1基础理论部分
A:“怎么按键按下去之后,结果不正常?”,B:“按键你消抖了吗?”A:“消什么抖,还要消抖?”, B:“先检测按键变化,然后消抖过滤波动信号,最后输出稳定信号”,A:“我好像漏掉了什么。。。。。”。
正如上述所说,小小一个按键,里面学问也是较多的。对于按键,无论您是学什么开发板或者用什么开发板或者自己开发板子,按键资源是必不可少的,可能是整个工程中算是用到比较多的,这也是人机工程交互最直接的一个例子。下图7.1是一个常用的按键。
图7.1 按键
在使用的按键中,用的最多的是机械弹性按键,当机械触点断开,闭合时,由于机械触点的弹性作用,一个按键开关不会马上稳定地接通,断开时也不会一下子断开,所以这导致人在按键的过程中,会导致一连串的抖动,这样的抖动如果不及时处理,若是被捕获到,那么危害也是可想而知的。如图7.2是一个抖动的直观图。
图7.2 按键抖动
由按键的机械特性决定,一般为5~10ms,为了保持最大稳定,可以选择10ms,这足以应对正常人按键的频率了。按键消抖有两种方法,一种是硬件消抖,一种是软件消抖;图7.3是硬件消抖电路,利用两个与非门的组合电路被称为双稳态电路,经过双稳态电路可以输出稳定的波形,起到滤波作用。
在数字系统中,一般常用软件消抖,这个带来的好处是可以节约PCB的成本和空间,利用软件消抖只需一个延时操作即可,操作不麻烦。
图7.3 硬件消抖
2 Verilog代码实现部分
按照图7.4中所示的,可以进行10ms延时即可,对于人的按键完全满足要求。
图7.4 延时示意图
实现步骤:按键检测------延时------输出有效键值
端口名 |
功能 |
值 |
clk |
时钟 |
50MHz |
rst_n |
复位 |
初始为0 |
key_in |
输入按键 |
初始值全为高电平 |
key_valid |
输出有效值 |
按下的按键为高电平,其他为低电平 |
key_flag |
输出使能值,作为和下一个模块沟通的 |
高电平 |
注意这种模块的书写格式,可以很方便的去更改相关的参数,达到最大化的移植。只需更改key_width就可以进行对按键数目的更改。
在进行计数的时候,有相应的条件,即当有键按下时才会计数,否则停止计数,这样可以节省资源。
产生使能部分,方便对下一个模块的使能,能够进行良好的沟通。
3 Modelsim仿真部分
3.1 Testbench测试脚本程序:
上述仍然是时钟和复位task模块。
上述是模仿按键抖动的测试程序,70行到79行模拟按键刚按下时的抖动,80行输出稳定值,紧接着81行到93行是松开时抖动的情况。
上述是运行各个模块,并输入模拟按键值。
3.2 仿真结果:
图7.5是仿真结果图,可以看到捕获到的有效信号和捕获使能信号,最终按键松开所有值恢复到高阻态。图7.6是脚本测试输出文件。
图7.5 仿真结果
图7.6 测试脚本输出
4 联合测试部分
对于按键测试部分,将前面的LED部分和本节的按键进行连接即可,由按键产生的有效信号没有直接送给LED模块,而是加入一个LED_control模块用来对按键操纵LED的编码,实现的功能是按键按下LED发光,再次按下,熄灭。此部分代码在EX5_LED中。
按键key_valid信号接入led_control模块。
上述是实现按键对LED的编解码操作。
在key_led_top模块将各个信号进行连接。最终实现的RTL视图如下图7.7所示.
图7.7 RTL视图