AdcInitRst.v 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. module AdcInitRst (
  2. clk_i,
  3. rst_i,
  4. signal_o,
  5. done_o
  6. );
  7. //================================================================================
  8. //
  9. // FUNCTIONS
  10. //
  11. //================================================================================
  12. function integer bit_num;
  13. input integer value;
  14. begin
  15. bit_num = 0;
  16. while (value > 0) begin
  17. value = value >> 1;
  18. bit_num = bit_num + 1;
  19. end
  20. end
  21. endfunction
  22. //================================================================================
  23. //
  24. // PARAMETER/LOCALPARAM
  25. //
  26. //================================================================================
  27. parameter DELAY_VALUE = 24000;
  28. parameter LENGTH_WIDTH = 2;
  29. localparam DELAY_CNT_W = bit_num(DELAY_VALUE);
  30. //================================================================================
  31. //
  32. // PORTS
  33. //
  34. //================================================================================
  35. input clk_i;
  36. input rst_i;
  37. output reg signal_o;
  38. output reg done_o;
  39. //================================================================================
  40. //
  41. // STATE MACHINE STATES
  42. //
  43. //================================================================================
  44. localparam [1:0] SM_RST_S = 2'b00;
  45. localparam [1:0] SM_DELAY_S = 2'b01;
  46. localparam [1:0] SM_SIGNAL_S = 2'b10;
  47. localparam [1:0] SM_DONE_S = 2'b11;
  48. //================================================================================
  49. //
  50. // REG/WIRE
  51. //
  52. //================================================================================
  53. reg [1:0] curr_state;
  54. reg [1:0] next_state;
  55. reg [DELAY_CNT_W-1:0] delay_cnt;
  56. reg [DELAY_CNT_W-1:0] delay_cnt_next;
  57. reg signal_next;
  58. reg done_next;
  59. //================================================================================
  60. //
  61. // CODING
  62. //
  63. //================================================================================
  64. always @(posedge clk_i or posedge rst_i) begin
  65. if (rst_i) begin
  66. curr_state <= SM_RST_S;
  67. delay_cnt <= {DELAY_CNT_W{1'b0}};
  68. signal_o <= 1'b0;
  69. done_o <= 1'b0;
  70. end else begin
  71. curr_state <= next_state;
  72. delay_cnt <= delay_cnt_next;
  73. signal_o <= signal_next;
  74. done_o <= done_next;
  75. end
  76. end
  77. always @(*) begin
  78. next_state = SM_RST_S;
  79. delay_cnt_next = {DELAY_CNT_W{1'b0}};
  80. signal_next = 1'b0;
  81. done_next = 1'b0;
  82. case(curr_state)
  83. SM_RST_S : begin
  84. next_state = SM_DELAY_S;
  85. end
  86. SM_DELAY_S : begin
  87. if (delay_cnt == DELAY_VALUE[DELAY_CNT_W-1:0]) begin
  88. next_state = SM_SIGNAL_S;
  89. delay_cnt_next = {DELAY_CNT_W{1'b0}};
  90. end else begin
  91. next_state = SM_DELAY_S;
  92. delay_cnt_next = delay_cnt + {{(DELAY_CNT_W-1){1'b0}}, 1'b1};
  93. end
  94. end
  95. SM_SIGNAL_S : begin
  96. signal_next = 1'b1;
  97. if (delay_cnt == LENGTH_WIDTH[DELAY_CNT_W-1:0]) begin
  98. next_state = SM_DONE_S;
  99. end else begin
  100. next_state = SM_SIGNAL_S;
  101. delay_cnt_next = delay_cnt + {{(DELAY_CNT_W-1){1'b0}}, 1'b1};
  102. end
  103. end
  104. SM_DONE_S : begin
  105. done_next = 1'b1;
  106. next_state = SM_DONE_S;
  107. end
  108. endcase
  109. end
  110. endmodule