-
Notifications
You must be signed in to change notification settings - Fork 0
/
module key_counter_scan.v
82 lines (72 loc) · 1.57 KB
/
module key_counter_scan.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
module key_counter_scan
#(
parameter KEY_WIDTH = 4
)
(
//global clock
input clk,
input rst_n,
//key interface
input [KEY_WIDTH-1:0] key_data,
//user interface
output reg key_flag,
output reg [KEY_WIDTH-1:0] key_value //H Valid
);
//-----------------------------------
//Register key_data for compare
reg [KEY_WIDTH-1:0] key_data_r;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
key_data_r <= {KEY_WIDTH{1'b1}};
else
key_data_r <= key_data;
end
//-----------------------------------
//continue 20ms
localparam DELAY_TOP = 20'd1000_000;
//localparam DELAY_TOP = 20'd1000; //Just for test
reg [19:0] delay_cnt;
//-----------------------------------
//Key scan via counter detect.
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
delay_cnt <= 0;
else
begin
if((key_data == key_data_r) && (key_data != {KEY_WIDTH{1'b1}})) //20ms counter jitter
begin
if(delay_cnt < DELAY_TOP)
delay_cnt <= delay_cnt + 1'b1;
else
delay_cnt <= DELAY_TOP;
end
else
delay_cnt <= 0;
end
end
//-----------------------------------
//the complete of key_data capture
wire key_trigger = (delay_cnt == DELAY_TOP - 1'b1) ? 1'b1 : 1'b0;
//-----------------------------------
//output the valid key_value via key_trigger
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
key_value <= {KEY_WIDTH{1'b0}};
else if(key_trigger)
key_value <= ~key_data_r;
else
key_value <= key_value;
end
//---------------------------------
//Lag 1 clock for valid read enable
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
key_flag <= 0;
else
key_flag <= key_trigger;
end
endmodule