Sfoglia il codice sorgente

Добавлены SPIm, SPIs, логика выбора типа SPI

Anatoliy Chigirinskiy 2 anni fa
parent
commit
a2796f5ac4

+ 155 - 48
SRAM/QuadSPIs.v

@@ -9,8 +9,13 @@ module QuadSPIs (
     input Mosi2_i,
     input Mosi3_i,
 
+    input [1:0] WidthSel_i,
+    input SELST_i,
+   
+
     output reg [23:0] Data_o,
     output reg [7:0] Addr_o,
+      output [31:0] DataToRxFifo_o,
     output reg Val_o
 );
 
@@ -19,34 +24,88 @@ module QuadSPIs (
 //================================================================================
 
 reg ssReg;
-reg ssRegR;
-reg RorWFlag;
-
-reg [3:0] cnt; 
+reg ssRegR; 
+reg SckReg; 
 reg [7:0] addrReg;
-reg [7:0] shiftReg0R;
-reg [7:0] shiftReg1R;
-reg [7:0] shiftReg2R;
-reg [7:0] shiftReg0RR;
-reg [7:0] shiftReg1RR;
-reg [7:0] shiftReg2RR;
 reg [7:0] shiftReg0;
 reg [7:0] shiftReg1;
 reg [7:0] shiftReg2;
+
+reg [7:0] shiftReg0M;
+reg [7:0] shiftReg1M;
+reg [7:0] shiftReg2M;
+reg [7:0] addrRegM;
+
+
+//===============================================================================
+//  ASSIGNMENTS
+
+
+assign DataToRxFifo_o = {Addr_o, Data_o};
+
 //================================================================================
 //	CODING
 //================================================================================
 
+always	@(posedge	Clk_i)	begin
+	ssReg	<=	Ss_i;
+	ssRegR	<=	ssReg;
+end
+
+
+always @(*) begin 
+    if (Rst_i) begin
+        addrRegM = 8'h0; 
+        shiftReg0M = 8'h0;
+        shiftReg1M = 8'h0;
+        shiftReg2M = 8'h0;
+    end
+    else begin 
+        case(WidthSel_i)  
+             0: begin 
+                addrRegM   = addrReg  [1:0];
+                shiftReg0M = shiftReg0[1:0];
+                shiftReg1M = shiftReg1[1:0];
+                shiftReg2M = shiftReg2[1:0];
+            end
+            1: begin 
+                addrRegM   = addrReg  [3:0];
+                shiftReg0M = shiftReg0[3:0];
+                shiftReg1M = shiftReg1[3:0];
+                shiftReg2M = shiftReg2[3:0];
+            end
+            2: begin 
+                addrRegM   = addrReg  [5:0];
+                shiftReg0M = shiftReg0[5:0];
+                shiftReg1M = shiftReg1[5:0];
+                shiftReg2M = shiftReg2[5:0];
+            end
+            3: begin 
+                addrRegM   = addrReg  [7:0];
+                shiftReg0M = shiftReg0[7:0];
+                shiftReg1M = shiftReg1[7:0];
+                shiftReg2M = shiftReg2[7:0];
+            end
+        endcase
+    end
+end
+
+
+
 always @(posedge Clk_i) begin 
     if (Rst_i) begin 
         Data_o <= 24'h0;
     end
-    else begin 
-        if (ssReg && !ssRegR) begin 
-            Data_o <= {shiftReg2, shiftReg1, shiftReg0};
+    else begin
+        if (SELST_i) begin  
+            if (ssReg && !ssRegR) begin 
+                Data_o <= {shiftReg2M, shiftReg1M, shiftReg0M};
+            end
         end
         else begin 
-            Data_o <= 24'h0;
+            if (!ssReg && ssRegR) begin 
+                Data_o <= {shiftReg2M, shiftReg1M, shiftReg0M};
+            end
         end
     end
 end
@@ -55,24 +114,43 @@ always @(posedge Clk_i) begin
     if (Rst_i) begin 
         Addr_o <= 8'h0;
     end
-    else begin 
-        if (ssReg && !ssRegR) begin 
-            Addr_o <= addrReg;
+    else begin
+        if (SELST_i) begin 
+            if (ssReg && !ssRegR) begin 
+                Addr_o <= addrRegM;
+            end
+        end
+        else begin 
+            if (!ssReg && ssRegR) begin 
+                Addr_o <= addrRegM;
+            end
         end
     end
 end
 
 
+
+
 always @(posedge Sck_i) begin 
     if (Rst_i) begin 
         shiftReg0 <= 8'h0;
     end
-    else begin 
-        if (!Ss_i) begin 
-            shiftReg0 <= {shiftReg0[6:0], Mosi0_i};
+    else begin
+        if (SELST_i) begin   
+            if (!Ss_i) begin 
+                shiftReg0 <= {shiftReg0[6:0], Mosi0_i};
+            end
+            else begin 
+                shiftReg0 <= 8'h0;
+            end
         end
         else begin 
-            shiftReg0 <= 8'h0;
+            if (Ss_i) begin 
+                shiftReg0 <= {shiftReg0[6:0], Mosi0_i};
+            end
+            else begin 
+                shiftReg0<= 8'h0;
+            end
         end
     end
 end
@@ -82,12 +160,22 @@ always @(posedge Sck_i ) begin
     if (Rst_i) begin 
         shiftReg1 <= 8'h0;
     end
-    else begin 
-        if (!Ss_i) begin 
-            shiftReg1 <= {shiftReg1[6:0], Mosi1_i};
+    else begin
+        if (SELST_i) begin   
+            if (!Ss_i) begin 
+                shiftReg1 <= {shiftReg1[6:0], Mosi1_i};
+            end
+            else begin 
+                shiftReg1 <= 8'h0;
+            end
         end
         else begin 
-            shiftReg1 <= 8'h0;
+            if (Ss_i) begin 
+                shiftReg1 <= {shiftReg1[6:0], Mosi1_i};
+            end
+            else begin 
+                shiftReg1 <= 8'h0;
+            end
         end
     end
 end
@@ -97,12 +185,22 @@ always @(posedge Sck_i ) begin
     if (Rst_i) begin 
         shiftReg2 <= 8'h0;
     end
-    else begin 
-        if (!Ss_i) begin 
-            shiftReg2 <= {shiftReg2[6:0], Mosi2_i};
+    else begin
+        if (SELST_i) begin   
+            if (!Ss_i) begin 
+                shiftReg2 <= {shiftReg2[6:0], Mosi2_i};
+            end
+            else begin 
+                shiftReg2 <= 8'h0;
+            end
         end
         else begin 
-            shiftReg2 <= 8'h0;
+            if (Ss_i) begin 
+                shiftReg2 <= {shiftReg2[6:0], Mosi2_i};
+            end
+            else begin 
+                shiftReg2 <= 8'h0;
+            end
         end
     end
 end
@@ -112,35 +210,44 @@ always @(posedge Sck_i ) begin
     if (Rst_i) begin 
         addrReg <= 8'h0;
     end
-    else begin 
-        if (!Ss_i) begin 
-            addrReg <= {addrReg[6:0], Mosi3_i};
+    else begin
+        if (SELST_i) begin 
+            if (!Ss_i) begin 
+                addrReg <= {addrReg[6:0], Mosi3_i};
+            end
+            else begin 
+                addrReg <= 8'h0;
+            end
         end
         else begin 
-            addrReg <= 8'h0;
+            if (Ss_i) begin 
+                addrReg <= {addrReg[6:0], Mosi3_i};
+            end
+            else begin 
+                addrReg <= 8'h0;
+            end
         end
     end
 end
 
 
-always	@(posedge	Clk_i)	begin
-	ssReg	<=	Ss_i;
-	ssRegR	<=	ssReg;
-    shiftReg0R <= shiftReg0;
-    shiftReg1R <= shiftReg1;
-    shiftReg2R <= shiftReg2;
-    shiftReg0RR <= shiftReg0R;
-    shiftReg1RR <= shiftReg1R;
-    shiftReg2RR <= shiftReg2R;
-end
-
 
-always @(posedge Clk_i) begin 
-    if (ssReg && !ssRegR) begin 
-        Val_o <= 1'b1;
+always @(posedge Clk_i) begin
+    if (SELST_i) begin 
+        if (ssReg && !ssRegR) begin 
+            Val_o <= 1'b1;
+        end
+        else begin 
+            Val_o <= 1'b0;
+        end
     end
     else begin 
-        Val_o <= 1'b0;
+        if (!ssReg&& ssRegR) begin 
+            Val_o <= 1'b1;
+        end
+        else begin 
+            Val_o <= 1'b0;
+        end
     end
 end
 

File diff suppressed because it is too large
+ 706 - 0
sources_1/ip/clk_wiz_0_2/clk_wiz_0.xci


+ 54 - 6
sources_1/new/DataFifo/DataFifoWrapper.v

@@ -11,17 +11,31 @@ module DataFifoWrapper
 	input	RdClk_i,
     input	Rst_i,
 	input   SmcAre_i,
+	input	SmcAwe_i,
 
 	input	ToFifoVal_i,
 	input	[CmdRegWidth-1:0]	ToFifoData_i,
+	input   [CmdRegWidth-1:0]	ToFifoRxData_i,
+	input   ToFifoRxWriteVal_i,                   
 	
+	input ToFifoTxReadVal_i,
+
 	output	ToSpiVal_o,
 	output	[CmdRegWidth-1:0]	ToSpiData_o
 );
 //================================================================================
 //	REG/WIRE
 //================================================================================
-	
+	wire [CmdRegWidth-1:0]	dataFromRxFifo;
+	wire fullFlagRx;
+	wire emptyFlagRx;
+	wire fullFlagTx;
+	wire emptyFlagTx;
+
+	wire txFifoWrEn;
+	wire txFifoRdEn;
+	wire rxFifoWrEn;
+	wire rxFifoRdEn;
 //================================================================================
 //	ASSIGNMENTS
 //================================================================================
@@ -34,16 +48,50 @@ module DataFifoWrapper
 //	CODING
 //================================================================================
 
-DataFifo	DataFifo
+FifoCtrl FifoCtrl_inst (
+	.ToFifoTxWriteVal_i	(!SmcAwe_i && toFifoVal_i),
+	.ToFifoTxReadVal_i (ToFifoTxReadVal_i),
+	.ToFifoRxWriteVal_i	(ToFifoRxWriteVal_i),
+	.ToFifoRxReadVal_i	(!SmcAre_i),
+	.FifoTxFull_i		(fullFlagTx),
+	.FifoTxEmpty_i		(emptyFlagTx),
+	.FifoRxFull_i		(fullFlagRx),
+	.FifoRxEmpty_i		(emptyFlagRx),
+	.FifoTxWriteEn_o	(txFifoWrEn),
+	.FifoTxReadEn_o		(txFifoRdEn),
+	.FifoRxWriteEn_o	(rxFifoWrEn),
+	.FifoRxReadEn_o		(rxFifoRdEn)
+
+
+
+
+
+);
+
+
+
+DataFifo	DataFifoTx
 ( 
 	.wr_clk		(WrClk_i), 
 	.rd_clk		(RdClk_i), 
 	.din		(ToFifoData_i), 
-	.wr_en		(ToFifoVal_i), 
-	.rd_en		(!SmcAre_i), 
+	.wr_en		(txFifoWrEn), 
+	.rd_en		(txFifoRdEn), 
 	.dout		(ToSpiData_o), 
-	.full		(fullFlag), 
-	.empty		(emptyFlag)
+	.full		(fullFlagTx), 
+	.empty		(emptyFlagTx)
+);
+
+DataFifo	DataFifoRx
+( 
+	.wr_clk		(RdClk_i), 
+	.rd_clk		(WrClk_i), 
+	.din		(ToFifoRxData_i), 
+	.wr_en		(rxFifoWrEn), 
+	.rd_en		(rxFifoRdEn), 
+	.dout		(dataFromRxFifo), 
+	.full		(fullFlagRx), 
+	.empty		(emptyFlagRx)
 );
 
 endmodule

+ 35 - 0
sources_1/new/DataFifo/FifoCtrl.v

@@ -0,0 +1,35 @@
+module FifoCtrl (
+    input ToFifoTxWriteVal_i,
+    input ToFifoTxReadVal_i,
+    input ToFifoRxWriteVal_i,
+    input ToFifoRxReadVal_i,
+
+    input FifoTxFull_i,
+    input FifoTxEmpty_i,
+    input FifoRxFull_i,
+    input FifoRxEmpty_i,
+
+
+    output FifoTxWriteEn_o,
+    output FifoTxReadEn_o,
+    output FifoRxWriteEn_o,
+    output FifoRxReadEn_o
+
+);
+
+
+
+// //================================================================================
+// //	ASSIGNMENTS
+
+assign FifoTxWriteEn_o = ToFifoTxWriteVal_i & ~FifoTxFull_i;
+assign FifoTxReadEn_o = ToFifoTxReadVal_i & ~FifoTxEmpty_i;
+assign FifoRxWriteEn_o = ToFifoRxWriteVal_i & ~FifoRxFull_i;
+assign FifoRxReadEn_o = ToFifoRxReadVal_i & ~FifoRxEmpty_i;
+
+
+
+// //================================================================================
+
+
+endmodule

+ 1 - 1
sources_1/new/MMCM/MmcmWrapper.v

@@ -52,7 +52,7 @@ MMCME2_ADV
    // .CLKIN1_PERIOD       (10.000),
    .CLKIN1_PERIOD       (8.130081300813),
    .CLKIN2_PERIOD       (10.000),
-   .CLKOUT0_DIVIDE_F    (12.3),
+   .CLKOUT0_DIVIDE_F    (15.25),
    .CLKOUT0_DUTY_CYCLE  (0.5),
    .CLKOUT0_PHASE       (0.0),
    .CLKOUT0_USE_FINE_PS ("FALSE"),

+ 23 - 16
sources_1/new/Mux/DataMuxer.v

@@ -6,20 +6,27 @@ module SmcDataMux
 	
 	parameter	FifoNum	=	7,
 	
-	parameter	Fifo0WriteAddr	=	12'h0+12'h24,
-	parameter	Fifo1WriteAddr	=	12'h50+12'h24,
-	parameter	Fifo2WriteAddr	=	12'hF0+12'h24,
-	parameter	Fifo3WriteAddr	=	12'h140+12'h24,
-	parameter	Fifo4WriteAddr	=	12'h190+12'h24,
-	parameter	Fifo5WriteAddr	=	12'h1e0+12'h24,
-	parameter	Fifo6WriteAddr	=	12'h230+12'h24
+	parameter	Fifo0WriteAddrL	=	12'h0+12'h24,
+	parameter	Fifo0WriteAddrS	=	12'h0+12'h26,
+	parameter	Fifo1WriteAddrL	=	12'h50+12'h24,
+	parameter	Fifo1WriteAddrS	=	12'h50+12'h26,
+	parameter	Fifo2WriteAddrL	=	12'hF0+12'h24,
+	parameter	Fifo2WriteAddrS	=	12'hF0+12'h26,
+	parameter	Fifo3WriteAddrL	=	12'h140+12'h24,
+	parameter	Fifo3WriteAddrS	=	12'h140+12'h26,
+	parameter	Fifo4WriteAddrL	=	12'h190+12'h24,
+	parameter	Fifo4WriteAddrS	=	12'h190+12'h26,
+	parameter	Fifo5WriteAddrL	=	12'h1e0+12'h24,
+	parameter	Fifo5WriteAddrS	=	12'h1e0+12'h26,
+	parameter	Fifo6WriteAddrL	=	12'h230+12'h24,
+	parameter	Fifo6WriteAddrS	=	12'h230+12'h26
 )
 (
     input	Clk_i,
     input	Rst_i,
 
 	input	SmcVal_i,
-	input	[CmdRegWidth-1:0]	SmcData_i,
+	input	[CmdRegWidth/2-1:0]	SmcData_i,
     input	[AddrRegWidth-1:0]	SmcAddr_i,
 
 	output	reg	ToRegMapVal_o,
@@ -55,33 +62,33 @@ always	@(posedge	Clk_i	or	posedge	Rst_i)	begin
 		ToFifoVal_o		<=	7'h0;
 		ToFifoData_o	<=	32'h0;
 	end	else	begin
-		if	(SmcAddr_i	==	Fifo0WriteAddr||SmcAddr_i==Fifo1WriteAddr||SmcAddr_i==Fifo2WriteAddr||SmcAddr_i==Fifo3WriteAddr||SmcAddr_i==Fifo4WriteAddr||SmcAddr_i==Fifo5WriteAddr||SmcAddr_i==Fifo6WriteAddr)	begin	
+		if	(SmcAddr_i	==	Fifo0WriteAddrL||SmcAddr_i==Fifo1WriteAddrL||SmcAddr_i==Fifo2WriteAddrL||SmcAddr_i==Fifo3WriteAddrL||SmcAddr_i==Fifo4WriteAddrL||SmcAddr_i==Fifo5WriteAddrL||SmcAddr_i==Fifo6WriteAddrL||SmcAddr_i	==	Fifo0WriteAddrS||SmcAddr_i==Fifo1WriteAddrS||SmcAddr_i==Fifo2WriteAddrS||SmcAddr_i==Fifo3WriteAddrS||SmcAddr_i==Fifo4WriteAddrS||SmcAddr_i==Fifo5WriteAddrS||SmcAddr_i==Fifo6WriteAddrS)	begin	
 			case(SmcAddr_i)	
-				Fifo0WriteAddr:	begin
+				Fifo0WriteAddrL:	begin
 									ToFifoVal_o[0]	<=	SmcVal_i;
 									ToFifoData_o[32*0+:32]	<=	SmcData_i;
 								end
-				Fifo1WriteAddr:	begin
+				Fifo1WriteAddrL:	begin
 									ToFifoVal_o[1]	<=	SmcVal_i;
 									ToFifoData_o[32*1-1+:32]	<=	SmcData_i;
 								end
-				Fifo2WriteAddr:	begin
+				Fifo2WriteAddrL:	begin
 									ToFifoVal_o[2]	<=	SmcVal_i;
 									ToFifoData_o[32*2-1+:32]	<=	SmcData_i;
 								end
-				Fifo3WriteAddr:	begin
+				Fifo3WriteAddrL:	begin
 									ToFifoVal_o[3]	<=	SmcVal_i;
 									ToFifoData_o[32*3-1+:32]	<=	SmcData_i;
 								end
-				Fifo4WriteAddr:	begin
+				Fifo4WriteAddrL:	begin
 									ToFifoVal_o[4]	<=	SmcVal_i;
 									ToFifoData_o[32*4-1+:32]	<=	SmcData_i;
 								end
-				Fifo5WriteAddr:	begin
+				Fifo5WriteAddrL:	begin
 									ToFifoVal_o[5]	<=	SmcVal_i;
 									ToFifoData_o[32*5-1+:32]	<=	SmcData_i;
 								end
-				Fifo6WriteAddr:	begin
+				Fifo6WriteAddrL:	begin
 									ToFifoVal_o[6]	<=	SmcVal_i;
 									ToFifoData_o[32*6-1+:32]	<=	SmcData_i;
 								end

+ 398 - 242
sources_1/new/S5443_3Top.v

@@ -37,7 +37,7 @@ module S5443_3Top #(
     input SmcAre_i,
     input [1:0] SmcBe_i,
     input SmcAoe_i,
-    output [SpiNum-1:0] LD_i,
+    output [SpiNum-1:0] Ld_i,
 
     output  Led_o,
    
@@ -73,66 +73,66 @@ wire [0:15] baudRate [SpiNum-1:0];
 
 
 //SPI0
-wire [CmdRegWidth-1:0] Spi0Ctrl;
-wire [CmdRegWidth-1:0] Spi0Clk;
-wire [CmdRegWidth-1:0] Spi0CsDelay;
-wire [CmdRegWidth-1:0] Spi0CsCtrl;
-wire [CmdRegWidth-1:0] Spi0TxFifoCtrl;
-wire [CmdRegWidth-1:0] Spi0RxFifoCtrl;
-wire [CmdRegWidth-1:0] Spi0TxFifo;
-wire [CmdRegWidth-1:0] Spi0RxFifo;
+wire [CmdRegWidth-1:0] spi0Ctrl;
+wire [CmdRegWidth-1:0] spi0Clk;
+wire [CmdRegWidth-1:0] spi0CsDelay;
+wire [CmdRegWidth-1:0] spi0CsCtrl;
+wire [CmdRegWidth-1:0] spi0TxFifoCtrl;
+wire [CmdRegWidth-1:0] spi0RxFifoCtrl;
+wire [CmdRegWidth-1:0] spi0TxFifo;
+wire [CmdRegWidth-1:0] spi0RxFifo;
 //SPI1
-wire [CmdRegWidth-1:0] Spi1Ctrl;
-wire [CmdRegWidth-1:0] Spi1Clk;
-wire [CmdRegWidth-1:0] Spi1CsDelay;
-wire [CmdRegWidth-1:0] Spi1CsCtrl;
-wire [CmdRegWidth-1:0] Spi1TxFifoCtrl;
-wire [CmdRegWidth-1:0] Spi1RxFifoCtrl;
-wire [CmdRegWidth-1:0] Spi1TxFifo;
-wire [CmdRegWidth-1:0] Spi1RxFifo;
+wire [CmdRegWidth-1:0] spi1Ctrl;
+wire [CmdRegWidth-1:0] spi1Clk;
+wire [CmdRegWidth-1:0] spi1CsDelay;
+wire [CmdRegWidth-1:0] spi1CsCtrl;
+wire [CmdRegWidth-1:0] spi1TxFifoCtrl;
+wire [CmdRegWidth-1:0] spi1RxFifoCtrl;
+wire [CmdRegWidth-1:0] spi1TxFifo;
+wire [CmdRegWidth-1:0] spi1RxFifo;
 //SPI2
-wire [CmdRegWidth-1:0] Spi2Ctrl;
-wire [CmdRegWidth-1:0] Spi2Clk;
-wire [CmdRegWidth-1:0] Spi2CsDelay;
-wire [CmdRegWidth-1:0] Spi2CsCtrl;
-wire [CmdRegWidth-1:0] Spi2TxFifoCtrl;
-wire [CmdRegWidth-1:0] Spi2RxFifoCtrl;
-wire [CmdRegWidth-1:0] Spi2TxFifo;
+wire [CmdRegWidth-1:0] spi2Ctrl;
+wire [CmdRegWidth-1:0] spi2Clk;
+wire [CmdRegWidth-1:0] spi2CsDelay;
+wire [CmdRegWidth-1:0] spi2CsCtrl;
+wire [CmdRegWidth-1:0] spi2TxFifoCtrl;
+wire [CmdRegWidth-1:0] spi2RxFifoCtrl;
+wire [CmdRegWidth-1:0] spi2TxFifo;
 wire [CmdRegWidth-1:0] Spi2RxFifo;
 //SPI3
-wire [CmdRegWidth-1:0] Spi3Ctrl;
-wire [CmdRegWidth-1:0] Spi3Clk;
-wire [CmdRegWidth-1:0] Spi3CsDelay;
-wire [CmdRegWidth-1:0] Spi3CsCtrl;
-wire [CmdRegWidth-1:0] Spi3TxFifoCtrl;
-wire [CmdRegWidth-1:0] Spi3RxFifoCtrl;
+wire [CmdRegWidth-1:0] spi3Ctrl;
+wire [CmdRegWidth-1:0] spi3Clk;
+wire [CmdRegWidth-1:0] spi3CsDelay;
+wire [CmdRegWidth-1:0] spi3CsCtrl;
+wire [CmdRegWidth-1:0] spi3TxFifoCtrl;
+wire [CmdRegWidth-1:0] spi3RxFifoCtrl;
 wire [CmdRegWidth-1:0] Spi3TxFifo;
 wire [CmdRegWidth-1:0] Spi3RxFifo;
 //SPI4
-wire [CmdRegWidth-1:0] Spi4Ctrl;
-wire [CmdRegWidth-1:0] Spi4Clk;
-wire [CmdRegWidth-1:0] Spi4CsDelay;
-wire [CmdRegWidth-1:0] Spi4CsCtrl;
-wire [CmdRegWidth-1:0] Spi4TxFifoCtrl;
-wire [CmdRegWidth-1:0] Spi4RxFifoCtrl;
+wire [CmdRegWidth-1:0] spi4Ctrl;
+wire [CmdRegWidth-1:0] spi4Clk;
+wire [CmdRegWidth-1:0] spi4CsDelay;
+wire [CmdRegWidth-1:0] spi4CsCtrl;
+wire [CmdRegWidth-1:0] spi4TxFifoCtrl;
+wire [CmdRegWidth-1:0] spi4RxFifoCtrl;
 wire [CmdRegWidth-1:0] Spi4TxFifo;
 wire [CmdRegWidth-1:0] Spi4RxFifo;
 //SPI5
-wire [CmdRegWidth-1:0] Spi5Ctrl;
-wire [CmdRegWidth-1:0] Spi5Clk;
-wire [CmdRegWidth-1:0] Spi5CsDelay;
-wire [CmdRegWidth-1:0] Spi5CsCtrl;
-wire [CmdRegWidth-1:0] Spi5TxFifoCtrl;
-wire [CmdRegWidth-1:0] Spi5RxFifoCtrl;
+wire [CmdRegWidth-1:0] spi5Ctrl;
+wire [CmdRegWidth-1:0] spi5Clk;
+wire [CmdRegWidth-1:0] spi5CsDelay;
+wire [CmdRegWidth-1:0] spi5CsCtrl;
+wire [CmdRegWidth-1:0] spi5TxFifoCtrl;
+wire [CmdRegWidth-1:0] spi5RxFifoCtrl;
 wire [CmdRegWidth-1:0] Spi5TxFifo;
 wire [CmdRegWidth-1:0] Spi5RxFifo;
 //SPI6
-wire [CmdRegWidth-1:0] Spi6Ctrl;
-wire [CmdRegWidth-1:0] Spi6Clk;
-wire [CmdRegWidth-1:0] Spi6CsDelay;
-wire [CmdRegWidth-1:0] Spi6CsCtrl;
-wire [CmdRegWidth-1:0] Spi6TxFifoCtrl;
-wire [CmdRegWidth-1:0] Spi6RxFifoCtrl;
+wire [CmdRegWidth-1:0] spi6Ctrl;
+wire [CmdRegWidth-1:0] spi6Clk;
+wire [CmdRegWidth-1:0] spi6CsDelay;
+wire [CmdRegWidth-1:0] spi6CsCtrl;
+wire [CmdRegWidth-1:0] spi6TxFifoCtrl;
+wire [CmdRegWidth-1:0] spi6RxFifoCtrl;
 wire [CmdRegWidth-1:0] Spi6TxFifo;
 wire [CmdRegWidth-1:0] Spi6RxFifo;
 
@@ -155,14 +155,17 @@ wire [SpiNum-1:0] CPOL;
 wire [SpiNum-1:0] CPHA;
 wire [SpiNum-1:0] endianSel;
 wire [SpiNum-1:0] selSt;
+wire [SpiNum-1:0] spiMode;
+
 
 wire [0:5] stopDelay [SpiNum-1:0];
 wire [SpiNum-1:0] leadx;
-wire [SpiNum-1:0] lagx; 
-wire [SpiNum-1:0] FifoRxRst;
-wire [SpiNum-1:0] FifoTxRst;
-wire [0:7]  WordCntTx [SpiNum-1:0];
-wire [0:7]  WordCntRx [SpiNum-1:0];
+wire [SpiNum-1:0] lag; 
+wire [SpiNum-1:0] fifoRxRst;
+wire [SpiNum-1:0] fifoTxRst;
+wire [0:7]  wordCntTx [SpiNum-1:0];
+wire [0:7]  wordCntRx [SpiNum-1:0];
+
 
 wire [SpiNum-1:0] CS0;
 wire [SpiNum-1:0] CS1;
@@ -175,6 +178,35 @@ wire	[SpiNum-1:0]	spiSyncRst;
 wire	[AddrRegWidth-1:0]	smcAddr;
 wire	[CmdRegWidth-1:0]	smcData;
 wire	smcVal;
+//RxFifo 
+wire [0:23] dataToRxFifo [SpiNum-1:0];
+wire [0:7] addrToRxFifo [SpiNum-1:0];
+wire [SpiNum-1:0] valToRxFifo;
+wire [SpiNum-1:0] valToTxFifoRead;
+
+
+// SPI mode choice 
+wire [SpiNum-1:0] SckR; 
+wire [SpiNum-1:0] SsR;
+wire [SpiNum-1:0] Mosi0R;
+wire [SpiNum-1:0] valToTxR;
+wire [SpiNum-1:0] valToRxR;
+wire [0:31] dataToRxFifoR [SpiNum-1:0];
+
+
+wire [SpiNum-1:0] SckQ;
+wire [SpiNum-1:0] SsQ;
+wire [SpiNum-1:0] Mosi0Q;
+wire [SpiNum-1:0] valToTxQ;
+wire [SpiNum-1:0] valToRxQ;
+wire [0:31] dataToRxFifoQ [SpiNum-1:0];
+
+
+
+
+
+
+
 	
 //================================================================================
 //  ASSIGNMENTS
@@ -202,85 +234,94 @@ assign SsFlash_o[5] = (Assel[5])?(CS1[5]? Ss[5]:~Ss[5]):CS1[5];
 assign SsFlash_o[6] = (Assel[6])?(CS1[6]? Ss[6]:~Ss[6]):CS1[6];
 assign Sck_o = Sck;
 
-assign widthSel[0] = Spi0Ctrl[6:5];
-assign widthSel[1] = Spi1Ctrl[6:5];
-assign widthSel[2] = Spi2Ctrl[6:5];
-assign widthSel[3] = Spi3Ctrl[6:5];
-assign widthSel[4] = Spi4Ctrl[6:5];
-assign widthSel[5] = Spi5Ctrl[6:5];
-assign widthSel[6] = Spi6Ctrl[6:5];
-
-assign CPOL[0] = Spi0Ctrl[2];
-assign CPOL[1] = Spi1Ctrl[2];
-assign CPOL[2] = Spi2Ctrl[2];
-assign CPOL[3] = Spi3Ctrl[2];
-assign CPOL[4] = Spi4Ctrl[2];
-assign CPOL[5] = Spi5Ctrl[2];
-assign CPOL[6] = Spi6Ctrl[2];
-
-assign CPHA[0] = Spi0Ctrl[1];
-assign CPHA[1] = Spi1Ctrl[1];
-assign CPHA[2] = Spi2Ctrl[1];
-assign CPHA[3] = Spi3Ctrl[1];
-assign CPHA[4] = Spi4Ctrl[1];
-assign CPHA[5] = Spi5Ctrl[1];
-assign CPHA[6] = Spi6Ctrl[1];
-
-assign endianSel[0] = Spi0Ctrl[8];
-assign endianSel[1] = Spi1Ctrl[8];
-assign endianSel[2] = Spi2Ctrl[8];
-assign endianSel[3] = Spi3Ctrl[8];
-assign endianSel[4] = Spi4Ctrl[8];
-assign endianSel[5] = Spi5Ctrl[8];
-assign endianSel[6] = Spi6Ctrl[8];
-
-assign selSt[0] = Spi0Ctrl[4];
-assign selSt[1] = Spi1Ctrl[4];
-assign selSt[2] = Spi2Ctrl[4];
-assign selSt[3] = Spi3Ctrl[4];
-assign selSt[4] = Spi4Ctrl[4];
-assign selSt[5] = Spi5Ctrl[4];
-assign selSt[6] = Spi6Ctrl[4];
-
-assign Assel[0] = Spi0Ctrl[3];
-assign Assel[1] = Spi1Ctrl[3];
-assign Assel[2] = Spi2Ctrl[3];
-assign Assel[3] = Spi3Ctrl[3];
-assign Assel[4] = Spi4Ctrl[3];
-assign Assel[5] = Spi5Ctrl[3];
-assign Assel[6] = Spi6Ctrl[3];
-
-assign stopDelay[0] = Spi0CsDelay[7:2];
-assign stopDelay[1] = Spi1CsDelay[7:2];
-assign stopDelay[2] = Spi2CsDelay[7:2];
-assign stopDelay[3] = Spi3CsDelay[7:2];
-assign stopDelay[4] = Spi4CsDelay[7:2];
-assign stopDelay[5] = Spi5CsDelay[7:2];
-assign stopDelay[6] = Spi6CsDelay[7:2];
-
-assign leadx[0] = Spi0CsDelay[1];
-assign leadx[1] = Spi1CsDelay[1];
-assign leadx[2] = Spi2CsDelay[1];
-assign leadx[3] = Spi3CsDelay[1];
-assign leadx[4] = Spi4CsDelay[1];
-assign leadx[5] = Spi5CsDelay[1];
-assign leadx[6] = Spi6CsDelay[1];
-
-assign lagx[0] = Spi0CsDelay[0];
-assign lagx[1] = Spi1CsDelay[0];
-assign lagx[2] = Spi2CsDelay[0];
-assign lagx[3] = Spi3CsDelay[0];
-assign lagx[4] = Spi4CsDelay[0];
-assign lagx[5] = Spi5CsDelay[0];
-assign lagx[6] = Spi6CsDelay[0];
-
-assign baudRate[0] = Spi0Clk[15:0];
-assign baudRate[1] = Spi1Clk[15:0];
-assign baudRate[2] = Spi2Clk[15:0];
-assign baudRate[3] = Spi3Clk[15:0];
-assign baudRate[4] = Spi4Clk[15:0];
-assign baudRate[5] = Spi5Clk[15:0];
-assign baudRate[6] = Spi6Clk[15:0];
+assign widthSel[0] = spi0Ctrl[6:5];
+assign widthSel[1] = spi1Ctrl[6:5];
+assign widthSel[2] = spi2Ctrl[6:5];
+assign widthSel[3] = spi3Ctrl[6:5];
+assign widthSel[4] = spi4Ctrl[6:5];
+assign widthSel[5] = spi5Ctrl[6:5];
+assign widthSel[6] = spi6Ctrl[6:5];
+
+assign spiMode[0] = spi0Ctrl[7];
+assign spiMode[1] = spi1Ctrl[7];
+assign spiMode[2] = spi2Ctrl[7];
+assign spiMode[3] = spi3Ctrl[7];
+assign spiMode[4] = spi4Ctrl[7];
+assign spiMode[5] = spi5Ctrl[7];
+assign spiMode[6] = spi6Ctrl[7];
+
+
+assign CPOL[0] = spi0Ctrl[2];
+assign CPOL[1] = spi1Ctrl[2];
+assign CPOL[2] = spi2Ctrl[2];
+assign CPOL[3] = spi3Ctrl[2];
+assign CPOL[4] = spi4Ctrl[2];
+assign CPOL[5] = spi5Ctrl[2];
+assign CPOL[6] = spi6Ctrl[2];
+
+assign CPHA[0] = spi0Ctrl[1];
+assign CPHA[1] = spi1Ctrl[1];
+assign CPHA[2] = spi2Ctrl[1];
+assign CPHA[3] = spi3Ctrl[1];
+assign CPHA[4] = spi4Ctrl[1];
+assign CPHA[5] = spi5Ctrl[1];
+assign CPHA[6] = spi6Ctrl[1];
+
+assign endianSel[0] = spi0Ctrl[8];
+assign endianSel[1] = spi1Ctrl[8];
+assign endianSel[2] = spi2Ctrl[8];
+assign endianSel[3] = spi3Ctrl[8];
+assign endianSel[4] = spi4Ctrl[8];
+assign endianSel[5] = spi5Ctrl[8];
+assign endianSel[6] = spi6Ctrl[8];
+
+assign selSt[0] = spi0Ctrl[4];
+assign selSt[1] = spi1Ctrl[4];
+assign selSt[2] = spi2Ctrl[4];
+assign selSt[3] = spi3Ctrl[4];
+assign selSt[4] = spi4Ctrl[4];
+assign selSt[5] = spi5Ctrl[4];
+assign selSt[6] = spi6Ctrl[4];
+
+assign Assel[0] = spi0Ctrl[3];
+assign Assel[1] = spi1Ctrl[3];
+assign Assel[2] = spi2Ctrl[3];
+assign Assel[3] = spi3Ctrl[3];
+assign Assel[4] = spi4Ctrl[3];
+assign Assel[5] = spi5Ctrl[3];
+assign Assel[6] = spi6Ctrl[3];
+
+assign stopDelay[0] = spi0CsDelay[7:2];
+assign stopDelay[1] = spi1CsDelay[7:2];
+assign stopDelay[2] = spi2CsDelay[7:2];
+assign stopDelay[3] = spi3CsDelay[7:2];
+assign stopDelay[4] = spi4CsDelay[7:2];
+assign stopDelay[5] = spi5CsDelay[7:2];
+assign stopDelay[6] = spi6CsDelay[7:2];
+
+assign leadx[0] = spi0CsDelay[1];
+assign leadx[1] = spi1CsDelay[1];
+assign leadx[2] = spi2CsDelay[1];
+assign leadx[3] = spi3CsDelay[1];
+assign leadx[4] = spi4CsDelay[1];
+assign leadx[5] = spi5CsDelay[1];
+assign leadx[6] = spi6CsDelay[1];
+
+assign lag[0] = spi0CsDelay[0];
+assign lag[1] = spi1CsDelay[0];
+assign lag[2] = spi2CsDelay[0];
+assign lag[3] = spi3CsDelay[0];
+assign lag[4] = spi4CsDelay[0];
+assign lag[5] = spi5CsDelay[0];
+assign lag[6] = spi6CsDelay[0];
+
+assign baudRate[0] = spi0Clk[15:0];
+assign baudRate[1] = spi1Clk[15:0];
+assign baudRate[2] = spi2Clk[15:0];
+assign baudRate[3] = spi3Clk[15:0];
+assign baudRate[4] = spi4Clk[15:0];
+assign baudRate[5] = spi5Clk[15:0];
+assign baudRate[6] = spi6Clk[15:0];
 
 
 assign SpiRst_o[0] = GPIOA[0];
@@ -291,63 +332,115 @@ assign SpiRst_o[4] = GPIOA[4];
 assign SpiRst_o[5] = GPIOA[5];
 assign SpiRst_o[6] = GPIOA[6];
 
-assign FifoRxRst[0] = Spi0RxFifoCtrl[0];
-assign FifoRxRst[1] = Spi1RxFifoCtrl[0];
-assign FifoRxRst[2] = Spi2RxFifoCtrl[0];
-assign FifoRxRst[3] = Spi3RxFifoCtrl[0];
-assign FifoRxRst[4] = Spi4RxFifoCtrl[0];
-assign FifoRxRst[5] = Spi5RxFifoCtrl[0];
-assign FifoRxRst[6] = Spi6RxFifoCtrl[0];
-
-assign FifoTxRst[0] = Spi0TxFifoCtrl[0];
-assign FifoTxRst[1] = Spi1TxFifoCtrl[0];
-assign FifoTxRst[2] = Spi2TxFifoCtrl[0];
-assign FifoTxRst[3] = Spi3TxFifoCtrl[0];
-assign FifoTxRst[4] = Spi4TxFifoCtrl[0];
-assign FifoTxRst[5] = Spi5TxFifoCtrl[0];
-assign FifoTxRst[6] = Spi6TxFifoCtrl[0];
-
-assign LD_i[0] = GPIOA[16];
-assign LD_i[1] = GPIOA[17];
-assign LD_i[2] = GPIOA[18];
-assign LD_i[3] = GPIOA[19];
-assign LD_i[4] = GPIOA[20];
-assign LD_i[5] = GPIOA[21];
-assign LD_i[6] = GPIOA[22];
-assign LD_o = LD_i[0]&LD_i[1]&LD_i[2]&LD_i[3]&LD_i[4]&LD_i[5]&LD_i[6];
-
-assign WordCntRx[0] = Spi0RxFifoCtrl[15:8];
-assign WordCntRx[1] = Spi1RxFifoCtrl[15:8];
-assign WordCntRx[2] = Spi2RxFifoCtrl[15:8];
-assign WordCntRx[3] = Spi3RxFifoCtrl[15:8];
-assign WordCntRx[4] = Spi4RxFifoCtrl[15:8];
-assign WordCntRx[5] = Spi5RxFifoCtrl[15:8];
-assign WordCntRx[6] = Spi6RxFifoCtrl[15:8];
-
-assign WordCntTx[0] = Spi0TxFifoCtrl[15:8];
-assign WordCntTx[1] = Spi1TxFifoCtrl[15:8];
-assign WordCntTx[2] = Spi2TxFifoCtrl[15:8];
-assign WordCntTx[3] = Spi3TxFifoCtrl[15:8];
-assign WordCntTx[4] = Spi4TxFifoCtrl[15:8];
-assign WordCntTx[5] = Spi5TxFifoCtrl[15:8];
-assign WordCntTx[6] = Spi6TxFifoCtrl[15:8];
-
-
-assign CS0[0] = Spi0CsCtrl[0];
-assign CS0[1] = Spi1CsCtrl[0];
-assign CS0[2] = Spi2CsCtrl[0];
-assign CS0[3] = Spi3CsCtrl[0];
-assign CS0[4] = Spi4CsCtrl[0];
-assign CS0[5] = Spi5CsCtrl[0];
-assign CS0[6] = Spi6CsCtrl[0];
-
-assign CS1[0] = Spi0CsCtrl[1];
-assign CS1[1] = Spi1CsCtrl[1];
-assign CS1[2] = Spi2CsCtrl[1];
-assign CS1[3] = Spi3CsCtrl[1];
-assign CS1[4] = Spi4CsCtrl[1];
-assign CS1[5] = Spi5CsCtrl[1];
-assign CS1[6] = Spi6CsCtrl[1];
+assign fifoRxRst[0] = spi0RxFifoCtrl[0];
+assign fifoRxRst[1] = spi1RxFifoCtrl[0];
+assign fifoRxRst[2] = spi2RxFifoCtrl[0];
+assign fifoRxRst[3] = spi3RxFifoCtrl[0];
+assign fifoRxRst[4] = spi4RxFifoCtrl[0];
+assign fifoRxRst[5] = spi5RxFifoCtrl[0];
+assign fifoRxRst[6] = spi6RxFifoCtrl[0];
+
+assign fifoTxRst[0] = spi0TxFifoCtrl[0];
+assign fifoTxRst[1] = spi1TxFifoCtrl[0];
+assign fifoTxRst[2] = spi2TxFifoCtrl[0];
+assign fifoTxRst[3] = spi3TxFifoCtrl[0];
+assign fifoTxRst[4] = spi4TxFifoCtrl[0];
+assign fifoTxRst[5] = spi5TxFifoCtrl[0];
+assign fifoTxRst[6] = spi6TxFifoCtrl[0];
+
+assign Ld_i[0] = GPIOA[16];
+assign Ld_i[1] = GPIOA[17];
+assign Ld_i[2] = GPIOA[18];
+assign Ld_i[3] = GPIOA[19];
+assign Ld_i[4] = GPIOA[20];
+assign Ld_i[5] = GPIOA[21];
+assign Ld_i[6] = GPIOA[22];
+assign LD_o = Ld_i[0]&Ld_i[1]&Ld_i[2]&Ld_i[3]&Ld_i[4]&Ld_i[5]&Ld_i[6];
+
+assign wordCntRx[0] = spi0RxFifoCtrl[15:8];
+assign wordCntRx[1] = spi1RxFifoCtrl[15:8];
+assign wordCntRx[2] = spi2RxFifoCtrl[15:8];
+assign wordCntRx[3] = spi3RxFifoCtrl[15:8];
+assign wordCntRx[4] = spi4RxFifoCtrl[15:8];
+assign wordCntRx[5] = spi5RxFifoCtrl[15:8];
+assign wordCntRx[6] = spi6RxFifoCtrl[15:8];
+
+assign wordCntTx[0] = spi0TxFifoCtrl[15:8];
+assign wordCntTx[1] = spi1TxFifoCtrl[15:8];
+assign wordCntTx[2] = spi2TxFifoCtrl[15:8];
+assign wordCntTx[3] = spi3TxFifoCtrl[15:8];
+assign wordCntTx[4] = spi4TxFifoCtrl[15:8];
+assign wordCntTx[5] = spi5TxFifoCtrl[15:8];
+assign wordCntTx[6] = spi6TxFifoCtrl[15:8];
+
+
+assign CS0[0] = spi0CsCtrl[0];
+assign CS0[1] = spi1CsCtrl[0];
+assign CS0[2] = spi2CsCtrl[0];
+assign CS0[3] = spi3CsCtrl[0];
+assign CS0[4] = spi4CsCtrl[0];
+assign CS0[5] = spi5CsCtrl[0];
+assign CS0[6] = spi6CsCtrl[0];
+
+assign CS1[0] = spi0CsCtrl[1];
+assign CS1[1] = spi1CsCtrl[1];
+assign CS1[2] = spi2CsCtrl[1];
+assign CS1[3] = spi3CsCtrl[1];
+assign CS1[4] = spi4CsCtrl[1];
+assign CS1[5] = spi5CsCtrl[1];
+assign CS1[6] = spi6CsCtrl[1];
+
+
+assign Ss[0] = (spiMode)? SsQ[0]:SsR[0];
+assign Ss[1] = (spiMode)? SsQ[1]:SsR[1];
+assign Ss[2] = (spiMode)? SsQ[2]:SsR[2];
+assign Ss[3] = (spiMode)? SsQ[3]:SsR[3];
+assign Ss[4] = (spiMode)? SsQ[4]:SsR[4];
+assign Ss[5] = (spiMode)? SsQ[5]:SsR[5];
+assign Ss[6] = (spiMode)? SsQ[6]:SsR[6];
+
+assign Sck[0] = (spiMode)? SckQ[0]:SckR[0];
+assign Sck[1] = (spiMode)? SckQ[1]:SckR[1];
+assign Sck[2] = (spiMode)? SckQ[2]:SckR[2];
+assign Sck[3] = (spiMode)? SckQ[3]:SckR[3];
+assign Sck[4] = (spiMode)? SckQ[4]:SckR[4];
+assign Sck[5] = (spiMode)? SckQ[5]:SckR[5];
+assign Sck[6] = (spiMode)? SckQ[6]:SckR[6];
+
+assign Mosi0[0] = (spiMode)? Mosi0Q[0]:Mosi0R[0];
+assign Mosi0[1] = (spiMode)? Mosi0Q[1]:Mosi0R[1];
+assign Mosi0[2] = (spiMode)? Mosi0Q[2]:Mosi0R[2];
+assign Mosi0[3] = (spiMode)? Mosi0Q[3]:Mosi0R[3];
+assign Mosi0[4] = (spiMode)? Mosi0Q[4]:Mosi0R[4];
+assign Mosi0[5] = (spiMode)? Mosi0Q[5]:Mosi0R[5];
+assign Mosi0[6] = (spiMode)? Mosi0Q[6]:Mosi0R[6];
+
+assign valToTxFifoRead[0] = (spiMode)? valToTxQ[0]:valToTxR[0];
+assign valToTxFifoRead[1] = (spiMode)? valToTxQ[1]:valToTxR[1];
+assign valToTxFifoRead[2] = (spiMode)? valToTxQ[2]:valToTxR[2];
+assign valToTxFifoRead[3] = (spiMode)? valToTxQ[3]:valToTxR[3];
+assign valToTxFifoRead[4] = (spiMode)? valToTxQ[4]:valToTxR[4];
+assign valToTxFifoRead[5] = (spiMode)? valToTxQ[5]:valToTxR[5];
+assign valToTxFifoRead[6] = (spiMode)? valToTxQ[6]:valToTxR[6];
+
+assign valToRxFifo[0] = (spiMode)? valToRxQ[0]:valToRxR[0];
+assign valToRxFifo[1] = (spiMode)? valToRxQ[1]:valToRxR[1];
+assign valToRxFifo[2] = (spiMode)? valToRxQ[2]:valToRxR[2];
+assign valToRxFifo[3] = (spiMode)? valToRxQ[3]:valToRxR[3];
+assign valToRxFifo[4] = (spiMode)? valToRxQ[4]:valToRxR[4];
+assign valToRxFifo[5] = (spiMode)? valToRxQ[5]:valToRxR[5];
+assign valToRxFifo[6] = (spiMode)? valToRxQ[6]:valToRxR[6];
+
+assign dataToRxFifo[0] = (spiMode)? dataToRxFifoQ[0]:dataToRxFifoR[0];
+assign dataToRxFifo[1] = (spiMode)? dataToRxFifoQ[1]:dataToRxFifoR[1];
+assign dataToRxFifo[2] = (spiMode)? dataToRxFifoQ[2]:dataToRxFifoR[2];
+assign dataToRxFifo[3] = (spiMode)? dataToRxFifoQ[3]:dataToRxFifoR[3];
+assign dataToRxFifo[4] = (spiMode)? dataToRxFifoQ[4]:dataToRxFifoR[4];
+assign dataToRxFifo[5] = (spiMode)? dataToRxFifoQ[5]:dataToRxFifoR[5];
+assign dataToRxFifo[6] = (spiMode)? dataToRxFifoQ[6]:dataToRxFifoR[6];
+
+
+
 
 //================================================================================
 //  CODING
@@ -410,66 +503,66 @@ RegMap_inst (
     .Led_o(Led_o),
     .AnsDataReg_o(data),
     //Spi0
-    .Spi0CtrlReg_o(Spi0Ctrl),
-    .Spi0ClkReg_o(Spi0Clk),
-    .Spi0CsDelayReg_o(Spi0CsDelay),
-    .Spi0CsCtrlReg_o(Spi0CsCtrl),
-    .Spi0TxFifoCtrlReg_o(Spi0TxFifoCtrl),
-    .Spi0RxFifoCtrlReg_o(Spi0RxFifoCtrl),
-    .Spi0TxFifoReg_o(Spi0TxFifo),
-    .Spi0RxFifoReg_o(Spi0RxFifo),
+    .Spi0CtrlReg_o(spi0Ctrl),
+    .Spi0ClkReg_o(spi0Clk),
+    .Spi0CsDelayReg_o(spi0CsDelay),
+    .Spi0CsCtrlReg_o(spi0CsCtrl),
+    .Spi0TxFifoCtrlReg_o(spi0TxFifoCtrl),
+    .Spi0RxFifoCtrlReg_o(spi0RxFifoCtrl),
+    .Spi0TxFifoReg_o(spi0TxFifo),
+    .Spi0RxFifoReg_o(spi0RxFifo),
     //Spi1
-    .Spi1CtrlReg_o(Spi1Ctrl),
-    .Spi1ClkReg_o(Spi1Clk),
-    .Spi1CsDelayReg_o(Spi1CsDelay),
-    .Spi1CsCtrlReg_o(Spi1CsCtrl),
-    .Spi1TxFifoCtrlReg_o(Spi1TxFifoCtrl),
-    .Spi1RxFifoCtrlReg_o(Spi1RxFifoCtrl),
-    .Spi1TxFifoReg_o(Spi1TxFifo),
-    .Spi1RxFifoReg_o(Spi1RxFifo),
+    .Spi1CtrlReg_o(spi1Ctrl),
+    .Spi1ClkReg_o(spi1Clk),
+    .Spi1CsDelayReg_o(spi1CsDelay),
+    .Spi1CsCtrlReg_o(spi1CsCtrl),
+    .Spi1TxFifoCtrlReg_o(spi1TxFifoCtrl),
+    .Spi1RxFifoCtrlReg_o(spi1RxFifoCtrl),
+    .Spi1TxFifoReg_o(spi1TxFifo),
+    .Spi1RxFifoReg_o(spi1RxFifo),
     //Spi2
-    .Spi2CtrlReg_o(Spi2Ctrl),
-    .Spi2ClkReg_o(Spi2Clk),
-    .Spi2CsDelayReg_o(Spi2CsDelay),
-    .Spi2CsCtrlReg_o(Spi2CsCtrl),
-    .Spi2TxFifoCtrlReg_o(Spi2TxFifoCtrl),
-    .Spi2RxFifoCtrlReg_o(Spi2RxFifoCtrl),
-    .Spi2TxFifoReg_o(Spi2TxFifo),
+    .Spi2CtrlReg_o(spi2Ctrl),
+    .Spi2ClkReg_o(spi2Clk),
+    .Spi2CsDelayReg_o(spi2CsDelay),
+    .Spi2CsCtrlReg_o(spi2CsCtrl),
+    .Spi2TxFifoCtrlReg_o(spi2TxFifoCtrl),
+    .Spi2RxFifoCtrlReg_o(spi2RxFifoCtrl),
+    .Spi2TxFifoReg_o(spi2TxFifo),
     .Spi2RxFifoReg_o(Spi2RxFifo),
     //Spi3
-    .Spi3CtrlReg_o(Spi3Ctrl),
-    .Spi3ClkReg_o(Spi3Clk),
-    .Spi3CsDelayReg_o(Spi3CsDelay),
-    .Spi3CsCtrlReg_o(Spi3CsCtrl),
-    .Spi3TxFifoCtrlReg_o(Spi3TxFifoCtrl),
-    .Spi3RxFifoCtrlReg_o(Spi3RxFifoCtrl),
+    .Spi3CtrlReg_o(spi3Ctrl),
+    .Spi3ClkReg_o(spi3Clk),
+    .Spi3CsDelayReg_o(spi3CsDelay),
+    .Spi3CsCtrlReg_o(spi3CsCtrl),
+    .Spi3TxFifoCtrlReg_o(spi3TxFifoCtrl),
+    .Spi3RxFifoCtrlReg_o(spi3RxFifoCtrl),
     .Spi3TxFifoReg_o(Spi3TxFifo),
     .Spi3RxFifoReg_o(Spi3RxFifo),
     //Spi4
-    .Spi4CtrlReg_o(Spi4Ctrl),
-    .Spi4ClkReg_o(Spi4Clk),
-    .Spi4CsDelayReg_o(Spi4CsDelay),
-    .Spi4CsCtrlReg_o(Spi4CsCtrl),
-    .Spi4TxFifoCtrlReg_o(Spi4TxFifoCtrl),
-    .Spi4RxFifoCtrlReg_o(Spi4RxFifoCtrl),
+    .Spi4CtrlReg_o(spi4Ctrl),
+    .Spi4ClkReg_o(spi4Clk),
+    .Spi4CsDelayReg_o(spi4CsDelay),
+    .Spi4CsCtrlReg_o(spi4CsCtrl),
+    .Spi4TxFifoCtrlReg_o(spi4TxFifoCtrl),
+    .Spi4RxFifoCtrlReg_o(spi4RxFifoCtrl),
     .Spi4TxFifoReg_o(Spi4TxFifo),
     .Spi4RxFifoReg_o(Spi4RxFifo),
     //Spi5
-    .Spi5CtrlReg_o(Spi5Ctrl),
-    .Spi5ClkReg_o(Spi5Clk),
-    .Spi5CsDelayReg_o(Spi5CsDelay),
-    .Spi5CsCtrlReg_o(Spi5CsCtrl),
-    .Spi5TxFifoCtrlReg_o(Spi5TxFifoCtrl),
-    .Spi5RxFifoCtrlReg_o(Spi5RxFifoCtrl),
+    .Spi5CtrlReg_o(spi5Ctrl),
+    .Spi5ClkReg_o(spi5Clk),
+    .Spi5CsDelayReg_o(spi5CsDelay),
+    .Spi5CsCtrlReg_o(spi5CsCtrl),
+    .Spi5TxFifoCtrlReg_o(spi5TxFifoCtrl),
+    .Spi5RxFifoCtrlReg_o(spi5RxFifoCtrl),
     .Spi5TxFifoReg_o(Spi5TxFifo),
     .Spi5RxFifoReg_o(Spi5RxFifo),
     //Spi6
-    .Spi6CtrlReg_o(Spi6Ctrl),
-    .Spi6ClkReg_o(Spi6Clk),
-    .Spi6CsDelayReg_o(Spi6CsDelay),
-    .Spi6CsCtrlReg_o(Spi6CsCtrl),
-    .Spi6TxFifoCtrlReg_o(Spi6TxFifoCtrl),
-    .Spi6RxFifoCtrlReg_o(Spi6RxFifoCtrl),
+    .Spi6CtrlReg_o(spi6Ctrl),
+    .Spi6ClkReg_o(spi6Clk),
+    .Spi6CsDelayReg_o(spi6CsDelay),
+    .Spi6CsCtrlReg_o(spi6CsCtrl),
+    .Spi6TxFifoCtrlReg_o(spi6TxFifoCtrl),
+    .Spi6RxFifoCtrlReg_o(spi6RxFifoCtrl),
     .Spi6TxFifoReg_o(Spi6TxFifo),
     .Spi6RxFifoReg_o(Spi6RxFifo),
 
@@ -487,6 +580,7 @@ MmcmWrapper MainMmcm
 );
 
 
+
 genvar i;
 
 generate
@@ -504,21 +598,67 @@ generate
 		(
 			.WrClk_i	(gclk),
 			.RdClk_i	(spiClkBus[i]),
-			// .Rst_i		(initRst | FifoRxRst[i]),
-			.Rst_i		(spiSyncRst[i] | FifoRxRst[i]),
+			// .Rst_i		(initRst | fifoRxRst[i]),
+			.Rst_i		(spiSyncRst[i]),
             .SmcAre_i   (SmcAre_i),
+            .SmcAwe_i   (SmcAwe_i),
 	
 			.ToFifoVal_i	(toFifoVal[i]),
+            .ToFifoRxData_i (dataToRxFifo[i]),
+            .ToFifoRxWriteVal_i (valToRxFifo[i]),
+            .ToFifoTxReadVal_i (valToTxFifoRead[i]),
 			.ToFifoData_i	(toFifoData[32*i+:32]),
+
 			
 			.ToSpiVal_o		(toSpiVal[i]),
 			.ToSpiData_o	(toSpiData[i])
 		);
-		
+
+
+
+        SPIm SPIm_inst (
+            .Clk_i(spiClkBus[i]),
+            .Start_i(ten[i]),
+            .Rst_i(initRst| spiMode[i]),
+            .SPIdata(toSpiData[i]),
+            .Sck_o(SckR[i]),
+            .Ss_o(SsR[i]),
+            .Mosi0_o(Mosi0R[i]),
+            .WidthSel_i(widthSel[i]),
+            .PulsePol_i(CPOL[i]),
+            .CPHA_i(CPHA[i]),
+            .EndianSel_i(endianSel[i]),
+            .LAG_i(lag[i]),
+            .LEAD_i(leadx[i]),
+            .Stop_i(stopDelay[i]),
+            .SELST_i(selSt[i]),
+            .Val_o(valToTxR[i])
+
+
+
+
+
+
+
+        );
+
+        SPIs SPIs_inst (
+            .Clk_i(spiClkBus[i]),
+            .Rst_i(initRst|SpiRst_o[i]| spiMode[i]),
+            .Sck_i(SckR[i]),
+            .Ss_i(SsR[i]),
+            .Mosi0_i(Mosi0R[i]),
+            .WidthSel_i(widthSel[i]),
+            .SELST_i(selSt[i]),
+            .DataToRxFifo_o(dataToRxFifoR[i]),
+            .Val_o(valToRxR[i])
+        );
+
+
         QuadSPIm QuadSPIm_inst (
             .Clk_i(spiClkBus[i]),
             .Start_i(ten[i]),
-            .Rst_i(initRst),
+            .Rst_i(initRst| !spiMode[i]),
 			.SpiDataVal_i	(toSpiVal),
             // .SPIdata(32'h2aaa00aa),
             .SPIdata(toSpiData[i]),
@@ -532,11 +672,27 @@ generate
             .PulsePol_i(CPOL[i]),
             .CPHA_i(CPHA[i]),
             .EndianSel_i(endianSel[i]),
-            .LAG_i(lagx[i]),
+            .LAG_i(lag[i]),
             .LEAD_i(leadx[i]),
             .Stop_i(stopDelay[i]),
-            .SELST_i(selSt[i])
+            .SELST_i(selSt[i]),
+            .Val_o(valToTxQ[i])
         );
+        QuadSPIs QuadSPIs_inst (
+            .Clk_i(spiClkBus[i]),
+            .Rst_i(initRst|SpiRst_o[i]| !spiMode[i]),
+            .Sck_i(Sck[i]),
+            .Ss_i(Ss[i]),
+            .Mosi0_i(Mosi0[i]),
+            .Mosi1_i(Mosi1[i]),
+            .Mosi2_i(Mosi2[i]),
+            .Mosi3_i(Mosi3[i]),
+            .WidthSel_i(widthSel[i]),
+            .SELST_i(selSt[i]),
+            .DataToRxFifo_o(dataToRxFifoQ[i]),
+            .Val_o(valToRxQ[i])
+        );
+
     end
 endgenerate
 

+ 343 - 0
sources_1/new/SpiR/SPIm.v

@@ -0,0 +1,343 @@
+module SPIm (
+    input Clk_i,
+    input Rst_i,
+    input Start_i,
+    input CPHA_i,
+    input [31:0] SPIdata,
+	input SpiDataVal_i,
+    input SELST_i,
+    input [1:0] WidthSel_i,
+    input  LAG_i,
+    input  LEAD_i,
+    input EndianSel_i,
+    input [5:0] Stop_i,
+    input PulsePol_i,
+
+
+    output reg Mosi0_o,
+    output reg Sck_o,
+    output  Ss_o,
+    output reg Val_o
+);
+
+
+//================================================================================
+//	REG/WIRE
+//================================================================================
+
+reg startFlag;
+reg [2:0] ssCnt;
+reg Ss;
+reg SSr;
+reg [7:0] mosiReg0;
+reg [3:0] ssNum;
+reg [2:0] delayCnt;
+reg stopFlag;
+
+wire SsPol = SELST_i ? Ss : ~Ss;
+
+
+//================================================================================
+//  ASSIGNMENTS
+//================================================================================
+
+
+assign Ss_o = SsPol; 
+
+
+
+
+//================================================================================
+//	CODING
+//================================================================================
+
+
+
+always @(negedge Clk_i) begin 
+    if (Rst_i) begin 
+        delayCnt <= 1'b0;
+    end
+    else begin 
+        if (stopFlag &&delayCnt < Stop_i) begin 
+            delayCnt <= delayCnt + 1'b1;
+        end
+        else begin 
+            delayCnt <= 1'b0;
+        end
+    end
+end
+
+always @(posedge Clk_i) begin 
+    if (Rst_i) begin 
+        stopFlag <= 1'b0;
+    end
+    else begin
+        if (SELST_i) begin 
+            if (Ss && !SSr) begin 
+                stopFlag <= 1'b1;
+            end
+            else if ( delayCnt == Stop_i) begin 
+                stopFlag <= 1'b0;
+            end
+        end
+        else begin 
+            if (!Ss && SSr) begin 
+                stopFlag <= 1'b1;
+            end
+            else if (delayCnt == Stop_i) begin 
+                stopFlag <= 1'b0;
+            end
+        end
+    end
+end
+
+
+
+
+always @(*) begin 
+    if (PulsePol_i) begin 
+        if (CPHA_i) begin
+            if (LEAD_i == 0) begin 
+            if (!Ss && (ssCnt <= ssNum+LAG_i+LEAD_i && ssCnt > LAG_i) ) begin 
+                Sck_o = ~(~Clk_i);
+            end
+            else begin 
+                Sck_o = 1'b0;
+                end
+            end
+            else begin 
+                if (!Ss && (ssCnt < ssNum+LAG_i+LEAD_i && ssCnt > LAG_i)) begin 
+                    Sck_o = ~(~Clk_i);
+                end
+                else begin 
+                    Sck_o = 1'b0;
+                end
+            end
+        end
+        else begin
+            if (LEAD_i == 0) begin 
+                if (!Ss && (ssCnt <= ssNum+LAG_i+LEAD_i && ssCnt > LAG_i) ) begin 
+                    Sck_o = ~(Clk_i);
+                end
+                else begin 
+                    Sck_o = 1'b0;
+                end
+            end
+            else begin 
+                if (!Ss && (ssCnt < ssNum + LAG_i + LEAD_i && ssCnt > LAG_i)) begin 
+                    Sck_o = ~(Clk_i);
+                end
+                else begin 
+                    Sck_o = 1'b0;
+                end
+            end
+        end
+    end
+    else begin 
+        if (CPHA_i) begin
+            if (LEAD_i == 0) begin  
+                if (!Ss && (ssCnt <= ssNum+LAG_i+LEAD_i && ssCnt > LAG_i) ) begin 
+                    Sck_o = ~(Clk_i);
+                end
+                else begin 
+                    Sck_o = 1'b0;
+                end
+            end
+            else begin 
+                if (!Ss && (ssCnt <ssNum + LAG_i + LAG_i && ssCnt > LAG_i)) begin 
+                    Sck_o = ~(Clk_i);
+                end
+                else begin 
+                    Sck_o = 1'b0;
+                end
+            end
+        end 
+        else begin
+            if (LEAD_i == 0) begin 
+                if (!Ss && (ssCnt <= ssNum+LAG_i+LEAD_i && ssCnt > LAG_i) ) begin 
+                    Sck_o = ~(~Clk_i);
+                end
+                else begin 
+                    Sck_o = 1'b0;
+                end
+            end
+            else begin 
+                if (!Ss && (ssCnt < ssNum + LAG_i + LEAD_i && ssCnt > LAG_i)) begin 
+                    Sck_o = ~(~Clk_i);
+                end
+                else begin 
+                    Sck_o = 1'b0;
+                end
+            end
+        end
+    end
+end
+
+
+always @(*) begin
+    if (Rst_i) begin 
+        Mosi0_o = 1'b0;
+    end
+    else begin
+        if (!EndianSel_i) begin 
+            case (WidthSel_i)  
+                0 : begin
+                    Mosi0_o = (!Ss&& (ssCnt < ssNum+LAG_i && ssCnt > LAG_i))? (mosiReg0[7]):1'b0;
+                end
+                1 : begin
+                    Mosi0_o = (!Ss&& (ssCnt < ssNum+LAG_i && ssCnt > LAG_i))? (mosiReg0[15]):1'b0;
+                end
+                2 : begin
+                    Mosi0_o = (!Ss&& (ssCnt < ssNum+LAG_i && ssCnt > LAG_i))? (mosiReg0[23]):1'b0;
+                end
+                3 : begin
+                    Mosi0_o = (!Ss&& (ssCnt < ssNum+LAG_i && ssCnt > LAG_i))? (mosiReg0[31]):1'b0;
+                end
+            endcase
+        end
+        else begin 
+            case (WidthSel_i)  
+                0 : begin
+                    Mosi0_o = (!Ss&& (ssCnt < ssNum+LAG_i && ssCnt > LAG_i))? (mosiReg0[0]):1'b0;
+                end
+                1 : begin
+                    Mosi0_o = (!Ss&& (ssCnt < ssNum+LAG_i && ssCnt > LAG_i))? (mosiReg0[0]):1'b0;
+                end
+                2 : begin
+                    Mosi0_o = (!Ss&& (ssCnt < ssNum+LAG_i && ssCnt > LAG_i))? (mosiReg0[0]):1'b0;
+                end
+                3 : begin
+                    Mosi0_o = (!Ss&& (ssCnt < ssNum+LAG_i && ssCnt > LAG_i))? (mosiReg0[0]):1'b0;
+                end
+            endcase
+        end
+    end
+end
+
+
+
+
+always @(posedge Clk_i) begin
+    SSr <= Ss;
+end
+
+
+always @(*) begin 
+    if (Rst_i) begin 
+        startFlag = 1'b0;
+    end
+    else begin 
+        if (Start_i && !stopFlag) begin 
+            startFlag = 1'b1;
+        end
+        else begin 
+            startFlag = 1'b0;
+        end
+    end
+end
+
+always @(*) begin
+    if (SELST_i) begin 
+        if (Ss && !SSr) begin 
+            Val_o = 1'b1;
+        end
+        else begin 
+            Val_o = 1'b0;
+        end
+    end
+    else begin 
+        if (!Ss&& SSr) begin 
+            Val_o = 1'b1;
+        end
+        else begin 
+            Val_o = 1'b0;
+        end
+    end
+end
+
+always @(*) begin 
+    if (Rst_i) begin 
+        ssNum = 1'b0;
+    end
+    else begin 
+        case (WidthSel_i) 
+            0 : begin 
+                ssNum = 8;
+            end
+            1 : begin 
+                ssNum = 16;
+            end
+            2 : begin 
+                ssNum = 24;
+            end
+            3 : begin 
+                ssNum = 32;
+            end
+        endcase
+    end
+end
+
+
+always @(negedge Clk_i) begin 
+    if (Rst_i) begin 
+        ssCnt <= 1'b0;
+    end
+    else if (ssCnt < (ssNum+LAG_i+LEAD_i)  && startFlag  ) begin 
+        ssCnt <= ssCnt + 1'b1;
+    end
+    else begin
+        if (ssCnt == ssNum-1 || !startFlag) begin 
+            ssCnt <= 1'b0;
+        end
+    end
+end
+
+
+
+
+always @(negedge Clk_i) begin 
+    if (Rst_i) begin 
+        Ss <= 1'b1;
+    end
+    else begin 
+        if (ssCnt < (ssNum+LAG_i+LEAD_i)  && startFlag ) begin 
+            Ss <= 1'b0;
+        end
+        else begin 
+            Ss <= 1'b1;
+        end
+    end
+end
+
+
+always @(negedge Clk_i) begin 
+    if (Rst_i) begin 
+        mosiReg0 <= SPIdata[31:0];
+    end
+    else begin
+        if (!EndianSel_i) begin 
+            if (!SSr && (ssCnt > LAG_i && ssCnt < ssNum + LAG_i + LEAD_i)) begin
+                mosiReg0 <= mosiReg0 << 1;
+            end
+            else begin 
+                mosiReg0 <= SPIdata[31:0];
+            end
+        end
+        else begin 
+            if (!SSr && (ssCnt > LAG_i && ssCnt < ssNum + LAG_i + LEAD_i)) begin
+                mosiReg0 <= mosiReg0 >> 1;
+            end
+            else begin 
+                mosiReg0 <= SPIdata[31:0];
+            end
+        end
+    end
+end
+
+
+
+
+
+
+
+endmodule

+ 157 - 0
sources_1/new/SpiR/SPIs.v

@@ -0,0 +1,157 @@
+module SPIs (
+    input Clk_i,
+    input Rst_i,
+
+    input Sck_i,
+    input Ss_i,
+    input Mosi0_i,
+    input [1:0] WidthSel_i,
+    input SELST_i,
+   
+
+    output reg [23:0] Data_o,
+    output reg [7:0] Addr_o,
+    output [31:0] DataToRxFifo_o,
+    output reg Val_o
+);
+
+//================================================================================
+//	REG/WIRE
+//================================================================================
+
+reg ssReg;
+reg ssRegR;  
+reg [31:0] shiftReg;
+
+reg [31:0] shiftRegM; 
+ 
+
+//===============================================================================
+//  ASSIGNMENTS
+
+
+assign DataToRxFifo_o = {Addr_o, Data_o};
+
+//================================================================================
+//	CODING
+//================================================================================
+
+always	@(posedge	Clk_i)	begin
+	ssReg	<=	Ss_i;
+	ssRegR	<=	ssReg;
+end
+
+
+always @(*) begin 
+    if (Rst_i) begin
+      shiftRegM = 32'h0;
+    end
+    else begin 
+        case(WidthSel_i)  
+             0: begin 
+                shiftRegM = shiftReg[7:0];
+            end
+            1: begin 
+                shiftRegM = shiftReg[15:0];
+            end
+            2: begin 
+                shiftRegM = shiftReg[23:0];
+            end
+            3: begin 
+                shiftRegM = shiftReg[31:0];
+            end
+        endcase
+    end
+end
+
+
+
+always @(posedge Clk_i) begin 
+    if (Rst_i) begin 
+        Data_o <= 24'h0;
+    end
+    else begin
+        if (SELST_i) begin  
+            if (ssReg && !ssRegR) begin 
+                Data_o <= shiftRegM;
+            end
+        end
+        else begin 
+            if (!ssReg && ssRegR) begin 
+                Data_o <= shiftRegM[23:0];
+            end
+        end
+    end
+end
+
+always @(posedge Clk_i) begin 
+    if (Rst_i) begin 
+        Addr_o <= 8'h0;
+    end
+    else begin
+        if (SELST_i) begin 
+            if (ssReg && !ssRegR) begin 
+                Addr_o <= shiftRegM[31:24];
+            end
+        end
+        else begin 
+            if (!ssReg && ssRegR) begin 
+                Addr_o <= shiftRegM[31:24];
+            end
+        end
+    end
+end
+
+
+
+
+always @(posedge Sck_i or posedge Rst_i) begin 
+    if (Rst_i) begin 
+        shiftReg<= 32'h0;
+    end
+    else begin
+        if (SELST_i) begin   
+            if (!Ss_i) begin 
+                shiftReg<= {shiftReg[30:0], Mosi0_i};
+            end
+            else begin 
+                shiftReg<= 32'h0;
+            end
+        end
+        else begin 
+            if (Ss_i) begin 
+                shiftReg<= {shiftReg[30:0], Mosi0_i};
+            end
+            else begin 
+                shiftReg<= 32'h0;
+            end
+        end
+    end
+end
+
+
+
+
+always @(posedge Clk_i) begin
+    if (SELST_i) begin 
+        if (ssReg && !ssRegR) begin 
+            Val_o <= 1'b1;
+        end
+        else begin 
+            Val_o <= 1'b0;
+        end
+    end
+    else begin 
+        if (!ssReg&& ssRegR) begin 
+            Val_o <= 1'b1;
+        end
+        else begin 
+            Val_o <= 1'b0;
+        end
+    end
+end
+
+
+
+
+endmodule