summaryrefslogtreecommitdiff
path: root/debouncer.v
diff options
context:
space:
mode:
authorMichael Abed <michaelabed@gmail.com>2012-04-05 15:53:47 -0400
committerMichael Abed <michaelabed@gmail.com>2012-04-05 15:53:47 -0400
commitc5c3101483a4c2facd67f514f0c320b4192f5844 (patch)
treec21262d3e8fadcb21d15da484997b56798f05307 /debouncer.v
downloadec311-lab6-master.tar.gz
ec311-lab6-master.tar.bz2
ec311-lab6-master.zip
Diffstat (limited to 'debouncer.v')
-rw-r--r--debouncer.v56
1 files changed, 56 insertions, 0 deletions
diff --git a/debouncer.v b/debouncer.v
new file mode 100644
index 0000000..d37cf6d
--- /dev/null
+++ b/debouncer.v
@@ -0,0 +1,56 @@
+module debouncer(clk_1M, rst, din, dout);
+ input clk_1M;
+ input rst;
+ input din;
+ output dout;
+
+ reg dout;
+ reg [21:0] count;
+
+ reg sync0; // first stage of synchronizer
+ reg sync1; // second stage of synchronizer
+
+ reg prev; // register for edge detection
+
+ // synchronize input. (Synchronizers will be discussed in a future lab.)
+ always @(posedge clk_1M or posedge rst) begin
+ if (rst == 1) begin
+ sync0 <= 0;
+ sync1 <= 0;
+ end
+ else begin
+ sync0 <= din;
+ sync1 <= sync0;
+ end
+ end // always
+
+ // perform an edge detect on the synchronized input.
+ always @(posedge clk_1M or posedge rst) begin
+ if (rst == 1) begin
+ prev <= 0;
+ end
+ else begin
+ prev <= sync1;
+ end
+ end // always
+
+ // state machine/counter for timing the debouncing.
+ always @(posedge clk_1M or posedge rst) begin
+ if (rst == 1) begin
+ count <= 0;
+ end
+ else begin
+ if (count == 0) begin
+ if (sync1 == 1 && prev == 0) begin // rising edge detect
+ count <= 22'd100000; // 100,000 us = 100ms delay
+ end
+ dout <= 0;
+ end
+ else begin
+ count <= count - 22'd1;
+ dout <= 1;
+ end
+ end
+ end // always
+
+endmodule