废话少说,直接贴代码:(如需转载请注明出处)
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Company: hclmcu
// Engineer:
//
// Create Date: 09:07:47 08/15/2010
// Design Name: 按键消抖
// Module Name: key_filter
// Description: 由此模块作为按键消抖模块时,当按键一直按下时,key_out的值一直为低,所以当使用时,可以用
// (negedge key_out)来实现即使按皱键一直按着,操作(此处指led或说是count)只进行一次。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//module key_filter(clk,key_in,key_out );
module key_filter(clk,key_in,led );
input clk,key_in;
output [7:0] led;
reg key_out;
reg [19:0] key_count;
reg [7:0] count; //灯显示计数
wire [7:0] led;
always @ (posedge clk)
begin
if(key_in==0) //判断是否有键按下
begin
key_count<=key_count+1'b1;//当检测到有键按下,计数器加1
key_out<=1'b1;//此时延时尚未达到,所以输出为高
if(key_count>=20'd1000000)
begin
key_count<=20'd1000001;//当达到延时20ms(50MHZ)时,锁存key-count值
key_out<=1'b0;//此时延时达到200us,输出为低
end
end
else
begin
key_out<=1'b1;//当没有键按下时, 输出为高
key_count<=1'b0;//计数器清0
end
end
//**********下面模块为由led灯来检测按键消抖是否成功*************************************
always @(negedge key_out)
begin
count<=count+1'b1;
end
assign led=count;
endmodule