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
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
F0|2N97s3Dl

-- 
GitLab