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.

97 lines
2.7 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. module sys_signal_delayer #(
  2. parameter REG_START_ADD = 0,
  3. parameter SYS_CLOCK_FREQ = 10000000,
  4. parameter SIG_BUS_WIDTH = 15
  5. ) (
  6. input clk, //! 时钟输入
  7. input rst_n, //! 复位输入
  8. input [31:0] addr, //! 寄存器地址
  9. input [31:0] wr_data, //! 写入数据
  10. input wr_en, //! 写使能
  11. output wire [31:0] rd_data, //! 读出数据
  12. /*******************************************************************************
  13. * 输入信号延迟 *
  14. *******************************************************************************/
  15. input [SIG_BUS_WIDTH:0] sig_in,
  16. output [SIG_BUS_WIDTH:0] sig_out
  17. );
  18. reg [31:0] r1_ctrl_reg_index;
  19. reg [31:0] r2_delay_cnt_ctrl;
  20. reg [31:0] delay_ctrl [SIG_BUS_WIDTH:0];
  21. wire [31:0] reg_wr_index;
  22. zutils_register_advanced #(
  23. .REG_START_ADD(REG_START_ADD)
  24. ) _register (
  25. .clk (clk),
  26. .rst_n (rst_n),
  27. .addr (addr),
  28. .wr_data (wr_data),
  29. .wr_en (wr_en),
  30. .rd_data (rd_data),
  31. .reg1 (r1_ctrl_reg_index),
  32. .reg2 (r2_delay_cnt_ctrl),
  33. .reg_wr_sig(reg_wr_sig),
  34. .reg_index (reg_wr_index)
  35. );
  36. reg delayer_rst_n_ctrl;
  37. integer m;
  38. always @(posedge clk or negedge rst_n) begin
  39. if (!rst_n) begin
  40. r1_ctrl_reg_index <= 0;
  41. r2_delay_cnt_ctrl <= delay_ctrl[r1_ctrl_reg_index][31:0];
  42. for (m = 0; m <= SIG_BUS_WIDTH; m = m + 1) begin
  43. delay_ctrl[m] <= 0;
  44. end
  45. delayer_rst_n_ctrl <= 1;
  46. end else begin
  47. case (reg_wr_sig)
  48. 0: begin
  49. delayer_rst_n_ctrl <= 1;
  50. // r2_delay_cnt_ctrl <= delay_ctrl[r1_ctrl_reg_index][31:0];
  51. end
  52. 1: begin
  53. delayer_rst_n_ctrl <= 0;
  54. case (reg_wr_index)
  55. 1: begin
  56. if (wr_data <= SIG_BUS_WIDTH) begin
  57. r1_ctrl_reg_index <= wr_data;
  58. r2_delay_cnt_ctrl <= delay_ctrl[wr_data][31:0];
  59. end
  60. end
  61. 2: begin
  62. delay_ctrl[r1_ctrl_reg_index][31:0] <= wr_data;
  63. r2_delay_cnt_ctrl <= wr_data;
  64. end
  65. endcase
  66. end
  67. endcase
  68. end
  69. end
  70. assign delayer_rst_n = delayer_rst_n_ctrl & rst_n;
  71. genvar i;
  72. generate
  73. for (i = 0; i <= SIG_BUS_WIDTH; i = i + 1) begin
  74. zutils_sig_delayer_v2 sig_delayer_inst (
  75. .clk (clk),
  76. .rst_n (delayer_rst_n),
  77. .delay_cnt(delay_ctrl[i]),
  78. .in (sig_in[i]),
  79. .out (sig_out[i])
  80. );
  81. // assign sig_out[i] = sig_in[i];
  82. end
  83. endgenerate
  84. // assign sig_out = sig_in;
  85. endmodule