一、基本介绍
1、按键识别
按键开关是各种电子设备不可或缺的人机接口。在实际应用中,很大一部分的按键是机械按键。由于机械触点的弹性振动,按键在按下时不会马上稳定地接通而在弹起时也不能立即完全断开,因而在按键闭合和断开的瞬间均会出现一连串的抖动,这称为按键的抖动干扰,其产生的波形如下图。当按键按下时会产生前沿抖动,当按键弹起时会产生后沿抖动。
2、原理图
所使用的开发板是EGO1开发板,系统晶振时钟为100MHZ。原理图和端口标号如下。
二、实验现象
实验现象:每按下一次按键,LED灯由亮变灭,由灭变亮。
去抖动思想
按键去抖动的关键在于提取稳定的低电平状态(本实验是高电平状态),滤除前沿抖动和后沿抖动的毛刺。对于一个按键信号,可以用一个脉冲进行采样。如果连续三次采样都为低电平,可认为信号已经处于键稳定状态,这时输出一个低电平按键信号。继续采样过程中如果不能满足连续三次采样均为低电平,则认为键稳定状态结束,这时输出一个高电平按键信号。
三、实验方法
方法1:源代码
module key(clk,rst,key,led);
input clk,rst;
input key;
output led;
reg led;
reg [20:0]counter; // 分频到1KHZ,计数到1—000—000
always @(posedge clk or negedge rst)
begin
if(!rst)
counter <= 0;
else if(counter == 21'd999_999) // 消除抖动采样周期为毫秒级
counter <= 0;
else
counter <= counter + 1;
end
reg dout1,dout2,dout3; // 三次采样信号
always @(posedge clk or negedge rst)
begin
if(!rst)
begin
dout1 <= 0;
dout2 <= 0;
dout3 <= 0;
end
else if(counter == 21'd999_999) // 连续三次采样
begin
dout1 <= key;
dout2 <= dout1;
dout3 <= dout2;
end
end
assign key_out = (dout1 | dout2 | dout3); // 按键消除抖动输出
always @(posedge key_out or negedge rst)
begin
if(!rst)
led <= 0;
else
led <= !led;
end
endmodule
方法2:源代码
module key(clk,rst,key,led);
input clk,rst;
input key;
output led;
reg led;
reg [20:0]u20ms; // 20ms消抖时间
reg key_flag; // 按键中间变量
always @(posedge clk or negedge rst)
begin
if(!rst)
u20ms <= 0;
else if(key == 0) // 因为板子上按键松开是低电平,大部分按键松开是返回高电平
u20ms <= 0;
else if(u20ms == 1_999_999)
u20ms <= 1_999_999;
else
u20ms <= u20ms + 1;
end
always @(posedge clk or negedge rst)
begin
if(!rst)
key_flag <= 0;
else if(u20ms == 1_999_998)
key_flag <= 1;
else
key_flag <= 0;
end
always @(posedge clk or negedge rst)
begin
if(!rst)
led <= 0;
else if(key_flag == 1) // 这里就是按键的执行内容了
led <= !led;
else
led <= led;
end
endmodule