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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.