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.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

118 lines
3.7 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
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. .reg5 (reg5_trigger_edge_select),
  44. .regE (regE_infreq_detect),
  45. .regF (regF_outfreq_detect),
  46. .reg_wr_sig(reg_wr_sig),
  47. .reg_index (reg_wr_index)
  48. );
  49. //!寄存器写入逻辑
  50. always @(posedge clk or negedge rst_n) begin
  51. if (!rst_n) begin
  52. reg1_sig_src <= `SIGNAL_INTERNAL_CLOCK_SIG; //!默认为内部时钟
  53. reg2_freq_division_ctrl <= 0;
  54. reg3_freq_multiplication_ctrl <= 0;
  55. reg4_freq_detect_bias <= `FREQ_DETECT_BIAS_DEFAULT;
  56. end else begin
  57. if (reg_wr_sig) begin
  58. case (reg_wr_index)
  59. 1: reg1_sig_src <= wr_data;
  60. 2: reg2_freq_division_ctrl <= wr_data;
  61. 3: reg3_freq_multiplication_ctrl <= wr_data;
  62. 4: reg4_freq_detect_bias <= wr_data;
  63. 5: reg5_trigger_edge_select <= wr_data;
  64. default: begin
  65. end
  66. endcase
  67. end
  68. end
  69. end
  70. //!信号选择器
  71. zutils_multiplexer_32t1 signal_in_multiplexer (
  72. .chooseindex(reg1_sig_src),
  73. .signal (signal_in),
  74. .signalout (signal_in_choose)
  75. );
  76. //!pll信号处理
  77. zsimple_pll _simple_pll (
  78. .clk (clk),
  79. .rst_n (rst_n),
  80. .insignal (signal_in_choose),
  81. .trigger_eage_type (reg5_trigger_edge_select),
  82. .freq_detect_bias (reg4_freq_detect_bias),
  83. .freq_division (reg2_freq_division_ctrl),
  84. .freq_multiplication(reg3_freq_multiplication_ctrl),
  85. .polarity_ctrl (1'd0),
  86. .cfg_change (reg_wr_sig),
  87. .outsignal (signal_in_af_pll)
  88. );
  89. zutils_freq_detector_v2 in_freq_detector (
  90. .clk (clk),
  91. .rst_n (rst_n),
  92. .freq_detect_bias(reg4_freq_detect_bias),
  93. .pluse_input (signal_in_choose),
  94. .pluse_width_cnt (regE_infreq_detect)
  95. );
  96. zutils_freq_detector_v2 output_freq_detector (
  97. .clk (clk),
  98. .rst_n (rst_n),
  99. .freq_detect_bias(reg4_freq_detect_bias),
  100. .pluse_input (sys_clock),
  101. .pluse_width_cnt (regF_outfreq_detect)
  102. );
  103. assign sys_clock = signal_in_af_pll;
  104. endmodule