-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdebouncer.v
83 lines (68 loc) · 2.17 KB
/
debouncer.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// debouncer.v
//
// Copyright (C) 2020 Dan Rodrigues <[email protected]>
//
// SPDX-License-Identifier: MIT
`default_nettype none
module debouncer #(
parameter integer BTN_COUNT = 8
) (
input clk,
input reset,
input [BTN_COUNT - 1:0] btn,
output reg [BTN_COUNT - 1:0] level,
output reg [BTN_COUNT - 1:0] trigger,
output reg [BTN_COUNT - 1:0] released
);
localparam BTN_WIDTH = BTN_COUNT - 1;
reg [BTN_WIDTH:0] btn_r [0:1];
reg [15:0] debounce_counter_common;
wire debounce_counter_common_tick = debounce_counter_common[15];
reg [4:0] debounce_counter_button [0:BTN_WIDTH];
always @(posedge clk) begin
btn_r[1] <= btn_r[0];
btn_r[0] <= btn;
end
reg [BTN_WIDTH:0] level_r;
always @(posedge clk) begin
if (reset) begin
level <= 0;
trigger <= 0;
released <= 0;
end else begin
for (i = 0; i < BTN_COUNT; i = i + 1) begin
if (debounce_counter_button[i][4]) begin
level[i] <= btn_r[1][i];
end
trigger[i] <= level[i] & ~level_r[i];
released[i] <= ~level[i] & level_r[i];
level_r[i] <= level[i];
end
end
end
always @(posedge clk) begin
if (reset) begin
debounce_counter_common <= 0;
end else begin
debounce_counter_common <= (debounce_counter_common_tick ? 0 : debounce_counter_common + 1);
end
end
always @(posedge clk) begin
if (reset) begin
for (i = 0; i < BTN_COUNT; i = i + 1) begin
debounce_counter_button[i] <= 0;
end
end else begin
for (i = 0; i < BTN_COUNT; i = i + 1) begin
if ((btn_r[0][i] == btn_r[1][i])) begin
if (debounce_counter_common_tick && !debounce_counter_button[i][4]) begin
debounce_counter_button[i] <= debounce_counter_button[i] + 1;
end
end else begin
debounce_counter_button[i] <= 0;
end
end
end
end
integer i;
endmodule