前言
最近做EDA课设的时候,因为没有对按键进行消抖处理,再加上开发板老化较为严重、按键松动,使得已经编写好的vhdl程序烧录到开发板后无法使用,两三天的努力直接白费。
经过血的教训,我根据网上的按键消抖程序,制作出了这个可能是目前能找到的最简单的按键消抖程序;
原理
通过开发板的时钟信号,在按键按下时进行计时(计数)并将按键后行为的部分数据存入缓存,当按键松开时结束计时(计数),如果此时的时间(数字)没有达到一定的长度,视为按键无意间的抖动,即专业术语中的误触;否则,视为合法按键,将缓存数据传递给对应的布线
完整代码
本次代码功能:按下按键,亮起一个信号灯,且还有一个信号灯显示按键是按下还是松开
library ieee;-----------顶层文件
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity test2 is
port(
clk:in std_logic;-----------------------时钟
key:in std_logic;-----------------------按键
warn1,warn2,warn3:out std_logic---------指示灯
);
end test2;
ARCHITECTURE nmsl of test2 is
signal clk1,a1:std_logic;
signal count_3:integer;
begin
COM2:process(clk,key)
variable count_1,count_2:integer range 0 to 100000;
begin
warn1<='1';
if key='0' then----若按键按下
warn3<='1';
if rising_edge(clk) then
if count_1<25 then---计数器开始计数
count_1:=count_1+1;
else
count_1:=count_1;
end if;
if count_1<=24 then----若没达到一定时间长度
a1<='0';
else -----若达到一定时间长度
a1<='1';
end if;
end if;
else
warn3<='0';
count_1:=0;
end if;
warn2<=a1;-----将缓存数据赋给信号灯
end process COM2;
end nmsl;
注:时钟信号连接的是1khz的信号;按键默认电平为高电平,按下时为低电平。
运行结果
初始状态
按下按键后
若消抖未设置好,则按下按键后第二个小灯不会亮起。