Hallo!
Ich habe in den Beiträgen zum Einsynchronisieren von Asynchronen
Signalen immer nur Lösungen gefunden, für Signale deren H-Pegel länger
als ein Takt ist (Flankenerkennung). Was mache ich, wenn die Signale die
ich erkennen will nur kurze Spikes sind? Meine Lösung klappt so auch im
Simulator, das stop_FF3 Signal sollte dann zwei Takte verzögert einen
definierten Tick darstellen. Da das ganze aber sicher funktionieren
soll, und ich eher noch nicht so lange mit VHDL arbeite frage ich hier
mal, ob die Lösung "sauber" aussieht und zu erwarten ist, dass sie
sicher funktioniert? Speziell dass stop_CE aus dem stop_FF abzuleiten
finde ich irgendwie unschön, genauso das stop_FF3 <= '0' im else-Zweig.
Ist das totzdem OK?
Der Code:
1 | entity to_test is
|
2 | Port ( stop : in STD_LOGIC;
|
3 | clock : in STD_LOGIC;
|
4 | reset : in STD_LOGIC;
|
5 | sync_stopped : out STD_LOGIC);
|
6 | end to_test;
|
7 |
|
8 | architecture Behavioral of to_test is
|
9 | signal stop_reset,stop_FF,stop_FF2,stop_FF3,FF2_reset,FF3_reset : STD_LOGIC:='0';
|
10 | signal stop_CE : STD_LOGIC:='1';
|
11 | begin
|
12 |
|
13 | process(stop,stop_CE,stop_FF,stop_reset)
|
14 | begin
|
15 | if stop_reset = '1' then
|
16 | stop_FF <= '0';
|
17 | elsif (stop'event and stop = '1') then
|
18 | if stop_CE = '1' then
|
19 | stop_FF <= '1';
|
20 | end if;
|
21 | end if;
|
22 | stop_CE <= not stop_FF;
|
23 | end process;
|
24 |
|
25 | process(stop_FF,clock,FF2_reset,stop_FF2)
|
26 | begin
|
27 | if FF2_reset = '1' then
|
28 | stop_FF2 <= '0';
|
29 | elsif clock'event and clock = '1' then
|
30 | if stop_FF = '1' then
|
31 | stop_FF2 <= not stop_FF2;
|
32 | end if;
|
33 | end if;
|
34 | sync_stopped <= stop_FF2;
|
35 | end process;
|
36 |
|
37 | process(clock,stop_FF2,FF3_reset,stop_FF3)
|
38 | begin
|
39 | if FF3_reset = '1' then
|
40 | stop_FF3 <= '0';
|
41 | elsif clock'event and clock = '1' then
|
42 | if stop_FF2 = '1' then
|
43 | stop_FF3 <= '1';
|
44 | else
|
45 | stop_FF3 <= '0';
|
46 | end if;
|
47 | end if;
|
48 | stop_reset <= stop_FF3;
|
49 | FF2_reset <= stop_FF3;
|
50 | end process;
|
51 |
|
52 | process(reset)
|
53 | begin
|
54 | FF3_reset <= reset;
|
55 | end process;
|
56 |
|
57 | end Behavioral;
|