Forum: FPGA, VHDL & Co. Register Synchronisation


von Martin O. (ossi-2)


Lesenswert?

Ich habe ein 8-Bit Register REG1 getaktet von Takt CLK1
und ein 8-Bit Register REG2 getaktet von Takt CLK2.

Ich möchte nun, dass REG2 die Werte von REG1 übernimmt.
Problem ist dabei, dass CLK2 sich ändern kann, während die
Bits in REG1 noch nicht stabil sind. Wie synchronisiert man
mehrere Bit gkleichzeitig, so dass in REG2 nur Werte ankommen,
die in REG1 tatsächlich gültig waren ?

Dass, je nach Takt CLK1 und CLK2, manche Werte von REG1 fehlen
oder doppelt vorkommen ist kein Problem.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin O. schrieb:
> Wie synchronisiert man mehrere Bit gkleichzeitig, so dass in REG2
> nur Werte ankommen, die in REG1 tatsächlich gültig waren ?
Man nimmt ein zusätzliches Signal, das anzeigt, dass die Werte im REG1 
stabil sind, und synchronisiert das ein.

So wie es z.B. bei SRAMs gemacht wird: beim Schreiben werden erst 
Adressen und Daten angelegt, dann wird mit einem einzigen Write-Signal 
gesagt, dass die parallelen Busse (A+D) jetzt stabil sind.

> Dass, je nach Takt CLK1 und CLK2, manche Werte von REG1 fehlen
> oder doppelt vorkommen ist kein Problem.
Was ist die Quelle, was das Ziel? Und woher kommen die "Takte"?

von Martin (Gast)


Lesenswert?

da macht man ein handshaking:

reg1 legt daten an
reg1 sendet "data avail" 1 clk später
reg2   holt daten wenn data avail==HIGH
reg2  sendet  "data fetched"
reg1 löscht "data avail"
reg2 löscht "data fetched"

von Markus F. (mfro)


Lesenswert?

Ich hab' das noch nirgends besser erklärt gefunden als hier:

http://www.lothar-miller.de/s9y/archives/41-Einsynchronisieren-von-asynchronen-Signalen.html

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Martin schrieb:
> reg2   holt daten wenn data avail==HIGH
Da muss man aber sehr aufpassen, dass dieses "data avail" Register nicht 
dupliziert wird. Das hatten wir vor kurzem im 
Beitrag "Re: Zeitkritisches Einsynchronisieren asynchroner Signale"
Eigentlich muss dieses "data avail" einsynchronisiert werden...

von J. S. (engineer) Benutzerseite


Lesenswert?

Bezieht sich die Besorgnis dabei wirklich auf Metastabilität, wie im 
Beitrag beschrieben? Das sollte praktisch kein Problem sein, weil auch 
duplizierte FFs letztlich direkt an ihrem Vorgänger angeschlossen sind 
und die Delays niemals so gross werden, dass kein budget mehr für die 
handvoll ps an Meta bleibt.

Das Problem ist hier ja auch nicht Metastabiltität, sondern der 
Taktübergang an sich den man mitunter inkonsistent reinbekommt. Je nach 
Taktfrequenz gibt es gfs gar kein stabiles data_valid, bzw nicht bei 
jeder Änderung. Da sollte man auf einen Wechselpuffer = asynchrones FIFO 
zurückgreifen, gfs unter geeigneter Dezimierung der Datenrate am 
Ausgang, dabit man nur jeden zweiten Datenwechsel erhaschen muss. So 
kann man z.B. auch problemlos 100 MHz Daten mit nur 60 MHz abtasten und 
verarbeiten.

von berndl (Gast)


Lesenswert?

Martin O. schrieb:
> Ich habe ein 8-Bit Register REG1 getaktet von Takt CLK1
> und ein 8-Bit Register REG2 getaktet von Takt CLK2.
>
> Ich möchte nun, dass REG2 die Werte von REG1 übernimmt.
> Problem ist dabei, dass CLK2 sich ändern kann, während die
> Bits in REG1 noch nicht stabil sind. Wie synchronisiert man
> mehrere Bit gkleichzeitig, so dass in REG2 nur Werte ankommen,
> die in REG1 tatsächlich gültig waren ?
>
> Dass, je nach Takt CLK1 und CLK2, manche Werte von REG1 fehlen
> oder doppelt vorkommen ist kein Problem.

ueber was reden wir hier denn konkret? Geht es um CLK-Domains auf dem 
FPGA oder in Verbindung mit externen Chips?

Falls auf dem FPGA: http://www.fpga4fun.com/CrossClockDomain.html oder 
die hier schon angesprochenen FIFOs.

Falls off-chip: Beim schreiben ins FPGA ist das mit dem schon von Lothar 
angemerkten 'strobe' eigentlich kein Problem, man kann das ganze ja auch 
noch einen Takt pipelinen. Solange das effektive 'strobe'-Signal aus 
einem FF gebildet wird, ist das immer sauber.
Falls es ums lesen vom FPGA geht, dann wird das ganze schon trickreicher 
und man muss halt evtl. das Lesetiming (bevorzugt auch wieder mit einem 
'strobe') entsprechend anpassen (eventuell langsamer machen, z.B. die 
Leseadresse frueher anlegen).

Also im Eingangspost fehlen wieder mal, wie leider oft ueblich, die 
Randbedingungen...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jürgen Schuhmacher schrieb:
> Bezieht sich die Besorgnis dabei wirklich auf Metastabilität, wie im
> Beitrag beschrieben?
Nein, ganz&gar nicht, Metastabilität ist selten ein/das Problem.
Problematisch ist zu 99% ein unterschiedliches Routing-Delay. Siehe 
dort:
http://www.lothar-miller.de/s9y/archives/62-Testaufbau-Metastabilitaet.html
Der Witz ist ja, dass das "data avail" nicht nur an 1 Flipflop geht, 
sondern an alle die Datenregister...

Jürgen Schuhmacher schrieb:
> Das sollte praktisch kein Problem sein, weil auch duplizierte FFs
> letztlich direkt an ihrem Vorgänger angeschlossen sind
Aber genau das muss nicht so sein. Das duplizierte Flipflop kann 
irgendwo im FPGA platziert werden.

> und die Delays niemals so gross werden, dass kein budget mehr für die
> handvoll ps an Meta bleibt.
Ein asynchrones Design hat keinerlei Budget. Das asynchrone Signal 
kommt&geht, wann es will. Und dieses Fehlerbild ist ein Fehler, der umso 
seltener auftritt, je weniger Unterschied in der Laufzeit ist. Bei ein 
paar ps kann das dann schon mal einen Monat dauern. Aber der Fehler 
ist prinzipiell im Design...  :-o

Martin O. schrieb:
> Ich habe ein 8-Bit Register REG1 getaktet von Takt CLK1
> und ein 8-Bit Register REG2 getaktet von Takt CLK2.
Welche Frequenzen haben CLK1 und CLK2? Welche Systemfrequenz hat dein 
FPGA?

von J. S. (engineer) Benutzerseite


Lesenswert?

Ich meinte Folgendes:

Zwischen dem Ausgang des ersten FFs und dem nächsten, welches u.U. 
dupliziert wurde, liegt ein kompletter Takt und das daraus folgende 
budget im Bezug auf mögliche Routingverzögerungen. Mit einkalkuliert 
sind Jitter des Taktes und auch das Routing selber (timing driven 
placement). Da dort "grosszügig" gerechnet wird, ist das bischen "Meta" 
inklusive und macht kein Problem und zwar auch nicht theoretisch. Laut 
einem Xilinx FAE sind diese ps mit eingeplant.

Du gehss aber wohl vom dem Fall aus, dass bereits das erste FF 
dupliziert wurde. Das darf natürlich nicht sein, richtig, denn dann 
haben wir ja genau den unsynchronen Fall eines überall hinlaufenden 
asynchronens Resets, den manche immer wieder bauen.

Dies zu verhindern, ist normalerweise die Aufgabe des IO-FFs in der 
IO-Zelle. Das kann nicht dupliziert werden.

Stellt sich nun die Frage, wie ich beim Design aktiv dafür sorgen 
könnte, dass ein internes FF nicht dupliziert wird. Eigentlich sollte es 
dafür dann keinen Anlass geben, wenn das valid-Signal in der ersten und 
der zweiten Domain jeweils noch über FF läuft, weil dann kein Fan-out- 
oder Timing-Problem besteht. Zudem müsste die Synthese "wissen" dass sie 
das nicht tun darf, z.B. beim register balancing.

Da ich das nicht 100% sicherstellen kann, arbeite ich da bislang immer 
mit Wechselpuffer und bedarfsweise Gray-Countern.

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.