本节按键消抖的代码部分采用三段式状态机形式进行编码,对于初学者或者以前没有使用三段式状态机习惯的读者可以参考。按键消抖在很多存在按键交互的项目中也经常使用,读者可以跟着了解本节代码之后,进行移植到相应的项目中使用是非常方便的,也是熟悉状态机设计的一个很好的例子。
一、代码讲解
模块名称声明,端口定义如下表和下图所示:
端口名称 | 功能 | 备注 |
clk | 时钟输入 | |
rst | 复位输入 | |
key_in | 按键信号输入 | |
key_state_out | 按键按下状态输出 | |
display_flip | 按键按下显示输出 | display_flip = 1'b1 默认值为高电平 |
状态机状态定义:空闲状态,按下滤波状态,稳定按下状态和释放滤波状态
第一段状态机赋值
第二段状态条件判断:
在空闲状态获取到按键的低电平信号,进入按键按下滤波状态。在按键按下滤波状态中,如果存在按键的上升沿信号,重新跳转到空闲,认为存在按键抖动现象。如果不存在抖动,在按键按下滤波状态进行延时20ms后认为按键稳定,进入按键按下的稳定状态。在按键按下稳定状态判断是否存在按键输入高电平信号,如果存在进入按键释放消抖状态,在按键释放消抖状态判断是否存在下降沿的情况,如果存在这种情况返回到按键按下稳定状态。如果不存在延时20ms后认为是稳定释放了返回到空闲等待下一次按键按下检测。
第三段状态描述具体执行的动作:
在按键按下滤波状态,存在按键输入上升沿的情况,计数器清零,累加到20ms的计数值也清零,其他情况计数值自加,在按键释放虑波状态也是同理。
在按键释放之后我们记为一次按键按下并把状态型号输出。
这里我们为了实验观看明显,将display_flip信号引出到LED上,按键按下并释放一次LED反转一次。
二、板上验证
我们将按键消抖的实验功能全编译通过之后下载bit流文件到实验硬件当中去,发现按键按下一次,LED反转一次,重复操作现象正常。具体操作流程可以见附件视频部分,实验的工程代码可以通过下面的链接获取。
链接:https://pan.baidu.com/s/1uMiQLrut34ZS-MCzPQO1-w
提取码:3kdz
三、总结
本节主要讲述按键消抖部分代码的控制原理,三段式状态机编写原理。代码讲解截取主要部分代码,详细的代码部分可以参考具体的工程,可以通过链接下载获取。由于工程的创建方法和引脚分配等细节在前几节已经讲述过了,这里就不重复赘述了,感兴趣的读者可以到本专题的前几讲进行了解。下一节我们主要讲述debug逻辑分析仪工具ChipWatcher的使用方法。