明德扬论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 590|回复: 0

【基于FPGA的图像处理工程】边缘检测工程之按键捕捉模块代码解析

[复制链接]
发表于 2019-12-7 11:54:03 | 显示全部楼层 |阅读模式

马上注册,看完整文章,学更多FPGA知识。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
【基于FPGA的图像处理工程】
                                                             —边缘检测工程:按键捕捉模块代码解析
作者:陈刀刀
        本文为明德扬原创文章,转载请注明出处!
按键捕捉模块的功能:可以达到按一次按键就可以得到一次识别的效果,并且需要对按键进行消抖处理,消除按下按键时不稳定、随机的抖动电压信号。

一、设计架构
有些同学看到按键消抖处理,就理所应当以为是将按键按下这一活动的抖动部分进行消除,但其实按键的消抖只是一种比较正式的说法,其本质上是在抖动的波形中,捕捉到比较稳定的电压。
我们通过实际情况来学习下。一般按键都是低电平有效,通常情况下按键信号为高电平,当主动按下按键时会变成低电平,这是按键的基本电平情况。前面我们有说到,在按下的瞬间,稳定状态的信号前后都会产生抖动,这时即使按键信号等于0也无法表示按键被按下。
如下图所示,按键持续为高电平,当按下按键的时候会变为低电平,但是在此前后都会产生一段高高低低的抖动信号。按键捕捉的方法就是持续的检测信号的进度,比如到第一个低电平产生时,开始计时,假设第一个出现的低电平持续时间为6ms,不满足按键按下标准;第二个低电平信号出现持续时间为8ms,不满足按键按下标准;到第四个低电平信号,持续了10ms以上,满足按下按键标准,即可判断这里有一次的按下按键操作;接着第五个低电平信号,持续时间为6ms,不满足按下按键标准。这种方法,就可以帮助我们很好的确判断有效按键信号。

14.png
按键捕捉模块使用一个计数器的架构,对按键信号长度进行计数。该计数器架构为:

15.png
计数器cnt0:时钟时钟计数器。用于计数按键信号持续超过10ms的时间,10ms即是500000个时钟,所以该计数器的计数周期为500000。

二、信号的意义

  
信号
  
类型
意义
clk
输入信号
时钟信号。
rst_n
输入信号
复位信号,低电平有效。
key_in
输入信号
按键输入信号。,没按下时为持续为高电平状态即1,按下时为低电平。变0表示按下按键。
key_vld
输出信号
按键输出有效指示信号。代表捕捉到按下一个按键。输出信号,持续为高电平状态即0,变1表示按下按键。当计数器计数结束时,输出按键信号。
Key_in_ff0
内部信号
设计逻辑:当时钟计数器数到10ms时,表示捕捉到一次按下,输出1个时钟的高电平。
Key_in_ff1
内部信号
输入进来的key_vld信号寄存一拍后的信号。
cnt
内部信号
该信号的目的是做时序同步,预防亚稳态。
add_cnt
内部信号
对key_in_ff0寄存一拍后的信号。
end_cnt
内部信号
目的是为了做时序同步,预防消除亚稳态。
flag_add
内部信号
时钟计数器。该计数器用来计算按键按下时的持续时间。按键信号持续时间计数器,该计数器计数按键信号持续超过10ms的时间,该计数器的计数周期为500000。


三、参考代码
下面展出本模块的设计,欢迎进一步交流,如果需要源代码,欢迎与本人联系。

  1. module key_module(
  2.     clk    ,
  3.     rst_n  ,
  4.     key_in ,
  5.     key_vld
  6. );
  7. parameter                          DATA_W           = 20          ;
  8. parameter                          KEY_W           = 4           ;
  9. parameter                       TIME_20MS = 500_000   ;

  10. input                            clk                     ;
  11. input                           rst_n                   ;
  12. input      [KEY_W-1 :0]                key_in                  ;
  13. output     [KEY_W-1 :0]     key_vld                 ;
  14. reg        [KEY_W-1 :0]     key_vld                 ;
  15. reg        [DATA_W-1:0]     cnt                     ;
  16. wire                               add_cnt                 ;
  17. wire                               end_cnt                 ;
  18. reg                                        flag_add                    ;
  19. reg     [KEY_W-1 :0]        key_in_ff1              ;
  20. reg     [KEY_W-1 :0]        key_in_ff0              ;

  21. always  @(posedge clk or negedge rst_n)begin
  22.     if(rst_n==1'b0)begin
  23.         cnt <= 20'b0;
  24.     end
  25.     else if(add_cnt)begin
  26.         if(end_cnt)
  27.             cnt <= 20'b0;
  28.         else
  29.             cnt <= cnt + 1'b1;
  30.     end
  31.     else begin
  32.         cnt <= 0;
  33.     end
  34. end

  35. assign add_cnt = flag_add==1'b0 && (key_in_ff1 != {KEY_W{1'b1}});
  36. assign end_cnt = add_cnt && cnt == TIME_20MS - 1;

  37. always  @(posedge clk or negedge rst_n)begin
  38.     if(rst_n==1'b0)begin
  39.         flag _add<= 1'b0;
  40.     end
  41.     else if(end_cnt)begin
  42.         flag_add <= 1'b1;
  43.     end
  44.     else if(key_in_ff1 == {KEY_W{1'b1}})begin
  45.         flag_add <= 1'b0;
  46.     end
  47. end

  48. always  @(posedge clk or negedge rst_n)begin
  49.     if(rst_n==1'b0)begin
  50.         key_in_ff0 <= 0;
  51.         key_in_ff1 <= 0;
  52.     end
  53.     else begin
  54.         key_in_ff0 <= key_in    ;
  55.         key_in_ff1 <= key_in_ff0;
  56.     end
  57. end

  58. always  @(posedge clk or negedge rst_n)begin
  59.     if(rst_n==1'b0)begin
  60.         key_vld <= 0;
  61.     end
  62.     else if(end_cnt)begin
  63.         key_vld <= ~key_in_ff1;
  64.     end
  65.     else begin
  66.         key_vld <= 0;
  67.     end
  68. end
  69. endmodule
复制代码

明德扬专注FPGA研究,我司正在连载两本书籍:《基于FPGA至简设计法实现的图像边缘检测系统》(http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=691)、《ASIC和FPGA时序约束理论与应用》(http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=705),有兴趣点击观看。也欢迎加入群(838209674),及时获取最新的文章信息,个性化问题也可以找我哦:Q1277642036(陈刀刀)。





上一篇:【基于FPGA的图像处理工程】边缘检测工程之Ascii转十六进制模块代码解析
下一篇:【基于FPGA的图像处理工程】边缘检测工程之二值化模块代码解析
加QQ:1744527324,获取更多FPGA资料!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|MDYBBS ( 粤ICP备16061416号

GMT+8, 2020-1-20 22:39 , Processed in 0.643958 second(s), 21 queries , File On.

Powered by Discuz! X3.4

本论坛由广州健飞通信有限公司所有

© 2001-2019 Comsenz Inc.

快速回复 返回顶部 返回列表