1

fpga实操训练(按键消抖)

 1 year ago
source link: https://blog.csdn.net/feixiaoxing/article/details/128307134
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

fpga实操训练(按键消抖)

嵌入式-老费 已于 2022-12-13 20:48:03 修改 185

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        之前我们谈到按键输入,其中涉及的功能就是,当按键按下的时候,led灯亮起来。等到按键弹起来的时候,led灯灭掉。这个功能实现起来是比较简单的。只需要把key和led之间做绑定就可以了。

        今天,我们实现一个复杂点的功能。这就是,当第一次按键按下、弹出来的时候,led灯亮起;第二次按键按下、弹出来的时候,led灯灭掉。这个时候应该怎么做呢?其实应该做到这两点,第一,做到按键消抖;第二,实现边沿检测。

1、按键消抖

        要做好按键消抖,那么就要设计一个简单的状态机。一个是idle状态,一个是消抖过程中的延时状态。在做好状态切换前,先锁存一下输入的数据,这个之前在按键输入那一章讲到过,

        有了tmp0和tmp1这两个信号,就可以判断信号什么时候发生了改变,

        接着,当diff产生的时候,就可以产生一个状态机和计数器,其中状态机的代码如下,



newCodeMoreWhite.png

        这是一个经典的三段式状态机写法。没有diff发生的时候,next_state是2'b00。如果diff发生,那么next_state切换成2’b01。等到count变成32’d199_9999的时候,next_state重新变成2'b00。在状态机中谈到了count,接着可以看看count是怎么写的,

        从上面的代码可以看出,rst复位的时候,count为0。等到state切换为2'b01的时候,count准备递增。如果在这过程中发生了二次抖动,则count重新计数,否则在计数到32'd199_9999之前一直在递增。等递增到32'd199_9999的时候,恢复为0。在state处于其他状态的时候,count都是设置为0。

2、边沿触发检测

        要做到边沿触发检测,一般需要两级寄存器进行检测。等到发现两个寄存器的数值不同的时候,这个时候其实就发生了边沿触发,



newCodeMoreWhite.png

        这里当count为32'd199_9999的时候,把tmp1的信号传递给out1,下一个时钟,再从out1传递给out2。在这过程当中,如果某一个时刻发现out2和out1不相等的时候,其实边沿触发就发生了。out2&~out1代表的是下降沿,~out2&out1代表的是上升沿。

3、开始实验

        等到代码都编写好之后,最重要的就是把pin脚配置好,烧入到fpga当中。

dded1d203b3e4b37a2034539dda895a3.png

        最后给出完整的代码,有需要的同学可以好好看下。



newCodeMoreWhite.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK