• 《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视图

  • 相关阅读:
    兼容利器之X-UA-Compatible
    SQL Server之游标的基础知识
    SQL 按特定字段值排序
    NodeJS 开篇 牛刀小试
    临时表之IF-ELSE
    css中如何设置字体
    怎么做到不加班?
    C# .net中cookie值为中文时的乱码解决方法
    HTML5商城开发一 楼层滚动加载数据
    QQ浏览器X5内核问题汇总
  • 原文地址:https://www.cnblogs.com/raymon-tec/p/5637980.html
走看看 - 开发者的网上家园