FPGA学习系列:11. 按键消抖设计

描述

设计背景:

在我们的工程设计中我们会或多或少的用到开关,开关分为好多种,不管是哪一种开关在按下还是抬起都会有轻微的抖动,为了使我们的设计更加准确化,今天我们将学习按键消抖。

 

设计原理: 

本次的设计是一个消抖的设计,在我们用的按键中,按下时低电平,抬起时高地平,可是在现实中按键的瞬间高低电平的变化并不是我们想的那样,而是下面的情况。

FPGA



  我们称按下到s的时候称为前抖,s到抬起后称为后抖,在正常的情况下就是上面电平变化波形,那么我们为了消除不必要的波形,我们就应该在s区域来判断按键是否按下也就是低电平,同理我们抬起的时候也要间隔一段时间后来确定按下,一般我们间隔的时间设置为 10ms ---- 20ms之间都可以,所以说消抖就是把现实中按下抬起的抖动消除,生成我们理想的高低高的波形。

 

设计架构图:

FPGA 

 

设计状态转移图FPGA 

 

设计代码:

设计模块

0 module key_xiaodou(clk,rst_n,key,key_x);

1 

2  input clk;  //输入输出

3  input rst_n;

4  input key;

5 

6  output reg key_x;

7  //parameter T10ms = 500_000;   //设计一个10ms的计数参数

8  parameter T10ms = 50;

9 

10 parameter s0 = 2'b00;    //4个状态

11 parameter s1 = 2'b01;

12 parameter s2 = 2'b10;

13 parameter s3 = 2'b11;

14 reg [18:0] count;

15 reg [1:0]state;

16 always @ (posedge clk or negedge rst_n)

17  if(!rst_n)

18   begin

19    count <= 19'b0;

20    state <= 2'b0;

21    key_x <= 1'b1;

22   end

23  else

24   begin

25    case (state)

26     s0:begin

27       if(key)    //判断是否按键按下

28        begin

29         count <= 1'b0;

30         key_x <= 1'b1;

31        end

32       else

33        begin

34         if(count < T10ms - 1)   //按下就计数10ms

35          begin

36           count <= count + 1'b1;

37           key_x <= 1'b1;

38          end

39         else

40          begin       //计数到了后给输出赋值为 0

41           key_x <= 1'b0;

42           state <= s1; 

43          end

44        end

45      end

46     s1:begin

47       if(~key)       //判断是否按键抬起

48        begin

49         count <= 1'b0;

50         key_x <= 1'b0;

51        end

52       else

53        begin

54         if(count < T10ms - 1)   //抬起就计数10ms

55          begin

56           count <= count + 1'b1;

57           key_x <= 1'b0;

58          end

59         else

60          begin

61           key_x <= 1'b1;  //计数到了后给输  出赋值为1

62           state <= s0; 

63          end

64        end

65     end

66     default:state <= 0;

67    endcase

68   end

69 endmodule 

 

测试模块

0 `timescale 1ns/1ps

1 

2  module xiaodou_tb();

3 

4

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分