Forum: FPGA, VHDL & Co. Einsynchronisieren von STD_LOGIC_VECTORen


von Nik N. (neusser)


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.

von lkmiller (Gast)


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.

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.