Browse Source

Переработаны модули QuadSpiM и SpiM. Написан тестбенч для этих модулей.

ChStepan 1 year ago
parent
commit
d8426603a5
3 changed files with 624 additions and 602 deletions
  1. 77 261
      sources_1/new/QuadSPI/QuadSPIm.v
  2. 39 8
      sources_1/new/QuadSPI/QuadSPImTb.v
  3. 508 333
      sources_1/new/SpiR/SPIm.v

+ 77 - 261
sources_1/new/QuadSPI/QuadSPIm.v

@@ -1,5 +1,6 @@
 
-module QuadSPIm(
+module QuadSPIm
+(
     input Clk_i,
     input Rst_i,
     input Start_i,
@@ -33,7 +34,6 @@ module QuadSPIm(
     reg [5:0] ssCnt;
     reg ss;
     reg ssR;
-    reg [31:0] spiDataR;
     reg oldDataFlag;
     reg [7:0] mosiReg0;
     reg [7:0] mosiReg1;
@@ -81,45 +81,43 @@ module QuadSPIm(
             end
         end
     end
-    
-    always @(posedge Clk_i) begin 
+	
+	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 else begin 
+			if (stopFlag) begin 
+				delayCnt <= delayCnt + 1'b1;
+			end else begin
+				delayCnt <= 0;
+			end
+		end
     end
-    
-    always @(posedge Clk_i) begin 
+	
+    always @(*) begin 
         if (Rst_i) begin 
-            stopFlag <= 1'b0;
+            stopFlag = 1'b0;
         end
         else begin
 			if (Stop_i != 0) begin
 				if (SelSt_i) begin 
 					if (ss && !ssR) begin 
-						stopFlag <= 1'b1;
+						stopFlag = 1'b1;
 					end
-					else if ( delayCnt == Stop_i) begin 
-						stopFlag <= 1'b0;
+					else if (delayCnt == Stop_i-1) begin 
+						stopFlag = 1'b0;
 					end
 				end
 				else begin 
 					if (!ss && ssR) begin 
-						stopFlag <= 1'b1;
+						stopFlag = 1'b1;
 					end
-					else if (delayCnt == Stop_i) begin 
-						stopFlag <= 1'b0;
+					else if (delayCnt == Stop_i-1) begin 
+						stopFlag = 1'b0;
 					end
 				end
 			end else begin
-				stopFlag <= 1'b0;
+				stopFlag = 1'b0;
 			end
         end
     end
@@ -162,7 +160,7 @@ module QuadSPIm(
 										Sck_o = 0;
 									end
 								end else begin
-									if (ssCnt >0 && ssCnt < txLenght-2) begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
 										Sck_o = Clk_i;
 									end else begin
 										Sck_o = 0;
@@ -193,7 +191,7 @@ module QuadSPIm(
 										Sck_o = 0;
 									end
 								end else begin
-									if (ssCnt >0 && ssCnt < txLenght-2) begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
 										Sck_o = !Clk_i;
 									end else begin
 										Sck_o = 0;
@@ -224,7 +222,7 @@ module QuadSPIm(
 										Sck_o = 0;
 									end
 								end else begin
-									if (ssCnt >0 && ssCnt < txLenght-2) begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
 										Sck_o = !Clk_i;
 									end else begin
 										Sck_o = 0;
@@ -255,7 +253,7 @@ module QuadSPIm(
 										Sck_o = 0;
 									end
 								end else begin
-									if (ssCnt >0 && ssCnt < txLenght-2) begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
 										Sck_o = Clk_i;
 									end else begin
 										Sck_o = 0;
@@ -286,7 +284,7 @@ module QuadSPIm(
 										Sck_o = 0;
 									end
 								end else begin
-									if (ssCnt >0 && ssCnt < txLenght-2) begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
 										Sck_o = !Clk_i;
 									end else begin
 										Sck_o = 0;
@@ -317,7 +315,7 @@ module QuadSPIm(
 										Sck_o = 0;
 									end
 								end else begin
-									if (ssCnt >0 && ssCnt < txLenght-2) begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
 										Sck_o = !Clk_i;
 									end else begin
 										Sck_o = 0;
@@ -348,7 +346,7 @@ module QuadSPIm(
 										Sck_o = 0;
 									end
 								end else begin
-									if (ssCnt >0 && ssCnt < txLenght-2) begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
 										Sck_o = !Clk_i;
 									end else begin
 										Sck_o = 0;
@@ -379,7 +377,7 @@ module QuadSPIm(
 										Sck_o = 0;
 									end
 								end else begin
-									if (ssCnt >0 && ssCnt < txLenght-2) begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
 										Sck_o = Clk_i;
 									end else begin
 										Sck_o = 0;
@@ -388,217 +386,55 @@ module QuadSPIm(
 							end
 						end
 				endcase
+			end else begin
+				if (startFlag) begin
+					if (SelSt_i) begin
+						if (!ss) begin
+							if (PulsePol_i) begin 
+								if (ClockPhase_i) begin
+									Sck_o = ~(~Clk_i);
+								end
+								else begin 
+									Sck_o = ~Clk_i;
+								end
+							end else begin
+								if (ClockPhase_i) begin
+									Sck_o = ~(Clk_i);
+								end
+								else begin 
+									Sck_o = ~(~Clk_i);
+								end
+							end
+						end else begin
+							Sck_o = 1'b0;
+						end
+					end else begin
+						if (ss) begin
+							if (PulsePol_i) begin 
+								if (ClockPhase_i) begin
+									Sck_o = ~(~Clk_i);
+								end
+								else begin 
+									Sck_o = ~Clk_i;
+								end
+							end else begin
+								if (ClockPhase_i) begin
+									Sck_o = ~(Clk_i);
+								end
+								else begin 
+									Sck_o = ~(~Clk_i);
+								end
+							end
+						end else begin
+							Sck_o = 1'b0;
+						end
+					end
+				end else begin
+					Sck_o = 0;
+				end
 			end
 		end
 	end
-	
-    // always @(*) begin
-		// if (Stop_i != 0) begin
-			// if (SelSt_i) begin 
-				// if (PulsePol_i) begin 
-					// if (ClockPhase_i) begin
-						// if (Lead_i == 0) begin 
-							// if (!ss && (ssCnt <= txLenght-1 && ssCnt > Lag_i) ) begin 
-								// Sck_o = ~(~Clk_i);
-							// end
-							// else begin 
-								// Sck_o = 1'b0;
-							// end
-						// end
-						// else begin 
-							// if (!ss && (ssCnt < txLenght-1 && 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 <= txLenght-1 && ssCnt > Lag_i) ) begin 
-								// Sck_o = ~(Clk_i);
-							// end
-							// else begin 
-								// Sck_o = 1'b0;
-							// end
-						// end
-						// else begin 
-							// if (!ss && (ssCnt < txLenght-1 && ssCnt > Lag_i)) begin 
-								// Sck_o = ~(Clk_i);
-							// end
-							// else begin 
-								// Sck_o = 1'b0;
-							// end
-						// end
-					// end
-				// end
-				// else begin 
-					// if (ClockPhase_i) begin
-						// if (Lead_i == 0) begin  
-							// if (!ss && (ssCnt <= txLenght-1 && ssCnt > Lag_i) ) begin 
-								// Sck_o = ~(Clk_i);
-							// end
-							// else begin 
-								// Sck_o = 1'b0;
-							// end
-						// end
-						// else begin 
-							// if (!ss && (ssCnt <txLenght-1 && 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 <= txLenght-1 && ssCnt > Lag_i) ) begin 
-								// Sck_o = ~(~Clk_i);
-							// end
-							// else begin 
-								// Sck_o = 1'b0;
-							// end
-						// end
-						// else begin 
-							// if (!ss && (ssCnt < txLenght-1 && ssCnt > Lag_i)) begin 
-								// Sck_o = ~(~Clk_i);
-							// end
-							// else begin 
-								// Sck_o = 1'b0;
-							// end
-						// end
-					// end
-				// end
-			// end
-			// else begin 
-				// if (PulsePol_i) begin 
-					// if (ClockPhase_i) begin
-						// if (Lead_i == 0) begin 
-							// if (ss && (ssCnt <= txLenght-1 && ssCnt > Lag_i) ) begin 
-								// Sck_o = ~(~Clk_i);
-							// end
-							// else begin 
-								// Sck_o = 1'b0;
-							// end
-						// end
-						// else begin 
-							// if (ss && (ssCnt < txLenght-1 && 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 <= txLenght-1 && ssCnt > Lag_i) ) begin 
-								// Sck_o = ~(Clk_i);
-							// end
-							// else begin 
-								// Sck_o = 1'b0;
-							// end
-						// end
-						// else begin 
-							// if (ss && (ssCnt < txLenght-1 && ssCnt > Lag_i)) begin 
-								// Sck_o = ~(Clk_i);
-							// end
-							// else begin 
-								// Sck_o = 1'b0;
-							// end
-						// end
-					// end
-				// end
-				// else begin 
-					// if (ClockPhase_i) begin
-						// if (Lead_i == 0) begin  
-							// if (ss && (ssCnt <= txLenght-1 && ssCnt > Lag_i) ) begin 
-								// Sck_o = ~(Clk_i);
-							// end
-							// else begin 
-								// Sck_o = 1'b0;
-							// end
-						// end
-						// else begin 
-							// if (ss && (ssCnt <txLenght-1 && 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 <= txLenght-1 && ssCnt > Lag_i) ) begin 
-								// Sck_o = ~(~Clk_i);
-							// end
-							// else begin 
-								// Sck_o = 1'b0;
-							// end
-						// end
-						// else begin 
-							// if (ss && (ssCnt < txLenght-1 && ssCnt > Lag_i)) begin 
-								// Sck_o = ~(~Clk_i);
-							// end
-							// else begin 
-								// Sck_o = 1'b0;
-							// end
-						// end
-					// end
-				// end
-			// end
-		// end else begin
-			// if (startFlag) begin
-				// if (SelSt_i) begin
-					// if (!ss) begin
-						// if (PulsePol_i) begin 
-							// if (ClockPhase_i) begin
-								// Sck_o = ~(~Clk_i);
-							// end
-							// else begin 
-								// Sck_o = ~Clk_i;
-							// end
-						// end else begin
-							// if (ClockPhase_i) begin
-								// Sck_o = ~(Clk_i);
-							// end
-							// else begin 
-								// Sck_o = ~(~Clk_i);
-							// end
-						// end
-					// end else begin
-						// Sck_o <= 1'b0;
-					// end
-				// end else begin
-					// if (ss) begin
-						// if (PulsePol_i) begin 
-							// if (ClockPhase_i) begin
-								// Sck_o = ~(~Clk_i);
-							// end
-							// else begin 
-								// Sck_o = ~Clk_i;
-							// end
-						// end else begin
-							// if (ClockPhase_i) begin
-								// Sck_o = ~(Clk_i);
-							// end
-							// else begin 
-								// Sck_o = ~(~Clk_i);
-							// end
-						// end
-					// end else begin
-						// Sck_o <= 1'b0;
-					// end
-				// end
-			// end else begin
-				// Sck_o = 0;
-			// end
-		// end
-    // end
-    
     
     always @(*) begin
         if (SelSt_i) begin 
@@ -734,13 +570,6 @@ module QuadSPIm(
 			end
 		end
     end
-	
-    
-    always @(posedge Clk_i) begin
-        if (valReg) begin  
-            spiDataR <= SpiData_i;
-        end
-    end
     
     always @(*) begin 
         if (Rst_i) begin 
@@ -1354,18 +1183,5 @@ module QuadSPIm(
             endcase
         end
     end
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    
-    endmodule
+
+endmodule

+ 39 - 8
sources_1/new/QuadSPI/QuadSPImTb.v

@@ -11,20 +11,22 @@ parameter CLK_PERIOD = 8.13; // Clock period in ns
 reg rst;
 reg clk;
 
-// localparam [31:0] startData = 32'h1;
-localparam [31:0] startData = 32'h0A0B0C0D;
+localparam [31:0] startData = 32'h1;
+// localparam [31:0] startData = 32'h0A0B0C0D;
 
 reg [31:0] data;
+reg [31:0] dataS;
 
 wire [1:0] widthSel  = 2'h3;
 wire clockPol = 1'b0;
 wire clockPhase = 1'b0;
 wire endianSel = 1'b0;
 wire lag = 1'b0;
-wire leadx = 1'b0;
-wire [5:0] stopDelay = 6'h1;
+wire lead = 1'b0;
+wire [5:0] stopDelay = 6'h0;
 wire selSt = 1'b1;
 wire val;
+wire valS;
 
 reg [31:0] tbCnt;
 
@@ -63,8 +65,15 @@ always @(posedge clk) begin
 	if (rst) begin
 		data <= startData;
 	end else if (val) begin
-		// data <= data+32'h1000;
-		data <= data;
+		data <= data+32'h1000;
+	end
+end
+
+always @(posedge clk) begin
+	if (rst) begin
+		dataS <= startData;
+	end else if (valS) begin
+		dataS <= dataS+32'h1000;
 	end
 end
 
@@ -86,10 +95,32 @@ QuadSPIm QuadSPIm
 	.ClockPhase_i(clockPhase),
 	.EndianSel_i(endianSel),
 	.Lag_i(lag),
-	.Lead_i(leadx),
+	.Lead_i(lead),
 	.Stop_i(stopDelay),
 	.SelSt_i(selSt),
 	.Val_o(val)
 );
-			
+
+SPIm Spi
+(
+    .Clk_i			(clk),
+    .Rst_i			(rst),
+    .Start_i		(start),
+    .EmptyFlag_i	(fifoEmpty),
+    .ClockPhase_i	(clockPol),
+    .SpiData_i		(dataS),
+    .SelSt_i		(selSt),
+    .WidthSel_i		(widthSel),
+    .Lag_i			(lag),
+    .Lead_i			(lead),
+    .EndianSel_i	(endianSel),
+    .Stop_i			(stopDelay),
+    .PulsePol_i		(clockPol),
+
+
+    .Mosi0_o		(),
+    .Sck_o			(),
+    .Ss_o			(),
+    .Val_o			(valS)
+);			
 endmodule

+ 508 - 333
sources_1/new/SpiR/SPIm.v

@@ -1,4 +1,5 @@
-module SPIm (
+module SPIm 
+(
     input Clk_i,
     input Rst_i,
     input Start_i,
@@ -26,15 +27,10 @@ module SPIm (
 //================================================================================
 
     reg startFlag;
-    reg startR;
-    reg [31:0] trCnt;
     reg valReg;
-    reg valToRxFifo1;
     reg lineBusy;
     reg [5:0] ssCnt;
-    reg Ss;
-    reg [31:0]spiDataR;
-    reg oldDataFlag;
+    reg ss;
     
     reg ssR;
     reg SSR;
@@ -43,15 +39,13 @@ module SPIm (
     reg [2:0] delayCnt;
     reg stopFlag;
     
-    wire ssPol = SelSt_i ? Ss : ~Ss;
-    
-    
+    wire [31:0] txLenght = ssNum+Lag_i+Lead_i;
     //================================================================================
     //  ASSIGNMENTS
     //================================================================================
     
     
-    assign Ss_o = ssPol; 
+    assign Ss_o = ss; 
     
     //================================================================================
     //	CODING
@@ -66,7 +60,6 @@ module SPIm (
         end
     end
     
-    
     always @(*) begin 
         if (SelSt_i) begin 
             if (!Ss_o) begin 
@@ -86,249 +79,359 @@ module SPIm (
         end
     end
     
-    
-    
-    always @(posedge Clk_i) begin
-        if (valReg) begin  
-            spiDataR <= SpiData_i;
-        end
-    end
-    
-    
-    always @(*) begin 
-        if (Rst_i) begin 
-            oldDataFlag = 1'b0;
-        end
-        else begin 
-            if (spiDataR == SpiData_i && (SpiData_i != 0) || EmptyFlag_i) begin 
-                oldDataFlag = 1'b1;
-            end
-            else begin 
-                oldDataFlag = 1'b0;
-            end
-        end
-    end
-    
-    
-    always @(posedge Clk_i) begin 
-        startR <= Start_i;
-    end
-    
-    always @(*) begin 
-        if (Rst_i) begin 
-            valToRxFifo1 = 1'b0;
-        end
-        else begin 
-            if (Start_i && !startR) begin 
-                valToRxFifo1 = 1'b1;
-            end
-            else begin 
-                valToRxFifo1 = 1'b0;
-            end
-        end
-    end
-    
-    always @(negedge Clk_i) begin 
+	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 else begin 
+			if (stopFlag) begin 
+				delayCnt <= delayCnt + 1'b1;
+			end else begin
+				delayCnt <= 0;
+			end
+		end
     end
     
-    always @(posedge Clk_i) begin 
+    always @(*) begin 
         if (Rst_i) begin 
-            stopFlag <= 1'b0;
+            stopFlag = 1'b0;
         end
         else begin
-            if (SelSt_i) begin 
-                if (ssPol && !ssR) begin 
-                    stopFlag <= 1'b1;
-                end
-                else if ( delayCnt == Stop_i) begin 
-                    stopFlag <= 1'b0;
-                end
-            end
-            else begin 
-                if (!ssPol && ssR) begin 
-                    stopFlag <= 1'b1;
-                end
-                else if (delayCnt == Stop_i) begin 
-                    stopFlag <= 1'b0;
-                end
-            end
+			if (Stop_i != 0) begin
+				if (SelSt_i) begin 
+					if (ss && !ssR) begin 
+						stopFlag = 1'b1;
+					end
+					else if (delayCnt == Stop_i-1) begin 
+						stopFlag = 1'b0;
+					end
+				end
+				else begin 
+					if (!ss && ssR) begin 
+						stopFlag = 1'b1;
+					end
+					else if (delayCnt == Stop_i-1) begin 
+						stopFlag = 1'b0;
+					end
+				end
+			end else begin
+				stopFlag = 1'b0;
+			end
         end
     end
     
-    
-    
-    
+	reg [2:0] clkCtrlReg;
+	always @(posedge Clk_i) begin
+		if (Rst_i) 	begin
+			clkCtrlReg <= 0;
+		end else begin
+			clkCtrlReg <= {SelSt_i,PulsePol_i,ClockPhase_i};
+		end
+	end
+	
     always @(*) begin
-        if (SelSt_i) begin 
-            if (PulsePol_i) begin 
-                if (ClockPhase_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 (ClockPhase_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
-        else begin 
-              if (PulsePol_i) begin 
-                if (ClockPhase_i) begin
-                    if (Lead_i == 0) begin 
-                        if (ssPol && (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 (ssPol && (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 (ssPol && (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 (ssPol && (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 (ClockPhase_i) begin
-                    if (Lead_i == 0) begin  
-                        if (ssPol && (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 (ssPol && (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 (ssPol && (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 (ssPol && (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
-            
-    end
-    
+		if (Rst_i) begin
+			Sck_o = 0;
+		end else begin
+			if (Stop_i!=0) begin
+				case (clkCtrlReg) 
+					0:	begin
+							if (!Lag_i) begin
+								if (!Lead_i) begin
+									if (!ss) begin
+										Sck_o = Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt < txLenght-1) begin
+										Sck_o = Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end else begin
+								if (!Lead_i) begin
+									if (ssCnt > 0) begin
+										Sck_o = Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
+										Sck_o = Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end
+						end
+					1:	begin
+							if (!Lag_i) begin
+								if (!Lead_i) begin
+									if (!ss) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt < txLenght-1) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end else begin
+								if (!Lead_i) begin
+									if (ssCnt > 0) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end
+						end
+					2:	begin
+							if (!Lag_i) begin
+								if (!Lead_i) begin
+									if (!ss) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt < txLenght-1) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end else begin
+								if (!Lead_i) begin
+									if (ssCnt > 0) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end
+						end
+					3:	begin
+							if (!Lag_i) begin
+								if (!Lead_i) begin
+									if (!ss) begin
+										Sck_o = Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt < txLenght-1) begin
+										Sck_o = Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end else begin
+								if (!Lead_i) begin
+									if (ssCnt > 0) begin
+										Sck_o = Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
+										Sck_o = Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end
+						end
+					4:	begin
+							if (!Lag_i) begin
+								if (!Lead_i) begin
+									if (!ss) begin
+										Sck_o = ~Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt < txLenght-1) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end else begin
+								if (!Lead_i) begin
+									if (ssCnt > 0) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end
+						end
+					5:	begin
+							if (!Lag_i) begin
+								if (!Lead_i) begin
+									if (!ss) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt < txLenght-1) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end else begin
+								if (!Lead_i) begin
+									if (ssCnt > 0) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end
+						end
+					6:	begin
+							if (!Lag_i) begin
+								if (!Lead_i) begin
+									if (!ss) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt < txLenght-1) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end else begin
+								if (!Lead_i) begin
+									if (ssCnt > 0) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
+										Sck_o = !Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end
+						end
+					7:	begin
+							if (!Lag_i) begin
+								if (!Lead_i) begin
+									if (!ss) begin
+										Sck_o = Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt < txLenght-1) begin
+										Sck_o = Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end else begin
+								if (!Lead_i) begin
+									if (ssCnt > 0) begin
+										Sck_o = Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end else begin
+									if (ssCnt >0 && ssCnt < txLenght-1) begin
+										Sck_o = Clk_i;
+									end else begin
+										Sck_o = 0;
+									end
+								end
+							end
+						end
+				endcase
+			end else begin
+				if (startFlag) begin
+					if (SelSt_i) begin
+						if (!ss) begin
+							if (PulsePol_i) begin 
+								if (ClockPhase_i) begin
+									Sck_o = Clk_i;
+								end
+								else begin 
+									Sck_o = ~Clk_i;
+								end
+							end else begin
+								if (ClockPhase_i) begin
+									Sck_o = ~Clk_i;
+								end
+								else begin 
+									Sck_o = Clk_i;
+								end
+							end
+						end else begin
+							Sck_o = 1'b0;
+						end
+					end else begin
+						if (ss) begin
+							if (PulsePol_i) begin 
+								if (ClockPhase_i) begin
+									Sck_o = Clk_i;
+								end
+								else begin 
+									Sck_o = ~Clk_i;
+								end
+							end else begin
+								if (ClockPhase_i) begin
+									Sck_o = ~Clk_i;
+								end
+								else begin 
+									Sck_o = Clk_i;
+								end
+							end
+						end else begin
+							Sck_o = 1'b0;
+						end
+					end
+				end else begin
+					Sck_o = 0;
+				end
+			end
+		end
+	end  
     
     always @(*) begin
         if (Rst_i) begin 
@@ -339,32 +442,32 @@ module SPIm (
                 if (!EndianSel_i) begin 
                     case (WidthSel_i)  
                         0 : begin
-                            Mosi0_o = (!Ss&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[7]):1'b0;
+                            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;
+                            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;
+                            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;
+                            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;
+                            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;
+                            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;
+                            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;
+                            Mosi0_o = (!ss&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[0]):1'b0;
                         end
                     endcase
                 end
@@ -373,53 +476,49 @@ module SPIm (
                 if (!EndianSel_i) begin 
                     case (WidthSel_i)  
                         0 : begin
-                            Mosi0_o = (ssPol&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[7]):1'b0;
+                            Mosi0_o = (ss&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[7]):1'b0;
                         end
                         1 : begin
-                            Mosi0_o = (ssPol&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[15]):1'b0;
+                            Mosi0_o = (ss&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[15]):1'b0;
                         end
                         2 : begin
-                            Mosi0_o = (ssPol&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[23]):1'b0;
+                            Mosi0_o = (ss&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[23]):1'b0;
                         end
                         3 : begin
-                            Mosi0_o = (ssPol&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[31]):1'b0;
+                            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 = (ssPol&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[0]):1'b0;
+                            Mosi0_o = (ss&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[0]):1'b0;
                         end
                         1 : begin
-                            Mosi0_o = (ssPol&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[0]):1'b0;
+                            Mosi0_o = (ss&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[0]):1'b0;
                         end
                         2 : begin
-                            Mosi0_o = (ssPol&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[0]):1'b0;
+                            Mosi0_o = (ss&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[0]):1'b0;
                         end
                         3 : begin
-                            Mosi0_o = (ssPol&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[0]):1'b0;
+                            Mosi0_o = (ss&& (ssCnt <= ssNum+Lag_i && ssCnt > Lag_i))? (mosiReg0[0]):1'b0;
                         end
                     endcase
                 end
             end
         end
     end
-    
-    
-    
+
     always @(posedge Clk_i) begin
-        ssR <= ssPol;
-        SSR <= Ss;
+        ssR <= ss;
     end
     
-    
     always @(*) begin 
         if (Rst_i) begin 
             startFlag = 1'b0;
         end
         else begin 
-            if (Start_i && !stopFlag && !EmptyFlag_i) begin 
+            if (Start_i && !stopFlag && !EmptyFlag_i ) begin 
                 startFlag = 1'b1;
             end
             else begin 
@@ -428,26 +527,18 @@ module SPIm (
         end
     end
     
-    always @(*) begin
-        if (SelSt_i) begin 
-            if (Ss_o && !ssR) begin 
-                valReg = 1'b1;
-            end
-            else begin 
-                valReg = 1'b0;
-            end
-        end
-        else begin 
-            if (!Ss_o&& ssR) begin 
-                valReg = 1'b1;
-            end
-            else begin 
-                valReg = 1'b0;
-            end
-        end
+    always @(posedge Clk_i) begin
+        if (Rst_i) begin
+			valReg <= 0;
+		end else begin
+			if (ssCnt == txLenght-2) begin
+				valReg <= 1;
+			end else begin
+				valReg <= 0;
+			end
+		end
     end
     
-    
     always @(*) begin 
         if (Rst_i) begin 
             ssNum = 1'b0;
@@ -471,66 +562,150 @@ module SPIm (
     end
     
     
-    always @(negedge Clk_i) begin 
+	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;
+            ssCnt <= 0;
         end
         else begin
-            if (ssCnt == ssNum-1 || !startFlag) begin 
-                ssCnt <= 1'b0;
-            end
-        end
+			if (SelSt_i) begin
+				if (!ss) begin
+					if (ssCnt != txLenght-1) begin 
+						ssCnt <= ssCnt + 1;
+					end else begin
+						ssCnt <= 0;
+					end
+				end else begin
+					ssCnt <= 0;
+				end
+			end else begin
+				if (ss) begin
+					if (ssCnt != txLenght-1) begin 
+						ssCnt <= ssCnt + 1;
+					end else begin
+						ssCnt <= 0;
+					end
+				end else begin
+					ssCnt <= 0;
+				end
+			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
+    always @(negedge Clk_i) begin
+		if (Rst_i) begin 
+			ss <= 1'b1;
+		end else begin
+			if (Stop_i != 0) begin
+				if (startFlag) begin
+					if (SelSt_i) begin  
+						if (ssCnt != txLenght-1) begin 
+							ss <= 1'b0;
+						end
+						else begin 
+							ss <= 1'b1;
+						end
+					end else begin
+						if (ssCnt != txLenght-1) begin 
+							ss <= 1'b1;
+						end
+						else begin 
+							ss <= 1'b0;
+						end
+					end
+				end else begin
+					if (SelSt_i) begin  
+						ss <= 1'b1;
+					end else begin 
+						ss <= 1'b0;
+					end
+				end
+			end else begin
+				if (startFlag) begin
+					if (SelSt_i) begin
+						ss <= 1'b0;
+					end else begin
+						ss <= 1'b1;
+					end
+				end else begin
+					if (SelSt_i) begin
+						ss <= 1'b1;
+					end else begin
+						ss <= 1'b0;
+					end
+				end
+			end
         end
     end
     
-    
     always @(negedge Clk_i) begin 
         if (Rst_i) begin 
             mosiReg0 <= SpiData_i[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_i[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_i[31:0];
-                end
-            end
+			if (SelSt_i) begin
+				if (!EndianSel_i) begin 
+					if (Lag_i!=0) begin
+						if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
+							mosiReg0 <= mosiReg0 << 1;
+						end else begin 
+							mosiReg0 <= SpiData_i[31:0];
+						end
+					end else begin
+						if (!ss&& (ssCnt < txLenght-1)) begin
+							mosiReg0 <= mosiReg0 << 1;
+						end else begin 
+							mosiReg0 <= SpiData_i[31:0];
+						end
+					end
+				end else begin 
+					if (Lag_i!=0) begin
+						if (!ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
+							mosiReg0 <= mosiReg0 >> 1;
+						end
+						else begin 
+							mosiReg0 <= SpiData_i[31:0];
+						end
+					end else begin
+						if (!ss&& (ssCnt < txLenght-1)) begin
+							mosiReg0 <= mosiReg0 << 1;
+						end else begin 
+							mosiReg0 <= SpiData_i[31:0];
+						end
+					end
+				end
+			end else begin
+				if (!EndianSel_i) begin 
+					if (Lag_i!=0) begin
+						if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
+							mosiReg0 <= mosiReg0 << 1;
+						end else begin 
+							mosiReg0 <= SpiData_i[31:0];
+						end
+					end else begin
+						if (ss&& (ssCnt < txLenght-1)) begin
+							mosiReg0 <= mosiReg0 << 1;
+						end else begin 
+							mosiReg0 <= SpiData_i[31:0];
+						end
+					end
+				end else begin 
+					if (Lag_i!=0) begin
+						if (ss&& (ssCnt > 0 && ssCnt < txLenght-1)) begin
+							mosiReg0 <= mosiReg0 >> 1;
+						end
+						else begin 
+							mosiReg0 <= SpiData_i[31:0];
+						end
+					end else begin
+						if (ss&& (ssCnt < txLenght-1)) begin
+							mosiReg0 <= mosiReg0 << 1;
+						end else begin 
+							mosiReg0 <= SpiData_i[31:0];
+						end
+					end
+				end
+			end
         end
     end
-    
-    
-    
-    
-    
-    
-    
-    endmodule
+  
+endmodule