ClkManager.v 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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:
  12. //
  13. // Dependencies:
  14. //
  15. // Revision:
  16. // Revision 1.0 - File Created
  17. // Additional Comments:
  18. //
  19. //////////////////////////////////////////////////////////////////////////////////
  20. module ClkManager
  21. #(
  22. parameter SPI_NUM = 7,
  23. parameter STAGES = 3
  24. )
  25. (
  26. input Clk_i,
  27. input Rst_i,
  28. input Rst80_i,
  29. input [7:0] BaudRate0_i,
  30. input [7:0] BaudRate1_i,
  31. input [7:0] BaudRate2_i,
  32. input [7:0] BaudRate3_i,
  33. input [7:0] BaudRate4_i,
  34. input [7:0] BaudRate5_i,
  35. input [7:0] BaudRate6_i,
  36. output Clk80_o,
  37. output [SPI_NUM-1:0] SpiClk_o
  38. );
  39. //================================================================================
  40. // REG/WIRE
  41. //================================================================================
  42. wire clk0out;
  43. wire clk1out;
  44. wire clk2out;
  45. wire clk3out;
  46. wire clk4out;
  47. wire clk5out;
  48. wire clk6out;
  49. wire locked;
  50. wire [SPI_NUM-1:0] clkOutMMCM;
  51. wire [SPI_NUM-1:0] clkMan;
  52. wire [0:2] clkNum [SPI_NUM-1:0];
  53. wire [0:3] clkDiv [SPI_NUM-1:0];
  54. wire [0:3] clkDivSync [SPI_NUM-1:0];
  55. wire [SPI_NUM-1:0] clkCh;
  56. wire [SPI_NUM-1:0] spiClk;
  57. //================================================================================
  58. // ASSIGNMENTS
  59. //===============================================================================
  60. assign clkNum[0] = BaudRate0_i[7:5];
  61. assign clkNum[1] = BaudRate1_i[7:5];
  62. assign clkNum[2] = BaudRate2_i[7:5];
  63. assign clkNum[3] = BaudRate3_i[7:5];
  64. assign clkNum[4] = BaudRate4_i[7:5];
  65. assign clkNum[5] = BaudRate5_i[7:5];
  66. assign clkNum[6] = BaudRate6_i[7:5];
  67. assign clkDiv[0] = BaudRate0_i[3:0];
  68. assign clkDiv[1] = BaudRate1_i[3:0];
  69. assign clkDiv[2] = BaudRate2_i[3:0];
  70. assign clkDiv[3] = BaudRate3_i[3:0];
  71. assign clkDiv[4] = BaudRate4_i[3:0];
  72. assign clkDiv[5] = BaudRate5_i[3:0];
  73. assign clkDiv[6] = BaudRate6_i[3:0];
  74. assign clkCh[0] = BaudRate0_i[4];
  75. assign clkCh[1] = BaudRate1_i[4];
  76. assign clkCh[2] = BaudRate2_i[4];
  77. assign clkCh[3] = BaudRate3_i[4];
  78. assign clkCh[4] = BaudRate4_i[4];
  79. assign clkCh[5] = BaudRate5_i[4];
  80. assign clkCh[6] = BaudRate6_i[4];
  81. // assign SpiClk_o[0] = spiClk[0];
  82. // assign SpiClk_o[1] = spiClk[1];
  83. // assign SpiClk_o[2] = spiClk[2];
  84. // assign SpiClk_o[3] = spiClk[3];
  85. // assign SpiClk_o[4] = spiClk[4];
  86. // assign SpiClk_o[5] = spiClk[5];
  87. // assign SpiClk_o[6] = spiClk[6];
  88. assign SpiClk_o = spiClk;
  89. assign Clk100_o = clk0out;
  90. assign Clk80_o = clk1out;
  91. //================================================================================
  92. // LOCALPARAMS
  93. //================================================================================
  94. //================================================================================
  95. // CODING
  96. //================================================================================
  97. genvar i;
  98. generate
  99. for (i = 0; i < SPI_NUM; i = i + 1) begin : ClkGen
  100. ClkDivider ClkDivider (
  101. .Clk_i (clk1out),
  102. .ClkDiv_i (clkDivSync[i]),
  103. .Rst_i (Rst80_i),
  104. .Clk_o (clkMan[i])
  105. );
  106. CmdSync #(
  107. .WIDTH (4),
  108. .STAGES (STAGES)
  109. ) CmdSync (
  110. .ClkFast_i (Clk_i),
  111. .ClkSlow_i (clk1out),
  112. .ClkDiv_i (clkDiv[i]),
  113. .ClkDiv_o (clkDivSync[i])
  114. );
  115. MmcmClkMux MmcmClkMux (
  116. .Rst_i (Rst_i),
  117. .clkNum (clkNum[i]),
  118. .Clk0_i (clk0out),
  119. .Clk1_i (clk1out),
  120. .Clk2_i (clk2out),
  121. .Clk3_i (clk3out),
  122. .Clk4_i (clk4out),
  123. .Clk5_i (clk5out),
  124. .Clk6_i (clk6out),
  125. .ClkOutMMCM_o (clkOutMMCM[i])
  126. );
  127. SpiClkMux SpiClkMux (
  128. .Rst_i (Rst_i),
  129. .clkCh (clkCh[i]),
  130. .clkOutMMCM (clkOutMMCM[i]),
  131. .clkMan (clkMan[i]),
  132. .SpiClk_o (spiClk[i])
  133. );
  134. end
  135. endgenerate
  136. MMCM MMCM
  137. (
  138. // Clock out ports
  139. .clk_out1(clk0out), //100 MHz
  140. .clk_out2(clk1out), // 80 MHz
  141. .clk_out3(clk2out), // 70 MHz
  142. .clk_out4(clk3out), // 60MHz
  143. .clk_out5(clk4out), // 50MHz
  144. .clk_out6(clk5out), // 40MHz
  145. .clk_out7(clk6out), // 30MHz
  146. // Status and control signals
  147. .reset(Rst_i), // input reset
  148. .locked(locked), // output locked
  149. // Clock in ports
  150. .clk_in1(Clk_i) // input clk_in1
  151. );
  152. endmodule