From dc54657650d9c0828d2e13d6f26005e01430cb2d Mon Sep 17 00:00:00 2001 From: dwf1m12 <d.w.flynn@soton.ac.uk> Date: Sun, 26 Feb 2023 23:12:10 +0000 Subject: [PATCH] update FPGA build for ft1248-to-axi-stream functionality --- .../component.xml | 52 +++++++++++++++--- .../hdl/SYNCHRONIZER_EDGES.v | 2 + .../hdl/ft1248x1_to_axi_streamio_v1_0.v | 41 +++++++++----- ....org_user_ft1248x1_to_axi_streamio_1.0.zip | Bin 7881 -> 8151 bytes 4 files changed, 72 insertions(+), 23 deletions(-) diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0/component.xml b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0/component.xml index 6298ed0..e23a30e 100644 --- a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0/component.xml +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0/component.xml @@ -23,7 +23,7 @@ <spirit:parameters> <spirit:parameter> <spirit:name>POLARITY</spirit:name> - <spirit:value spirit:id="BUSIFPARAM_VALUE.ARESETN.POLARITY" spirit:choiceRef="choice_list_74b5137e">ACTIVE_LOW</spirit:value> + <spirit:value spirit:id="BUSIFPARAM_VALUE.ARESETN.POLARITY" spirit:choiceRef="choice_list_9d8b0d81">ACTIVE_LOW</spirit:value> </spirit:parameter> </spirit:parameters> </spirit:busInterface> @@ -136,7 +136,7 @@ <spirit:parameters> <spirit:parameter> <spirit:name>viewChecksum</spirit:name> - <spirit:value>d48af1db</spirit:value> + <spirit:value>07d8b26e</spirit:value> </spirit:parameter> </spirit:parameters> </spirit:view> @@ -152,7 +152,7 @@ <spirit:parameters> <spirit:parameter> <spirit:name>viewChecksum</spirit:name> - <spirit:value>d48af1db</spirit:value> + <spirit:value>07d8b26e</spirit:value> </spirit:parameter> </spirit:parameters> </spirit:view> @@ -400,7 +400,7 @@ </spirit:model> <spirit:choices> <spirit:choice> - <spirit:name>choice_list_74b5137e</spirit:name> + <spirit:name>choice_list_9d8b0d81</spirit:name> <spirit:enumeration>ACTIVE_HIGH</spirit:enumeration> <spirit:enumeration>ACTIVE_LOW</spirit:enumeration> </spirit:choice> @@ -419,7 +419,7 @@ <spirit:file> <spirit:name>hdl/ft1248x1_to_axi_streamio_v1_0.v</spirit:name> <spirit:fileType>verilogSource</spirit:fileType> - <spirit:userFileType>CHECKSUM_dbb92f62</spirit:userFileType> + <spirit:userFileType>CHECKSUM_1d919ea1</spirit:userFileType> </spirit:file> </spirit:fileSet> <spirit:fileSet> @@ -493,8 +493,8 @@ <xilinx:taxonomy>AXI_Peripheral</xilinx:taxonomy> </xilinx:taxonomies> <xilinx:displayName>ft1248x1_to_axi_streamio_v1.0</xilinx:displayName> - <xilinx:coreRevision>5</xilinx:coreRevision> - <xilinx:coreCreationDateTime>2023-02-20T10:15:53Z</xilinx:coreCreationDateTime> + <xilinx:coreRevision>8</xilinx:coreRevision> + <xilinx:coreCreationDateTime>2023-02-26T14:27:06Z</xilinx:coreCreationDateTime> <xilinx:tags> <xilinx:tag xilinx:name="ui.data.coregen.df@428bf478_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> <xilinx:tag xilinx:name="ui.data.coregen.df@77d2a63f_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> @@ -581,12 +581,46 @@ <xilinx:tag xilinx:name="ui.data.coregen.df@654e1a72_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> <xilinx:tag xilinx:name="ui.data.coregen.df@428ff7a8_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> <xilinx:tag xilinx:name="ui.data.coregen.df@2747214_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@165165da_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@14b2bd29_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@11bb99fa_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@45d547c_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@992911c_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@6f68f972_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@33ec70d0_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@77c4c6ca_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@3eaae7a_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@7e143239_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@1ddc7b40_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@302a1c3e_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@4fa27fd6_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@1117ca64_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@35cb4ee9_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@4a5d8467_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@4c4463a4_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@56eee029_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@333fc4de_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@6e8d2e2a_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@70ab23aa_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@203963e1_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@509005d0_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@4916ee78_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@9b5c2aa_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@58902ddb_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@5744b6c1_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@51d00cf6_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@4910d90c_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@52ca7ed0_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@7a2f2ef_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@13049cbf_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@2c4fe533_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> + <xilinx:tag xilinx:name="ui.data.coregen.df@19907224_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git_new/nanosoc/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0</xilinx:tag> </xilinx:tags> </xilinx:coreExtensions> <xilinx:packagingInfo> <xilinx:xilinxVersion>2021.1</xilinx:xilinxVersion> - <xilinx:checksum xilinx:scope="busInterfaces" xilinx:value="6c2025e0"/> - <xilinx:checksum xilinx:scope="fileGroups" xilinx:value="c08cf8d4"/> + <xilinx:checksum xilinx:scope="busInterfaces" xilinx:value="90504787"/> + <xilinx:checksum xilinx:scope="fileGroups" xilinx:value="5194cd85"/> <xilinx:checksum xilinx:scope="ports" xilinx:value="95a87e81"/> <xilinx:checksum xilinx:scope="hdlParameters" xilinx:value="1be3ccaa"/> <xilinx:checksum xilinx:scope="parameters" xilinx:value="6bebc0ed"/> diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0/hdl/SYNCHRONIZER_EDGES.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0/hdl/SYNCHRONIZER_EDGES.v index 35555b6..c669ec1 100644 --- a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0/hdl/SYNCHRONIZER_EDGES.v +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0/hdl/SYNCHRONIZER_EDGES.v @@ -13,6 +13,7 @@ module SYNCHRONIZER_EDGES ( ,input wire reset_n_i ,input wire asyn_i ,output wire syn_o + ,output wire syn_del_o ,output wire posedge_o ,output wire negedge_o ); @@ -34,6 +35,7 @@ reg sync_stage3; end assign syn_o = (testmode_i) ? asyn_i : sync_stage2; +assign syn_del_o = (testmode_i) ? asyn_i : sync_stage3; assign posedge_o = (testmode_i) ? asyn_i : ( sync_stage2 & !sync_stage3); assign negedge_o = (testmode_i) ? asyn_i : (!sync_stage2 & sync_stage3); diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0/hdl/ft1248x1_to_axi_streamio_v1_0.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0/hdl/ft1248x1_to_axi_streamio_v1_0.v index d4c6ac4..a089edf 100644 --- a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0/hdl/ft1248x1_to_axi_streamio_v1_0.v +++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0/hdl/ft1248x1_to_axi_streamio_v1_0.v @@ -35,9 +35,6 @@ input wire ft_miosio_i, output wire ft_miosio_o, output wire ft_miosio_z, -// assign ft_miosio_io = (ft_miosio_z) ? 1'bz : ft_miosio_o;// tri-state pad control for MIOSIO -// -// assign #1 ft_miosio_i = ft_miosio_io; //add notional delay on inout to ensure last "half-bit" on FT1248TXD is sampled before tri-stated input wire aclk, // external primary clock input wire aresetn, // external reset (active low) @@ -59,8 +56,7 @@ wire ft_clk_rising; wire ft_clk_falling; wire ft_ssn; -//wire ft_ssn_rising; -//wire ft_ssn_falling; +wire ft_miosio_i_del; SYNCHRONIZER_EDGES u_sync_ft_clk ( .testmode_i(1'b0), @@ -68,6 +64,7 @@ SYNCHRONIZER_EDGES u_sync_ft_clk ( .reset_n_i(aresetn), .asyn_i(ft_clk_i), .syn_o(), + .syn_del_o(), .posedge_o(ft_clk_rising), .negedge_o(ft_clk_falling) ); @@ -78,6 +75,18 @@ SYNCHRONIZER_EDGES u_sync_ft_ssn ( .reset_n_i(aresetn), .asyn_i(ft_ssn_i), .syn_o(ft_ssn), + .syn_del_o(), + .posedge_o( ), + .negedge_o( ) + ); + +SYNCHRONIZER_EDGES u_sync_ft_din ( + .testmode_i(1'b0), + .clk_i(aclk), + .reset_n_i(aresetn), + .asyn_i(ft_miosio_i), + .syn_o( ), + .syn_del_o(ft_miosio_i_del), .posedge_o( ), .negedge_o( ) ); @@ -130,7 +139,7 @@ wire ft_cmd_rxd = ft_cmd[7] & !ft_cmd[6] & !ft_cmd[3] & !ft_cmd[1] & ft_cmd[0] wire ft_cmd_txd = ft_cmd[7] & !ft_cmd[6] & !ft_cmd[3] & !ft_cmd[1] & !ft_cmd[0]; // tristate enable for miosio (deselected status or serialized data for read command) -wire ft_miosio_e = ft_ssn_i | (ft_cmd_rxd & !ft_state[4] & ft_state[3]); +wire ft_miosio_e = ft_ssn_i | (ft_cmd_rxd & !ft_state[4] & ft_state[3]); assign ft_miosio_z = !ft_miosio_e; // capture (ft_cmd_txd) serial data out on falling edge of clock @@ -142,7 +151,7 @@ always @(posedge aclk or negedge aresetn) else if (ft_ssn) // sync reset rxd_sr <= 8'b00000000; else if (ft_clk_falling & ft_cmd_txd & (ft_state[4:3] == 2'b01)) //serial shift - rxd_sr <= {ft_miosio_i, rxd_sr[7:1]}; + rxd_sr <= {ft_miosio_i_del, rxd_sr[7:1]}; // AXI STREAM handshake interfaces // TX stream delivers valid FT1248 read data transfer @@ -154,7 +163,7 @@ always @(posedge aclk or negedge aresetn) else if (txstream[8] & txd_tready_i) // priority clear stream data valid when accepted txstream[8] <= 1'b0; else if (ft_clk_falling & ft_cmd_txd & (ft_state==5'b01111)) //load as last shift arrives - txstream[8:0] <= {1'b1, 1'b0, rxd_sr[7:1]}; + txstream[8:0] <= {1'b1, ft_miosio_i_del, rxd_sr[7:1]}; assign txd_tvalid_o = txstream[8]; assign txd_tdata8_o = txstream[7:0]; @@ -163,6 +172,8 @@ assign txd_tdata8_o = txstream[7:0]; // AXI STREAM handshake interfaces // RX stream accepts 8-bit data to transfer over FT1248 channel // 8-bit write port with extra top-bit used as valid qualifer + +/* reg [8:0] rxstream; always @(posedge aclk or negedge aresetn) if (!aresetn) @@ -172,28 +183,30 @@ always @(posedge aclk or negedge aresetn) else if (rxstream[8] & ft_clk_rising & ft_cmd_rxd & (ft_state==5'b01111)) // hold until final shift completion rxstream[8] <= 1'b0; assign rxd_tready_o = !rxstream[8]; // ready until loaded +*/ // shift TXD on rising edge of clock -reg [7:0] txd_sr; +reg [8:0] txd_sr; // rewrite for clocked always @(posedge aclk or negedge aresetn) if (!aresetn) txd_sr <= 8'b00000000; else if (ft_ssn) // sync reset txd_sr <= 8'b00000000; - else if (ft_clk_falling & ft_cmd_rxd & (ft_state == 5'b00111)) - txd_sr <= rxstream[8] ? rxstream[7:0] : 8'b00000000; + else if (ft_clk_falling & ft_cmd_rxd & rxd_tvalid_i & (ft_state == 5'b00111)) + txd_sr <= rxd_tdata8_i; else if (ft_clk_rising & ft_cmd_rxd & (ft_state[4:3] == 2'b01)) //serial shift txd_sr <= {1'b0,txd_sr[7:1]}; +assign rxd_tready_o = (ft_clk_rising & ft_cmd_rxd & (ft_state==5'b01110)); // hold until final shift //FT1248 FIFO status signals // ft_miso_o reflects TXF when deselected -assign ft_miosio_o = (ft_ssn_i) ? !txstream[8] : txd_sr[0]; +assign ft_miosio_o = (ft_ssn_i) ? txstream[8] : txd_sr[0]; // ft_miso_o reflects RXE when deselected -assign ft_miso_o = (ft_ssn_i) ? rxstream[8] : (ft_state == 5'b00111); - +//assign ft_miso_o = (ft_ssn_i) ? rxstream[8] : (ft_state == 5'b00111); +assign ft_miso_o = (ft_ssn_i) ? !rxd_tvalid_i : ((ft_state == 5'b00111) & ((ft_cmd_txd) ? txstream[8]: !rxd_tvalid_i)); endmodule diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0/soclabs.org_user_ft1248x1_to_axi_streamio_1.0.zip b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_axi_streamio_1.0/soclabs.org_user_ft1248x1_to_axi_streamio_1.0.zip index 9da11b5a3446608bfe339577062496b021daa431..7cc581a635a8bd18d2224fc4f7b002adf2093b95 100644 GIT binary patch delta 6652 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 GARYkwPrrQt delta 6366 zcmca^f6}%-z?+#xgn@y9gW*?TNZ9<3y&qoiGB7+@$iTqMz`&54pIeZhmzr0iSCO0Z zHa2qlEi>tT@7I5LSa)FBcgwji-6bX!Slwn<iOs7?iDa5DG5c29w12-&vAs8H7M>I& zt9MK7{j>5)mAyinet*{2*Y>YCl=y`0U#S19Zd=CR8U-=+^@Ue|o7C4QeyQ8}@8$E1 zw{3YfolRG*K5Ufd4msPe7aw!}Yy7&Z(-v{@d~D~>pZ}}7(qFaOdg0nU*9>o`MtRo6 zH+f-y6=Hbm_V1p%P&Mx0!8e6QbI-6(N?RfBAaeH1CGRI;XKYTdR1%%Y^_Kg3f6@!( zJG=jR3K*TAzu`U0!%~rY1^!!si@tqca7v4_dY$Z{4_~W<9~y|C?ohRqU-!YZQ+0ua z{v=U$v6{lQ8hnN^I~~`}@CuFb++6EBIrdYcw|3{v*%^<HTc`*;)JWVA8SQsgUE&eP z@w&sUvnKw0EyX=mC+6#^udChau6EyP<=;DJUc}y4OZ!h{ifZt_I=^IPzjJ*@l2+lK z^ytKx3*YVSKRpo63%D-QQeLpv+o(C%z)ONtOt0yl@>Gq@*{w6qJv*bcq{(vAjb%mZ z)7A@i-(UD_Wx=t8+uAp-&UpRB#(QVA!4m&P87WWoA8&l*C0kRoL-x|ff9|_)TmKUN zVrH2T^L*9!cb9WM{VTMPy%#yZef#`lf9oHX*hrs$|9j?18Q~1c9UT6KJ74Agý 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 F0|2N97s3Dl -- GitLab