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.