10086RainEr 发表于 2010-8-16 17:26:24

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

希望哪位高手能给个小小的实例
谢谢了!

suipeng70 发表于 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

akuei2 发表于 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 ⊙ )啊!

Crazy_Bingo 发表于 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                CLK_Class
                                );
                               
reg         count;                        //Delay_10ms
reg                 CLK_100Hz;                 //100HZ(10ms)时钟信
reg         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

tokeyman001 发表于 2010-8-16 23:02:54

俺还是觉得用一串D触发器比较好...我们公司一般这么用
reg shifter;
input pink;
output pink_out;
reg pink_out;

always @(posedge clk)
begin
shifter<=shifter;
shifter<=pink;
end

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

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

HXW718059156 发表于 2010-8-17 20:55:08

最后这个Verilog写得不错!

yuri99q 发表于 2010-8-18 00:39:01

分频时钟连一个(串联3个D触发器)

sujiebin 发表于 2010-8-18 01:04:25

crazy bingo 的代码很有通用意义,尤其是可以实现步进任意值的功能,不错!

honsimark 发表于 2010-8-22 21:29:57

值得学习!

tokeyman001 发表于 2010-8-23 12:04:11

crazy bingo的代码是不是占用的资源太多了啊...

yvhksovo 发表于 2010-8-24 10:00:54

回复【9楼】tokeyman001
-----------------------------------------------------------------------

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

cxlspp 发表于 2011-5-23 12:12:27

回复【4楼】tokeyman001
俺还是觉得用一串d触发器比较好...我们公司一般这么用
reg shifter;
input pink;
output pink_out;
reg pink_out;
always @(posedge clk)
begin
shifter&lt;=shifter;
shifter&lt;=pink;
end
always @(posedge clk)
begin
if(shifter==3'b000)
   pink_out&lt;=1'b0;
else if(shifter==3'b111)
   pink_out&lt;=1'b1;
else
   pink_out&lt;=pink_out;
end
然后给一个慢速的时钟就好了
-----------------------------------------------------------------------

觉得tokeyman001的这个不错

http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_642224JCK2Q1.png
(原文件名:绘图1.png)

tianya342201 发表于 2011-5-24 09:08:42

还是用一串D触发器来延时消抖较好,简单。

lan_lingshan 发表于 2012-2-7 14:00:21

如果把按键消抖的程序用在100K滤波检测,还是移位寄存器方便点儿
页: [1]
查看完整版本: 请教verilog简单的按键消抖代码