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.

152 lines
4.0 KiB

2 years ago
2 years ago
2 years ago
  1. //
  2. // @功能:
  3. // 1. 功能:同步输出,脉冲输出
  4. // 2. 输出脉冲
  5. // 3. 输出脉冲时长可调
  6. // 4. 输出极性可调
  7. //
  8. module ttl_output #(
  9. parameter REG_START_ADD = 0,
  10. parameter TEST = 0
  11. ) (
  12. input clk, //clock input
  13. input rst_n, //asynchronous reset input, low active
  14. //寄存器读写接口
  15. input [31:0] addr,
  16. input [31:0] wr_data,
  17. input wr_en,
  18. output wire [31:0] rd_data,
  19. input [7:0] signal_in,
  20. output ttloutput, //ttl输出信号
  21. output ttloutput_state_led //ttl输出状态信号
  22. );
  23. /*******************************************************************************
  24. * 寄存器列表 *
  25. *******************************************************************************/
  26. //
  27. // 输入信号选择器
  28. // 0: 信号0
  29. // 1: 信号1
  30. // ...
  31. // x: 信号x
  32. wire [31:0] reg_input_signal_select;
  33. //
  34. // 输出信号选择器
  35. // [0]
  36. // 0:输出0
  37. // 1:输出1
  38. // 2:测试信号输出
  39. // 3:原始信号
  40. // 4:原始信号翻转输出
  41. // 5:脉冲输出
  42. // 6:脉冲信号翻转输出
  43. localparam REG1_INIT = TEST ? 2 : 0;
  44. wire [31:0] reg_output_signal_select;
  45. //
  46. // 配置寄存器
  47. // [0] 脉冲输入时候触发信号 0:上升沿 1:下降沿触发
  48. //
  49. wire [31:0] reg_config;
  50. assign pluse_input_trigger_signal = reg_config[0];
  51. //
  52. // 脉冲模式-有效电平长度:
  53. // 0~0xffffffff
  54. //
  55. wire [31:0] reg_pulse_mode_valid_len; // 脉冲模式-有效电平长度: 0~0xffffffff
  56. zutils_register16 #(
  57. .REG_START_ADD(REG_START_ADD),
  58. .REG1_INIT(REG1_INIT)
  59. ) _register (
  60. .clk(clk),
  61. .rst_n(rst_n),
  62. .addr(addr),
  63. .wr_data(wr_data),
  64. .wr_en(wr_en),
  65. .rd_data(rd_data),
  66. .reg0(reg_input_signal_select),
  67. .reg1(reg_output_signal_select),
  68. .reg2(reg_config),
  69. .reg3(reg_pulse_mode_valid_len)
  70. );
  71. /*******************************************************************************
  72. * 内部信号 *
  73. *******************************************************************************/
  74. //脉冲输出
  75. wire pluse_output;
  76. // 输入信号上升沿事件
  77. wire in_signal_rising_edge;
  78. // 输入信号下降沿事件
  79. wire in_signal_falling_edge;
  80. // 输入信号上升沿或下降沿事件
  81. wire in_signal_edge;
  82. // 输出的脉冲触发信号的触发信号
  83. wire signal_src_trigger;
  84. assign signal_src_trigger = (pluse_input_trigger_signal==0) ? (in_signal_rising_edge) : (in_signal_falling_edge);
  85. wire signal_in_choose;
  86. zutils_multiplexer_16t1 _signal_select (
  87. .chooseindex(reg_input_signal_select),
  88. .signal({8'b0, signal_in}),
  89. .signalout(signal_in_choose)
  90. );
  91. // 边沿检测
  92. zutils_edge_detecter _signal_in (
  93. .clk(clk),
  94. .rst_n(rst_n),
  95. .in_signal(signal_in_choose),
  96. .in_signal_rising_edge(in_signal_rising_edge),
  97. .in_signal_falling_edge(in_signal_falling_edge),
  98. .in_signal_edge(in_signal_edge)
  99. );
  100. // 短脉冲触发生成长脉冲
  101. zutils_pluse_generator _pluse_generator (
  102. .clk(clk),
  103. .rst_n(rst_n),
  104. .pluse_width(reg_pulse_mode_valid_len),
  105. .trigger(signal_src_trigger),
  106. .output_signal(ttl_after_process_output)
  107. );
  108. zutils_pwm_generator #(
  109. .SYS_CLOCK_FREQ(50000000),
  110. .OUTPUT_FREQ(1000)
  111. ) _test_signal_generator (
  112. .clk(clk),
  113. .rst_n(rst_n),
  114. .output_signal(test_signal_output)
  115. );
  116. zutils_multiplexer_16t1 _signal_output_select (
  117. .chooseindex(reg_output_signal_select),
  118. .signal({
  119. 8'b0,
  120. /*7*/ 0,
  121. /*6*/ 0,
  122. /*5*/ ttl_after_process_output,
  123. /*4*/ !ttl_after_process_output,
  124. /*3*/ signal_in_choose,
  125. /*2*/ test_signal_output,
  126. /*1*/ 1,
  127. /*0*/ 0
  128. }),
  129. .signalout(ttloutput)
  130. );
  131. assign ttloutput_state_led = ttloutput;
  132. endmodule