|
@@ -1,6 +1,6 @@
|
|
|
-`timescale 1ns/1ps
|
|
|
|
|
|
|
+`timescale 1ns/1ns
|
|
|
|
|
|
|
|
-module TopSbTmsgTb;
|
|
|
|
|
|
|
+module TopSbTmsgTb(inout Mosi1_io);
|
|
|
parameter CLK_PERIOD = 8.13; // Clock period in ns
|
|
parameter CLK_PERIOD = 8.13; // Clock period in ns
|
|
|
|
|
|
|
|
// Inputs
|
|
// Inputs
|
|
@@ -28,12 +28,12 @@ module TopSbTmsgTb;
|
|
|
// Outputs
|
|
// Outputs
|
|
|
wire Mosi0_o;
|
|
wire Mosi0_o;
|
|
|
wire Mosi1_o;
|
|
wire Mosi1_o;
|
|
|
- wire Mosi1_io;
|
|
|
|
|
wire Mosi2_o;
|
|
wire Mosi2_o;
|
|
|
wire Mosi3_o;
|
|
wire Mosi3_o;
|
|
|
wire Sck_o;
|
|
wire Sck_o;
|
|
|
wire Ss_o;
|
|
wire Ss_o;
|
|
|
wire Val_o;
|
|
wire Val_o;
|
|
|
|
|
+ wire anyFlag;
|
|
|
|
|
|
|
|
wire valR;
|
|
wire valR;
|
|
|
wire valQ;
|
|
wire valQ;
|
|
@@ -47,6 +47,8 @@ module TopSbTmsgTb;
|
|
|
wire locked;
|
|
wire locked;
|
|
|
wire rstInit;
|
|
wire rstInit;
|
|
|
|
|
|
|
|
|
|
+ logic mosi1Reg;
|
|
|
|
|
+
|
|
|
logic [16:0] trCnt;
|
|
logic [16:0] trCnt;
|
|
|
logic [4:0] trCntSync;
|
|
logic [4:0] trCntSync;
|
|
|
|
|
|
|
@@ -98,15 +100,26 @@ localparam [4:0] DeviceIdGpio2 = 5'h9;
|
|
|
|
|
|
|
|
localparam [16:0] Gpio1InitWordNum = 17'd1;
|
|
localparam [16:0] Gpio1InitWordNum = 17'd1;
|
|
|
localparam [16:0] Gpio2InitWordNum = 17'd1;
|
|
localparam [16:0] Gpio2InitWordNum = 17'd1;
|
|
|
-localparam [16:0] Lmx2594InitWordNum = 17'd113;
|
|
|
|
|
-localparam [16:0] DDSInitWordNum = 17'd37;
|
|
|
|
|
|
|
+localparam [16:0] PotWordInitNum = 17'd1;
|
|
|
|
|
+localparam [16:0] DacWordInitNum = 17'd1;
|
|
|
|
|
+localparam [16:0] AttWordInitNum = 17'd1;
|
|
|
|
|
+localparam [16:0] ShRegWordInitNum = 17'd1;
|
|
|
|
|
+localparam [16:0] Lmx2594InitWordNum = 17'd13;
|
|
|
|
|
+localparam [16:0] DDSInitWordNum = 17'd7;
|
|
|
localparam [16:0] MaxInitWordNum = 17'd6;
|
|
localparam [16:0] MaxInitWordNum = 17'd6;
|
|
|
|
|
+localparam [16:0] TempSensWordNum = 17'd1;
|
|
|
|
|
|
|
|
-localparam [23:0] InitGpio1Header = {1'h0, DeviceIdGpio1, Gpio1InitWordNum, 1'h1};
|
|
|
|
|
-localparam [23:0] InitGpio2Header = {1'b0, DeviceIdGpio2,Gpio2InitWordNum,1'h1 };
|
|
|
|
|
|
|
+localparam [23:0] InitGpio1Header = {1'h0, DeviceIdGpio1, Gpio1InitWordNum, 1'h1};
|
|
|
|
|
+localparam [23:0] InitGpio2Header = {1'b0, DeviceIdGpio2,Gpio2InitWordNum,1'h1 };
|
|
|
|
|
+localparam [23:0] TempSensHeader = {1'h0, DeviceIdTemp, TempSensWordNum, 1'h1};
|
|
|
localparam [23:0] InitLMX2594Header = {1'h0, DeviceIdLmx2594, Lmx2594InitWordNum, 1'h1};
|
|
localparam [23:0] InitLMX2594Header = {1'h0, DeviceIdLmx2594, Lmx2594InitWordNum, 1'h1};
|
|
|
localparam [23:0] InitDDSHeader = {1'h0, DeviceIdDDS, DDSInitWordNum, 1'h1};
|
|
localparam [23:0] InitDDSHeader = {1'h0, DeviceIdDDS, DDSInitWordNum, 1'h1};
|
|
|
localparam [23:0] InitMAX2870Header = {1'h0, DeviceIdMax2870, MaxInitWordNum, 1'h1};
|
|
localparam [23:0] InitMAX2870Header = {1'h0, DeviceIdMax2870, MaxInitWordNum, 1'h1};
|
|
|
|
|
+localparam [23:0] InitPotHeader = {1'h0, DeviceIdPot, PotWordInitNum, 1'h1};
|
|
|
|
|
+localparam [23:0] InitDacHeader = {1'h0, DeviceIdDac, DacWordInitNum, 1'h1};
|
|
|
|
|
+localparam [23:0] InitAttHeader = {1'h0, DeviceIdAtt, AttWordInitNum, 1'h1};
|
|
|
|
|
+localparam [23:0] InitShRegHeader = {1'h0, DeviceIdShReg, ShRegWordInitNum, 1'h1};
|
|
|
|
|
+
|
|
|
localparam [3:0] LMXWordNum = 4'd14;
|
|
localparam [3:0] LMXWordNum = 4'd14;
|
|
|
localparam [1:0] DDSWordNum = 2'd3;
|
|
localparam [1:0] DDSWordNum = 2'd3;
|
|
|
localparam POTWordNum = 1'd1;
|
|
localparam POTWordNum = 1'd1;
|
|
@@ -125,9 +138,10 @@ assign Val_o = (modeSel) ? valQ : valR;
|
|
|
assign Sck_o = (modeSel) ? SckQ : SckR;
|
|
assign Sck_o = (modeSel) ? SckQ : SckR;
|
|
|
assign Ss_o = (modeSel) ? SsQ : SsR;
|
|
assign Ss_o = (modeSel) ? SsQ : SsR;
|
|
|
assign Mosi0_o = (modeSel) ? mosi0Q : mosi0R;
|
|
assign Mosi0_o = (modeSel) ? mosi0Q : mosi0R;
|
|
|
|
|
+assign Mosi1_io = (anyFlag) ? 1'bz : Mosi1_o;
|
|
|
assign MisoLdLmx_i = 1'b1;
|
|
assign MisoLdLmx_i = 1'b1;
|
|
|
|
|
|
|
|
-assign emptyFlagTx = (trCnt > 187) ? 1'b1 : 1'b0;
|
|
|
|
|
|
|
+assign emptyFlagTx = (trCnt > 69) ? 1'b1 : 1'b0;
|
|
|
assign QSPITotalWordNum = LMXWordNum + DDSWordNum + POTWordNum + DACWordNum + ATTWordNum + ShRegWordNum + MaxWordNum + GPIOWordNum;
|
|
assign QSPITotalWordNum = LMXWordNum + DDSWordNum + POTWordNum + DACWordNum + ATTWordNum + ShRegWordNum + MaxWordNum + GPIOWordNum;
|
|
|
|
|
|
|
|
//***********************************************
|
|
//***********************************************
|
|
@@ -169,7 +183,7 @@ initial begin
|
|
|
#(CLK_PERIOD*10) Rst_i = 0;
|
|
#(CLK_PERIOD*10) Rst_i = 0;
|
|
|
#(300000-60) rstForFPGA = 1;
|
|
#(300000-60) rstForFPGA = 1;
|
|
|
#(CLK_PERIOD*74) rstForFPGA = 0;
|
|
#(CLK_PERIOD*74) rstForFPGA = 0;
|
|
|
- #(20) Start_i = 1; // Start SPI transaction
|
|
|
|
|
|
|
+ #(165000) Start_i = 1; // Start SPI transaction
|
|
|
|
|
|
|
|
end
|
|
end
|
|
|
//***********************************************
|
|
//***********************************************
|
|
@@ -185,13 +199,24 @@ always_ff @(posedge Clk10) begin
|
|
|
end
|
|
end
|
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
+always_comb begin
|
|
|
|
|
+ if (Rst_i) begin
|
|
|
|
|
+ mosi1Reg = 0;
|
|
|
|
|
+ end
|
|
|
|
|
+ else begin
|
|
|
|
|
+ mosi1Reg = Mosi1_io;
|
|
|
|
|
+ end
|
|
|
|
|
+end
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
genvar i;
|
|
genvar i;
|
|
|
always_comb begin
|
|
always_comb begin
|
|
|
if (Rst_i) begin
|
|
if (Rst_i) begin
|
|
|
WidthSel_i = 2'd0;
|
|
WidthSel_i = 2'd0;
|
|
|
end
|
|
end
|
|
|
else begin
|
|
else begin
|
|
|
- if (trCnt > 152 && trCnt < 159) begin
|
|
|
|
|
|
|
+ if (trCnt > 36 && trCnt < 43) begin
|
|
|
WidthSel_i = 2'd3;
|
|
WidthSel_i = 2'd3;
|
|
|
end
|
|
end
|
|
|
else begin
|
|
else begin
|
|
@@ -205,7 +230,7 @@ always_comb begin
|
|
|
modeSel = 0;
|
|
modeSel = 0;
|
|
|
end
|
|
end
|
|
|
else begin
|
|
else begin
|
|
|
- if (trCnt == 159) begin
|
|
|
|
|
|
|
+ if (trCnt == 45) begin
|
|
|
modeSel = 1;
|
|
modeSel = 1;
|
|
|
end
|
|
end
|
|
|
end
|
|
end
|
|
@@ -243,45 +268,49 @@ always_comb begin
|
|
|
else begin
|
|
else begin
|
|
|
// if (!rstInit && locked) begin
|
|
// if (!rstInit && locked) begin
|
|
|
if (trCnt == 0) begin
|
|
if (trCnt == 0) begin
|
|
|
- SPIdata = InitGpio2Header;
|
|
|
|
|
|
|
+ SPIdata = InitGpio1Header;
|
|
|
end
|
|
end
|
|
|
else if (trCnt == 2) begin
|
|
else if (trCnt == 2) begin
|
|
|
- SPIdata = InitGpio2Header;
|
|
|
|
|
|
|
+ SPIdata = InitGpio1Header;
|
|
|
|
|
+ end
|
|
|
|
|
+ else if (trCnt == 4) begin
|
|
|
|
|
+ SPIdata = TempSensHeader;
|
|
|
end
|
|
end
|
|
|
- else if (trCnt == 4) begin
|
|
|
|
|
|
|
+ else if (trCnt == 6) begin
|
|
|
SPIdata = InitLMX2594Header;
|
|
SPIdata = InitLMX2594Header;
|
|
|
end
|
|
end
|
|
|
// else if (trCnt > 0 && trCnt < 114) begin
|
|
// else if (trCnt > 0 && trCnt < 114) begin
|
|
|
// SPIdata = pkt.data;
|
|
// SPIdata = pkt.data;
|
|
|
// end
|
|
// end
|
|
|
- else if (trCnt == 118) begin
|
|
|
|
|
|
|
+ else if (trCnt == 20) begin
|
|
|
SPIdata = InitDDSHeader;
|
|
SPIdata = InitDDSHeader;
|
|
|
end
|
|
end
|
|
|
- else if (trCnt == 156) begin
|
|
|
|
|
|
|
+ else if (trCnt == 28) begin
|
|
|
|
|
+ SPIdata = InitPotHeader;
|
|
|
|
|
+ end
|
|
|
|
|
+ else if (trCnt == 30) begin
|
|
|
|
|
+ SPIdata = InitDacHeader;
|
|
|
|
|
+ end
|
|
|
|
|
+ else if (trCnt == 32) begin
|
|
|
|
|
+ SPIdata = InitAttHeader;
|
|
|
|
|
+ end
|
|
|
|
|
+ else if (trCnt == 34) begin
|
|
|
|
|
+ SPIdata = InitShRegHeader;
|
|
|
|
|
+ end
|
|
|
|
|
+ else if (trCnt == 36) begin
|
|
|
SPIdata = InitMAX2870Header;
|
|
SPIdata = InitMAX2870Header;
|
|
|
end
|
|
end
|
|
|
- else if (trCnt > 156 && trCnt < 163) begin
|
|
|
|
|
- // if (trCnt % 2 == 0) begin
|
|
|
|
|
- // SPIdata = 32'haaaaaaaa;
|
|
|
|
|
- // end
|
|
|
|
|
- // else begin
|
|
|
|
|
- // SPIdata = 32'h55555555;
|
|
|
|
|
- // end
|
|
|
|
|
|
|
+ else if (trCnt > 36 && trCnt < 43) begin
|
|
|
SPIdata = 32'haaaaaaaa;
|
|
SPIdata = 32'haaaaaaaa;
|
|
|
- // SPIdata = pkt.data32;
|
|
|
|
|
end
|
|
end
|
|
|
- else if (trCnt == 163) begin
|
|
|
|
|
|
|
+ else if (trCnt == 43) begin
|
|
|
|
|
+ SPIdata = InitGpio2Header;
|
|
|
|
|
+ end
|
|
|
|
|
+ else if (trCnt == 45) begin
|
|
|
SPIdata = AllDevQSPIHeader;
|
|
SPIdata = AllDevQSPIHeader;
|
|
|
end
|
|
end
|
|
|
else begin
|
|
else begin
|
|
|
- // if (trCnt % 2 == 0) begin
|
|
|
|
|
- // SPIdata = 24'haaaaaa;
|
|
|
|
|
- // end
|
|
|
|
|
- // else begin
|
|
|
|
|
- // SPIdata = 24'h555555;
|
|
|
|
|
- // end
|
|
|
|
|
SPIdata = 24'haaaaaa;
|
|
SPIdata = 24'haaaaaa;
|
|
|
- // SPIdata = pkt.data;
|
|
|
|
|
end
|
|
end
|
|
|
end
|
|
end
|
|
|
end
|
|
end
|
|
@@ -334,6 +363,13 @@ always_comb begin
|
|
|
.Ss_o(SsQ),
|
|
.Ss_o(SsQ),
|
|
|
.Val_o(valQ)
|
|
.Val_o(valQ)
|
|
|
);
|
|
);
|
|
|
|
|
+
|
|
|
|
|
+ ExtI2cSlaveEmul ExtI2cSlaveEmul_inst (
|
|
|
|
|
+ .scl (i2cScl),
|
|
|
|
|
+ .sda (i2cSda)
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ pullup p2(i2cSda); // pullup sda line
|
|
|
|
|
|
|
|
TopSbTmsg TopSbTmsg_inst (
|
|
TopSbTmsg TopSbTmsg_inst (
|
|
|
.Clk_i(Clk24),
|
|
.Clk_i(Clk24),
|
|
@@ -342,8 +378,11 @@ always_comb begin
|
|
|
.Ss_i(Ss_o),
|
|
.Ss_i(Ss_o),
|
|
|
.MisoLdLmx_i(1'b1),
|
|
.MisoLdLmx_i(1'b1),
|
|
|
.MisoLdMax2870_i(1'b1),
|
|
.MisoLdMax2870_i(1'b1),
|
|
|
|
|
+ .I2cScl_o(i2cScl),
|
|
|
|
|
+ .I2cSda_io(i2cSda),
|
|
|
|
|
+ .AnyFlag_o(anyFlag),
|
|
|
.Mosi0_i(Mosi0_o),
|
|
.Mosi0_i(Mosi0_o),
|
|
|
- .Mosi1_io(Mosi1_o),
|
|
|
|
|
|
|
+ .Mosi1_io(Mosi1_io),
|
|
|
.Mosi2_i(Mosi2_o),
|
|
.Mosi2_i(Mosi2_o),
|
|
|
.Mosi3_i(Mosi3_o)
|
|
.Mosi3_i(Mosi3_o)
|
|
|
);
|
|
);
|