搜索
bottom↓
回复: 13

请教verilog简单的按键消抖代码

[复制链接]

出0入0汤圆

发表于 2010-8-16 17:26:24 | 显示全部楼层 |阅读模式
希望哪位高手能给个小小的实例
谢谢了!

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

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

出0入0汤圆

发表于 2010-8-16 17:31:01 | 显示全部楼层
坛子里有啊,缺氧老弟的范例
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3870307&bbs_page_no=1&search_mode=3&search_text=tear086&bbs_id=9999

出0入0汤圆

发表于 2010-8-16 18:03:29 | 显示全部楼层
http://cid-c8c65500aea2fb15.office.live.com/self.aspx/Verilog%20HDL%20%e9%82%a3%e4%ba%9b%e4%ba%8b%e5%84%bf%20%ef%bc%88%e7%bb%a7%e7%bb%ad%e6%9c%aa%e5%ae%8c%e7%9a%84%e6%95%85%e4%ba%8b%20%ef%bc%89/%e7%ac%ac%e4%ba%8c%e7%ab%a05.rar

( ⊙ o ⊙ )啊!

出0入0汤圆

发表于 2010-8-16 22:45:45 | 显示全部楼层
我照着单片机的思想 用verilog调了一个,用着灰常稳定,愿与天下人共享
/***************************************************************************************
FILE NAME      :     Key_Scan.v
AUTHOR         :     Crazy Bingo
FUNCTION       :     Take away the jitter of Independent Key
SETUP TIME     :     2010/5/5
***************************************************************************************/
/*        每一次按键,前后大约是20ms,
**  由于干扰的存在,要消除抖动,才能保证系统的稳定性
**        在单片机中检测按键用延时,抖动检测,松手检测
**        在FPGA 中同样可以利用单片机思想在状态机中实现
**        整个状态分为:
                                (1)按键检测
                                (2)消抖动(按键检测)        Delay_10ms
                                (3)执行操作
                                (4)松手检测(消抖动)        Delay_10ms
                                (5)松手检测                        Delay_10ms
*/
module Key_Scan(
                                input                                CLOCK_50,
                                input                                Key,
                                input                                RST_n,

                                output        reg        [3:0]        CLK_Class
                                );
                               
reg [17:0]        count;                        //Delay_10ms
reg                 CLK_100Hz;                 //100HZ(10ms)时钟信
reg [2:0]        state;                  //状态标志


always @(posedge CLOCK_50 or negedge RST_n)
begin
        if(!RST_n)
                begin
                CLK_100Hz<=0;
                count<=0;
                end
        else
                begin
                if(count<18'd250000)
                        count<=count+1'b1;
                else
                        begin
                        count<=0;
                        CLK_100Hz<=~CLK_100Hz;
                        end       
                end
end


always@(posedge CLK_100Hz or negedge RST_n)
begin
        if(!RST_n)
                CLK_Class <= 0;
        else
                begin
                case(state)                                        //按键,不按下去的时候是VCC高,按下去的时候是GND低
                0:
                        begin
                        if(!Key)                        //检测键盘是否被按下(Delay_5ms)
                                state <= 1;
                        else
                                state <= 0;                        //未按下,循环检测
                        end
                1:
                        begin
                        if(!Key)                        //检测键盘是否真的被按下,还是抖动(消抖动(Delay_5ms))
                                state <= 2;                        //检测到不是抖动,进行下一步操作
                        else
                                state <= 0;                        //是抖动,回去继续检测按键
                        end
                2:
                        begin                       
                        CLK_Class <= CLK_Class+1'b1;
                        state <= 3;                                //只进行加1操作,不连加                       
                        end
                       
//                        if(!Key)
//                                begin
//                                CLK_Class <= CLK_Class+1'b1;                       
//                                state <= 2;                                //连加,就返回本进程
//                                end
//                        else
//                                state <= 3;
                3:
                        begin
                        if(Key)                                //松手(VCC)检测,有可能是抖动
                                state <= 4;
                        else                                                //检测到还是(GND)低电平,未松手
                                state <= 3;
                        end
                4:
                        begin
                        if(Key)                                //松手(VCC)检测,有可能是抖动
                                state <= 0;
                        else
                                state <= 4;                                //检测到还是(GND)低电平,未松手
                        end
                endcase
                end
end

endmodule

出0入0汤圆

发表于 2010-8-16 23:02:54 | 显示全部楼层
俺还是觉得用一串D触发器比较好...我们公司一般这么用
reg [2:0] shifter;
input pink;
output pink_out;
reg pink_out;

always @(posedge clk)
begin
shifter[2:1]<=shifter[1:0];
shifter[0]<=pink;
end

always @(posedge clk)
begin
if(shifter[2:0]==3'b000)
   pink_out<=1'b0;
else if(shifter[2:0]==3'b111)
   pink_out<=1'b1;
else
   pink_out<=pink_out;
end

然后给一个慢速的时钟就好了

出0入0汤圆

发表于 2010-8-17 20:55:08 | 显示全部楼层
最后这个Verilog写得不错!

出0入0汤圆

发表于 2010-8-18 00:39:01 | 显示全部楼层
分频时钟连一个(串联3个D触发器)

出0入0汤圆

发表于 2010-8-18 01:04:25 | 显示全部楼层
crazy bingo 的代码很有通用意义,尤其是可以实现步进任意值的功能,不错!

出0入0汤圆

发表于 2010-8-22 21:29:57 | 显示全部楼层
值得学习!

出0入0汤圆

发表于 2010-8-23 12:04:11 | 显示全部楼层
crazy bingo的代码是不是占用的资源太多了啊...

出0入0汤圆

发表于 2010-8-24 10:00:54 | 显示全部楼层
回复【9楼】tokeyman001
-----------------------------------------------------------------------

你的那个代码还不是要求给慢时钟才行.时钟快的话,寄存器就要的多才有效果.

出0入0汤圆

发表于 2011-5-23 12:12:27 | 显示全部楼层
回复【4楼】tokeyman001
俺还是觉得用一串d触发器比较好...我们公司一般这么用
reg [2:0] shifter;
input pink;
output pink_out;
reg pink_out;
always @(posedge clk)
begin
shifter[2:1]&lt;=shifter[1:0];
shifter[0]&lt;=pink;
end
always @(posedge clk)
begin
if(shifter[2:0]==3'b000)
   pink_out&lt;=1'b0;
else if(shifter[2:0]==3'b111)
   pink_out&lt;=1'b1;
else
   pink_out&lt;=pink_out;
end
然后给一个慢速的时钟就好了
-----------------------------------------------------------------------

觉得tokeyman001的这个不错


(原文件名:绘图1.png)

出0入0汤圆

发表于 2011-5-24 09:08:42 | 显示全部楼层
还是用一串D触发器来延时消抖较好,简单。

出0入0汤圆

发表于 2012-2-7 14:00:21 | 显示全部楼层
如果把按键消抖的程序用在100K滤波检测,还是移位寄存器方便点儿
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 11:25

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

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