Mit einer Beschreibung wie dieser wird das unausweichlich passieren:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;
entity Bouncing is
Port ( clk : in STD_LOGIC;
keyin : in STD_LOGIC;
counter: out STD_LOGIC_VECTOR(7 downto 0));
end Bouncing;
architecture Behavioral of Bouncing is
signal cnt : integer range 0 to 255 := 0;
keyinold : std_logic;
begin
process begin
wait until rising_edge(clk);
-- Flankenerkennung steigende Flanke
if (keyin='1' and keyinold='0')
then cnt <= cnt+1;
end if;
keyinold <= keyin;
end process;
counter <= std_locig_vector(to_unsigned(cnt,8));
end Behavioral;
Mechanische Kontakte können ziemlich lange prellen. Ein FPGA mit einer Taktfrequenz von z.B. 50MHz sieht dann viele einzelne Ein- und Aus-Zustände und reagiert dementsprechend.
Hier jetzt 3 Möglichkeiten, diese prellenden Kontakte sicher auszuwerten:
Mit einem Schieberegister, wie der MAX6816 und gleich 8 Taster auf einmal wie der MAX6818.