fpga应用:按键去抖

今天简单的说说按键消抖,原理特别好理解,其实就是延时,做一定时间的延时后取值一次,就能够得到特定的消抖后的状态了。

为什么要消抖? 见图:

我们可以看到,但按键按下的那一刻,存在一段时间的抖动,同时在释放按键的一段时间里也是存在抖动的,这就可能导致状态在识别的时候可能检测为多次的按键,因为运行过程中普通的检测一次状态key为1就执行一次按键操作。所以我们在使用按键时往往需要消抖。

代码如下:

程序分析:

去抖

去抖可分位硬件去抖和软件去抖,顾名思义硬件去抖就是通过硬件来达到去抖的目的,一般是用施密特触发器来实现,需要消耗硬件资源,在一些成本限制的时候,往往采用软件去抖。

软件去抖原理:一般按键的抖动频率是几十khz(故状态转移间隔为ms级,程序中我们采用20ms)整体思路是跳过这一段抖动,我们设计的去抖状态机如下:

假如按键按下时为低电平,idle为初始状态,当检测到有按键按下时即key_pre==0,进入delay1状态(注意:状态从idle到delay1需要20ms,相等于跳过抖动),若此时key_pre仍为0,则我们认为是按键按下,则进入下一状态,否则回到idle认为时抖动,到此为按下去抖。在press状态下,若检测到按键抬起即key_pre==1,则进入delay2状态,否则仍在press状态(防止有长时间按下),在delay2状态,若key_pre仍为1,则认为按键以抬起,则进入下一状态taiqi,至此完成抬起去抖,可以产生去抖后的信 。

程序关键点:

第一:delay信 的产生

delay信 的高电平时间,只是一个主时钟的宽度,所以当delay==1时,状态转移alw块只会触发一次,而不是多次。

第二:去抖后信 key_out的产生(输出高电平表示按下)。

程序中我们采用

assign key_out=(state==taiqi && delay==1)?1’b1:1’b0;

有人认为当状态到taiqi是直接就可输出,为什么还要有delay==1这个条件呢?我们先看一下这两种仿真结果:

未加delay==1

加delay==1

从图中我们可以明显看出,未加delay==1,key_out为1有很宽的脉宽,在以clk_50M为敏感信 是,会造成多次触发,而加上delay==1,key_out的宽度只为一个clk_50M主时钟宽度,达到去抖效果。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年7月4日
下一篇 2021年7月4日

相关推荐