手撕Verilog面试题专题——(10)按键消抖

10 按键消抖;抖动小于15ms,输入时钟12MHz
参考文章:https://blog.csdn.net/Reborn_Lee/article/details/89927569
15ms/(1/12Mhz) = 180000 = 0x2BF20(16)

Verilog代码:

module presskey(
	input	       clk,
	input	       rst,
	input	       key_in,
	output  reg    key_out
);
	//按键本身值为1,按下值为0;
	reg	sw_in_r0;
	
	always@(posedge clk or negedge rst)	begin
		if(!rst)
			sw_in_r0	<= 1;
		else
			sw_in_r0	<= key_in;
	end
	
	wire	edgel, edgeh, edge_en;
	assign	edgel	= sw_in_r0 & (~key_in);
	assign	edgeh	= (~sw_in_r0) & key_in;
	assign	edge_en = edgel | edgeh;
	
	reg	[19:0] count;
	always@(posedge clk or negedge rst)	begin
		if(!rst)	
			count	<= 0;
		else if(edge_en)
			count	<= 0;
		else
			count	<= count + 1;
	end
	
	always@(posedge clk or negedge rst)	begin
		if(!rst)
			key_out	<= 1;
		else if(count == 20'h2BF20)
			key_out	<= key_in;
		else
			key_out	<= key_out;
	end
	
endmodule 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值