You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
3.6 KiB

1 year ago
  1. `include "../config.v"
  2. module sys_clock #(
  3. parameter REG_START_ADD = 0,
  4. parameter SYS_CLOCK_FREQ = 10000000
  5. ) (
  6. input clk, //clock input
  7. input rst_n, //asynchronous reset input, low active
  8. //寄存器读写接口
  9. input [31:0] addr,
  10. input [31:0] wr_data,
  11. input wr_en,
  12. output wire [31:0] rd_data,
  13. input [31:0] signal_in,
  14. output sys_clock
  15. );
  16. /*******************************************************************************
  17. * 寄存器列表 *
  18. *******************************************************************************/
  19. reg [31:0] reg1_sig_src; //!信号源选择
  20. reg [31:0] reg2_freq_division_ctrl; //!分频控制
  21. reg [31:0] reg3_freq_multiplication_ctrl; //!倍频控制
  22. reg [31:0] reg4_freq_detect_bias; //!频率探测滤波系数
  23. reg [31:0] reg5_trigger_edge_select; //!触发电平
  24. wire [31:0] regE_infreq_detect; //!输入频率探测
  25. wire [31:0] regF_outfreq_detect; //!输出频率探测
  26. wire [31:0] reg_wr_index; //!寄存器写入时相对地址
  27. wire signal_in_choose; //!选择的信号源
  28. wire signal_in_af_pll;
  29. //!TTLOUT_寄存器自动赋值选择器
  30. zutils_register_advanced #(
  31. .REG_START_ADD(REG_START_ADD)
  32. ) _register (
  33. .clk (clk),
  34. .rst_n (rst_n),
  35. .addr (addr),
  36. .wr_data(wr_data),
  37. .wr_en (wr_en),
  38. .rd_data(rd_data),
  39. .reg1 (reg1_sig_src),
  40. .reg2 (reg2_freq_division_ctrl),
  41. .reg3 (reg3_freq_multiplication_ctrl),
  42. .reg4 (reg4_freq_detect_bias),
  43. .regE (regE_infreq_detect),
  44. .regF (regF_outfreq_detect),
  45. .reg_wr_sig(reg_wr_sig),
  46. .reg_index (reg_wr_index)
  47. );
  48. //!寄存器写入逻辑
  49. always @(posedge clk or negedge rst_n) begin
  50. if (!rst_n) begin
  51. reg1_sig_src <= 0;
  52. reg2_freq_division_ctrl <= 0;
  53. reg3_freq_multiplication_ctrl <= 0;
  54. reg4_freq_detect_bias <= `FREQ_DETECT_BIAS_DEFAULT;
  55. end else begin
  56. if (reg_wr_sig) begin
  57. case (reg_wr_index)
  58. 1: reg1_sig_src <= wr_data;
  59. 2: reg2_freq_division_ctrl <= wr_data;
  60. 3: reg3_freq_multiplication_ctrl <= wr_data;
  61. 4: reg4_freq_detect_bias <= wr_data;
  62. default: begin
  63. end
  64. endcase
  65. end
  66. end
  67. end
  68. //!信号选择器
  69. zutils_multiplexer_32t1 signal_in_multiplexer (
  70. .chooseindex(reg1_sig_src),
  71. .signal (signal_in),
  72. .signalout (signal_in_choose)
  73. );
  74. //!pll信号处理
  75. zsimple_pll _simple_pll (
  76. .clk (clk),
  77. .rst_n (rst_n),
  78. .insignal (signal_in_choose),
  79. .trigger_eage_type (reg5_trigger_edge_select[0]),
  80. .freq_detect_bias (reg4_freq_detect_bias),
  81. .freq_division (reg2_freq_division_ctrl),
  82. .freq_multiplication(reg3_freq_multiplication_ctrl),
  83. .polarity_ctrl (1'd0),
  84. .cfg_change (reg_wr_sig),
  85. .outsignal (signal_in_af_pll)
  86. );
  87. zutils_freq_detector_v2 in_freq_detector (
  88. .clk (clk),
  89. .rst_n (rst_n),
  90. .freq_detect_bias(reg4_freq_detect_bias),
  91. .pluse_input (signal_in_choose),
  92. .pluse_width_cnt (regE_infreq_detect)
  93. );
  94. zutils_freq_detector_v2 output_freq_detector (
  95. .clk (clk),
  96. .rst_n (rst_n),
  97. .freq_detect_bias(reg4_freq_detect_bias),
  98. .pluse_input (sys_clock),
  99. .pluse_width_cnt (regF_outfreq_detect)
  100. );
  101. assign sys_clock = signal_in_af_pll;
  102. endmodule