设为首页 加入收藏

TOP

《FPGA全程进阶---实战演练》第七章 让按键恢复平静
2017-10-10 12:21:44 】 浏览:7057
Tags:FPGA 全程 进阶 --- 实战 演练 按键 恢复 平静

1基础理论部分

  A:“怎么按键按下去之后,结果不正常?”,B:“按键你消抖了吗?”A:“消什么抖,还要消抖?”,  B:“先检测按键变化,然后消抖过滤波动信号,最后输出稳定信号”,A:“我好像漏掉了什么。。。。。”。

  正如上述所说,小小一个按键,里面学问也是较多的。对于按键,无论您是学什么开发板或者用什么开发板或者自己开发板子,按键资源是必不可少的,可能是整个工程中算是用到比较多的,这也是人机工程交互最直接的一个例子。下图7.1是一个常用的按键。

wps294E.tmpwps294F.tmp

图7.1 按键

  在使用的按键中,用的最多的是机械弹性按键,当机械触点断开,闭合时,由于机械触点的弹性作用,一个按键开关不会马上稳定地接通,断开时也不会一下子断开,所以这导致人在按键的过程中,会导致一连串的抖动,这样的抖动如果不及时处理,若是被捕获到,那么危害也是可想而知的。如图7.2是一个抖动的直观图。

wps295F.tmp

图7.2 按键抖动

  由按键的机械特性决定,一般为5~10ms,为了保持最大稳定,可以选择10ms,这足以应对正常人按键的频率了。按键消抖有两种方法,一种是硬件消抖,一种是软件消抖;图7.3是硬件消抖电路,利用两个与非门的组合电路被称为双稳态电路,经过双稳态电路可以输出稳定的波形,起到滤波作用。

  在数字系统中,一般常用软件消抖,这个带来的好处是可以节约PCB的成本和空间,利用软件消抖只需一个延时操作即可,操作不麻烦。

wps2970.tmp

图7.3 硬件消抖

2 Verilog代码实现部分

  按照图7.4中所示的,可以进行10ms延时即可,对于人的按键完全满足要求。

wps2971.tmp

图7.4 延时示意图

  实现步骤:按键检测------延时------输出有效键值

  封装之后的模块端口声明:

端口名

功能

clk

时钟

50MHz

rst_n

复位

初始为0

key_in

输入按键

初始值全为高电平

key_valid

输出有效值

按下的按键为高电平,其他为低电平

key_flag

输出使能值,作为和下一个模块沟通的

高电平

wps2982.tmp

  注意这种模块的书写格式,可以很方便的去更改相关的参数,达到最大化的移植。只需更改key_width就可以进行对按键数目的更改。

wps2983.tmp

在进行计数的时候,有相应的条件,即当有键按下时才会计数,否则停止计数,这样可以节省资源。

image

wps29A3.tmp

产生使能部分,方便对下一个模块的使能,能够进行良好的沟通。

image

3 Modelsim仿真部分

3.1 Testbench测试脚本程序:

wps29A4.tmp

上述仍然是时钟和复位task模块。

wps29B5.tmp

wps29C5.tmp

上述是模仿按键抖动的测试程序,70行到79行模拟按键刚按下时的抖动,80行输出稳定值,紧接着81行到93行是松开时抖动的情况。

wps29C6.tmp

上述是运行各个模块,并输入模拟按键值。

3.2 仿真结果:

 

图7.5是仿真结果图,可以看到捕获到的有效信号和捕获使能信号,最终按键松开所有值恢复到高阻态。图7.6是脚本测试输出文件。

wps29D7.tmp

图7.5 仿真结果

wps29D8.tmp

图7.6 测试脚本输出

4 联合测试部分

对于按键测试部分,将前面的LED部分和本节的按键进行连接即可,由按键产生的有效信号没有直接送给LED模块,而是加入一个LED_control模块用来对按键操纵LED的编码,实现的功能是按键按下LED发光,再次按下,熄灭。此部分代码在EX5_LED中。

wps29E8.tmp

按键key_valid信号接入led_control模块。

wps2A09.tmp

上述是实现按键对LED的编解码操作。

wps2A19.tmp

在key_led_top模块将各个信号进行连接。最终实现的RTL视图如下图7.7所示.

wps2A1A.tmp

图7.7 RTL视图

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇《FPGA全程进阶---实战演练》第七.. 下一篇《FPGA全程进阶---实战演练》第五..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目