按键消抖检测

/*当有按键按下时,为了消除抖动,一般抖动会有5-10ms
启动延时计数器,如果按键保持低电平的时间足够长,
计数一定会满足设定的计数条件,否则计数器清零,等待下一次按键到老
*/

module key(
	input				clk,
	input				rst_n,
	input				key_in,
	output reg[3:0]sum
);
reg[10:0]counter;//消抖延时计数器
reg state;
reg pos_flag;//尖峰计数器
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		begin
			counter<=0;
			state<=0;
			pos_flag<=0;
		end
	else begin
		case(state)
			0:begin
					if(counter<10)
						begin
							if(!key_in)
								counter<=counter+1;
							else
								counter<=0;
						end
					else begin
						pos_flag<=1;
						counter<=0;
						state<=1;
					end
				end
			1:begin
					pos_flag<=0;
					if(key_in)
						state<=0;
				end
			default:state<=0;
		endcase
	end
	
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		sum<=0;
	else if(pos_flag)
		sum<=sum+1;
endmodule

 

`timescale 1ns/1ns
module key_tb;
	reg				clk;
	reg				rst_n;
	reg				key_in;
	wire [3:0]sum;

	initial begin
		clk=0;
		rst_n=0;
		key_in=1;
		#100;
		rst_n=1;
		#30 		key_in=0;
		#30 		key_in=1;
		#20 		key_in=0;
		#90 		key_in=1;
		#1000 		key_in=0;
		#200 		key_in=1;
		#10000 		key_in=0;
		#120 		key_in=1;
		#2000;
		$stop;
	end
	
	always #10 clk=~clk;
	

	
	
key key(
	.	clk(clk),
	.	rst_n(rst_n),
	.	key_in(key_in),
	.sum(sum)
);

endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值