什么是按键消抖:通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。 抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。一般不会超过20mS,这是一个很重要的时间参数,在很多场合都要用到。按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。按键抖动会引起一次按键被误读多次,所以一般在使用到按键的嵌入式设备中都需要进行按键消抖。
使用verilog进行软件消抖大致可以分为4个状态:
1,没有按下按键,处于空闲状态;
2,按下按键,进入抖动滤除状态;
3,按键按下,正常状态;
4,按键释放,进入释放抖动滤除状态;
下图是状态转移图以及转移条件。
以下是代码实现:
module key_filter_top
(
input clk_50MHZ ,//系统时钟50M
input rst_n ,//系统复位
input key_in ,//按键
output reg [3:0] led , //4位LED灯
output reg key_flag,
output led_flag
);
reg key_temp0 ;//用于按键上一次状态存储
reg key_temp1 ;//用于按键当前状态存储
wire key_posedge ;//按键上升沿
wire key_negedge ;//按键下降沿
//wire led_flag;
reg [20:0]cnt ;//20位2进制计数器
reg cnt_en ;//下降沿计数使能
reg cnt_full ;//上升沿计数使能
reg key_flag_temp0 ;//用于按键上标志一次状态存储
reg key_flag_temp1 ;//用于按键标志当前状态存储
//===============================================================================
//
//边沿检测,采用寄存器方式。
//
//===============================================================================
always@(posedge clk_50MHZ or negedge rst_n)
begin
if(!rst_n)
begin
key_temp0<=1'b0;
key_temp1<=1'b0;
end
else
begin
key_temp1<=key_in;
key_temp0<=key_temp1;
end
end
assign key_posedge=(!key_temp0)&key_temp1;
assign key_ne