| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- //////////////////////////////////////////////////////////////////////////////////
- // Company: TAIR
- // Engineer:
- //
- // Create Date: 10/30/2023 11:24:31 AM
- // Design Name:
- // Module Name: SpiSubSystem
- // Project Name: S5443_V3_FPGA3
- // Target Devices: BOARD: BY5443v3. FPGA: xc7s25csga225-2
- // Tool Versions:
- // Description: This is wrapper that encapsulates FIFO's, Spi modules and
- // modules that multiplex Spi output lines
- //
- // Dependencies:
- //
- // Revision:
- // Revision 1.0 - File Created
- // Additional Comments:
- //
- //////////////////////////////////////////////////////////////////////////////////
- module SpiSubSystem #(
- parameter STAGES = 3,
- parameter CMD_REG_WIDTH = 32,
- parameter ADDR_REG_WIDTH = 12,
- parameter WIDTH = 1,
- parameter FIFO_NUM = 7,
- parameter ISTEMPRD = 1,
- parameter ISPOWERRST = 1
- )
- (
- input Clk_i,
- input SpiClk_i,
- input Rst_i,
- input TxEn_i,
- input FifoRxRst_i,
- input FifoTxRst_i,
- input FifoRxRstRdPtr_i,
- input FifoTxRstWrPtr_i,
- input ToFifoVal_i,
- input ToRstMemVal_i,
- input [CMD_REG_WIDTH-1:0] ToFifoData_i,
- input [1:0] WidthSel_i,
- input PulsePol_i,
- input ClockPhase_i,
- input EndianSel_i,
- input Lag_i,
- input Lead_i,
- input SelSt_i,
- input [5:0] Stop_i,
- input Assel_i,
- input [FIFO_NUM-1:0] ChipSelFpga_i,
- input [FIFO_NUM-1:0] ChipSelFlash_i,
- input SpiMode_i,
- input SpiEn_i,
- output [CMD_REG_WIDTH-1:0] TxFifoCtrlReg_o,
- output [CMD_REG_WIDTH-1:0] RxFifoCtrlReg_o,
- output [CMD_REG_WIDTH-1:0] DataFromRxFifo_o,
- output Sck_o,
- output Ss_o,
- output SsFlash_o,
- output Mosi0_o,
- inout Mosi1_io,
- output Mosi2_o,
- output Mosi3_o,
- input Ctrl_i,
- output [31:0] TempData_o
- );
- //================================================================================
- // REG/WIRE
- //================================================================================
- wire [CMD_REG_WIDTH-1:0] toSpiData;
- wire [CMD_REG_WIDTH-1:0] toSpiDataR;
- wire emptyFlagTx;
- wire sckR;
- wire ssR;
- wire mosi0R;
- wire valToTxR;
- wire valToRxR;
- wire sckQ;
- wire ssQ;
- wire mosi0Q;
- wire valToTxQ;
- wire valToTxFifoRead;
- wire valToRxFifoWrite;
- wire [CMD_REG_WIDTH-1:0] dataToRxFifo;
- wire [31:0] tempData;
- reg [31:0] tempDataReg;
- wire [31:0] powRstData;
- wire mosi1_o;
- //================================================================================
- // ASSIGNMENTS
- //================================================================================
- assign valToTxFifoRead = (SpiMode_i) ? valToTxQ : valToTxR;
- assign Mosi1_io = (SpiMode_i) ? mosi1_o : 1'bz;
- assign TempData_o = tempData;
- //================================================================================
- // CODING
- //================================================================================
- InitRst InitRst_inst
- (
- .clk_i (SpiClk_i),
- .signal_o (Rst_i)
- );
- Sync1bit #(
- .WIDTH (1),
- .STAGES (STAGES)
- ) Sync1bit_inst
- (
- .ClkFast_i (Clk_i),
- .ClkSlow_i (SpiClk_i),
- .TxEn_i (TxEn_i),
- .TxEn_o (spiTxEnSync)
- );
- DataFifoWrapper #(
- .CMD_REG_WIDTH (CMD_REG_WIDTH),
- .ADDR_REG_WIDTH (ADDR_REG_WIDTH),
- .STAGES (STAGES),
- .FIFO_NUM (FIFO_NUM)
- ) DataFifoWrapper
- (
- .WrClk_i (Clk_i),
- .RdClk_i (SpiClk_i),
- .FifoRxRst_i (FifoRxRst_i),
- .FifoTxRst_i (FifoTxRst_i),
- .FifoRxRstRdPtr_i (FifoRxRstRdPtr_i),
- .FifoTxRstWrPtr_i (FifoTxRstWrPtr_i),
- .ToFifoVal_i (ToFifoVal_i),
- .ToFifoRxData_i (dataToRxFifo),
- .ToFifoRxWriteVal_i (valToRxR),
- .ToFifoTxReadVal_i (valToTxFifoRead),
- .ToFifoData_i (ToFifoData_i),
- .TxFifoCtrlReg_o (TxFifoCtrlReg_o),
- .RxFifoCtrlReg_o (RxFifoCtrlReg_o),
- .EmptyFlagTx_o (emptyFlagTx),
- .DataFromRxFifo_o (DataFromRxFifo_o),
- .ToSpiData_o (toSpiData)
- );
- //------------------------------------------------
- //Generating needed amount of calculating channels
- generate
- if (ISTEMPRD) begin : TempRdSpi
- SPIs TempRdSpi
- (
- .Clk_i (SpiClk_i),
- .Rst_i (Rst_i | SpiMode_i),
- .Sck_i (sckR),
- .Ss_i (ssR),
- .Mosi0_i (Mosi1_io),
- .WidthSel_i (WidthSel_i),
- .EndianSel_i (EndianSel_i),
- .SelSt_i (SelSt_i),
- .DataToRxFifo_o (tempData),
- .Val_o (tempVal)
- );
- always @(posedge Clk_i) begin
- if (Rst_i) begin
- tempDataReg <= 32'd0;
- end else begin
- if (tempVal) begin
- tempDataReg <= tempData;
- end
- end
- end
- end
- endgenerate
- generate
- if (ISPOWERRST) begin : PowRstMem
- PowRstMemWrapper PowRstMemWrapper(
- .Clk_i(Clk_i),
- .Rst_i(Rst_i),
-
- .WrReq_i(ToRstMemVal_i),
- .Data_i(ToFifoData_i),
-
- .RdReq_i(),
- .Data_o(powRstData),
- .DataVal_o()
- );
- SpiDataMuxer SpiDataMuxer(
- .Clk_i (Clk_i),
- .Rst_i (Rst_i),
- .Ctrl_i (Ctrl_i),
-
- .PowRstData_i (powRstData),
- .RegularData_i (toSpiData),
-
- .Data_o (toSpiDataR)
- );
- SPIm SPIm (
- .Clk_i (SpiClk_i),
- .Start_i (spiTxEnSync),
- .Rst_i (Rst_i | SpiMode_i | !SpiEn_i),
- .EmptyFlag_i (emptyFlagTx),
- .SpiData_i (toSpiDataR),
- .WidthSel_i (WidthSel_i),
- .PulsePol_i (PulsePol_i),
- .ClockPhase_i (ClockPhase_i),
- .EndianSel_i (EndianSel_i),
- .Lag_i (Lag_i),
- .Lead_i (Lead_i),
- .Stop_i (Stop_i),
- .SelSt_i (SelSt_i),
- .Sck_o (sckR),
- .Ss_o (ssR),
- .Mosi0_o (mosi0R),
- .Val_o (valToTxR)
- );
- SPIs SPIs (
- .Clk_i (SpiClk_i),
- .Rst_i (Rst_i | SpiMode_i),
- .Sck_i (sckR),
- .Ss_i (ssR),
- .Mosi0_i (Mosi1_io),
- .WidthSel_i (WidthSel_i),
- .EndianSel_i (EndianSel_i),
- .SelSt_i (SelSt_i),
- .DataToRxFifo_o (dataToRxFifo),
- .Val_o (valToRxR)
- );
- QuadSPIm QuadSPIm (
- .Clk_i (SpiClk_i),
- .Start_i (spiTxEnSync),
- .Rst_i (Rst_i | !SpiMode_i | !SpiEn_i),
- .EmptyFlag_i (emptyFlagTx),
- .SpiData_i (toSpiDataR),
- .WidthSel_i (WidthSel_i),
- .PulsePol_i (PulsePol_i),
- .ClockPhase_i (ClockPhase_i),
- .EndianSel_i (EndianSel_i),
- .Lag_i (Lag_i),
- .Lead_i (Lead_i),
- .Stop_i (Stop_i),
- .SelSt_i (SelSt_i),
- .Sck_o (sckQ),
- .Ss_o (ssQ),
- .Mosi0_o (mosi0Q),
- .Mosi1_o (mosi1_o),
- .Mosi2_o (Mosi2_o),
- .Mosi3_o (Mosi3_o),
- .Val_o (valToTxQ)
- );
- SpiLinesMuxer SpiLinesMuxer (
- .SsR_i (ssR),
- .SsQ_i (ssQ),
- .SckR_i (sckR),
- .SckQ_i (sckQ),
- .Mosi0R_i (mosi0R),
- .Mosi0Q_i (mosi0Q),
- .ChipSelFpga_i (ChipSelFpga_i),
- .ChipSelFlash_i (ChipSelFlash_i),
- .Assel_i (Assel_i),
- .SpiMode_i (SpiMode_i),
- .Ss_o (Ss_o),
- .SsFlash_o (SsFlash_o),
- .Sck_o (Sck_o),
- .Mosi0_o (Mosi0_o)
- );
- end else begin
- SPIm SPIm (
- .Clk_i (SpiClk_i),
- .Start_i (spiTxEnSync),
- .Rst_i (Rst_i | SpiMode_i | !SpiEn_i),
- .EmptyFlag_i (emptyFlagTx),
- .SpiData_i (toSpiData),
- .WidthSel_i (WidthSel_i),
- .PulsePol_i (PulsePol_i),
- .ClockPhase_i (ClockPhase_i),
- .EndianSel_i (EndianSel_i),
- .Lag_i (Lag_i),
- .Lead_i (Lead_i),
- .Stop_i (Stop_i),
- .SelSt_i (SelSt_i),
- .Sck_o (sckR),
- .Ss_o (ssR),
- .Mosi0_o (mosi0R),
- .Val_o (valToTxR)
- );
- SPIs SPIs (
- .Clk_i (SpiClk_i),
- .Rst_i (Rst_i | SpiMode_i),
- .Sck_i (sckR),
- .Ss_i (ssR),
- .Mosi0_i (Mosi1_io),
- .WidthSel_i (WidthSel_i),
- .EndianSel_i (EndianSel_i),
- .SelSt_i (SelSt_i),
- .DataToRxFifo_o (dataToRxFifo),
- .Val_o (valToRxR)
- );
- QuadSPIm QuadSPIm (
- .Clk_i (SpiClk_i),
- .Start_i (spiTxEnSync),
- .Rst_i (Rst_i | !SpiMode_i | !SpiEn_i),
- .EmptyFlag_i (emptyFlagTx),
- .SpiData_i (toSpiData),
- .WidthSel_i (WidthSel_i),
- .PulsePol_i (PulsePol_i),
- .ClockPhase_i (ClockPhase_i),
- .EndianSel_i (EndianSel_i),
- .Lag_i (Lag_i),
- .Lead_i (Lead_i),
- .Stop_i (Stop_i),
- .SelSt_i (SelSt_i),
- .Sck_o (sckQ),
- .Ss_o (ssQ),
- .Mosi0_o (mosi0Q),
- .Mosi1_o (mosi1_o),
- .Mosi2_o (Mosi2_o),
- .Mosi3_o (Mosi3_o),
- .Val_o (valToTxQ)
- );
- SpiLinesMuxer SpiLinesMuxer (
- .SsR_i (ssR),
- .SsQ_i (ssQ),
- .SckR_i (sckR),
- .SckQ_i (sckQ),
- .Mosi0R_i (mosi0R),
- .Mosi0Q_i (mosi0Q),
- .ChipSelFpga_i (ChipSelFpga_i),
- .ChipSelFlash_i (ChipSelFlash_i),
- .Assel_i (Assel_i),
- .SpiMode_i (SpiMode_i),
- .Ss_o (Ss_o),
- .SsFlash_o (SsFlash_o),
- .Sck_o (Sck_o),
- .Mosi0_o (Mosi0_o)
- );
- end
- endgenerate
- endmodule
|