| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- module InitRst (
- clk_i,
- signal_o
- );
- //================================================================================
- //
- // FUNCTIONS
- //
- //================================================================================
- function integer bit_num;
- input integer value;
- begin
- bit_num = 0;
- while (value > 0) begin
- value = value >> 1;
- bit_num = bit_num + 1;
- end
- end
- endfunction
- //================================================================================
- //
- // PARAMETER/LOCALPARAM
- //
- //================================================================================
- parameter DELAY_VALUE = 20;
- localparam DELAY_CNT_W = bit_num(DELAY_VALUE);
- //================================================================================
- //
- // PORTS
- //
- //================================================================================
- input clk_i;
- output reg signal_o;
- //================================================================================
- //
- // STATE MACHINE STATES
- //
- //================================================================================
- localparam SM_RST_S = 1'b0;
- localparam SM_DONE_S = 1'b1;
- //================================================================================
- //
- // REG/WIRE
- //
- //================================================================================
- reg curr_state = SM_RST_S;
- reg [DELAY_CNT_W-1:0] delay_cnt = {DELAY_CNT_W{1'b0}};
- reg delay_flag = 1'b0;
- reg next_state;
- reg [DELAY_CNT_W-1:0] delay_cnt_next = {DELAY_CNT_W{1'b0}};
- reg signal_next;
- //================================================================================
- //
- // CODING
- //
- //================================================================================
- initial begin
- curr_state = SM_RST_S;
- delay_cnt = {DELAY_CNT_W{1'b0}};
- signal_o = 1'b1;
- delay_flag = 1'b0;
- end
- always @(posedge clk_i) begin
- curr_state <= next_state;
- delay_cnt <= delay_cnt_next;
- signal_o <= signal_next;
- delay_flag <= delay_cnt > (DELAY_VALUE - 1);
- end
- always @(*) begin
- next_state = SM_RST_S;
- delay_cnt_next = delay_cnt;
- signal_next = 1'b1;
- case(curr_state)
- SM_RST_S : begin
- if (delay_flag) begin
- next_state = SM_DONE_S;
- end else begin
- next_state = SM_RST_S;
- delay_cnt_next = delay_cnt + {{(DELAY_CNT_W-1){1'b0}}, 1'b1};
- end
- end
- SM_DONE_S : begin
- signal_next = 1'b0;
- next_state = SM_DONE_S;
- end
- endcase
- end
- endmodule
|