Einsynchronisieren von Spikes

Gast #1291326
Lesenswert?

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;
Moderator (Firma: Titel) Persönliche Seite #1291345
Lesenswert?

Deine Beschreibung geht den richtigen Weg:
Setzen eines FFs mit dem Spike und anschliessendes Synchronisieren auf 
den FPGA-Takt.

Allerdings ist das Ganze recht umständlich formuliert. Ich mach das so:
http://www.lothar-miller.de/s9y/categories/19-SpikePuls


BTW:
1
process(stop_FF,clock,FF2_reset,stop_FF2)
2
begin
3
  if  FF2_reset = '1' then
4
    stop_FF2 <= '0';
5
  elsif clock'event and clock = '1' then
6
  :
Du brauchst nicht soooo arg viel Signale in die Sensitivity-Liste 
aufzuehmen. Das Ergebnis dieses Prozesses hängt nur von FF2_reset und 
clock ab. deshalb müssen auch nur diese beiden in die Liste:
1
process(clock,FF2_reset)
2
begin
3
  if  FF2_reset = '1' then
4
    stop_FF2 <= '0';
5
  elsif clock'event and clock = '1' then
6
  :

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren