按键消抖原理及VHDL代码实现

按键消抖原理及VHDL代码实现

按键抖动原理

按键消抖原理及VHDL代码实现_第1张图片
如上图所示,当我们按下FPGA上的button键之后,我们理想的状态如黑线所示,但是实际的情况是如红线所示,会有几次的来回抖动,然后才会变得稳定。这个问题就会导致FPGA检测到数次1,这样可能就会运行数次操作,从而得到错误的结果。

按键消抖原理

按键消抖原理及VHDL代码实现_第2张图片
因为按下FPGA的按键时,弹簧片最低震动频率不会低于50 HZ,所以,两次下降沿出现的时间差不会超过20ms, 也就是说,当我们检测到一次下降沿/上升沿之后,再在20ms内检测是否有下降沿/上升沿产生,如果有,则重新检测,如果没有,则说明按键稳定。(一般而言,按钮被释放比按钮被按下去的反弹要少很多)

按键消抖的VHDL代码实现

下降沿
20ms内再次检测到下降沿
20ms内没有下降沿
检测到上升沿
20ms内再次检测到上升沿
20ms 内没有检测到上升沿
idle
wait_low_20ms
low_stable
wait_high_20ms

按键的边沿检测边沿检测显示

通过一个寄存器来实现存储上一个按键的状态,实现边沿检测

状态机的实现

idle

当状态机第一个状态为idle,如果检测到下降沿,进入 wait_low_stable状态
按键消抖原理及VHDL代码实现_第3张图片

wait_low_20ms

在wait_low_stable状态计数20ms,如果20ms内出现下降沿,就重新开始计数检测,如果没有出现下降沿,则进入low_stable状态,计数置零,标志着按键已经被按下

FPGA为100MHZ,一个系统时钟为10ns,所以计数20ms需要2000000个时钟周期
按键消抖原理及VHDL代码实现_第4张图片

low_stable

在low_stable状态时,如果出现上升沿,则进入wait_high_stable状态,反之则保持,表示按键还处于被按下的状态
按键消抖原理及VHDL代码实现_第5张图片

wait_high_stable

在wait_high_stable状态时,如果20ms内出现上升沿,就开始重新计数检测,如果没有,表示按键已经被释放,再次进去idle状态,等待下一次按键被按下
按键消抖原理及VHDL代码实现_第6张图片

仿真结果

按键消抖原理及VHDL代码实现_第7张图片
如上图所示,在testbench里面,在按键被稳定按下之前,我写了4个下降沿(第一个在最开始,有点看不见),能看到falledge也检测到了四个,当四个下降沿之后20ms,state进入了low_stable状态,然后出现上升沿之后进入wait_high_stable状态,当出现两次上升沿20ms之后,进入idle状态。

wait_low_20ms --> low_stable

wait_low->stable

wait_high_stable–>idle

high_stable

VHDL代码(原文件,testbench,.do文件)

你可能感兴趣的:(VHDL,初级)