请教verilog简单的按键消抖代码
希望哪位高手能给个小小的实例谢谢了! 坛子里有啊,缺氧老弟的范例
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3870307&bbs_page_no=1&search_mode=3&search_text=tear086&bbs_id=9999 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 ⊙ )啊! 我照着单片机的思想 用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 俺还是觉得用一串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
然后给一个慢速的时钟就好了 最后这个Verilog写得不错! 分频时钟连一个(串联3个D触发器) crazy bingo 的代码很有通用意义,尤其是可以实现步进任意值的功能,不错! 值得学习! crazy bingo的代码是不是占用的资源太多了啊... 回复【9楼】tokeyman001
-----------------------------------------------------------------------
你的那个代码还不是要求给慢时钟才行.时钟快的话,寄存器就要的多才有效果. 回复【4楼】tokeyman001
俺还是觉得用一串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
然后给一个慢速的时钟就好了
-----------------------------------------------------------------------
觉得tokeyman001的这个不错
http://cache.amobbs.com/bbs_upload782111/files_39/ourdev_642224JCK2Q1.png
(原文件名:绘图1.png) 还是用一串D触发器来延时消抖较好,简单。 如果把按键消抖的程序用在100K滤波检测,还是移位寄存器方便点儿
页:
[1]