找回密码
 注册
关于网站域名变更的通知
查看: 552|回复: 2
打印 上一主题 下一主题

FPGA按键消抖的方法

[复制链接]
  • TA的每日心情
    开心
    2019-11-20 15:00
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2019-4-30 09:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

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

    x
    FPGA按键消抖的方法
    2 }& r# [3 Y! s4 s$ t, A: M* e
    给大家分享一些简单的代码。
    & P* k" e6 E2 \# _+ \) m很多FPGA初学者,不会做按键消抖,可能他们会写出这样的代码( W5 [1 O9 m9 v" r' K3 b3 I- ~
    always(*)7 u3 [( }( E2 Q( F
        if(!key)
    8 [, `0 V2 k( X+ b* P& |    begin. A5 Z, H; a+ Y$ [
        //该按键的功能
    ' i* a* h) z# |) {4 d    end  G/ {" i3 V0 E. Z" t
    意思是把按键当时钟来用,这样即没有消抖,也没有做同步。
    % Y0 \+ l* f( J我目前用的这个是计数消抖,设置一个计数器来消抖(消抖时间可任意设定),同时,产生一个跟时钟同步的单脉冲。0 Z. z2 {6 }; {1 N( {
    用计数器消抖很好理解,但是为什么要产生一个跟时钟同步的单脉冲呢?
      ^4 M5 ?' Z, T5 y8 G" n这就是FPGA设计原则里面的同步原则,意思是每个模块都用同一个时钟(很多时候这个时钟是由PLL产生的),  T" {# g0 _* q! N8 a
    这样的话,在按键消抖后面紧跟的模块就可以这样来处理这个单脉冲。
    & ^9 [1 H# l0 y1 t$ ualways(posedge clk)//clk是全局时钟,这个时钟跟消抖模块的时钟是相同的。
    5 |7 a+ t% }. U" E0 c7 O3 c       if(key)    //key是消抖后,出来的单脉冲,高电平有效。' p9 \! [! M% q* Y
           begin
    8 \+ v6 L* D. }  z       //该按键的功能。
    ' q2 g8 I) s3 @% w# u$ w       end$ @3 ]1 ?& S3 z" z
    + W8 ]# M% U$ _* I2 m- ]
    这个方法同样适合于单片机的按键消抖。! z4 u, v: y1 ]
    比如用C51写这样的代码:
    4 b$ p% k$ y0 }+ n     if(!key)' D. ?9 M/ N8 k" n. e
         {! a/ t" w4 f* t! ?8 V
          delayms(10);
    7 z: n) {. C+ b          if(!key)! r. M9 e+ o9 c6 j9 a; [. W5 X" K
              { //该按键的功能
    6 j( |7 I" q; k          }; C* |+ L& h6 Q
         }4 C; R  ]- h- f; O, v9 n
    很多教材都写这样的例子出来,但是它会出现一个问题,就是如果你一直按住这个按键,mcu就会不断地进入这个函数,就是说代码的容错性不好。% I% r8 D1 Z/ k
    uchar key_time=0;            //“键龄”,这是全局变量。
    & g; q6 A, ]( x( N2 V7 A+ zvoid key_scan(void)" s3 d; u# M' D, l! d4 f) h7 ~
    {5 c2 r. u. A4 |9 J. b: i
            if(!key)5 ]1 o. f$ a5 D' f: s3 z
            {( }0 l& t! X8 @" |6 o* N) z$ t
                    if(key_time<8)        //这个8是消抖时间,虽然自己设定/ w# W6 s: G- o8 x
                            key_time++;           //捕捉“键龄”0 X" x; |* W' [$ j( Y, I: ]* v, ]
                    if(key_time==1)         
    * _& i  |( B9 U) P                {8 u! c7 }* f  e- M5 j
                            if(!key)        
    # E9 }9 ^: m% B: |& P                        {4 @5 M$ x" I% Y
                             //该按键的功能& U+ w9 [  y" Y7 ^
                            }        2 @6 P" K' L8 m: d; J: [" f4 ?; s" T
                    }, Y) r* }0 g  }
            }' X/ h. F/ w8 O, X
            else        ' Y6 \+ j/ C/ M- v' K) \
                    key_time=0;        ! M" T" a" d1 j4 H! D! U$ B0 w
    }
    ! r. z) W: {- P: j2 J1 i1 y具体的理论可以参考,周航慈的单片机教材。
    1 z2 _/ J- j' @0 m1 D这样的话,单片机和FPGA就可以触类旁通了。如有问题可以加Q:331922164. k7 H7 m) r$ x% C4 |  z) f  f- U
    PS:附上了参考文献、VHDL和verilog两种代码,使用这些代码之前,要先搞清楚按键按下是高电平还是低电平,出来的单脉冲是高电平还是低电平。
    ) ]" E& ?' a2 b1 c* {$ Y因为quartus9.0不支持中文,所以我写的代码全部都用英文注解。& a# d* Q2 s* _# |
    游客,如果您要查看本帖隐藏内容请回复

    ; U5 w! a2 O5 `$ H( W% [2 p! p

    该用户从未签到

    2#
    发表于 2019-4-30 17:31 | 只看该作者
    很棒的资料 谢谢分享
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-8-2 21:57 , Processed in 0.125000 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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