Der Witz bei dieser Entprelllogik ist ein Schieberegister, in das der Eingangspegel eingetaktet wird. Auf diese Art erschlägt man gleich mehrere Fliegen mit einer Klappe:
1. Einsynchronisieren eines asynchronen Eingangs
(das asynchrone Verhalten haben mechanische Konakte so an sich)
2. Entprellung über die Schieberegisterbreite
3. einfache Flankenauswertung
Hier der Beispielcode:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity debounce is
Port ( clk : in STD_LOGIC;
input : in STD_LOGIC;
output : out STD_LOGIC;
riseedge : out STD_LOGIC;
falledge : out STD_LOGIC);
end debounce;
architecture Behavioral of debounce is
signal prescaler : integer range 0 to 10000;
signal inputsr : std_logic_vector(3 downto 0);
begin
process begin
wait until rising_edge(clk);
if (prescaler=0) then
prescaler <= 10000;
-- Pegel zuweisen
if (inputsr = "0000") then output<='0'; end if;
if (inputsr = "1111") then output<='1'; end if;
-- steigende Flanke
riseedge <= '0';
if (inputsr = "0111") then riseedge<='1'; end if;
-- fallende Flanke
falledge <= '0';
if (inputsr = "1000") then falledge<='1'; end if;
-- von rechts Eintakten
inputsr <= inputsr(2 downto 0) & input;
else
prescaler <= prescaler-1;
end if;
end process;
end Behavioral;