当前位置:   article > 正文

Verilog实现的多个按键消抖(具体模块可用)_verilog消抖电路

verilog消抖电路

由于前面已经分享过了,这里直接说思路,贴代码。原理等等其他的翻前面的博文。(代码经过验证,可以在板机上使用)

1,逻辑功能

四个独立按键分别对应四个led灯,按键控制led的反转。

2,设计思路

这里的思路其实很简单,基于按键的抖动最长为20ms,所以每20ms取一次按键状态,前后两次进行下降沿检测就行。(有没有很简单,还有一个更简单的!!!后面代码中分享)贴张图

3,实验代码

  1. module key_filter(clk,rst_n,key_in,led
  2. );
  3. input clk;
  4. input rst_n;
  5. input [3:0] key_in;
  6. output [3:0] led;
  7. //这两段代码前面分别进行计数和在计数满产生一个高脉冲信号cnt_full
  8. //20ms计数器
  9. reg cnt_full;
  10. reg [19:0] cnt;
  11. always@(posedge clk or negedge rst_n)
  12. begin
  13. if(!rst_n)
  14. cnt <= 20'd0;
  15. else if(cnt == 20'd999_999)
  16. cnt <= 20'd0;
  17. else
  18. cnt <= cnt + 1'b1;
  19. end
  20. //计数满信号
  21. always@(posedge clk or negedge rst_n)
  22. begin
  23. if(!rst_n)
  24. cnt_full <= 1'b0;
  25. else if(cnt == 20'd999_999)
  26. cnt_full <= 1'b1;
  27. else
  28. cnt_full <= 1'b0;
  29. end
  30. //这两段代码就是来用实现取前后按键信号的
  31. reg [3:0] key_in_r;
  32. reg [3:0] key_in_r_next;
  33. always@(posedge clk or negedge rst_n)
  34. begin
  35. if(!rst_n)
  36. key_in_r_next <= 4'b1111;
  37. else if(cnt_full)
  38. key_in_r_next <= key_in;
  39. else
  40. key_in_r_next <= key_in_r_next;
  41. end
  42. always@(posedge clk or negedge rst_n)
  43. begin
  44. if(!rst_n)
  45. key_in_r <= 4'b1111;
  46. else
  47. key_in_r <= key_in_r_next;
  48. end
  49. wire [3:0] key_out;
  50. assign key_out = key_in_r & (~key_in_r_next);
  51. //后面两个单元很简单,控制led翻转
  52. reg [3:0] led_r;
  53. //led翻转
  54. always@(posedge clk or negedge rst_n)
  55. begin
  56. if(!rst_n)
  57. led_r <= 4'b0000;
  58. else
  59. begin
  60. if(key_out == 4'b0001) led_r[0] <= ~led[0];
  61. if(key_out == 4'b0010) led_r[1] <= ~led[1];
  62. if(key_out == 4'b0100) led_r[2] <= ~led[2];
  63. if(key_out == 4'b1000) led_r[3] <= ~led[3];
  64. end
  65. end
  66. assign led[0] = led_r[0];
  67. assign led[1] = led_r[1];
  68. assign led[2] = led_r[2];
  69. assign led[3] = led_r[3];
  70. endmodule

4,RTL图

本来不想贴,但是它太漂亮了,,所以分享下,一起感受它的美!!

小惊喜!!!!上边核心代码是不是有点不太好理解??这里有一个新思路,直接计数40ms!!取值两次进行对比即可(两次取值分别在中间和结束,看看和上边图是不是一个意思??)!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/718573
推荐阅读
相关标签
  

闽ICP备14008679号