2021年5月13日-VHDL程序最简单的按键消抖方法

前言

最近做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的信号;按键默认电平为高电平,按下时为低电平。

运行结果

初始状态在这里插入图片描述
按下按键后
在这里插入图片描述
若消抖未设置好,则按下按键后第二个小灯不会亮起。

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值