FPGA按键为什么会一次触发多次?用消抖和状态机做稳定的人机输入 | 明德扬FPGA
机械按键在按下和松开瞬间会产生短时间抖动。若把按键信号直接当作计数或模式切换脉冲,一次操作可能被FPGA识别成多次。这个实验适合同时学习同步、计时和状态机。
机械按键在按下和松开瞬间会产生短时间抖动。若把按键信号直接当作计数或模式切换脉冲,一次操作可能被FPGA识别成多次。这个实验适合同时学习同步、计时和状态机。
理解按键输入先分清三件事
- 按键信号来自异步时钟域
- 抖动持续时间远短于人的操作时间
- 电平状态与单周期触发脉冲不是一回事
*图:双触发同步、等待稳定、确认按下、输出单脉冲、等待释放。*

*图:MP603 Cyclone IV FPGA学习板,用于了解板卡与主要接口形态。*
为什么要先同步
按键与FPGA系统时钟没有固定关系,直接采样可能引入亚稳态。常见做法是先经过两级触发器同步,再进入消抖逻辑。
同步降低风险,但不能消除机械抖动。
消抖计时怎样设计
只有当同步后的电平连续保持设定时间,才确认状态改变。计时值应由系统时钟和目标消抖时间计算,不要随意写一个大数字。
按下和松开都应经过稳定确认。
状态机如何产生单次事件
状态可分为空闲、确认按下、已按下和确认释放。确认按下时输出一个时钟周期的脉冲,之后即使按键持续保持也不重复触发。
使用LED或数码管计数,可以直观看到结果。
适合从哪块板开始
MP603采用Cyclone IV,提供按键、LED、VGA和摄像头相关接口,适合从基础逻辑逐步过渡到图像实验。
完成按键消抖后,可以继续加入长按、双击和菜单状态机。
总结
稳定按键输入需要先同步、再计时确认,最后由状态机把持续电平转换为单周期事件。