|
|
@@ -0,0 +1,257 @@
|
|
|
+`timescale 1ns / 1ps
|
|
|
+//////////////////////////////////////////////////////////////////////////////////
|
|
|
+// Company:
|
|
|
+// Engineer:
|
|
|
+//
|
|
|
+// Create Date: 17.09.2020 14:18:14
|
|
|
+// Design Name:
|
|
|
+// Module Name: SlaveSpi
|
|
|
+// Project Name:
|
|
|
+// Target Devices:
|
|
|
+// Tool Versions:
|
|
|
+// Description:
|
|
|
+//
|
|
|
+// Dependencies:
|
|
|
+//
|
|
|
+// Revision:
|
|
|
+// Revision 0.01 - File Created
|
|
|
+// Additional Comments:
|
|
|
+//
|
|
|
+//////////////////////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+
|
|
|
+module QuadSlaveSpi
|
|
|
+#(
|
|
|
+ parameter CmdRegWidth = 32,
|
|
|
+ parameter DataCntWidth = 5,
|
|
|
+ parameter HeaderWidth = 7,
|
|
|
+ parameter CmdDataRegWith = 24,
|
|
|
+ parameter Adc0DirAccessAddr = 7'h13,
|
|
|
+ parameter Adc1DirAccessAddr = 7'h14
|
|
|
+)
|
|
|
+(
|
|
|
+ input Clk_i,
|
|
|
+ input Rst_i,
|
|
|
+
|
|
|
+ output reg [CmdRegWidth-1:0] Data_o,
|
|
|
+ output reg Val_o,
|
|
|
+
|
|
|
+ input SpiRst_i,
|
|
|
+ input Mosi0_i,
|
|
|
+ input Mosi1_i,
|
|
|
+ inout Miso0_Mosi2_io,
|
|
|
+ inout Miso1_Mosi3_io,
|
|
|
+ input Sck_i,
|
|
|
+ input Ss_i,
|
|
|
+
|
|
|
+ output Mosi_o,
|
|
|
+ output Sck_o,
|
|
|
+ output Ss0_o,
|
|
|
+ output Ss1_o,
|
|
|
+
|
|
|
+ output [HeaderWidth-1:0] AnsAddr_o,
|
|
|
+ input [CmdDataRegWith-1:0] AnsReg_i,
|
|
|
+
|
|
|
+ output Miso_o
|
|
|
+);
|
|
|
+//================================================================================
|
|
|
+// REG/WIRE
|
|
|
+//================================================================================
|
|
|
+
|
|
|
+ localparam QuadSpiRegWidth = CmdRegWidth/4;
|
|
|
+
|
|
|
+ reg [CmdRegWidth-1:0] singleCaptReg;
|
|
|
+
|
|
|
+ reg [QuadSpiRegWidth-1:0] quadCaptReg0;
|
|
|
+ reg [QuadSpiRegWidth-1:0] quadCaptReg1;
|
|
|
+ reg [QuadSpiRegWidth-1:0] quadCaptReg2;
|
|
|
+ reg [QuadSpiRegWidth-1:0] quadCaptReg3;
|
|
|
+
|
|
|
+ reg [DataCntWidth-1:0] dataCnt;
|
|
|
+ reg [HeaderWidth-1:0] ansAddr;
|
|
|
+ reg spiMode;
|
|
|
+ wire directTransit = (ansAddr == Adc0DirAccessAddr)|(ansAddr == Adc1DirAccessAddr);
|
|
|
+
|
|
|
+
|
|
|
+ reg txWind;
|
|
|
+ reg [4:0] txCnt;
|
|
|
+
|
|
|
+ reg ssReg;
|
|
|
+ reg ssRegR;
|
|
|
+ reg ssPos;
|
|
|
+//================================================================================
|
|
|
+// ASSIGNMENTS
|
|
|
+//================================================================================
|
|
|
+ assign Mosi_o = (!spiMode&directTransit)? Mosi0_i:1'b1;
|
|
|
+ assign Sck_o = (directTransit)? Sck_i:1'b0;
|
|
|
+ assign Ss0_o = (ansAddr == Adc0DirAccessAddr)? Ss_i:1'b1;
|
|
|
+ assign Ss1_o = (ansAddr == Adc1DirAccessAddr)? Ss_i:1'b1;
|
|
|
+
|
|
|
+ assign AnsAddr_o = ansAddr;
|
|
|
+ assign Miso_o = txWind? AnsReg_i[txCnt]:1'b0;
|
|
|
+//================================================================================
|
|
|
+// CODING
|
|
|
+//================================================================================
|
|
|
+
|
|
|
+ always @(posedge Sck_i) begin
|
|
|
+ if (Rst_i) begin
|
|
|
+ singleCaptReg <= 0;
|
|
|
+ quadCaptReg0 <= 0;
|
|
|
+ quadCaptReg1 <= 0;
|
|
|
+ quadCaptReg2 <= 0;
|
|
|
+ quadCaptReg3 <= 0;
|
|
|
+ end else begin
|
|
|
+ if (!Ss_i) begin
|
|
|
+ if (SpiRst_i) begin
|
|
|
+ singleCaptReg <= {singleCaptReg[CmdRegWidth-2:0],Mosi0_i};
|
|
|
+ quadCaptReg0 <= 0;
|
|
|
+ quadCaptReg1 <= 0;
|
|
|
+ quadCaptReg2 <= 0;
|
|
|
+ quadCaptReg3 <= 0;
|
|
|
+ end else begin
|
|
|
+ singleCaptReg <= 0;
|
|
|
+ quadCaptReg0 <= {quadCaptReg0[QuadSpiRegWidth-2:0],Mosi0_i};
|
|
|
+ quadCaptReg1 <= {quadCaptReg1[QuadSpiRegWidth-2:0],Mosi1_i};
|
|
|
+ quadCaptReg2 <= {quadCaptReg2[QuadSpiRegWidth-2:0],Miso0_Mosi2_io};
|
|
|
+ quadCaptReg3 <= {quadCaptReg3[QuadSpiRegWidth-2:0],Miso1_Mosi3_io};
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ always @(posedge Sck_i) begin
|
|
|
+ if (Rst_i) begin
|
|
|
+ dataCnt <= 0;
|
|
|
+ end else begin
|
|
|
+ if (~Ss_i) begin
|
|
|
+ dataCnt <= dataCnt + 5'd1;
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ always @(posedge Sck_i) begin
|
|
|
+ if (Rst_i) begin
|
|
|
+ spiMode <= 1'b0;
|
|
|
+ end else begin
|
|
|
+ if (dataCnt == 5'd1) begin
|
|
|
+ if (SpiRst_i) begin
|
|
|
+ if (singleCaptReg[CmdRegWidth-CmdRegWidth]) begin
|
|
|
+ spiMode <= 1'b1;
|
|
|
+ end else begin
|
|
|
+ spiMode <= 1'b0;
|
|
|
+ end
|
|
|
+ end else begin
|
|
|
+ if (quadCaptReg3[QuadSpiRegWidth-QuadSpiRegWidth]) begin
|
|
|
+ spiMode <= 1'b1;
|
|
|
+ end else begin
|
|
|
+ spiMode <= 1'b0;
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ always @(negedge Sck_i) begin
|
|
|
+ if (Rst_i) begin
|
|
|
+ ansAddr <= 7'h7F;
|
|
|
+ end else begin
|
|
|
+ if (~Ss_i) begin
|
|
|
+ if (dataCnt == 5'd8) begin
|
|
|
+ if (SpiRst_i) begin
|
|
|
+ ansAddr <= singleCaptReg[QuadSpiRegWidth-1:0];
|
|
|
+ end else begin
|
|
|
+ ansAddr <= quadCaptReg3[QuadSpiRegWidth-1:0];
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end else begin
|
|
|
+ ansAddr <= 7'h7F;
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+//================================================================================
|
|
|
+// Generating output signals
|
|
|
+//================================================================================
|
|
|
+
|
|
|
+ always @(posedge Clk_i) begin
|
|
|
+ ssReg <= Ss_i;
|
|
|
+ ssRegR <= ssReg;
|
|
|
+ end
|
|
|
+
|
|
|
+ always @(posedge Clk_i) begin
|
|
|
+ ssPos <= ssReg&!ssRegR;
|
|
|
+ end
|
|
|
+
|
|
|
+ always @(posedge Clk_i) begin
|
|
|
+ if (!directTransit&!spiMode) begin
|
|
|
+ if (ssReg&!ssRegR) begin
|
|
|
+ Val_o <= 1'b1;
|
|
|
+ end else begin
|
|
|
+ Val_o <= 0;
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ always @(posedge Clk_i) begin
|
|
|
+ if (Rst_i) begin
|
|
|
+ Data_o <= 0;
|
|
|
+ end else begin
|
|
|
+ if (ssReg&!ssRegR) begin
|
|
|
+ if (SpiRst_i) begin
|
|
|
+ Data_o <= singleCaptReg;
|
|
|
+ end else begin
|
|
|
+ Data_o <= {quadCaptReg3,quadCaptReg2,quadCaptReg1,quadCaptReg0};
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ always @(*) begin
|
|
|
+ if (spiMode & !Ss_i) begin
|
|
|
+ if (dataCnt >=5'd8|dataCnt == 0) begin
|
|
|
+ txWind = 1'b1;
|
|
|
+ end else begin
|
|
|
+ txWind = 1'b0;
|
|
|
+ end
|
|
|
+ end else begin
|
|
|
+ txWind = 1'b0;
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ always @(negedge Sck_i) begin
|
|
|
+ if (txWind) begin
|
|
|
+ if (~Ss_i & txWind & txCnt!= 0) begin
|
|
|
+ txCnt <= txCnt - 5'd1;
|
|
|
+ end else begin
|
|
|
+ txCnt <= 5'd24;
|
|
|
+ end
|
|
|
+ end else begin
|
|
|
+ txCnt <= 5'd24;
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+endmodule
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|