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.

173 lines
6.1 KiB

1 year ago
1 year ago
2 years ago
1 year ago
2 years ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years 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
2 years 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
2 years ago
1 year ago
2 years ago
  1. `include "../config.v"
  2. module light_src_ctrl #(
  3. parameter REG_START_ADD = 0,
  4. parameter SYS_CLOCK_FREQ = 100000000,
  5. parameter ID = 1
  6. ) (
  7. input clk, //clock input
  8. input rst_n, //asynchronous reset input, low active
  9. //寄存器读写接口
  10. input [31:0] addr,
  11. input [31:0] wr_data,
  12. input wr_en,
  13. output wire [31:0] rd_data,
  14. input [31:0] signal_in,
  15. output wire lt_intensity_ctrl,
  16. output wire lt_en,
  17. input wire lt_error_sig_in
  18. );
  19. /*******************************************************************************
  20. * 寄存器列表 *
  21. *******************************************************************************/
  22. reg [31:0] reg1_source_select;
  23. reg [31:0] reg2_en_sig_ctrl_mode; //!0:触发模式 1:转发模式
  24. reg [31:0] reg3_light_intensity_ctrl_mode; //!0:固定强度
  25. reg [31:0] reg4_trigger_mode_pluse_num;
  26. reg [31:0] reg5_trigger_mode_pluse_interval;
  27. reg [31:0] reg6_trigger_mode_pluse_width;
  28. reg [31:0] reg7_trigger_mode_first_pluse_offset;
  29. reg [31:0] reg8_trigger_mode_output_polarity;
  30. reg [31:0] reg9_light_intensity_cnt;
  31. reg [31:0] regA_light_driver_freq_cnt;
  32. reg [31:0] regC_freq_detect_bias;
  33. reg [31:0] regD_light_src_error_state;
  34. wire [31:0] regE_in_sig_freq_detect;
  35. wire [31:0] regF_out_sig_freq_detect;
  36. wire [31:0] reg_wr_index; //!寄存器写入时相对地址
  37. //!TTLOUT_寄存器自动赋值选择器
  38. zutils_register_advanced #(
  39. .REG_START_ADD(REG_START_ADD)
  40. ) _register (
  41. .clk (clk),
  42. .rst_n (rst_n),
  43. .addr (addr),
  44. .wr_data(wr_data),
  45. .wr_en (wr_en),
  46. .rd_data(rd_data),
  47. .reg1(reg1_source_select),
  48. .reg2(reg2_en_sig_ctrl_mode),
  49. .reg3(reg3_light_intensity_ctrl_mode),
  50. .reg4(reg4_trigger_mode_pluse_num),
  51. .reg5(reg5_trigger_mode_pluse_interval),
  52. .reg6(reg6_trigger_mode_pluse_width),
  53. .reg7(reg7_trigger_mode_first_pluse_offset),
  54. .reg8(reg8_trigger_mode_output_polarity),
  55. .reg9(reg9_light_intensity_cnt),
  56. .regA(regA_light_driver_freq_cnt),
  57. .regC(regC_freq_detect_bias),
  58. .regD(regD_light_src_error_state),
  59. .regE(regE_in_sig_freq_detect),
  60. .regF(regF_out_sig_freq_detect),
  61. .reg_wr_sig(reg_wr_sig),
  62. .reg_index (reg_wr_index)
  63. );
  64. //!寄存器写入逻辑
  65. localparam pluse_interval_init_val = 1 * (SYS_CLOCK_FREQ / 32'd1000_000); //1us
  66. localparam pluse_width_initval = 30 * (SYS_CLOCK_FREQ / 32'd1000_000); //1us
  67. always @(posedge clk or negedge rst_n) begin
  68. if (!rst_n) begin
  69. reg1_source_select <= `SIG_INTERNAL_CLK;
  70. reg2_en_sig_ctrl_mode <= 0;
  71. reg3_light_intensity_ctrl_mode <= 0;
  72. reg4_trigger_mode_pluse_num <= 1;
  73. reg5_trigger_mode_pluse_interval <= pluse_interval_init_val;
  74. reg6_trigger_mode_pluse_width <= pluse_width_initval;
  75. reg7_trigger_mode_first_pluse_offset <= pluse_interval_init_val * ID + ((ID - 1) * pluse_width_initval);
  76. reg8_trigger_mode_output_polarity <= 1;
  77. reg9_light_intensity_cnt <= (SYS_CLOCK_FREQ / 30000 / 10); //100k
  78. regA_light_driver_freq_cnt <= (SYS_CLOCK_FREQ / 30000); //100k
  79. regC_freq_detect_bias <= `FREQ_DETECT_BIAS_DEFAULT;
  80. end else begin
  81. if (reg_wr_sig) begin
  82. case (reg_wr_index)
  83. 32'h1: reg1_source_select <= reg_wr_index;
  84. 32'h2: reg2_en_sig_ctrl_mode <= reg_wr_index;
  85. 32'h3: reg3_light_intensity_ctrl_mode <= reg_wr_index;
  86. 32'h4: reg4_trigger_mode_pluse_num <= reg_wr_index;
  87. 32'h5: reg5_trigger_mode_pluse_interval <= reg_wr_index;
  88. 32'h6: reg6_trigger_mode_pluse_width <= reg_wr_index;
  89. 32'h7: reg7_trigger_mode_first_pluse_offset <= reg_wr_index;
  90. 32'h8: reg8_trigger_mode_output_polarity <= reg_wr_index;
  91. 32'h9: reg9_light_intensity_cnt <= reg_wr_index;
  92. 32'hA: regA_light_driver_freq_cnt <= reg_wr_index;
  93. 32'hC: regC_freq_detect_bias <= reg_wr_index;
  94. default: begin
  95. end
  96. endcase
  97. end
  98. end
  99. end
  100. wire signal_in_choose; //!选中的信号
  101. wire signal_in_choose_rsing_edge; //!选中的信号
  102. wire signal_en_output; //!EN信号输出
  103. wire signal_lt_intensity; //!光强输出
  104. //!信号选择器
  105. zutils_multiplexer_32t1 signal_in_multiplexer (
  106. .chooseindex(reg1_source_select),
  107. .signal (signal_in),
  108. .signalout (signal_in_choose)
  109. );
  110. zutils_edge_detecter edge_detecter (
  111. .clk (clk),
  112. .rst_n (rst_n),
  113. .in_signal (signal_in_choose),
  114. .in_signal_rising_edge(signal_in_choose_rsing_edge)
  115. );
  116. zutils_pluse_generator_v2 pluse_generator (
  117. .clk (clk),
  118. .rst_n(rst_n),
  119. .pluse_width (reg6_trigger_mode_pluse_width),
  120. .pluse_delay (reg7_trigger_mode_first_pluse_offset),
  121. .trigger (signal_in_choose_rsing_edge),
  122. .output_signal(signal_en_output)
  123. );
  124. /*******************************************************************************
  125. * 光源亮度信号发生器 *
  126. *******************************************************************************/
  127. zutils_pwm_generator_v2 signal_lt_intensity_generator (
  128. .clk (clk),
  129. .rst_n(rst_n),
  130. .pluse_width_cnt (reg9_light_intensity_cnt),
  131. .pluse_period_cnt(regA_light_driver_freq_cnt),
  132. .output_signal(signal_lt_intensity)
  133. );
  134. /*******************************************************************************
  135. * 异常信号捕获 *
  136. *******************************************************************************/
  137. always @(posedge clk or negedge rst_n) begin
  138. if (!rst_n) begin
  139. regD_light_src_error_state <= 0;
  140. end else begin
  141. regD_light_src_error_state[0] <= lt_error_sig_in;
  142. end
  143. end
  144. assign lt_intensity_ctrl = signal_lt_intensity;
  145. assign lt_en = signal_en_output;
  146. endmodule