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.

145 lines
5.3 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. // `include "zutils/zutils_edge_detecter.v"
  2. // `include "zutils/zutils_pluse_generator.v"
  3. // `include "zutils/zutils_register.v"
  4. module des_ttl_generator #(
  5. parameter REG_START_ADD = 0
  6. ) (
  7. input clk, //clock input
  8. input rst_n, //asynchronous reset input, low active
  9. //regbus interface
  10. output [31:0] addr,
  11. input [31:0] wr_data,
  12. input wr_en,
  13. inout wire [31:0] rd_data, //received serial data
  14. // 输入
  15. input signal_in,
  16. //输出
  17. output reg ttloutput //ttl原始数据
  18. );
  19. //
  20. // @功能:
  21. // 1. 功能:同步输出,脉冲输出
  22. // 2. 输出脉冲
  23. // 3. 输出脉冲时长可调
  24. // 4. 输出极性可调
  25. //
  26. //
  27. // @寄存器列表:
  28. // 地址 读写 默认 描述
  29. // 0x00 wr 0x0 模式 0:同步输出 1:脉冲输出
  30. // 0x01 wr 0x0 脉冲模式-脉冲触发方式 0:上升沿 1:下降沿触发
  31. // 0x02 wr 0x0 脉冲模式-有效电平长度: 0~0xffffffff
  32. // 0x03 wr 0x0 输出极性 0:正极性 1:极性翻转
  33. //
  34. parameter ADD_NUM = 5; //寄存器数量
  35. parameter REG_FUNC_ADD = REG_START_ADD + 0; //功能寄存器地址
  36. parameter REG_PULSE_MODE_ADD = REG_START_ADD + 1; //脉冲模式寄存器地址
  37. parameter REG_PULSE_MODE_RISE_FALL_ADD = REG_START_ADD + 2; //脉冲模式-脉冲触发方式寄存器地址
  38. parameter REG_PULSE_MODE_VALID_LEN_ADD = REG_START_ADD + 3; //脉冲模式-有效电平长度寄存器地址
  39. parameter REG_OUTPUT_POLARITY_ADD = REG_START_ADD + 4; //输出极性寄存器地址
  40. reg ttl_origin_output; //ttl原始信号输出
  41. wire ttl_after_process_output; //ttl处理后信号输出
  42. assign signal_in_a = signal_in; //信号输入
  43. reg signal_in_b = 0; //信号输入延迟一周期
  44. /*******************************************************************************
  45. * 寄存器读写 *
  46. *******************************************************************************/
  47. // parameter REG_END_ADD = REG_START_ADD + ADD_NUM - 1; //寄存器结束地址
  48. // reg [31:0] register[REG_START_ADD:REG_END_ADD];
  49. // integer i;
  50. // always @(posedge clk or negedge rst_n) begin
  51. // if (!rst_n) begin
  52. // for (i = 0; i < ADD_NUM; i = i + 1) begin
  53. // register[i] <= 0;
  54. // end
  55. // end else begin
  56. // if (wr_en && addr >= REG_START_ADD && addr <= REG_END_ADD) register[addr] <= wr_data;
  57. // end
  58. // end
  59. // assign rd_data = (addr >= REG_START_ADD && addr <= REG_END_ADD) ? register[addr] : 31'bz;
  60. zutils_register #(
  61. .REG_START_ADD(REG_START_ADD),
  62. .ADD_NUM(5)
  63. ) _register (
  64. .clk(clk),
  65. .rst_n(rst_n),
  66. .addr(addr),
  67. .wr_data(wr_data),
  68. .wr_en(wr_en),
  69. .rd_data(rd_data)
  70. );
  71. // zutils_edge_detecter _signal_in (
  72. // .clk(clk),
  73. // .rst_n(rst_n),
  74. // .signal_in(signal_in)
  75. // );
  76. /*******************************************************************************
  77. * signal_a and signal_b *
  78. *******************************************************************************/
  79. // signal_in 脉冲信号捕获
  80. always @(posedge clk or negedge rst_n) begin
  81. if (!rst_n) begin
  82. signal_in_b <= 0;
  83. end else begin
  84. signal_in_b <= signal_in_a;
  85. end
  86. end
  87. /*******************************************************************************
  88. * 脉冲模式输出 *
  89. *******************************************************************************/
  90. // 电平计数
  91. reg [31:0] signal_output_duration_cnt;
  92. assign signal_src_trigger = (_register.data[REG_PULSE_MODE_RISE_FALL_ADD] == 0) ? (signal_in_a & ~signal_in_b) : (~signal_in_a & signal_in_b);
  93. // 通过计数输出波形
  94. assign ttl_after_process_output = (signal_output_duration_cnt < _register.data[REG_PULSE_MODE_VALID_LEN_ADD]) ? 1 : 0;
  95. // 脉冲计数
  96. always @(posedge clk or negedge rst_n) begin
  97. if (!rst_n) begin
  98. signal_output_duration_cnt <= 0;
  99. end else begin
  100. // 脉冲模式
  101. if (_register.data[REG_FUNC_ADD] == 1) begin
  102. if (signal_src_trigger == 1) begin
  103. signal_output_duration_cnt <= 0;
  104. end else begin
  105. signal_output_duration_cnt <= signal_output_duration_cnt + 1;
  106. end
  107. end // 非脉冲模式
  108. else begin
  109. signal_output_duration_cnt <= 0;
  110. end
  111. end
  112. end
  113. /*******************************************************************************
  114. * 信号输出控制 *
  115. *******************************************************************************/
  116. reg ttloutput;
  117. always @(*) begin
  118. case (_register.data[REG_FUNC_ADD])
  119. 0: begin
  120. ttloutput = (_register.data[REG_OUTPUT_POLARITY_ADD][0] == 0) ? ttl_origin_output : !ttl_origin_output;
  121. end
  122. 1: begin
  123. ttloutput = (_register.data[REG_OUTPUT_POLARITY_ADD][0] == 0) ? ttl_after_process_output : !ttl_after_process_output;
  124. end
  125. default: ttloutput = 0;
  126. endcase
  127. end
  128. endmodule