diff options
| -rw-r--r-- | debounce.tb.v | 3 | ||||
| -rw-r--r-- | debounce.v | 32 |
2 files changed, 32 insertions, 3 deletions
diff --git a/debounce.tb.v b/debounce.tb.v index 36f3a27..7501e2b 100644 --- a/debounce.tb.v +++ b/debounce.tb.v @@ -16,6 +16,7 @@ debounce uut( .signal_i(signal_i), .signal_o(signal_o) ); +defparam uut.STABLE_PERIOD = 5; initial begin $dumpfile("debounce.lxt2"); $dumpvars(); @@ -51,7 +52,7 @@ initial begin #500 signal_i <= ~signal_i; - #105 + #500 $finish(); end @@ -5,11 +5,39 @@ module debounce ( output reg signal_o ); +parameter STABLE_PERIOD = 50; +parameter INIT_SIG_STATE = 1'b1; + +reg [31:0] clk_counter; +reg prev_state; + always @(posedge clk_i or negedge rst_i) begin if (!rst_i) begin - + clk_counter <= 0; + prev_state <= INIT_SIG_STATE; + signal_o <= INIT_SIG_STATE; + end else begin + clk_counter <= clk_counter + 1; + + if (signal_i != prev_state) begin + clk_counter <= 0; + prev_state <= signal_i; + end + + if (clk_counter == STABLE_PERIOD) begin + signal_o <= signal_i; + end end - signal_o <= signal_i; end +// Learning? +// Apparently, (and obviously, when you think about it), +// it's not possible to drive a signal by two blocks +// always @(signal_i) begin +// if (signal_i != prev_state) begin +// clk_counter <= 0; +// prev_state <= signal_i; +// end +// end + endmodule |
