原理
这一检测方案中,由于在按键的抖动中,计数器不断地清零,所以时间不会达到20ms;而按键按下的时间必然会大于20ms,因此必然能够检测到。同时,在松开按键时,计数器再次被清零。
按键检测方案的Verilog HDL实现
module key_count_scan(
input clk,
input rst_n,
input [3:0] key_data,
output reg key_flag,
output reg [3:0] key_value
);
//----------------------------
//Register key_data for compare
reg [3:0] key_data_r;
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
key_data_r <= {4{1'b1}};
else
key_data_r <= key_data;
end
//----------------------------
//Delay for 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 <= 20'd0;
else begin
if((key_data == key_data_r) &&a