summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debounce.tb.v3
-rw-r--r--debounce.v32
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
diff --git a/debounce.v b/debounce.v
index efeb845..704a588 100644
--- a/debounce.v
+++ b/debounce.v
@@ -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