一. 什么是按键消抖 
按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图所示,为了不产生这种现象而作的措施就是按键消抖。

从按键对应的数字电平来看,按键的抖动过程如下图所示。在抖动期间,按键的输入电平是不稳定的,消抖的目的就是去除抖动的影响,得到能表征按键过程的稳定的按键输入电平。

二. 按键消抖的方案 
2.1 硬件消抖
通常的做法是在按键两端并联一个贴片电容,利用电容两端电压不能突变的特性来消除抖动。

2.2 软件消抖
利用按键按下的特点来消抖:
1.按键按下和弹起都会抖动,抖动的持续时间和按键类型和质量有关,一般为5~10ms
2.按键按下后保持稳定电平的时间一般不小于120ms
三. Verilog实现按键消抖 
3.1 模块框图
3.2 参数列表
| 参数名 | 说明 | 
|---|---|
| CLK_FREQ_MHZ | 模块时钟频率,默认100,注意修改 | 
| KEY_INIT_STATUS | 按键在FPGA上电时的初始状态,可选”up”(默认)或”down” | 
| INTI_MS | 初始检测未按下电平, 需要持续多少MS才视为检测成功, 默认50ms, 通常无需修改 | 
| KEEP_MS | 检测到按键按下/抬起需要持续多少MS才视为有效, 默认40ms, 通常无需修改 | 
3.3 接口信号列表
| 接口名 | 说明 | 
|---|---|
| key_in | 按键输入 | 
| clk | 模块工作时钟 | 
| key_down | 按键按下指示, 1表示按下 | 
| key_down_one_time | 1表示按键按下一次, 1只会持续一个时钟周期 | 
| key_up | 按键抬起指示, 1表示抬起 | 
| key_up_one_time | 1表示按键抬起一次, 1只会持续一个时钟周期 | 
四. 源码与工程分享 
Gitee:Verilog功能模块–按键消抖: 按键消抖 (gitee.com)
Github:zhengzhideakang/Verilog–Key: Verilog按键消抖 (github.com)
Git难以管理非文本文件,故Vivado工程通过网盘分享。
verilog-function-module–key 按键消抖 Vivado 2021.2工程 20240922.7z
欢迎大家关注我的公众号:徐晓康的博客,回复以下代码获取。
2352
建议复制过去不会码错字!
如果本文对你有所帮助,欢迎点赞、转发、收藏、评论让更多人看到,赞赏支持就更好了。
如果对文章内容有疑问,请务必清楚描述问题,留言评论或私信告知我,我看到会回复。
徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识,软件,工具等内容,欢迎大家关注。