1.按键消抖
按键是最常见的电子元器件之一,在电子设计中应用广泛;在日常生活中,遥控器\玩具\计算器等等电子产品都要使用按键
- 在FPGA的实验工程中,我们可以使用其作为系统复位信号或者控制信号的外部输入
- 常见的按键:自锁式按键或者是机械按键
按键消抖主要针对的是机械弹性开关,当机械触点断开\闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定接通,在断开时也不会一下子断开,因而在闭合及断开的瞬间伴随有一连串的抖动,为了保证系统能正确识别按键的开关,就必须对按键的抖动进行处理,就是按键消抖
- 硬件消抖:使用RS触发器(按键数量少),消耗空间和资源
- 软件消抖:使用延时程序去除抖动的部分
2.FPGA设计
2.1 框图和波形
- 软件消抖:使用延时程序去除掉抖动的部分
- 在按键按下后能够精准的识别到一次按键按下,所以需要计数器,所以要设计时序电路,输入有时钟信号和复位信号
- 输入未处理的按键信号key_in,输出消抖之后稳定的按键信号key_flag
- 前抖动和后抖动的时间大概是5s - 10ms,按键按下的稳定时间大概是20mm
- 可以使用计数器消除防抖,当key_in是低电平的时候开始计数,当key_in为高电平的时候清0,按键按下的有效时间是20ms,需要计数1000_0000,最大计数值是999_999,在计数20ms内没有识别到高电平,就表示按键按下有效,注意要在时钟的上升沿采样key_in信号
- 采用传统计数器的方式,当计数到最大值的时候计数器进行清0,输出信号在最大值的时候产生一个脉冲信号,如果信号稳定时间超过20ms,就会进行多次清0和计数,也会产生多个脉冲信号,分析这种情况是计数器清零条件导致的还是key_flag信号拉高时间导致的?如果key_flag不在最大值拉高,在其他位置拉高,也会出现这种问题,所以问题是清0条件导致的
- 这时采用当计数器计数到最大值之后,如果超过计数器最大值,计数器不清0,一直维持计数器的最大值,当key_in为高电平的时候,计数器才清0,此时key_flag信号可以在计数器产生最大值之后产生一个周期的脉冲信号然后拉低为0,这样key_flag信号不会产生多次
- 修改清0条件之后,key_flag信号虽然不会出现多次,但是不是脉冲信号,而是一个长时间的电平信号,