www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Einsynchronisieren von STD_LOGIC_VECTORen


Autor: Nik N. (neusser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

in einem anderen Thread wurde gerade das Thema "Einsynchronisieren" 
asynchroner Signale diskutiert. Dabei drehte sich alles um 1 Bit breite 
Signale:
Beitrag "Einsynchronsieren mit 2 FFs"

Da sich im anderen Thread auch Beiträge zum "Einsynchronisieren von 
STD_LOGIC_VECTORen" eingeschlichen haben, habe ich diesen Thread 
erstellt.

Bisher wurden folgende Möglichkeiten gepostet (hab alles etwas 
sortiert):

Beitrag 1:
  Input : in std_logic_vector(7 downto 0);
  :
  signal ffA : std_logic_vector(7 downto 0);
  signal ffB : std_logic_vector(7 downto 0);
  :
  process begin 
    wait until rising_edge(clk);
    ffA <= Input;
    ffB <= ffA;
  end process;

Antwort dazu:
Gefährlich, weil ja wegen unterschiedlicher Signallaufzeiten, die
Signale teilweise um einen Takt verzögert ausgegeben werden. Besser:
Handshake...
Andere Ideen??


Beitrag 2:
es gibt für parallele Busse
üblicherweise ein zusätzliches Steuersignal, das anzeigt, wenn die Daten
gültig (und stabil) sind. Nur dieses eine Signal muß synchronisiert
werden, dann sind die Setup-Zeiten für die entsprechenden FFs erfüllt.


Beitrag 3:
Ich würde sogar noch weitergehen, und z.B. ein Write-Signal als lokalen
Takt die Daten einlesen lassen, und anschliessend mit den gespeicherten
Daten weiterarbeiten.
daten : in STD_LOGIC_VECTOR(7 downto 0);
write : in STD_LOGIC; -- fallende Flanke --> Daten gültig
clk   : in STD_LOGIC;
  :
  :
   dasync : STD_LOGIC_VECTOR(7 downto 0);
   dsync : STD_LOGIC_VECTOR(7 downto 0);
   wrsr : STD_LOGIC_VECTOR(2 downto 0);
  :
  :
   process begin
      -- Daten von extern mit write-Impuls übernehmen
      wait until falling_edge(write);  
      dasync <= daten;
   end process;

 process begin
   -- gespeicherte Daten synchron weitergeben.
   wait until rising_edge(clk);
   wrsr <= wrsr(1 downto 0) & write; -- Schieberegister
   if(wrsr="100") then -- fallende Flanke
      dsync <= dasync;
   end if;
end process;


Beitrag 4:
Aufgrund der Metastabilität kann man aber 2 Signale NIEMALS parallel
eintakten, weil es ganau die Eigenschaft der Metastabiliät ist, dass der
Ausgang des FFs kippen kann oder nicht. Es kann deshalb immer vorkommen,
dass ein Port das jeweilige Eingangsignal einen Takt früher sieht als
der andere.

Autor: lkmiller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Beitrag 1:
und
> Beitrag 4:
sind eigentlich gleich.
Beitrag "Re: Einsynchronsieren mit 2 FFs"

Genauso laufen
> Beitrag 2:
und
> Beitrag 3:
auf das selbe raus: ein zusätzliches Validierungssignal gibt die 
Gültigkeit der parallelen Daten bekannt.

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.