-
Notifications
You must be signed in to change notification settings - Fork 0
/
switch_debounce.v
115 lines (105 loc) · 1.84 KB
/
switch_debounce.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
`timescale 1ns / 1ps
module switch_debounce(
input swclock,
input swtick,
input sw,
output dirsw,dirsw_neg,
output reg dbsw,
output dbsw_neg,
output [2:0] state
);
localparam [2:0]
zero=3'b000,
wait1_1=3'b001,
wait1_2=3'b010,
wait1_3=3'b011,
one=3'b100,
wait0_1=3'b101,
wait0_2=3'b110,
wait0_3=3'b111;
reg[2:0] state_reg, state_next;
assign dirsw=sw; // przepisanie wejœcia na wyjœcie
assign dirsw_neg=~sw; // przepisanie wejœcia na wyjœcie
assign dbsw_neg=~dbsw; // zanegowane wyjœcie - przydatne przy pullup
assign state=state_reg; // udostêpnienie stanu
always @(posedge swclock)
begin
state_reg<=state_next;
end
// next-state logic
always @*
begin
state_next=state_reg;
dbsw=1'b1; // pullup
case(state_reg)
zero:
begin
dbsw=1'b0;
if(sw)
state_next=wait1_1;
end
wait1_1:
begin
dbsw=1'b0;
if(~sw)
state_next=zero;
else
if(swtick)
state_next=wait1_2;
end
wait1_2:
begin
dbsw=1'b0;
if(~sw)
state_next=zero;
else
if(swtick)
state_next=wait1_3;
end
wait1_3:
begin
dbsw=1'b0;
if(~sw)
state_next=zero;
else
if(swtick)
state_next=one;
end
one:
begin
dbsw=1'b1;// nadmiarowe (wartoœæ domyœlna)
if(~sw)
state_next=wait0_1;
end
wait0_1:
begin
dbsw=1'b1;// nadmiarowe
if(sw)
state_next=one;
else
if(swtick)
state_next=wait0_2;
end
wait0_2:
begin
dbsw=1'b1;// nadmiarowe
if(sw)
state_next=one;
else
if(swtick)
state_next=wait0_3;
end
wait0_3:
begin
dbsw=1'b1; // nadmiarowe
if(sw)
state_next=one;
else
if(swtick)
state_next=zero;
end
default:
state_next=one; // pullup
endcase
end
endmodule