|
|
@@ -1,205 +1,536 @@
|
|
|
-`timescale 1ns / 1ps
|
|
|
-
|
|
|
-module ExtSpiMEmul
|
|
|
-(
|
|
|
- input Rst_i,
|
|
|
- input Clk_i,
|
|
|
-
|
|
|
- input Start_i,
|
|
|
- output TxDone_o,
|
|
|
-
|
|
|
- output Sck_o,
|
|
|
- output reg Ss_o,
|
|
|
- output reg Mosi_o
|
|
|
-
|
|
|
+module ExtSpiMEmul (
|
|
|
+ input Clk_i,
|
|
|
+ input Rst_i,
|
|
|
+ input Start_i,
|
|
|
+ input EmptyFlag_i,
|
|
|
+ input ClockPhase_i,
|
|
|
+ input [31:0] SpiData_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
|
|
|
);
|
|
|
|
|
|
-//================================================================================
|
|
|
-// PARAMETERS
|
|
|
- localparam [1:0] IDLE = 0;
|
|
|
- localparam [1:0] CMD = 1;
|
|
|
- localparam [1:0] TX = 2;
|
|
|
- localparam [1:0] PAUSE = 3;
|
|
|
|
|
|
- parameter MODE = 1'h0;
|
|
|
- parameter [4:0] DEVID = 5'h1;
|
|
|
- parameter [16:0] WORDSNUM = 17'd24;
|
|
|
- parameter EOPBIT = 1'b1;
|
|
|
-
|
|
|
//================================================================================
|
|
|
-// REG/WIRE
|
|
|
- reg [1:0] currState;
|
|
|
- reg [1:0] nextState;
|
|
|
-
|
|
|
- reg [6:0] txCnt;
|
|
|
- reg [6:0] cmdCnt;
|
|
|
- reg [3:0] pauseCnt;
|
|
|
-
|
|
|
- wire txStop = (cmdCnt >= WORDSNUM+1);
|
|
|
-
|
|
|
- reg [23:0] headerCmd = {MODE,DEVID,WORDSNUM,EOPBIT};
|
|
|
- reg [23:0] spiData;
|
|
|
-
|
|
|
- reg [23:0] dspSpiData;
|
|
|
-
|
|
|
- reg sckFlag;
|
|
|
+// REG/WIRE
|
|
|
//================================================================================
|
|
|
-// ASSIGNMENTS
|
|
|
-
|
|
|
-assign Sck_o = (sckFlag)? ~Clk_i:1'b0;
|
|
|
-assign TxDone_o = (txStop & (currState== CMD));
|
|
|
-
|
|
|
-//================================================================================
|
|
|
-// CODING
|
|
|
-
|
|
|
-always @(posedge Clk_i) begin
|
|
|
- if (!Rst_i) begin
|
|
|
- if (currState == CMD) begin
|
|
|
- if (!txStop) begin
|
|
|
- cmdCnt <= cmdCnt+1;
|
|
|
- end else begin
|
|
|
- cmdCnt <= 0;
|
|
|
- end
|
|
|
- end
|
|
|
- end else begin
|
|
|
- cmdCnt <= 0;
|
|
|
- end
|
|
|
-end
|
|
|
-
|
|
|
-always @(posedge Clk_i) begin
|
|
|
- if (!Rst_i) begin
|
|
|
- if (currState == TX) begin
|
|
|
- txCnt <= txCnt+1;
|
|
|
- end else begin
|
|
|
- txCnt <= 0;
|
|
|
- end
|
|
|
- end else begin
|
|
|
- txCnt <= 0;
|
|
|
- end
|
|
|
-end
|
|
|
-
|
|
|
-always @(posedge Clk_i) begin
|
|
|
- if (!Rst_i) begin
|
|
|
- if (currState == PAUSE) begin
|
|
|
- pauseCnt <= pauseCnt+1;
|
|
|
- end else begin
|
|
|
- pauseCnt <= 0;
|
|
|
- end
|
|
|
- end else begin
|
|
|
- pauseCnt <= 0;
|
|
|
- end
|
|
|
-end
|
|
|
-
|
|
|
-always @(posedge Clk_i) begin
|
|
|
- if (!Rst_i) begin
|
|
|
- if (currState == CMD) begin
|
|
|
- spiData <= spiData+cmdCnt;
|
|
|
- end
|
|
|
- end else begin
|
|
|
- spiData <= 24'hab;
|
|
|
- end
|
|
|
-end
|
|
|
-
|
|
|
-always @(posedge Clk_i) begin
|
|
|
- if (currState == CMD) begin
|
|
|
- if (cmdCnt == 0) begin
|
|
|
- dspSpiData <= headerCmd;
|
|
|
- end else begin
|
|
|
- dspSpiData <= spiData;
|
|
|
- end
|
|
|
- end else if (currState == TX) begin
|
|
|
- dspSpiData <= dspSpiData<<1;
|
|
|
- end if (currState == IDLE) begin
|
|
|
- dspSpiData <= 0;
|
|
|
- end
|
|
|
-end
|
|
|
-
|
|
|
-always @(posedge Clk_i) begin
|
|
|
- if (currState == TX) begin
|
|
|
- if (txCnt >= 7'd0) begin
|
|
|
- Mosi_o <= dspSpiData[23];
|
|
|
- end else begin
|
|
|
- Mosi_o <= 1'b0;
|
|
|
- end
|
|
|
- end else begin
|
|
|
- Mosi_o <= 1'b0;
|
|
|
- end
|
|
|
-end
|
|
|
-
|
|
|
-always @(posedge Clk_i) begin
|
|
|
- if (currState == TX) begin
|
|
|
- Ss_o <= 1'b0;
|
|
|
- sckFlag <= 1'b1;
|
|
|
- end else begin
|
|
|
- Ss_o <= 1'b1;
|
|
|
- sckFlag <= 1'b0;
|
|
|
- end
|
|
|
-end
|
|
|
-
|
|
|
-always @(posedge Clk_i) begin
|
|
|
- if (Rst_i) begin
|
|
|
- currState <= IDLE;
|
|
|
- end else begin
|
|
|
- currState <= nextState;
|
|
|
- end
|
|
|
-end
|
|
|
-
|
|
|
-always @(*) begin
|
|
|
- nextState = IDLE;
|
|
|
- case(currState)
|
|
|
- IDLE : begin
|
|
|
- if (Start_i) begin
|
|
|
- nextState = CMD;
|
|
|
- end else begin
|
|
|
- nextState = IDLE;
|
|
|
- end
|
|
|
- end
|
|
|
-
|
|
|
- CMD : begin
|
|
|
- if (!txStop) begin
|
|
|
- nextState = TX;
|
|
|
- end else begin
|
|
|
- nextState = IDLE;
|
|
|
- end
|
|
|
- end
|
|
|
-
|
|
|
- TX : begin
|
|
|
- if (txCnt==6'd23) begin
|
|
|
- nextState = PAUSE;
|
|
|
- end else begin
|
|
|
- nextState = TX;
|
|
|
- end
|
|
|
- end
|
|
|
-
|
|
|
- PAUSE : begin
|
|
|
- if (pauseCnt==4'd2) begin
|
|
|
- nextState = CMD;
|
|
|
- end else begin
|
|
|
- nextState = PAUSE;
|
|
|
- end
|
|
|
- end
|
|
|
- endcase
|
|
|
-end
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-endmodule
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
|
|
|
+ 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 ssR;
|
|
|
+ reg SSR;
|
|
|
+ reg [31:0] mosiReg0;
|
|
|
+ reg [5:0] ssNum;
|
|
|
+ reg [2:0] delayCnt;
|
|
|
+ reg stopFlag;
|
|
|
+
|
|
|
+ wire ssPol = SelSt_i ? Ss : ~Ss;
|
|
|
+
|
|
|
+
|
|
|
+ //================================================================================
|
|
|
+ // ASSIGNMENTS
|
|
|
+ //================================================================================
|
|
|
+
|
|
|
+
|
|
|
+ assign Ss_o = ssPol;
|
|
|
+
|
|
|
+ //================================================================================
|
|
|
+ // CODING
|
|
|
+ //================================================================================
|
|
|
+
|
|
|
+ always @(*) begin
|
|
|
+ if (Start_i) begin
|
|
|
+ Val_o = valReg;
|
|
|
+ end
|
|
|
+ else begin
|
|
|
+ Val_o = 1'b0;
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ always @(*) begin
|
|
|
+ if (SelSt_i) begin
|
|
|
+ if (!Ss_o) begin
|
|
|
+ lineBusy = 1'b1;
|
|
|
+ end
|
|
|
+ else begin
|
|
|
+ lineBusy = 1'b0;
|
|
|
+ end
|
|
|
+ end
|
|
|
+ else begin
|
|
|
+ if (Ss_o) begin
|
|
|
+ lineBusy = 1'b1;
|
|
|
+ end
|
|
|
+ else begin
|
|
|
+ lineBusy = 1'b0;
|
|
|
+ end
|
|
|
+ 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
|
|
|
+ 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 (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
|
|
|
+ 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
|
|
|
+
|
|
|
+
|
|
|
+ always @(*) begin
|
|
|
+ if (Rst_i) begin
|
|
|
+ Mosi0_o = 1'b0;
|
|
|
+ end
|
|
|
+ else begin
|
|
|
+ if (SelSt_i) 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
|
|
|
+ else begin
|
|
|
+ if (!EndianSel_i) begin
|
|
|
+ case (WidthSel_i)
|
|
|
+ 0 : begin
|
|
|
+ Mosi0_o = (ssPol&& (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;
|
|
|
+ end
|
|
|
+ 2 : begin
|
|
|
+ Mosi0_o = (ssPol&& (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;
|
|
|
+ end
|
|
|
+ endcase
|
|
|
+ end
|
|
|
+ else begin
|
|
|
+ case (WidthSel_i)
|
|
|
+ 0 : begin
|
|
|
+ Mosi0_o = (ssPol&& (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;
|
|
|
+ end
|
|
|
+ 2 : begin
|
|
|
+ Mosi0_o = (ssPol&& (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;
|
|
|
+ end
|
|
|
+ endcase
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ always @(posedge Clk_i) begin
|
|
|
+ ssR <= ssPol;
|
|
|
+ SSR <= Ss;
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+ always @(*) begin
|
|
|
+ if (Rst_i) begin
|
|
|
+ startFlag = 1'b0;
|
|
|
+ end
|
|
|
+ else begin
|
|
|
+ if (Start_i && !stopFlag && !EmptyFlag_i) begin
|
|
|
+ startFlag = 1'b1;
|
|
|
+ end
|
|
|
+ else begin
|
|
|
+ startFlag = 1'b0;
|
|
|
+ end
|
|
|
+ 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
|
|
|
+ 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_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
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ endmodule
|