新闻  |   论坛  |   博客  |   在线研讨会
按键消抖的原理和基于fpga的消抖设计_明德扬资料
billow兔 | 2017-08-03 09:13:19    阅读:654   发布文章

 

 

 

 

 

 

 

 

 

           按键消抖的原理和基于fpga的消抖设计

明德扬科技教育有限公司

 

 

 

 

官  网:www.mdy-edu.com

淘  宝:mdy-edu.taobao.com

QQ  群:544453837

QQ咨询:158063679


 

按键消抖

1功能概述

按键开关是各种电子设备不可或缺的人机接口,如电脑的键盘等。实际应用中,按键开关通常为机械式弹性开关。当机械点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定接通,断开时也不会马上断开,在闭合和断开的瞬间均伴随有一连串的抖动。为保证系统及时正确识别,必须对这种情况作出相应处理。我们称之为按键消抖。

按键消抖可分为硬件消抖和软件消抖。硬件消抖的原理是在信号输入系统之前消除抖动干扰,在按键较少的情况下比较适宜。如果按键较多,则使用软件消抖。软件消抖的实质在于降低键盘输入端口的采样频率,将高频抖动略去。需要注意的是,软件消抖需要占据一定的系统资源。

尽管硬件消抖和软件消抖能实现按键消抖功能,串行处理的方式都存在一定的局限性,显得不那么完美。而硬件资源丰富的FPGA系统采用并行处理的模式,利用硬件来减轻软件工作量,通过硬件加速软件消抖处理,即可做到软件消抖并行化,因而在按键消抖处理方面具备非常明显的优势。

优秀的设计程序应该是用最简单的代码(架构、信号)实现功能。在本例中,我们的只需要用4个信号界定,并用很短的代码即可。下面我们先来看看功能要求:

在系统设计中,消除按键抖动的方法五花八门,无论是硬件电路和软件设计都十分成熟。在本项目中,我们将用Verilog语言给出具体实现过程,设计一个程序来检查键值,有效滤除按键抖动区间20 ms的毛刺脉冲。

 

2 设计思路

一般按键所用开关为机械弹性开关,由于机械触点的弹性作用,每个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,如下图。抖动时间的长短由按键的机械特性决定,一般为5 ms~10 ms。

图1  按键抖动过程示意

    当系统检测出按键闭合后,执行一个延时程序,产生5ms~10ms的延时;前沿抖动消失后,再一次检测键的状态;如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。本案例我们设置经过20 ms后的高电平才是真正的按键功能。

    信号列表如下:

信号名

I/O

位宽

说明

clk

I

1

系统工作时钟50MHz。

rst_n

I

1

系统复位信号,低电平有效。

key_in

I

4

按键输入信号,按下高电平。

key_vld

O

4

按键有效信号,高电平有效。

 

3   程序设计

模块代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

module key_module(

                  clk         ,

                    rst_n         ,

                    key_in        ,

          key_vld

      );

      parameter                         DATA_W      =   20        ;

      parameter                         KEY_W            = 4           ;

      parameter                         TIME_20MS = 1_000_000  ;

     

      input                                clk                     ;

      input                                rst_n                   ;

      input           [KEY_W-1 :0]        key_in                  ;

      output          [KEY_W-1   :0]       key_vld                 ;

      reg             [KEY_W-1   :0]      key_vld                 ;

      reg               [DATA_W-1:0]     cnt                     ;

      wire                             add_cnt                 ;

      wire                             end_cnt                 ;

      reg                                                    flag                    ;

      reg             [KEY_W-1   :0]    key_in_ff1               ;

      reg             [KEY_W-1   :0]    key_in_ff0               ;

     

      always  @(posedge clk or negedge   rst_n)begin

        if(rst_n==1'b0)begin

            cnt <= 20'b0;

        end

        else if(add_cnt)begin

            if(end_cnt)

                cnt <= 20'b0;

            else

                cnt <= cnt + 1'b1;

        end

        else begin

            cnt <= 0;

        end

      end

      assign add_cnt = flag==1'b0 && (key_in_ff1!=0);

      assign end_cnt = add_cnt && cnt == TIME_20MS - 1;

     

      always  @(posedge clk or negedge   rst_n)begin

        if(rst_n==1'b0)begin

            flag <= 1'b0;

        end

        else if(end_cnt)begin

            flag <= 1'b1;

        end

        else if(key_in_ff1==0)begin

            flag <= 1'b0;

        end

      end

     

      always  @(posedge clk or negedge   rst_n)begin

        if(rst_n==1'b0)begin

            key_in_ff0 <= 0;

            key_in_ff1 <= 0;

        end

        else begin

            key_in_ff0 <= key_in    ;

            key_in_ff1 <= key_in_ff0;

        end

      end

     

      always  @(posedge clk or negedge   rst_n)begin

        if(rst_n==1'b0)begin

            key_vld <= 0;

        end

        else if(end_cnt)begin

            key_vld <= key_in_ff1;

        end

        else begin

            key_vld <= 0;

        end

      end

endmodule

 


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客