-
Notifications
You must be signed in to change notification settings - Fork 0
/
TipKey.v
83 lines (71 loc) · 1.53 KB
/
TipKey.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
module TipKey(
clk,
rst_n,
key,
sig
);
parameter KEY_DOWN_VAL = 1'B0;
parameter KEY_CNT_WIDTH = 24;
parameter SHAKE_FILTER = 24'D1000000; // 20ms <=> 50MHz
parameter SER_SPEED = 5'D15;
localparam SER_MUL = SER_SPEED + 1'B1;
localparam SER_CNT_MAX = SHAKE_FILTER * SER_MUL - 1'B1;
localparam KEY_CNT_MAX = SHAKE_FILTER - 1'B1;
localparam STA_0 = 2'D0;
localparam STA_DOWN = 2'D1;
localparam STA_SER = 2'D2;
input clk;
input rst_n;
input key;
output sig;
reg sig;
reg[1:0] key_sta;
reg[KEY_CNT_WIDTH-1:0] key_cnt;
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
key_sta <= STA_0;
key_cnt <= 1'B0;
sig <= 1'B0;
end else begin
sig <= 1'B0;
case (key_sta)
STA_0: begin
if(key == KEY_DOWN_VAL) begin
key_sta <= STA_DOWN;
key_cnt <= 1'B0;
end
end
STA_DOWN: begin
if(key == KEY_DOWN_VAL) begin
if(key_cnt > KEY_CNT_MAX) begin
key_sta <= STA_SER;
key_cnt <= 1'B0;
sig <= 1'B1;
end else begin
key_cnt <= key_cnt + 1'B1;
end
end else begin
key_sta <= STA_0;
end
end
STA_SER: begin
if(key == KEY_DOWN_VAL) begin
if(key_cnt > SER_CNT_MAX) begin
key_cnt <= 1'B0;
sig <= 1'B1;
end else begin
key_cnt <= key_cnt + 1'B1;
end
end else begin
if(key_cnt < SHAKE_FILTER) begin
key_sta <= STA_0;
end else begin
key_cnt <= key_cnt - SHAKE_FILTER;
end
end
end
default: key_sta <= STA_0;
endcase
end
end
endmodule