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

FPGA按键消抖的方法

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    FPGA按键消抖的方法

    * N& s3 O7 ^! w' Q+ w* A( G7 ^给大家分享一些简单的代码。
    : p* W4 u4 L1 e8 }, ^$ o0 r" S$ Q很多FPGA初学者,不会做按键消抖,可能他们会写出这样的代码
    ; \% g" x1 d# {& b; }% g3 Aalways(*)
    5 f  h( Y6 G" t+ L    if(!key) 3 n& U8 m% B1 E' C' O' x: d
        begin; a1 O, \: z# k; n
        //该按键的功能
    % ?; Q, R1 T6 L" J. ]0 {& e$ f: k- `! \    end
    * g" Y8 W; c/ W) O- a7 G! p意思是把按键当时钟来用,这样即没有消抖,也没有做同步。. m. d9 A/ e. ]" A
    我目前用的这个是计数消抖,设置一个计数器来消抖(消抖时间可任意设定),同时,产生一个跟时钟同步的单脉冲。! m5 a+ T2 D- L: L
    用计数器消抖很好理解,但是为什么要产生一个跟时钟同步的单脉冲呢?5 S  s: v, n. J- b5 U; D
    这就是FPGA设计原则里面的同步原则,意思是每个模块都用同一个时钟(很多时候这个时钟是由PLL产生的),
    * g3 H: Q7 T& ]5 d+ |0 p3 ^* G这样的话,在按键消抖后面紧跟的模块就可以这样来处理这个单脉冲。
    0 a7 n4 @, g5 D0 Q. j* k- Falways(posedge clk)//clk是全局时钟,这个时钟跟消抖模块的时钟是相同的。8 M) G& o8 M2 Z4 H7 _9 k
           if(key)    //key是消抖后,出来的单脉冲,高电平有效。
    ! R4 ~& K  p" r. ~" U1 ~" F       begin
    . ?7 Q. B! N+ W6 J6 H4 o' P3 l       //该按键的功能。
    8 z" K( i( A. L8 ?3 F       end7 U7 L9 t0 n9 a& _$ X! j+ f
    ! |2 |  }' h/ A! h* t  M
    这个方法同样适合于单片机的按键消抖。
    8 ~6 F; U, g* N0 u* E! |% p, ?0 m比如用C51写这样的代码:- D; b& u4 M2 [# q5 f0 S3 W
         if(!key)
    $ r5 U% _1 q+ X* C/ D9 R6 J     {2 N: \) l6 T. A3 K" s$ \& f- {
          delayms(10);2 A, }9 I5 c$ E! e% S# h8 }* c
              if(!key)
    ; p6 O# @( X- y( I          { //该按键的功能) Y/ ^* p6 c2 j  Q( j6 T5 j
              }
    4 ?7 t1 v6 o# `6 l# ?     }
    : k0 O/ z9 P0 s& ?  J很多教材都写这样的例子出来,但是它会出现一个问题,就是如果你一直按住这个按键,mcu就会不断地进入这个函数,就是说代码的容错性不好。
    3 z3 X; U7 Z5 b8 fuchar key_time=0;            //“键龄”,这是全局变量。/ @4 S! B* ]( L- B' k
    void key_scan(void)
    " k( \& u( Z$ ]' J6 ^  H" v0 H{2 T$ ^; }. j0 m' u& p& z* f$ H
            if(!key)
    ; }, P* ~) y+ m/ d        {/ ^5 `. o' M; w8 B
                    if(key_time<8)        //这个8是消抖时间,虽然自己设定6 X# M" d1 c5 Y7 R( x: Q  r
                            key_time++;           //捕捉“键龄”  G4 N/ _) T2 V/ o( C
                    if(key_time==1)          , \; F  T8 ]: q: h7 R
                    {
      Q6 L+ \8 K. G- Q3 _                        if(!key)        
    % \, `- F1 y0 X* P                        {
    1 C$ P6 p; d1 g9 `, J& J; u. O                         //该按键的功能
    ) R7 b( C" f3 Y0 G2 k                        }        9 W7 c( p0 p2 _8 K, m' a( n
                    }
    8 b# y3 K( L5 z        }' W4 {/ m, O" }* B! t# w$ h
            else        
    & u2 U0 ^* R: R2 S9 a$ Z2 ]9 y                key_time=0;        2 P% v1 q, G2 \$ D1 i
    }( x' o9 K  Y8 M; V6 y
    具体的理论可以参考,周航慈的单片机教材。( D- O' v: S2 \$ }$ f
    这样的话,单片机和FPGA就可以触类旁通了。如有问题可以加Q:331922164
    8 S" T/ e# f9 f; O2 q6 G8 W& kPS:附上了参考文献、VHDL和verilog两种代码,使用这些代码之前,要先搞清楚按键按下是高电平还是低电平,出来的单脉冲是高电平还是低电平。
    " o) Z! H3 V% Y& j/ j5 m( K5 N$ h因为quartus9.0不支持中文,所以我写的代码全部都用英文注解。, e& C4 u( I2 R& q
    游客,如果您要查看本帖隐藏内容请回复

    3 E/ I7 D) G0 f( ^0 b% y

    该用户从未签到

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

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-1 16:06 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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