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.