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.

122 lines
4.7 KiB

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