Cdc.sv 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. //////////////////////////////////////////////////////////////////////////////////
  2. // Company: TAIR
  3. // Engineer:
  4. //
  5. // Create Date: 10/30/2023 11:24:31 AM
  6. // Design Name:
  7. // Module Name: CDC
  8. // Project Name: S5443_V3_FPGA3
  9. // Target Devices: BOARD: BY5443v3. FPGA: xc7s25csga225-2
  10. // Tool Versions:
  11. // Description:
  12. //
  13. // Dependencies: This module synchronizes commands from RegMap to the
  14. // respective clock domain.
  15. //
  16. // Revision:
  17. // Revision 1.0 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module CDC #(
  22. parameter WIDTH = 32,
  23. parameter STAGES = 3,
  24. parameter SPI_NUM = 7
  25. )
  26. (
  27. input ClkFast_i,
  28. input [SPI_NUM-1:0] ClkSlow_i,
  29. /* Arrays of inputs */
  30. input [WIDTH-1:0] SpiCtrlReg_i [SPI_NUM-1:0],
  31. input [WIDTH-1:0] SpiCsCtrlReg_i [SPI_NUM-1:0],
  32. input [WIDTH-1:0] SpiCsDelayReg_i [SPI_NUM-1:0],
  33. input [WIDTH-1:0] SpiTxRxFifoCtrlReg_i [SPI_NUM-1:0],
  34. /* Arrays of outputs */
  35. output [WIDTH-1:0] SpiCtrlReg_o [SPI_NUM-1:0],
  36. output [WIDTH-1:0] SpiCsCtrlReg_o [SPI_NUM-1:0],
  37. output [WIDTH-1:0] SpiCsDelayReg_o [SPI_NUM-1:0],
  38. output [WIDTH-1:0] SpiTxRxFifoCtrlReg_o [SPI_NUM-1:0]
  39. );
  40. //================================================================================
  41. // REG/WIRE
  42. //================================================================================
  43. /* Arrays of launch registers */
  44. reg [WIDTH-1:0] spiCtrlReg [SPI_NUM-1:0];
  45. reg [WIDTH-1:0] spiCsCtrlReg [SPI_NUM-1:0];
  46. reg [WIDTH-1:0] spiCsDelayReg [SPI_NUM-1:0];
  47. reg [WIDTH-1:0] spiTxRxFifoCtrlReg [SPI_NUM-1:0];
  48. /* Array of capture regs */
  49. (* ASYNC_REG = "TRUE" *)reg [STAGES*WIDTH-1:0] spiCtrlReg_c [SPI_NUM-1:0];
  50. (* ASYNC_REG = "TRUE" *)reg [STAGES*WIDTH-1:0] spiCsCtrlReg_c [SPI_NUM-1:0];
  51. (* ASYNC_REG = "TRUE" *)reg [STAGES*WIDTH-1:0] spiCsDelayReg_c [SPI_NUM-1:0];
  52. (* ASYNC_REG = "TRUE" *)reg [STAGES*WIDTH-1:0] spiTxRxFifoCtrlReg_c [SPI_NUM-1:0];
  53. //================================================================================
  54. // ASSIGNMENTS
  55. //================================================================================
  56. genvar i ;
  57. generate
  58. for (i = 0; i < SPI_NUM; i = i + 1) begin : CDC_ASSIGN_OUT
  59. assign SpiCtrlReg_o[i] = spiCtrlReg_c[i][STAGES*WIDTH-1:(STAGES-1)*WIDTH];
  60. assign SpiCsCtrlReg_o[i] = spiCsCtrlReg_c[i][STAGES*WIDTH-1:(STAGES-1)*WIDTH];
  61. assign SpiCsDelayReg_o[i] = spiCsDelayReg_c[i][STAGES*WIDTH-1:(STAGES-1)*WIDTH];
  62. assign SpiTxRxFifoCtrlReg_o[i] = spiTxRxFifoCtrlReg_c[i][STAGES*WIDTH-1:(STAGES-1)*WIDTH];
  63. end
  64. endgenerate
  65. //================================================================================
  66. // LOCALPARAMS
  67. //================================================================================
  68. //================================================================================
  69. // CODING
  70. //================================================================================
  71. always_ff @(posedge ClkFast_i) begin
  72. spiCtrlReg <= SpiCtrlReg_i;
  73. spiCsCtrlReg <= SpiCsCtrlReg_i;
  74. spiCsDelayReg <= SpiCsDelayReg_i;
  75. spiTxRxFifoCtrlReg <= SpiTxRxFifoCtrlReg_i;
  76. end
  77. generate
  78. for (i = 0; i < SPI_NUM; i = i + 1) begin : CDC_GEN
  79. always_ff @(posedge ClkSlow_i[i]) begin : CDC_CAPTURE
  80. spiCtrlReg_c[i] <= {spiCtrlReg_c[i][(STAGES-1)*WIDTH-1:0], spiCtrlReg[i]};
  81. spiCsCtrlReg_c[i] <= {spiCsCtrlReg_c[i][(STAGES-1)*WIDTH-1:0], spiCsCtrlReg[i]};
  82. spiCsDelayReg_c[i] <= {spiCsDelayReg_c[i][(STAGES-1)*WIDTH-1:0], spiCsDelayReg[i]};
  83. spiTxRxFifoCtrlReg_c[i] <= {spiTxRxFifoCtrlReg_c[i][(STAGES-1)*WIDTH-1:0], spiTxRxFifoCtrlReg[i]};
  84. end
  85. end
  86. endgenerate
  87. endmodule