Forum: FPGA, VHDL & Co. Einsynchronisieren von Spikes


von max (Gast)


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;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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
  :

von max (Gast)


Lesenswert?

Danke, genau sowas hab ich irgendwie nicht gefunden...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.