library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity debounce_FSM is
generic (fclk : integer :=50000000);
port(
n_rst : in std_logic;
clk : in std_logic;
key_in : in std_logic;
pulse : out std_logic --output single pulse
);
end debounce_FSM;
architecture rtl of debounce_FSM is
type m_state is(
idle,
delay,
output,
key_up
);
signal cs,ns: m_state;
signal key_reg : std_logic;
constant n : integer :=fclk/100; --100Hz,means to delay 10 ms signal delay_cnt : integer range 0 to n-1;
begin
--three section FSM
--timing sequence part of FSM
process(n_rst,clk)
begin
if(n_rst='0')then
cs<=idle;
elsif(clk'event and clk='1')then
cs<=ns;
end if;
end process;
--combination part of FSM
process(cs,key_in,delay_cnt)
begin
case (cs) is
when idle => if(key_in='0')then
ns<=delay; --when key is down
else
ns<=idle;
end if;
when delay => if(delay_cnt=n-1)then
ns<=output;
else
ns<=delay;
end if;
when output => ns<=key_up;
when key_up => if(key_in='1')then --waiting key being up
ns<=idle;
else
ns<=key_up;
end if;
when others => ns<=idle;
end case;
end process;
--register output part of FSM
process(n_rst,clk)
begin
if(n_rst='0')then
key_reg <='0';
delay_cnt<=0;
elsif(clk'event and clk='1')then
case (ns) is
when idle => key_reg <='0';delay_cnt<=0;
when delay => key_reg <='0';delay_cnt<=delay_cnt+1;
when output => if(key_in='0')then
key_reg <='1';
else
key_reg <='0';
end if;
delay_cnt<=delay_cnt;
when key_up => key_reg <='0';delay_cnt<=0;
when others => key_reg <='0';delay_cnt<=0;
end case;
end if;
end process;
pulse<=key_reg;
end rtl;
本文档为【VHDL状态机按键消抖】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。