按键消抖在单片机上的实现是非常简单的,检测到输入变化后延时一段时间继续检测,在FPGA上也可以运用相似的原理,延时采用计数方式。
注:此消抖方法并不是最优化的,本文并不主讲消抖,而是讲在消抖过程中发现的阻塞赋值和非阻塞赋值的区别
本文使用的按键消抖中,有四个重要的寄存器和一个wire型变量:
output reg key_state; //寄存新的key状态
output reg key_state_pre; //寄存上一个key状态
output reg key_delay_state; //寄存计数值满后的key状态
output reg key_delay_state_pre; //寄存计数值满后的上一个key状态
wire key_negedge; //检测key是否出现下降沿,其值为 key_negedge = key_state_pre&(~key_state)
//为1时出现下降沿,即按下,为0时没按下,或为一直按下,或为弹起
消抖原理如下:
首先判断按键是否按下(出现下降沿)
always@(posedge clk or negedge rst_n) //key状态读取模块
begin
if(!rst_n)
begin
key_state <= 1;
key_state_pre <= 1;
end
else
begin
key_state <= key; //key_state为当前key值
key_state_pre <= key_state; //key_state_pre为上一个周期key值
end
end
assign key_negedge