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

FPGA按键消抖的方法

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    FPGA按键消抖的方法

    " l% N1 E( [2 c: _5 [给大家分享一些简单的代码。5 z# \' m: |8 D% T; C# a+ }8 S
    很多FPGA初学者,不会做按键消抖,可能他们会写出这样的代码
    + i8 a, C: {* aalways(*)
    1 p3 S# L# z: w% g  R2 k! n    if(!key)
    0 n$ ]9 w& K7 ]. s1 f8 C2 x    begin8 n, T. ^7 R9 F7 O
        //该按键的功能8 r5 O5 l! ^$ {* p
        end9 l' m. l% z% M" C0 G1 S
    意思是把按键当时钟来用,这样即没有消抖,也没有做同步。; v, k1 @% Z* Y3 K2 ~' R1 j
    我目前用的这个是计数消抖,设置一个计数器来消抖(消抖时间可任意设定),同时,产生一个跟时钟同步的单脉冲。
    ! A5 A5 {) K0 B& l用计数器消抖很好理解,但是为什么要产生一个跟时钟同步的单脉冲呢?: Y' Z9 @1 T, [" v. I$ h8 s8 t
    这就是FPGA设计原则里面的同步原则,意思是每个模块都用同一个时钟(很多时候这个时钟是由PLL产生的),
      R# h1 `6 i0 X, T! ^2 p$ T. D这样的话,在按键消抖后面紧跟的模块就可以这样来处理这个单脉冲。0 v+ L9 G8 e9 n* w
    always(posedge clk)//clk是全局时钟,这个时钟跟消抖模块的时钟是相同的。1 k" W$ a% o* i# @
           if(key)    //key是消抖后,出来的单脉冲,高电平有效。
    ' V# n4 b& L5 i5 F1 u- k       begin
    - P" U1 e$ I& S) x. ]$ W. t: u6 L5 ^       //该按键的功能。
    + H8 U, ?, C; u9 P8 ]       end
    9 v  K1 I) b% j! U5 O/ S9 q1 O" x3 o
    这个方法同样适合于单片机的按键消抖。
    0 k" K% d: p! }9 d5 `9 _2 F1 l4 |比如用C51写这样的代码:6 V% k- ?8 A3 {' V
         if(!key)
    + l8 f# ?2 Z4 n' y6 A     {: a) Z0 F0 M( {; _
          delayms(10);
    7 |/ U" `) r* V" K) v, h          if(!key)
    * d$ }2 z8 L! A7 _4 G) e          { //该按键的功能/ U1 k3 e) h( v
              }
    4 n* U3 d5 I$ k% B' H6 Z     }
    : }/ ~9 e! f/ F: A, x2 g+ m, F很多教材都写这样的例子出来,但是它会出现一个问题,就是如果你一直按住这个按键,mcu就会不断地进入这个函数,就是说代码的容错性不好。) R+ P4 B- {( b7 p/ c
    uchar key_time=0;            //“键龄”,这是全局变量。
    * a. V8 R% {. _  M- dvoid key_scan(void)( h1 G; _  B0 t) ~  x
    {
    7 [+ T; w7 M( G. O3 I6 x8 s# T) P        if(!key)6 o/ ]6 `9 r6 U3 Z% T3 \+ A' P
            {
    ) i. d8 d) S& `. ]                if(key_time<8)        //这个8是消抖时间,虽然自己设定
    # b' s" I" Z  }! e( m                        key_time++;           //捕捉“键龄”% Y1 t7 |$ c. d
                    if(key_time==1)         
    ' Q8 u) v/ g- X& [* f' I+ u- w7 y# V! V                {
    7 [' v* i1 E2 d4 x! q7 f                        if(!key)        + c. i- c' y6 w2 H: {
                            {
    8 `. g/ k. ^2 c+ @! ?% k6 ~+ f                         //该按键的功能
    . `1 y: y& T( ~; M                        }        
    : e5 r( {9 o8 t. S/ p4 }                }3 A9 w# _8 _8 ?8 ?/ I5 t% L
            }/ _  P4 P3 K+ p6 }: x! E+ z
            else        " t9 \4 i  l) y! q0 h. I% o
                    key_time=0;        9 S  W4 n1 @! U2 s# d  T
    }
    . z* d. ]1 u# O$ z- B* b8 t1 X具体的理论可以参考,周航慈的单片机教材。$ K" S9 W2 D: a. l% E5 t, v
    这样的话,单片机和FPGA就可以触类旁通了。如有问题可以加Q:331922164: a/ m0 Q, u6 V, F
    PS:附上了参考文献、VHDL和verilog两种代码,使用这些代码之前,要先搞清楚按键按下是高电平还是低电平,出来的单脉冲是高电平还是低电平。8 ^" \1 \+ t7 L8 H3 o
    因为quartus9.0不支持中文,所以我写的代码全部都用英文注解。
    7 w/ G4 p, G  S! J* V; E8 }+ O% e) _
    游客,如果您要查看本帖隐藏内容请回复

    0 r* `5 u" |) x

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-9 11:21 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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