Cdc.sv 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. )
  25. (
  26. input ClkFast_i,
  27. input ClkSlow_i,
  28. /* Arrays of inputs */
  29. input [WIDTH-1:0] SpiCtrlReg_i,
  30. input [WIDTH-1:0] SpiCsCtrlReg_i,
  31. input [WIDTH-1:0] SpiCsDelayReg_i,
  32. input [WIDTH-1:0] SpiTxRxFifoCtrlReg_i,
  33. /* Arrays of outputs */
  34. output [WIDTH-1:0] SpiCtrlReg_o,
  35. output [WIDTH-1:0] SpiCsCtrlReg_o,
  36. output [WIDTH-1:0] SpiCsDelayReg_o,
  37. output [WIDTH-1:0] SpiTxRxFifoCtrlReg_o
  38. );
  39. //================================================================================
  40. // REG/WIRE
  41. //================================================================================
  42. /* Arrays of launch registers */
  43. reg [WIDTH-1:0] spiCtrlReg;
  44. reg [WIDTH-1:0] spiCsCtrlReg;
  45. reg [WIDTH-1:0] spiCsDelayReg;
  46. reg [WIDTH-1:0] spiTxRxFifoCtrlReg;
  47. /* Array of capture regs */
  48. (* ASYNC_REG = "TRUE" *)reg [STAGES*WIDTH-1:0] spiCtrlReg_c;
  49. (* ASYNC_REG = "TRUE" *)reg [STAGES*WIDTH-1:0] spiCsCtrlReg_c;
  50. (* ASYNC_REG = "TRUE" *)reg [STAGES*WIDTH-1:0] spiCsDelayReg_c;
  51. (* ASYNC_REG = "TRUE" *)reg [STAGES*WIDTH-1:0] spiTxRxFifoCtrlReg_c;
  52. //================================================================================
  53. // ASSIGNMENTS
  54. //================================================================================
  55. assign SpiCtrlReg_o = spiCtrlReg_c[STAGES*WIDTH-1:(STAGES-1)*WIDTH];
  56. assign SpiCsCtrlReg_o = spiCsCtrlReg_c[STAGES*WIDTH-1:(STAGES-1)*WIDTH];
  57. assign SpiCsDelayReg_o = spiCsDelayReg_c[STAGES*WIDTH-1:(STAGES-1)*WIDTH];
  58. assign SpiTxRxFifoCtrlReg_o = spiTxRxFifoCtrlReg_c[STAGES*WIDTH-1:(STAGES-1)*WIDTH];
  59. //================================================================================
  60. // LOCALPARAMS
  61. //================================================================================
  62. //================================================================================
  63. // CODING
  64. //================================================================================
  65. always_ff @(posedge ClkFast_i) begin
  66. spiCtrlReg <= SpiCtrlReg_i;
  67. spiCsCtrlReg <= SpiCsCtrlReg_i;
  68. spiCsDelayReg <= SpiCsDelayReg_i;
  69. spiTxRxFifoCtrlReg <= SpiTxRxFifoCtrlReg_i;
  70. end
  71. always_ff @(posedge ClkSlow_i) begin : CDC_CAPTURE
  72. spiCtrlReg_c <= {spiCtrlReg_c[(STAGES-1)*WIDTH-1:0], spiCtrlReg};
  73. spiCsCtrlReg_c <= {spiCsCtrlReg_c[(STAGES-1)*WIDTH-1:0], spiCsCtrlReg};
  74. spiCsDelayReg_c <= {spiCsDelayReg_c[(STAGES-1)*WIDTH-1:0], spiCsDelayReg};
  75. spiTxRxFifoCtrlReg_c <= {spiTxRxFifoCtrlReg_c[(STAGES-1)*WIDTH-1:0], spiTxRxFifoCtrlReg};
  76. end
  77. endmodule