mikrocontroller.net

Forum: FPGA, VHDL & Co. Einsynchronisieren von Spikes


Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
entity to_test is
    Port ( stop : in  STD_LOGIC;
           clock : in  STD_LOGIC;
        reset : in STD_LOGIC;
           sync_stopped : out  STD_LOGIC);
end to_test;

architecture Behavioral of to_test is
signal stop_reset,stop_FF,stop_FF2,stop_FF3,FF2_reset,FF3_reset : STD_LOGIC:='0';
signal stop_CE : STD_LOGIC:='1';
begin

process(stop,stop_CE,stop_FF,stop_reset)
begin
  if stop_reset = '1' then
    stop_FF <= '0';
  elsif (stop'event and stop = '1') then
    if stop_CE = '1' then
    stop_FF <= '1';
    end if;
  end if;
    stop_CE <= not stop_FF;
end process;

process(stop_FF,clock,FF2_reset,stop_FF2)
begin
  if  FF2_reset = '1' then
    stop_FF2 <= '0';
  elsif clock'event and clock = '1' then
    if  stop_FF = '1' then
      stop_FF2 <= not stop_FF2;
    end if;
  end if;
  sync_stopped <= stop_FF2;
end process;

process(clock,stop_FF2,FF3_reset,stop_FF3)
begin
  if  FF3_reset = '1' then
    stop_FF3 <= '0';
  elsif clock'event and clock = '1' then
    if  stop_FF2 = '1' then
      stop_FF3 <= '1';
    else
      stop_FF3 <= '0';
    end if;
  end if;
  stop_reset <= stop_FF3;
  FF2_reset <= stop_FF3;
end process;

process(reset)
begin
FF3_reset <= reset;
end process;

end Behavioral;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
process(stop_FF,clock,FF2_reset,stop_FF2)
begin
  if  FF2_reset = '1' then
    stop_FF2 <= '0';
  elsif clock'event and clock = '1' then
  :
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:
process(clock,FF2_reset)
begin
  if  FF2_reset = '1' then
    stop_FF2 <= '0';
  elsif clock'event and clock = '1' then
  :

Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, genau sowas hab ich irgendwie nicht gefunden...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.