原创 (多图) verilog键盘扫描程序之debug

2015-3-24 13:49 1303 19 19 分类: FPGA/CPLD

  EDN博客精华文章  作者:ilove314

verilog键盘扫描程序之debug

  上次的日志《经典的verilog键盘扫描程序》承蒙厚爱,已成博客精华,在EDN博客主页置顶多日。但是我发现那个经典程序还是存在一点点小bug,且听我慢慢道来。

  先放上仿真波形来说明一下问题吧:

  仿真说明:由于20ms检测一次按键值对于仿真来说太长了,所以只假定16个主时钟周期就做一次检测(也就是cnt[3]的下降沿锁存键值)。

sw1_n被按下(拉底)大约5个时钟周期(<16),而此时与其相应的led_d5却改变状态了

图1,sw1_n被按下(拉底)大约5个时钟周期(<16),而此时与其相应的led_d5却改变状态了。说明的问题是,大多数时候按键消抖其实是到不了20ms的。

  其实这个小bug通常在下载后,测试键盘是不会有什么感觉的。但是问题是,如果真的出现那种抖动在20ms以内(甚至远小于20ms)的外部干扰存在时,这个bug就不可忽视了。

  因此,在原程序的基础上,做了如下的改进。其思想是在每个主时钟(50MHz)周期里都进行一次按键检测,如果前后两次键值改变了,说明有可能键盘被按下了,此时,在下一个时钟周期将复位20ms计数值,然后20ms后重新锁存键值,其它的和原程序基本相同,这样就达到了真正意义上的20ms消抖。

  重新修改代码后的仿真波形如下:

仿真波形

点击看原图

图2,可以看到此时在不满16个时钟周期的键值变化是不会然led做出变化的。

仿真波形

图3,按键sw3_n的按下时间明显超过了16个时钟周期,那么在cnt重新记到16个时钟周期后,led_d4就做出了改变。

  重新修改后的代码如下:

  //当三个独立按键的某一个被按下后,相应的LED被点亮;再次按下后,LED熄灭,按键控制LED亮灭

程序

程序

程序

程序

程序

文章评论0条评论)

登录后参与讨论
我要评论
0
19
关闭 站长推荐上一条 /2 下一条