按键消抖Verilog

        时钟频率为50MHz,从0开始计数记到999_999时为20ms,当key_in为低电平时cnt_20ms开始计数,当计数到999_998时,key_flag输出一个周期的脉冲信号,cnt_20ms保持为999_999(若计数到999_999时才输出脉冲的画,当中间停留时间太长就会导致输出多个脉冲周期,也是非常不好的一种现象)。

 

 

Verilog代码为

module key_filter
#(parameter CNT_MAX=20'd999_999)
(
	input wire sys_clk,
	input wire sys_rst_n,
	input wire key_in,
	output reg key_flag
    );
	
	reg [19:0]cnt_20ms;
	always@(posedge sys_clk or negedge sys_rst_n)
		begin
			if(sys_rst_n==1'b0)
				cnt_20ms<=20'd0;
			else if(key_in==1'b1)
				cnt_20ms<=20'd0;
			else if(cnt_20ms==CNT_MAX)
				cnt_20ms<=CNT_MAX;
			else
				cnt_20ms<=cnt_20ms+20'd1;
		end
	always@(posedge sys_clk or negedge sys_rst_n)
		begin
			if(sys_rst_n==1'b0)
				key_flag<=1'd0;
			else if(cnt_20ms==(CNT_MAX-20'd1))
				key_flag<=1'd1;
			else
				key_flag<=1'd0;
		end
endmodule

仿真测试的时候用一个tb_cnt来模拟按键的抖动,当 tb_cnt在0~19、169~249之间时保持一个高电平,在69~149时保持一个低电平,在16~69、149~169之间产生随机数来模拟按键的抖动。

则仿真测试代码为

`timescale 1ns / 1ns

module tb_key_filter();

reg sys_clk;
reg	sys_rst_n;
reg key_in;
reg [7:0]tb_cnt;
wire key_flag;

initial
	begin
		sys_clk=1'b1;
		sys_rst_n<=1'b0;
		#20
		sys_rst_n<=1'b1;
	end
	
always #10 sys_clk<=~sys_clk;

always@(posedge sys_clk or negedge sys_rst_n)
	begin
		if(sys_rst_n==1'b0)
			tb_cnt<=8'd0;
		else if(tb_cnt==8'd249)
			tb_cnt<=8'd0;
		else
			tb_cnt<=tb_cnt+2'd1;
	end
always@(posedge sys_clk or negedge sys_rst_n)
	begin
		if(sys_rst_n==1'b0)
			key_in<=1'b1;
		else if((tb_cnt>=8'd19)&&(tb_cnt<=8'd69)
		||(tb_cnt>=8'd149)&&(tb_cnt<=8'd169))
			key_in<={$random}%2;
		else if((tb_cnt<8'd19)||(tb_cnt>8'd169))
			key_in<=1'b1;
		else
			key_in<=1'b0;
	end	
	
key_filter
#(.CNT_MAX(20'd50))
key_filter_inst
(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.key_in(key_in),
.key_flag(key_flag)
    );
	
endmodule

vivado仿真的波形图

计数到最大值减一的时候产生一个时钟周期的脉冲。 

模拟按键消抖 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值