Einsynchronisieren von STD_LOGIC_VECTORen

OP #1162694
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:
1
  Input : in std_logic_vector(7 downto 0);
2
  :
3
  signal ffA : std_logic_vector(7 downto 0);
4
  signal ffB : std_logic_vector(7 downto 0);
5
  :
6
  process begin 
7
    wait until rising_edge(clk);
8
    ffA <= Input;
9
    ffB <= ffA;
10
  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.
1
daten : in STD_LOGIC_VECTOR(7 downto 0);
2
write : in STD_LOGIC; -- fallende Flanke --> Daten gültig
3
clk   : in STD_LOGIC;
4
  :
5
  :
6
   dasync : STD_LOGIC_VECTOR(7 downto 0);
7
   dsync : STD_LOGIC_VECTOR(7 downto 0);
8
   wrsr : STD_LOGIC_VECTOR(2 downto 0);
9
  :
10
  :
11
   process begin
12
      -- Daten von extern mit write-Impuls übernehmen
13
      wait until falling_edge(write);  
14
      dasync <= daten;
15
   end process;
16

17
 process begin
18
   -- gespeicherte Daten synchron weitergeben.
19
   wait until rising_edge(clk);
20
   wrsr <= wrsr(1 downto 0) & write; -- Schieberegister
21
   if(wrsr="100") then -- fallende Flanke
22
      dsync <= dasync;
23
   end if;
24
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.

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.