| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- //////////////////////////////////////////////////////////////////////////////////
- // Company: TAIR
- // Engineer:
- //
- // Create Date: 10/30/2023 11:24:31 AM
- // Design Name:
- // Module Name: CDC
- // Project Name: S5443_V3_FPGA3
- // Target Devices: BOARD: BY5443v3. FPGA: xc7s25csga225-2
- // Tool Versions:
- // Description:
- //
- // Dependencies: This module synchronizes commands from RegMap to the
- // respective clock domain.
- //
- // Revision:
- // Revision 1.0 - File Created
- // Additional Comments:
- //
- //////////////////////////////////////////////////////////////////////////////////
- module CDC #(
- parameter WIDTH = 32,
- parameter STAGES = 3,
- parameter SPI_NUM = 7
- )
- (
- input ClkFast_i,
- input [SPI_NUM-1:0] ClkSlow_i,
- /* Arrays of inputs */
- input [WIDTH-1:0] SpiCtrlReg_i [SPI_NUM-1:0],
- input [WIDTH-1:0] SpiCsCtrlReg_i [SPI_NUM-1:0],
- input [WIDTH-1:0] SpiCsDelayReg_i [SPI_NUM-1:0],
- input [WIDTH-1:0] SpiTxRxFifoCtrlReg_i [SPI_NUM-1:0],
- /* Arrays of outputs */
- output [WIDTH-1:0] SpiCtrlReg_o [SPI_NUM-1:0],
- output [WIDTH-1:0] SpiCsCtrlReg_o [SPI_NUM-1:0],
- output [WIDTH-1:0] SpiCsDelayReg_o [SPI_NUM-1:0],
- output [WIDTH-1:0] SpiTxRxFifoCtrlReg_o [SPI_NUM-1:0]
-
- );
- //================================================================================
- // REG/WIRE
- //================================================================================
- /* Arrays of launch registers */
- reg [WIDTH-1:0] spiCtrlReg [SPI_NUM-1:0];
- reg [WIDTH-1:0] spiCsCtrlReg [SPI_NUM-1:0];
- reg [WIDTH-1:0] spiCsDelayReg [SPI_NUM-1:0];
- reg [WIDTH-1:0] spiTxRxFifoCtrlReg [SPI_NUM-1:0];
- /* Array of capture regs */
- (* ASYNC_REG = "TRUE" *)reg [STAGES*WIDTH-1:0] spiCtrlReg_c [SPI_NUM-1:0];
- (* ASYNC_REG = "TRUE" *)reg [STAGES*WIDTH-1:0] spiCsCtrlReg_c [SPI_NUM-1:0];
- (* ASYNC_REG = "TRUE" *)reg [STAGES*WIDTH-1:0] spiCsDelayReg_c [SPI_NUM-1:0];
- (* ASYNC_REG = "TRUE" *)reg [STAGES*WIDTH-1:0] spiTxRxFifoCtrlReg_c [SPI_NUM-1:0];
- //================================================================================
- // ASSIGNMENTS
- //================================================================================
- genvar i ;
- generate
- for (i = 0; i < SPI_NUM; i = i + 1) begin : CDC_ASSIGN_OUT
- assign SpiCtrlReg_o[i] = spiCtrlReg_c[i][STAGES*WIDTH-1:(STAGES-1)*WIDTH];
- assign SpiCsCtrlReg_o[i] = spiCsCtrlReg_c[i][STAGES*WIDTH-1:(STAGES-1)*WIDTH];
- assign SpiCsDelayReg_o[i] = spiCsDelayReg_c[i][STAGES*WIDTH-1:(STAGES-1)*WIDTH];
- assign SpiTxRxFifoCtrlReg_o[i] = spiTxRxFifoCtrlReg_c[i][STAGES*WIDTH-1:(STAGES-1)*WIDTH];
- end
- endgenerate
- //================================================================================
- // LOCALPARAMS
- //================================================================================
- //================================================================================
- // CODING
- //================================================================================
- always_ff @(posedge ClkFast_i) begin
- spiCtrlReg <= SpiCtrlReg_i;
- spiCsCtrlReg <= SpiCsCtrlReg_i;
- spiCsDelayReg <= SpiCsDelayReg_i;
- spiTxRxFifoCtrlReg <= SpiTxRxFifoCtrlReg_i;
- end
- generate
- for (i = 0; i < SPI_NUM; i = i + 1) begin : CDC_GEN
- always_ff @(posedge ClkSlow_i[i]) begin : CDC_CAPTURE
- spiCtrlReg_c[i] <= {spiCtrlReg_c[i][(STAGES-1)*WIDTH-1:0], spiCtrlReg[i]};
- spiCsCtrlReg_c[i] <= {spiCsCtrlReg_c[i][(STAGES-1)*WIDTH-1:0], spiCsCtrlReg[i]};
- spiCsDelayReg_c[i] <= {spiCsDelayReg_c[i][(STAGES-1)*WIDTH-1:0], spiCsDelayReg[i]};
- spiTxRxFifoCtrlReg_c[i] <= {spiTxRxFifoCtrlReg_c[i][(STAGES-1)*WIDTH-1:0], spiTxRxFifoCtrlReg[i]};
- end
- end
- endgenerate
- endmodule
|