ClkManager.sv 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. //////////////////////////////////////////////////////////////////////////////////
  2. // Company: TAIR
  3. // Engineer:
  4. //
  5. // Create Date: 10/30/2023 11:24:31 AM
  6. // Design Name:
  7. // Module Name: ClkManager
  8. // Project Name: S5443_V3_FPGA3
  9. // Target Devices: BOARD: BY5443v3. FPGA: xc7s25csga225-2
  10. // Tool Versions:
  11. // Description: This module is a clock distributor. Based on a setting it
  12. // multiplexing cloks that generated either from MMCM or from
  13. // a custom divider.
  14. //
  15. // Dependencies:
  16. //
  17. // Revision:
  18. // Revision 1.0 - File Created
  19. // Additional Comments:
  20. //
  21. //////////////////////////////////////////////////////////////////////////////////
  22. module ClkManager
  23. #(
  24. parameter SPI_NUM = 7,
  25. parameter STAGES = 3
  26. )
  27. (
  28. input Clk_i,
  29. input Rst_i,
  30. input Rst80_i,
  31. input [7:0] BaudRate_i [SPI_NUM-1:0],
  32. output Clk80_o,
  33. output [SPI_NUM-1:0] SpiClk_o,
  34. output SubSystSyncRst_o
  35. );
  36. //================================================================================
  37. // REG/WIRE
  38. //================================================================================
  39. wire clk0out;
  40. wire clk1out;
  41. wire clk2out;
  42. wire clk3out;
  43. wire clk4out;
  44. wire clk5out;
  45. wire clk6out;
  46. wire locked;
  47. wire [SPI_NUM-1:0] clkOutMMCM;
  48. wire [SPI_NUM-1:0] clkMan;
  49. wire [0:2] clkNum [SPI_NUM-1:0];
  50. wire [0:3] clkDiv [SPI_NUM-1:0];
  51. wire [0:3] clkDivSync [SPI_NUM-1:0];
  52. wire [SPI_NUM-1:0] clkCh;
  53. wire [SPI_NUM-1:0] spiClk;
  54. //================================================================================
  55. // ASSIGNMENTS
  56. //===============================================================================
  57. genvar k;
  58. generate
  59. for (k = 0; k < SPI_NUM; k = k + 1) begin : ClkGenAssignments
  60. assign clkNum[k] = BaudRate_i[k][7:5];
  61. assign clkDiv[k] = BaudRate_i[k][3:0];
  62. assign clkCh[k] = BaudRate_i[k][4];
  63. end
  64. endgenerate
  65. assign SpiClk_o = spiClk;
  66. assign Clk100_o = clk0out;
  67. assign Clk80_o = clk1out;
  68. //================================================================================
  69. // LOCALPARAMS
  70. //================================================================================
  71. //================================================================================
  72. // CODING
  73. //================================================================================
  74. genvar i;
  75. generate
  76. for (i = 0; i < SPI_NUM; i = i + 1) begin : ClkGen
  77. ClkDivider ClkDivider (
  78. .Clk_i (clk1out),
  79. .ClkDiv_i (clkDivSync[i]),
  80. .Rst_i (Rst_i),
  81. .Clk_o (clkMan[i])
  82. );
  83. CmdSync #(
  84. .WIDTH (4),
  85. .STAGES (STAGES)
  86. ) CmdSync (
  87. .ClkFast_i (Clk_i),
  88. .ClkSlow_i (clk1out),
  89. .ClkDiv_i (clkDiv[i]),
  90. .ClkDiv_o (clkDivSync[i])
  91. );
  92. MmcmClkMux MmcmClkMux (
  93. .Rst_i (Rst_i),
  94. .clkNum (clkNum[i]),
  95. .Clk0_i (clk0out),
  96. .Clk1_i (clk1out),
  97. .Clk2_i (clk2out),
  98. .Clk3_i (clk3out),
  99. .Clk4_i (clk4out),
  100. .Clk5_i (clk5out),
  101. .Clk6_i (clk6out),
  102. .ClkOutMMCM_o (clkOutMMCM[i])
  103. );
  104. SpiClkMux SpiClkMux (
  105. .Rst_i (Rst_i),
  106. .clkCh (clkCh[i]),
  107. .clkOutMMCM (clkOutMMCM[i]),
  108. .clkMan (clkMan[i]),
  109. .SpiClk_o (spiClk[i])
  110. );
  111. end
  112. endgenerate
  113. MMCM MMCM
  114. (
  115. // Clock out ports
  116. .clk_out1(clk0out), //100 MHz
  117. .clk_out2(clk1out), // 80 MHz
  118. .clk_out3(clk2out), // 70 MHz
  119. .clk_out4(clk3out), // 60MHz
  120. .clk_out5(clk4out), // 50MHz
  121. .clk_out6(clk5out), // 40MHz
  122. .clk_out7(clk6out), // 30MHz
  123. // Status and control signals
  124. .reset(Rst_i), // input reset
  125. .locked(locked), // output locked
  126. // Clock in ports
  127. .clk_in1(Clk_i) // input clk_in1
  128. );
  129. InitRst InitRst
  130. (
  131. .clk_i (clk6out),
  132. .signal_o (SubSystSyncRst_o)
  133. );
  134. endmodule