搜索
bottom↓
回复: 3

发个按键消抖的程序,请大家指正

[复制链接]

出0入0汤圆

发表于 2014-5-4 15:58:42 | 显示全部楼层 |阅读模式
包括按下抖动和松开抖动

没有判断按键有无按下,只是将抖动的信号过滤掉,信号输出电平和输入一致

按键默认电平值为高

新手请大家指正
  1. `timescale        1 ns/1 ps
  2. `define                DELAY        1

  3. module filter
  4. (
  5.     clk,
  6.     rst,
  7.     /*port*/

  8.     signal_in,
  9.     signal_out
  10. );
  11. input                   clk ;
  12. input                   rst ;

  13. input                                    signal_in ;
  14. output                            signal_out ;
  15. reg                                signal_out ;

  16. reg     [3:0]           MainState ;
  17. parameter            sDefaultHigh = 1 ;
  18. parameter            sPressFlutter = 2 ;
  19. parameter            sPressNormal = 3 ;

  20. parameter            sDefaultLow = 4 ;
  21. parameter            sReleaseFlutter = 5 ;
  22. parameter            sReleaseNormal = 6 ;

  23. //parameter            DELAY_20MS = 500_000 ;  //500_000, 10ms
  24. parameter            DELAY_20MS = 250_000 ;  //250_000, 5ms
  25. //parameter            DELAY_20MS = 50 ;  //500_000, 10ms
  26. reg     [31:0]          count;
  27. always @ (posedge clk or negedge rst)
  28. begin
  29.     if(~rst)
  30.     begin
  31.         signal_out <=#`DELAY 1 ;
  32.         count <=#`DELAY 0 ;
  33.         MainState <=#`DELAY sDefaultHigh ;
  34.     end
  35.     else
  36.     begin
  37.         case (MainState)
  38.         sDefaultHigh:
  39.         begin
  40.             signal_out <=#`DELAY 1 ;
  41.             if(~signal_in)
  42.                 MainState <=#`DELAY sPressFlutter ;
  43.             else
  44.                 MainState <=#`DELAY sDefaultHigh ;
  45.         end
  46.         sPressFlutter:
  47.         begin
  48.             if(count == DELAY_20MS)
  49.             begin
  50.                 if(signal_in == 0)
  51.                 begin
  52.                     MainState <=#`DELAY sPressNormal ;
  53.                     signal_out <=#`DELAY 0 ;
  54.                     count <=#`DELAY 0 ;
  55.                 end
  56.                 else
  57.                 begin
  58.                     MainState <=#`DELAY sPressFlutter ;
  59.                     count <=#`DELAY 0 ;
  60.                 end
  61.             end
  62.             else
  63.             begin
  64.                 count <=#`DELAY count + 1 ;
  65.                 signal_out <=#`DELAY 1 ;
  66.             end
  67.         end
  68.         sPressNormal:
  69.         begin
  70.             signal_out <=#`DELAY 0 ;
  71.             MainState <=#`DELAY sDefaultLow ;
  72.         end

  73.         sDefaultLow:
  74.         begin
  75.             signal_out <=#`DELAY 0 ;
  76.             if(signal_in)
  77.                 MainState <=#`DELAY sReleaseFlutter ;
  78.             else
  79.                 MainState <=#`DELAY sDefaultLow ;
  80.         end
  81.         sReleaseFlutter:
  82.         begin
  83.             if(count == DELAY_20MS)
  84.             begin
  85.                 if(signal_in == 1)
  86.                 begin
  87.                     MainState <=#`DELAY sReleaseNormal ;
  88.                     signal_out <=#`DELAY 1 ;
  89.                     count <=#`DELAY 0 ;
  90.                 end
  91.                 else
  92.                 begin
  93.                     MainState <=#`DELAY sReleaseFlutter ;
  94.                     count <=#`DELAY 0 ;
  95.                 end
  96.             end
  97.             else
  98.             begin
  99.                 count <=#`DELAY count + 1 ;
  100.                 signal_out <=#`DELAY 0 ;
  101.             end
  102.         end
  103.         sReleaseNormal:
  104.         begin
  105.             signal_out <=#`DELAY 1 ;
  106.             MainState <=#`DELAY sDefaultHigh ;
  107.         end
  108.         default:
  109.         begin
  110.             MainState <=#`DELAY sDefaultHigh ;
  111.         end
  112.         endcase
  113.     end
  114. end
  115. endmodule
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-5-5 09:06:54 | 显示全部楼层
太啰嗦了, 而且貌似不支持长短按键

出0入0汤圆

 楼主| 发表于 2014-5-5 09:34:42 | 显示全部楼层
7802848 发表于 2014-5-5 09:06
太啰嗦了, 而且貌似不支持长短按键

本来就是个过滤毛刺的小程序

虽然啰嗦,但我觉得流程比较清楚

出0入0汤圆

发表于 2014-5-5 10:39:28 | 显示全部楼层
看你需求,简单处理是双采样后,遇到下降沿开始计数,遇到上升沿停止计数,如果计数大于某一数值,则有按键按下。对于长按键处理如此类似
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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