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.

157 lines
5.1 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 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 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 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 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 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. module zsimple_pll (
  2. input clk, //!clock input
  3. input rst_n, //!asynchronous reset input, low active
  4. input insignal, //!输入信号
  5. input trigger_eage_type,
  6. input wire [31:0] freq_detect_bias, //! 频率偏差计数
  7. input wire [31:0] freq_division,
  8. input wire [31:0] freq_multiplication,
  9. input wire polarity_ctrl,
  10. input wire cfg_change,
  11. output wire outsignal,
  12. output reg output_trigger_sig
  13. );
  14. //
  15. //
  16. //insignal
  17. // ----->
  18. // insignal_trigger_sig
  19. // ------->
  20. // insignal_division
  21. // -------->
  22. // insignal_multiplication
  23. wire insignal_rising_edge; //! 输入信号上升沿
  24. wire insignal_falling_edge; //! 输入信号下降沿
  25. reg insignal_trigger_sig; //! 触发信号
  26. wire module_reset; //! 模块内部复位信号
  27. reg insignal_division; //! 输入信号分频后的信号
  28. reg insignal_multiplication; //! 输入信号倍频后的信号
  29. reg insignal_pluse_width_modulation; //! 输入信号脉宽调制后的信号
  30. zutils_edge_detecter edge_detecter (
  31. .clk (clk),
  32. .rst_n (rst_n),
  33. .in_signal (insignal),
  34. .in_signal_rising_edge (insignal_rising_edge),
  35. .in_signal_falling_edge(insignal_falling_edge)
  36. );
  37. always @(*) begin
  38. case (trigger_eage_type)
  39. 0: insignal_trigger_sig <= insignal_rising_edge;
  40. 1: insignal_trigger_sig <= insignal_rising_edge;
  41. 2: insignal_trigger_sig <= insignal_rising_edge;
  42. default:
  43. insignal_trigger_sig <= insignal_rising_edge;
  44. endcase
  45. end
  46. // assign insignal_trigger_sig = trigger_eage_type ? insignal_rising_edge : insignal_falling_edge;
  47. assign module_reset = !rst_n || cfg_change;
  48. // 分频
  49. reg [31:0] insignal_division_cnt;
  50. always @(posedge clk or posedge module_reset) begin
  51. if (module_reset) begin
  52. insignal_division_cnt <= 0;
  53. insignal_division <= 0;
  54. end else begin
  55. if (insignal_trigger_sig) begin
  56. if (insignal_division_cnt >= freq_division) begin
  57. insignal_division_cnt <= 0;
  58. insignal_division <= 1;
  59. end else begin
  60. insignal_division_cnt <= insignal_division_cnt + 1;
  61. end
  62. end else begin
  63. insignal_division <= 0;
  64. end
  65. end
  66. end
  67. wire [31:0] insignal_multiplication_freq_cnt;
  68. wire pluse_width_cnt_lock;
  69. zutils_freq_detector_v2 freq_detector (
  70. .clk (clk),
  71. .rst_n (rst_n),
  72. .freq_detect_bias (freq_detect_bias),
  73. .pluse_input (insignal_division),
  74. .pluse_width_cnt (insignal_multiplication_freq_cnt),
  75. .pluse_width_cnt_lock(pluse_width_cnt_lock)
  76. );
  77. reg [31:0] multiplication_cnt;
  78. reg [31:0] multiplication_state;
  79. reg [31:0] gen_pluse_cnt;
  80. always @(posedge clk or posedge module_reset) begin
  81. if (module_reset || !pluse_width_cnt_lock) begin
  82. multiplication_cnt <= 0;
  83. multiplication_state <= 0;
  84. gen_pluse_cnt <= 0;
  85. insignal_multiplication <= 0;
  86. output_trigger_sig <= 0;
  87. end else begin
  88. case (multiplication_state)
  89. 0: begin
  90. gen_pluse_cnt <= 0;
  91. multiplication_cnt <= 0;
  92. insignal_multiplication <= 0;
  93. if (pluse_width_cnt_lock) begin
  94. multiplication_state <= 1;
  95. end
  96. end
  97. 1: begin
  98. if (insignal_division) begin
  99. multiplication_state <= 2;
  100. gen_pluse_cnt <= 0;
  101. insignal_multiplication <= 1;
  102. output_trigger_sig <= 1;
  103. multiplication_cnt <= 0;
  104. end
  105. end
  106. 2: begin
  107. if (multiplication_cnt < insignal_multiplication_freq_cnt >> 1) begin
  108. multiplication_cnt <= multiplication_cnt + freq_multiplication + 1;
  109. insignal_multiplication <= 1;
  110. output_trigger_sig <= 0;
  111. end else if ((multiplication_cnt + freq_multiplication + 2) >= insignal_multiplication_freq_cnt) begin
  112. gen_pluse_cnt <= gen_pluse_cnt + 1;
  113. multiplication_cnt <= 0;
  114. insignal_multiplication <= 1;
  115. output_trigger_sig <= 1;
  116. gen_pluse_cnt <= gen_pluse_cnt + 1;
  117. end else begin
  118. output_trigger_sig <= 0;
  119. if (gen_pluse_cnt >= freq_multiplication) begin
  120. multiplication_state <= 1;
  121. insignal_multiplication <= 0;
  122. multiplication_cnt <= 0;
  123. end else begin
  124. multiplication_cnt <= multiplication_cnt + freq_multiplication + 1;
  125. insignal_multiplication <= 0;
  126. end
  127. end
  128. end
  129. default: begin
  130. multiplication_state <= 0;
  131. end
  132. endcase
  133. end
  134. end
  135. assign outsignal = insignal_multiplication ^ polarity_ctrl;
  136. endmodule