FPGA按键消抖

代码如下

module key_debounce(input clk,
						 input rst_n,
						 input[3:0] key_v,
						 output reg[7:0] led);
					 
		wire key;//所有按键值相与的结果
		reg[3:0] keyr;//key的缓存寄存器
		assign key = key_v[3]&key_v[2]&key_v[1]&key_v[0];
		//获得按键是否有按下或者释放的标志位 keg_neg keg_pos
		always @(posedge clk or negedge rst_n)//按键变化的检测
			if(!rst_n)
				keyr <= 4'b1111;
			else 
				keyr <= {keyr[2:0],key};
		wire keg_neg = ~keyr[2]&keyr[3];//某个按键被按下
		wire keg_pos = keyr[2]&~keyr[3];//某个按键被释放
		
		
		reg[19:0] cnt;
		//计数器,40ms采集一次键值
		always @(posedge clk or negedge rst_n)
			if(!rst_n)
				cnt <= 20'd0;
			else if(keg_neg||keg_pos)
				cnt <= 20'd0;
			else if(cnt<20'd999_999)
				cnt <= cnt + 1'b1;
			else 
				cnt <= 20'd0;
		
		reg[3:0] key_value[1:0];
		//定时采集键值
		always @(posedge clk or negedge rst_n)
			if(!rst_n)
			begin
				key_value[0] <= 4'b1111;
				key_value[1] <= 4'b1111;
			end
			else 
			begin
				key_value[1] <= key_value[0];
				if(cnt == 20'd999_999)
					key_value[0] <= key_v;
				else;
			end
		
		wire[3:0] key_press = key_value[1]&~key_value[0];//判断哪个按键被按下
		
		always @(posedge clk or negedge rst_n)
			if(!rst_n)
				led <= 8'hff;
			else if(key_press[0])
				led[0] <= ~led[0];
			else if(key_press[1])
				led[1] <= ~led[1];
			else if(key_press[2])
				led[2] <= ~led[2];
			else if(key_press[3])
				led[3] <= ~led[3];
			else;
endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值