按键消抖

按键消抖

按键是FPGA实验工程中常见的电子元器件,通常用作系统复位信号或者控制。外部信号的输入。按键消抖主要针对的是机械弹性开关(按下去,一旦松开就会弹上去),当机械触点断开、闭合时,由于机械触点的弹性作用,按键开关在闭合时不会立刻稳定的接通,在断开时也不会一下子断开。按键在闭合和断开的瞬间会有一连串的抖动,为了保证系统能够正确识别按键开关,必须进行消抖处理。
按键消抖分为硬件消抖和软件消抖,硬件消抖会使用额外的器件,占用空间,增加布局布线复杂度。这里讲的是软件消抖,适用于按键比较多的情况。

设计目标

按键每次按下后,系统能够检测到按键仅被按下了一次,而不是因抖动发生重复按下的情况。

设计方法

设计打算应用延时程序去除抖动部分。
cnt_20ms为中间变量,当key_in高电平时,cnt_20ms清零,为低电平时加一。当计数值达到999999-1时,cnt_20ms保持最大值不变,直到遇到key_in高电平清零,这样可以防止因抖动多次检测到按键信号,保证按键按下只产生一个key_flag脉冲。
在这里插入图片描述
在这里插入图片描述

代码实现

下面直接上代码:

module	key_filter
#(
	parameter	CNT_MAX = 20'd999_999
)
(
	input		sys_clk		,
	input		rst_n		,
	input		key_in		,
	
	output	reg	key_flag
);

reg		[19:0]	cnt_20ms;

always@(posedge sys_clk or negedge rst_n)begin
	if(rst_n == 1'b0)
		cnt_20ms <= 20'd0;
	else if(key_in == 1'd1)			//按键处于没有按下的状态时,cnt_20ms清零
		cnt_20ms <= 20'd0;
	else if(cnt_20ms == CNT_MAX )	//计数到最大值时cnt_20ms保持最大值
		cnt_20ms <= CNT_MAX;
	else
		cnt_20ms <= cnt_20ms + 20'd1;
end

always@(posedge sys_clk or negedge rst_n)begin
	if(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

仿真文件:

`timescale  1ns/1ns
module key_filter_tb();

reg		sys_clk	;
reg		rst_n	;
reg		key_in	;
reg	[7:0] cnt;

wire		key_flag;
parameter M = 249;
initial begin
	sys_clk = 1'd0;
	forever #10 sys_clk = ~sys_clk;
end

initial begin
	rst_n <= 1'd0;
	#20
	rst_n <= 1'd1;
end

always@(posedge sys_clk or negedge rst_n)begin
	if(rst_n == 1'd0)
		cnt <= 8'd0;
	else if(cnt == M)
		cnt <= 8'd0;
	else
		cnt <= cnt + 8'd1;
end

always@(posedge sys_clk or negedge rst_n)begin
	if(rst_n == 1'd0)
		key_in <= 1'd0;
	else if(((cnt>8'd19) && (cnt<=8'd69)) || ((cnt>8'd149) && (cnt<=8'd199)) )
		key_in <= {$random} % 2 ;
	else if((cnt>8'd69)&& (cnt<=8'd149))
		key_in <= 1'd0;
	else
		key_in <= 1'd1;
end

key_filter
#(
	.CNT_MAX (20'd24)
)
key_filter_inst
(
	.sys_clk	(sys_clk)	,
	.rst_n		(rst_n)		,
	.key_in		(key_in)	,
	        
	.key_flag   (key_flag)
);

endmodule 

仿真结果如图所示,按键按下(key_in长保持低电平时)两次产生了两个脉冲信号,和绘制波形图结果一致。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值