Hi,
I'm using simple module which take care about metastability and debounce.
HTML Code:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;
ENTITY debounce IS
GENERIC (
width : NATURAL;
active_level : STD_LOGIC
);
PORT (
clk : IN STD_LOGIC;
async_in : IN STD_LOGIC;
sync_out : OUT STD_LOGIC
);
END;
ARCHITECTURE rtl OF debounce IS
SIGNAL dff1_q : STD_LOGIC := not active_level;
SIGNAL dff2_q : STD_LOGIC := not active_level;
SIGNAL cnt : UNSIGNED(width - 1 DOWNTO 0) := (OTHERS => '1');
BEGIN
-- metastability remover
PROCESS (clk)
BEGIN
IF rising_edge(clk) THEN
dff1_q <= async_in; -- first DFF
dff2_q <= dff1_q; -- second DFF
END IF;
END PROCESS;
-- debouncer
PROCESS (clk, dff2_q)
BEGIN
-- asynchronous reset
IF dff2_q = active_level THEN
cnt <= (OTHERS => '0');
sync_out <= active_level;
-- debounce counter
ELSIF rising_edge(clk) THEN
IF cnt = (2**width - 1) THEN
sync_out <= NOT active_level;
ELSE
cnt <= cnt + 1;
END IF;
END IF;
END PROCESS;
END;
Martin