MmcmWrapper.v 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. module MmcmWrapper
  2. #(
  3. parameter SpiNum = 7,
  4. parameter STAGES = 3
  5. )
  6. (
  7. input Clk_i,
  8. input Rst_i,
  9. input Rst80_i,
  10. input [7:0] BaudRate0_i,
  11. input [7:0] BaudRate1_i,
  12. input [7:0] BaudRate2_i,
  13. input [7:0] BaudRate3_i,
  14. input [7:0] BaudRate4_i,
  15. input [7:0] BaudRate5_i,
  16. input [7:0] BaudRate6_i,
  17. output Clk80_o,
  18. output [SpiNum-1:0] SpiClk_o
  19. );
  20. //================================================================================
  21. // REG/WIRE
  22. //================================================================================
  23. wire clk0out;
  24. wire clk1out;
  25. wire clk2out;
  26. wire clk3out;
  27. wire clk4out;
  28. wire clk5out;
  29. wire clk6out;
  30. wire locked;
  31. wire [SpiNum-1:0] clkOutMMCM;
  32. wire [SpiNum-1:0] clkMan;
  33. wire [0:2] clkNum [SpiNum-1:0];
  34. wire [0:3] clkDiv [SpiNum-1:0];
  35. wire [0:3] clkDivSync [SpiNum-1:0];
  36. wire [SpiNum-1:0] clkCh;
  37. wire [SpiNum-1:0] spiClk;
  38. //================================================================================
  39. // ASSIGNMENTS
  40. //================================================================================
  41. // assign SpiClk_o[0] = clk1out;
  42. // assign SpiClk_o[1] = clk2out;
  43. // assign SpiClk_o[2] = clk3out;
  44. // assign SpiClk_o[3] = clk4out;
  45. // assign SpiClk_o[4] = clk5out;
  46. // assign SpiClk_o[5] = clk6out;
  47. // assign SpiClk_o[6] = clk7out;
  48. assign clkNum[0] = BaudRate0_i[7:5];
  49. assign clkNum[1] = BaudRate1_i[7:5];
  50. assign clkNum[2] = BaudRate2_i[7:5];
  51. assign clkNum[3] = BaudRate3_i[7:5];
  52. assign clkNum[4] = BaudRate4_i[7:5];
  53. assign clkNum[5] = BaudRate5_i[7:5];
  54. assign clkNum[6] = BaudRate6_i[7:5];
  55. assign clkDiv[0] = BaudRate0_i[3:0];
  56. assign clkDiv[1] = BaudRate1_i[3:0];
  57. assign clkDiv[2] = BaudRate2_i[3:0];
  58. assign clkDiv[3] = BaudRate3_i[3:0];
  59. assign clkDiv[4] = BaudRate4_i[3:0];
  60. assign clkDiv[5] = BaudRate5_i[3:0];
  61. assign clkDiv[6] = BaudRate6_i[3:0];
  62. assign clkCh[0] = BaudRate0_i[4];
  63. assign clkCh[1] = BaudRate1_i[4];
  64. assign clkCh[2] = BaudRate2_i[4];
  65. assign clkCh[3] = BaudRate3_i[4];
  66. assign clkCh[4] = BaudRate4_i[4];
  67. assign clkCh[5] = BaudRate5_i[4];
  68. assign clkCh[6] = BaudRate6_i[4];
  69. assign SpiClk_o[0] = spiClk[0];
  70. assign SpiClk_o[1] = spiClk[1];
  71. assign SpiClk_o[2] = spiClk[2];
  72. assign SpiClk_o[3] = spiClk[3];
  73. assign SpiClk_o[4] = spiClk[4];
  74. assign SpiClk_o[5] = spiClk[5];
  75. assign SpiClk_o[6] = spiClk[6];
  76. assign Clk100_o = clk0out;
  77. assign Clk80_o = clk1out;
  78. //================================================================================
  79. // LOCALPARAMS
  80. //================================================================================
  81. //================================================================================
  82. // CODING
  83. //================================================================================
  84. genvar i;
  85. generate
  86. for (i=0; i < SpiNum; i = i +1) begin : ClkGen
  87. ClkGen ClkGen_inst (
  88. .Clk_i(clk1out),
  89. .ClkDiv_i(clkDivSync[i]),
  90. .Rst_i(Rst80_i),
  91. .Clk_o(clkMan[i])
  92. );
  93. ClkDivSync #(
  94. .WIDTH(4),
  95. .STAGES(STAGES)
  96. ) ClkDiv_Inst (
  97. .ClkFast_i(Clk_i),
  98. .ClkSlow_i(clk1out),
  99. .ClkDiv_i(clkDiv[i]),
  100. .ClkDiv_o(clkDivSync[i])
  101. );
  102. clkOutMMCM clkOutMMCM_inst (
  103. .Rst_i(Rst_i),
  104. .clkNum(clkNum[i]),
  105. .clk0out(clk0out),
  106. .clk1out(clk1out),
  107. .clk2out(clk2out),
  108. .clk3out(clk3out),
  109. .clk4out(clk4out),
  110. .clk5out(clk5out),
  111. .clk6out(clk6out),
  112. .ClkOutMMCM_o(clkOutMMCM[i])
  113. );
  114. ClkCh ClkCh_inst (
  115. .Rst_i(Rst_i),
  116. .clkCh(clkCh[i]),
  117. .clkOutMMCM(clkOutMMCM[i]),
  118. .clkMan(clkMan[i]),
  119. .SpiClk_o(spiClk[i])
  120. );
  121. end
  122. endgenerate
  123. ClkDiv ClkDiv_inst
  124. (
  125. // Clock out ports
  126. .clk_out1(clk0out), //100 MHz
  127. .clk_out2(clk1out), // 80 MHz
  128. .clk_out3(clk2out), // 70 MHz
  129. .clk_out4(clk3out), // 60MHz
  130. .clk_out5(clk4out), // 50MHz
  131. // .clk_out6(clk5out), // 40MHz
  132. .clk_out7(clk6out), // 30MHz
  133. // Status and control signals
  134. .reset(Rst_i), // input reset
  135. .locked(locked), // output locked
  136. // Clock in ports
  137. .clk_in1(Clk_i)); // input clk_in1
  138. endmodule