|
|
@@ -19,8 +19,7 @@
|
|
|
// Additional Comments:
|
|
|
//
|
|
|
//////////////////////////////////////////////////////////////////////////////////
|
|
|
-
|
|
|
-module InterfaceArbiter
|
|
|
+module InterfaceArbiter
|
|
|
#(
|
|
|
parameter OUTWORDWIDTH = 24,
|
|
|
parameter SSPIWORDWIDTH = 24,
|
|
|
@@ -38,17 +37,16 @@ module InterfaceArbiter
|
|
|
input Mosi2_i,
|
|
|
input Mosi3_i,
|
|
|
|
|
|
-
|
|
|
- output DataVal_o,
|
|
|
output reg TestTrig_o,
|
|
|
+ output reg DataVal_o,
|
|
|
output [OUTWORDWIDTH-1:0] Data_o
|
|
|
);
|
|
|
|
|
|
//================================================================================
|
|
|
// REG/WIRE
|
|
|
|
|
|
- localparam [1:0] IDLE = 2'b01;
|
|
|
- localparam [1:0] DATARX = 2'b10;
|
|
|
+ localparam [1:0] IDLE = 0;
|
|
|
+ localparam [1:0] DATARX = 1;
|
|
|
|
|
|
reg [OUTWORDWIDTH-1:0] dataRegSSpi;
|
|
|
reg [OUTWORDWIDTH-1:0] dataRegQSpi;
|
|
|
@@ -59,28 +57,14 @@ module InterfaceArbiter
|
|
|
reg [QSPIWORDWIDTH-1:0] captReg1;
|
|
|
reg [QSPIWORDWIDTH-1:0] captReg2;
|
|
|
reg [QSPIWORDWIDTH-1:0] captReg3;
|
|
|
-
|
|
|
- reg [OUTWORDWIDTH-1:0] captRegSspiR;
|
|
|
- reg [OUTWORDWIDTH-1:0] captRegSspiRR;
|
|
|
-
|
|
|
- reg [QSPIWORDWIDTH-1:0] captReg0R;
|
|
|
- reg [QSPIWORDWIDTH-1:0] captReg0RR;
|
|
|
- reg [QSPIWORDWIDTH-1:0] captReg1R;
|
|
|
- reg [QSPIWORDWIDTH-1:0] captReg1RR;
|
|
|
- reg [QSPIWORDWIDTH-1:0] captReg2R;
|
|
|
- reg [QSPIWORDWIDTH-1:0] captReg2RR;
|
|
|
- reg [QSPIWORDWIDTH-1:0] captReg3R;
|
|
|
- reg [QSPIWORDWIDTH-1:0] captReg3RR;
|
|
|
-
|
|
|
- reg ssReg;
|
|
|
- reg ssRegR;
|
|
|
- reg ssRegRR;
|
|
|
|
|
|
- reg spiMode;
|
|
|
|
|
|
- wire ssPos;
|
|
|
- reg ssPosR;
|
|
|
+ reg spiMode;
|
|
|
+ reg spiModeSyncA;
|
|
|
+ reg spiModeSyncB;
|
|
|
|
|
|
+ wire dataVal;
|
|
|
+ wire dataValNeg;
|
|
|
reg dataValReg;
|
|
|
|
|
|
reg [OUTWORDWIDTH/4-1:0] ssCnt;
|
|
|
@@ -93,88 +77,26 @@ module InterfaceArbiter
|
|
|
reg [1:0] currState;
|
|
|
|
|
|
reg rxDone;
|
|
|
-
|
|
|
- wire plsToggleSyncSignal;
|
|
|
- reg plsToggle;
|
|
|
- reg plsToggleSyncA;
|
|
|
- reg plsToggleSyncB;
|
|
|
- reg plsToggleSyncC;
|
|
|
- reg plsToggleSyncSignalR;
|
|
|
-
|
|
|
- /* SpiMode Sync Signals */
|
|
|
- reg spiModeSyncA;
|
|
|
- reg spiModeSyncB;
|
|
|
-
|
|
|
//================================================================================
|
|
|
// ASSIGNMENTS
|
|
|
- assign ssPos = ssRegR & !ssRegRR;
|
|
|
|
|
|
|
|
|
- assign DataVal_o = plsToggleSyncSignalR;
|
|
|
+ // assign DataVal_o = dataValReg;
|
|
|
assign Data_o = (spiModeSyncB)? dataRegQSpi:dataRegSSpi;
|
|
|
-
|
|
|
- assign plsToggleSyncSignal = plsToggleSyncC^plsToggleSyncB;
|
|
|
-
|
|
|
- //assign ssCntRstThresh = (spiMode) ? QSPIWORDWIDTH-1:SSPIWORDWIDTH-1;
|
|
|
|
|
|
//================================================================================
|
|
|
// CODING
|
|
|
|
|
|
always @(posedge Clk_i) begin
|
|
|
- if (Rst_i) begin
|
|
|
- plsToggleSyncA <= 1'b0;
|
|
|
- plsToggleSyncB <= 1'b0;
|
|
|
- end
|
|
|
- else begin
|
|
|
- plsToggleSyncA <= plsToggle;
|
|
|
- plsToggleSyncB <= plsToggleSyncA;
|
|
|
- end
|
|
|
- end
|
|
|
-
|
|
|
- always @(posedge Clk_i) begin
|
|
|
- if (Rst_i) begin
|
|
|
- spiModeSyncA <= 1'b0;
|
|
|
- spiModeSyncB <= 1'b0;
|
|
|
- end
|
|
|
- else begin
|
|
|
- spiModeSyncA <= spiMode;
|
|
|
- spiModeSyncB <= spiModeSyncA;
|
|
|
- end
|
|
|
- end
|
|
|
-
|
|
|
- always @(posedge Clk_i) begin
|
|
|
- if (Rst_i) begin
|
|
|
- plsToggleSyncC <= 1'b0;
|
|
|
- end
|
|
|
- else begin
|
|
|
- plsToggleSyncC <= plsToggleSyncB;
|
|
|
- end
|
|
|
- end
|
|
|
-
|
|
|
- always @(posedge Ss_i or posedge Rst_i) begin
|
|
|
if (Rst_i) begin
|
|
|
- plsToggle <= 1'b0;
|
|
|
+ DataVal_o <= 1'b0;
|
|
|
end
|
|
|
else begin
|
|
|
- if (Ss_i) begin
|
|
|
- plsToggle <= ~plsToggle;
|
|
|
- end
|
|
|
- else begin
|
|
|
- plsToggle <= plsToggle;
|
|
|
- end
|
|
|
+ DataVal_o <= dataValReg;
|
|
|
end
|
|
|
end
|
|
|
|
|
|
- always @(posedge Clk_i) begin
|
|
|
- if (Rst_i) begin
|
|
|
- plsToggleSyncSignalR <= 1'b0;
|
|
|
- end
|
|
|
- else begin
|
|
|
- plsToggleSyncSignalR <= plsToggleSyncSignal;
|
|
|
- end
|
|
|
- end
|
|
|
-
|
|
|
- always @(posedge Sck_i or posedge Rst_i) begin
|
|
|
+ always @(posedge Sck_i) begin
|
|
|
if (Rst_i) begin
|
|
|
captRegSspi <= 0;
|
|
|
|
|
|
@@ -195,40 +117,6 @@ module InterfaceArbiter
|
|
|
end
|
|
|
end
|
|
|
|
|
|
- always @(posedge Clk_i) begin
|
|
|
- if (Rst_i) begin
|
|
|
- captRegSspiR <= 0;
|
|
|
- captRegSspiRR <= 0;
|
|
|
- end
|
|
|
- else begin
|
|
|
- captRegSspiR <= captRegSspi;
|
|
|
- captRegSspiRR <= captRegSspiR;
|
|
|
- end
|
|
|
- end
|
|
|
-
|
|
|
- always @(posedge Clk_i) begin
|
|
|
- if (Rst_i) begin
|
|
|
- captReg0R <= 0;
|
|
|
- captReg0RR <= 0;
|
|
|
- captReg1R <= 0;
|
|
|
- captReg1RR <= 0;
|
|
|
- captReg2R <= 0;
|
|
|
- captReg2RR <= 0;
|
|
|
- captReg3R <= 0;
|
|
|
- captReg3RR <= 0;
|
|
|
- end
|
|
|
- else begin
|
|
|
- captReg0R <= captReg0;
|
|
|
- captReg0RR <= captReg0R;
|
|
|
- captReg1R <= captReg1;
|
|
|
- captReg1RR <= captReg1R;
|
|
|
- captReg2R <= captReg2;
|
|
|
- captReg2RR <= captReg2R;
|
|
|
- captReg3R <= captReg3;
|
|
|
- captReg3RR <= captReg3R;
|
|
|
- end
|
|
|
- end
|
|
|
-
|
|
|
always @(*) begin
|
|
|
if (currState == IDLE && (Data_o[11]& Data_o[8])) begin
|
|
|
TestTrig_o = 1'b1;
|
|
|
@@ -238,17 +126,13 @@ module InterfaceArbiter
|
|
|
end
|
|
|
end
|
|
|
|
|
|
- always @(posedge Sck_i or posedge Rst_i) begin
|
|
|
- if (Rst_i) begin
|
|
|
+ always @(posedge Sck_i or posedge Ss_i) begin
|
|
|
+ if (Ss_i) begin
|
|
|
ssCnt <= 0;
|
|
|
end
|
|
|
else begin
|
|
|
- if (currState == IDLE) begin
|
|
|
- if (!Ss_i) begin
|
|
|
- ssCnt <= ssCnt+1;
|
|
|
- end
|
|
|
- end else begin
|
|
|
- ssCnt <= 0;
|
|
|
+ if (!Ss_i) begin
|
|
|
+ ssCnt <= ssCnt+1;
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
@@ -256,7 +140,7 @@ module InterfaceArbiter
|
|
|
always @(posedge Clk_i) begin
|
|
|
if (!Rst_i) begin
|
|
|
if (currState == DATARX) begin
|
|
|
- if (plsToggleSyncSignal) begin
|
|
|
+ if (dataVal) begin
|
|
|
if (wordsCnt == wordsNum-1) begin
|
|
|
wordsCnt <= 0;
|
|
|
rxDone <= 1'b1;
|
|
|
@@ -275,67 +159,57 @@ module InterfaceArbiter
|
|
|
end
|
|
|
end
|
|
|
|
|
|
- always @(posedge Sck_i or posedge Rst_i) begin
|
|
|
+ always @(posedge Sck_i) begin
|
|
|
if (Rst_i) begin
|
|
|
spiMode <= 1'b0;
|
|
|
end
|
|
|
else begin
|
|
|
if (currState == IDLE) begin
|
|
|
if (ssCnt == 1) begin
|
|
|
- if (captRegSspi[0]) begin
|
|
|
- spiMode <= 1'b1;
|
|
|
- end
|
|
|
- else begin
|
|
|
- spiMode <= 1'b0;
|
|
|
- end
|
|
|
+ spiMode <= captRegSspi[0];
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
end
|
|
|
-
|
|
|
+
|
|
|
+ always @(posedge Clk_i) begin
|
|
|
+ if (Rst_i) begin
|
|
|
+ spiModeSyncA <= 1'b0;
|
|
|
+ spiModeSyncB <= 1'b0;
|
|
|
+ end
|
|
|
+ else begin
|
|
|
+ spiModeSyncA <= spiMode;
|
|
|
+ spiModeSyncB <= spiModeSyncA;
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ always @(posedge Clk_i) begin
|
|
|
+ if (!Rst_i) begin
|
|
|
+ dataValReg <= dataVal;
|
|
|
+ if (dataVal) begin
|
|
|
+ dataRegSSpi <= captRegSspi;
|
|
|
+ dataRegQSpi <= {captReg0,captReg1,captReg2,captReg3};
|
|
|
+ end
|
|
|
+ end else begin
|
|
|
+ dataRegSSpi <= 0;
|
|
|
+ dataRegQSpi <= 0;
|
|
|
+ dataValReg <= 0;
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
always @(posedge Clk_i) begin
|
|
|
if (!Rst_i) begin
|
|
|
if (currState == IDLE) begin
|
|
|
- if (!spiMode) begin
|
|
|
+ if (!spiModeSyncB) begin
|
|
|
wordsNum <= dataRegSSpi[17:1];
|
|
|
end else begin
|
|
|
- wordsNum <= dataRegQSpi[21:19]+dataRegQSpi[17:16]+dataRegQSpi[15:12]+dataRegQSpi[11:9]+dataRegQSpi[7:6]+dataRegQSpi[4:3]+dataRegQSpi[2]+dataRegQSpi[1];
|
|
|
+ wordsNum <= dataRegQSpi[21:19]+dataRegQSpi[17:16]+dataRegQSpi[15:12]+dataRegQSpi[10:9]+dataRegQSpi[7:6]+dataRegQSpi[4:3]+dataRegQSpi[2]+dataRegQSpi[1];
|
|
|
end
|
|
|
end
|
|
|
end else begin
|
|
|
wordsNum <= 0;
|
|
|
end
|
|
|
end
|
|
|
-
|
|
|
- always @(posedge Clk_i) begin
|
|
|
- if (!Rst_i) begin
|
|
|
- ssReg <= Ss_i;
|
|
|
- ssRegR <= ssReg;
|
|
|
- ssRegRR <= ssRegR;
|
|
|
- ssPosR <= ssPos;
|
|
|
- end else begin
|
|
|
- ssReg <= 1;
|
|
|
- ssRegR <= 1;
|
|
|
- ssRegRR <= 1;
|
|
|
- ssPosR <= 0;
|
|
|
- end
|
|
|
- end
|
|
|
-
|
|
|
- always @(posedge Clk_i) begin
|
|
|
- if (!Rst_i) begin
|
|
|
- if (plsToggleSyncSignal) begin
|
|
|
- dataRegSSpi <= captRegSspiRR;
|
|
|
- dataRegQSpi <= {captReg0R,captReg1R,captReg2R,captReg3R};
|
|
|
- dataValReg <= 1'b1;
|
|
|
- end else begin
|
|
|
- dataValReg <= 1'b0;
|
|
|
- end
|
|
|
- end else begin
|
|
|
- dataRegSSpi <= 0;
|
|
|
- dataRegQSpi <= 0;
|
|
|
- dataValReg <= 0;
|
|
|
- end
|
|
|
- end
|
|
|
|
|
|
always @(posedge Clk_i) begin
|
|
|
if (Rst_i) begin
|
|
|
@@ -349,7 +223,7 @@ module InterfaceArbiter
|
|
|
nextState = IDLE;
|
|
|
case(currState)
|
|
|
IDLE :begin
|
|
|
- if (plsToggleSyncSignalR) begin
|
|
|
+ if (dataValReg) begin
|
|
|
nextState = DATARX;
|
|
|
end else begin
|
|
|
nextState = IDLE;
|
|
|
@@ -366,23 +240,25 @@ module InterfaceArbiter
|
|
|
endcase
|
|
|
end
|
|
|
|
|
|
-endmodule
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ edgeDetectingSynchronizer#
|
|
|
+ (
|
|
|
+ .Length(2),
|
|
|
+ .EdgeType("rising")
|
|
|
+ ) edgeDetectingSynchronizer (
|
|
|
+ .Rst_i(1'b0),
|
|
|
+ .Clk_i(Clk_i),
|
|
|
+ .D_i(Ss_i),
|
|
|
+ .D_o(dataVal)
|
|
|
+ );
|
|
|
+
|
|
|
+ // edgeDetectingSynchronizer#
|
|
|
+ // (
|
|
|
+ // .Length(2),
|
|
|
+ // .EdgeType("falling")
|
|
|
+ // ) edgeDetectingSynchronizer2 (
|
|
|
+ // .Rst_i(1'b0),
|
|
|
+ // .Clk_i(Clk_i),
|
|
|
+ // .D_i(dataVal),
|
|
|
+ // .D_o(dataValNeg)
|
|
|
+ // );
|
|
|
+endmodule
|