一. 什么是按键消抖
按键消抖通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图所示,为了不产生这种现象而作的措施就是按键消抖。
从按键对应的数字电平来看,按键的抖动过程如下图所示。在抖动期间,按键的输入电平是不稳定的,消抖的目的就是去除抖动的影响,得到能表征按键过程的稳定的按键输入电平。
二. 按键消抖的方案
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与嵌入式知识,软件,工具等内容,欢迎大家关注。