Immer wieder gibt es in synchronen Designs das Problem, dass auch Eingangsimpulse auftreten können, die kürzer als die Abtastperiode sind. Wenn zum Beispiel die Taktfrequenz 50MHz (==> Zykluszeit 20ns) beträgt, der kürzeste Eingangspuls aber nur 19ns sein könnte, dann kann dieses Signal nicht zuverlässig eingetaktet und ausgewertet werden.
Ein Ausweg bietet hier, das Signal direkt am Pin in einem Merker-Flip-Flop asynchron zu speichern und dann einzusynchronisieren. Nach dem Eintakten wird das Merker-FF zurückgesetzt. Eine steigende Flanke wird so, unabhängig von ihrer Dauer, einen Impuls mit einer Dauer von 1 Taktzyklus ausgeben.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Spikedetector is Port ( clk : in STD_LOGIC; spikein : in STD_LOGIC; spikeout : out STD_LOGIC); end Spikedetector; architecture Behavioral of Spikedetector is signal sr0 : std_logic := '0'; signal sr1 : std_logic := '0'; signal merkin : std_logic := '0'; begin -- Merker-FF process (sr1, spikein) begin if (sr1 = '1') then merkin <= '0'; elsif rising_edge(spikein) then merkin <= '1'; end if; end process; -- Asynchrones Merker-FF eintakten process begin wait until rising_edge(clk); if(sr1='1') then sr0 <= '0'; sr1 <= '0'; else sr0 <= merkin; sr1 <= sr0; end if; end process; -- Flanken-Impulse ausgeben spikeout <= sr1; end Behavioral;
Daraus wird das hier. Hier erkennt man, dass für das Merker-FF ein asynchrones FF mit Clear-Eingang verwendet wurde. Die Synchronisations-FFs sind synchron, da auch das Zurücksetzen taktsynchron geschieht.
Und so sieht das in der Simulation aus. Man erkennt, dass auch längere Pulse nur einen (1) Augangspuls ausgeben.