InitRst.v 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. module InitRst (
  2. clk_i,
  3. signal_o
  4. );
  5. //================================================================================
  6. //
  7. // FUNCTIONS
  8. //
  9. //================================================================================
  10. function integer bit_num;
  11. input integer value;
  12. begin
  13. bit_num = 0;
  14. while (value > 0) begin
  15. value = value >> 1;
  16. bit_num = bit_num + 1;
  17. end
  18. end
  19. endfunction
  20. //================================================================================
  21. //
  22. // PARAMETER/LOCALPARAM
  23. //
  24. //================================================================================
  25. parameter DELAY_VALUE = 20;
  26. localparam DELAY_CNT_W = bit_num(DELAY_VALUE);
  27. //================================================================================
  28. //
  29. // PORTS
  30. //
  31. //================================================================================
  32. input clk_i;
  33. output reg signal_o;
  34. //================================================================================
  35. //
  36. // STATE MACHINE STATES
  37. //
  38. //================================================================================
  39. localparam SM_RST_S = 1'b0;
  40. localparam SM_DONE_S = 1'b1;
  41. //================================================================================
  42. //
  43. // REG/WIRE
  44. //
  45. //================================================================================
  46. reg curr_state = SM_RST_S;
  47. reg [DELAY_CNT_W-1:0] delay_cnt = {DELAY_CNT_W{1'b0}};
  48. reg delay_flag = 1'b0;
  49. reg next_state;
  50. reg [DELAY_CNT_W-1:0] delay_cnt_next = {DELAY_CNT_W{1'b0}};
  51. reg signal_next;
  52. //================================================================================
  53. //
  54. // CODING
  55. //
  56. //================================================================================
  57. initial begin
  58. curr_state = SM_RST_S;
  59. delay_cnt = {DELAY_CNT_W{1'b0}};
  60. signal_o = 1'b1;
  61. delay_flag = 1'b0;
  62. end
  63. always @(posedge clk_i) begin
  64. curr_state <= next_state;
  65. delay_cnt <= delay_cnt_next;
  66. signal_o <= signal_next;
  67. delay_flag <= delay_cnt > (DELAY_VALUE - 1);
  68. end
  69. always @(*) begin
  70. next_state = SM_RST_S;
  71. delay_cnt_next = delay_cnt;
  72. signal_next = 1'b1;
  73. case(curr_state)
  74. SM_RST_S : begin
  75. if (delay_flag) begin
  76. next_state = SM_DONE_S;
  77. end else begin
  78. next_state = SM_RST_S;
  79. delay_cnt_next = delay_cnt + {{(DELAY_CNT_W-1){1'b0}}, 1'b1};
  80. end
  81. end
  82. SM_DONE_S : begin
  83. signal_next = 1'b0;
  84. next_state = SM_DONE_S;
  85. end
  86. endcase
  87. end
  88. endmodule