Forum: FPGA, VHDL & Co. FIFO "verliert" bei clock domain crossing die ersten 4 Takte


von Andreas N. (poolspieler)


Lesenswert?

Hallo zusammen,
ich würde gerne mit ca. 100MHz Daten (84 Bit) in ein FIFO schreiben. Der 
100MHz ist ein externer Clock (also nicht synchron). Ich nenne diese 
Seite mal die "rechte Clock Domain".
Die "linke Clock Domain" ist mein Systemtakt mit 62,5MHz.

Es sollen ca. 500 Werte Rechts geschrieben und später relativ langsam 
links gelesen werden. Ob die ankommenden Daten (steigende Flanke des 
Clocks) übernommen werden sollen, teilt die linke Clock Domain der 
Rechten über ein Freigabesignal mit.

Soweit denke ich, werde ich es hinbekommen.
(Das ganze soll unter Xilinx ISE 14.2 auf einem Spartan6 laufen.)

PROBLEM:
Ich habe mit dem CoreGen ein FIFO erzeugt und mal simuliert. Es ist wohl 
so, dass die ersten 4 Takte nötig sind, um das FIFO zu inizialisieren 
(oder was auch immer).
Wie es aussieht sind die Daten der ersten 4 Takte "verloren" - ich habe 
aber auch keine Möglichkeit, das wr_ack auf der Rechten Seite abzufragen 
und so lange Clocks anzulegen, bis dieses auf HIGH geht - in der Zeit 
kommen ja schon die nächsten Daten.

Kann mir jemand einen Tip geben? Wie tauscht man Daten zwischen Clock 
Domains OHNE Datenverlust aus?

Viele Grüße,

Andreas

von Fine in Fud out (Gast)


Lesenswert?

Hast du eventuell das Reset Signal vergessen?

Einige (viele?) Coregen Module brauchen den zumindest für die 
Simulation. Idealerweise liegt der natürlich zum synchron für jede Seite 
vor.

Oder schreibst du gar während der Reset noch aktiv ist?

Das 4 Datenworte verloren gehen ist auf jeden Fall ein Fehler und wenn 
das in der Simu schon passiert würde ich mich nicht drauf verlassen, 
dass das FIFO in nach der Synthese überhaupt etwas sinnvolles tut.

von Bronco (Gast)


Lesenswert?

Andreas N. schrieb:
> ich würde gerne mit ca. 100MHz Daten (84 Bit) in ein FIFO schreiben. Der
> 100MHz ist ein externer Clock (also nicht synchron).

Versteh ich das richtig: Der externe Takt liegt nur dann an, wenn auch 
Daten kommen?

von Andreas N. (poolspieler)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
die Daten kommen von einer ISERDES. Deshalb kommt der Clock nur, wenn 
auch Daten anliegen. Ausser ich würde den Clock der ISERDES in irgend 
einer Form verwenden - dann hätte ich einen Faktor 7.
Der Clock liegt aber schon stetig an - mit dem WR_EN hätte ich dann dem 
FIFO gern mitgeteilt, wann Daten aufgezeichnet werden sollen.
Weiteres Problem: WR_EN kommt aber von der linken CLock Domain. Deshalb 
müsste ich es auf der Rechten Seite erstmal zum rechten Clock 
synchronisieren - oder?

Die 4 (bzw. 3) "verlorenen" Takte habe ich mal in der angehängten 
Simulation dargestellt:
Der erste Clock kommt während des Resets - geht also verloren...
Aber dann dauert es DREI Takte, bis das FULL Bit auf LOW geht.
Erst beim vierten Takt kommt dann auch das WR_ACK. Beim Auslesen (hier 
nicht dargestellt) wird dies auch bestätigt. Es sind (logischer Weise) 
nur Daten im FIFO, für die auch das WR_ACK HIGH war.

Ich freue mich über jede Idee oder Anregung! Danke!

Viele Grüße,

Andreas

von Bronco (Gast)


Lesenswert?

Andreas N. schrieb:
> Deshalb kommt der Clock nur, wenn auch Daten anliegen.

> Der Clock liegt aber schon stetig an

Was denn nun?

von Andreas N. (poolspieler)


Lesenswert?

Die Daten kommen stetig mit ca. 100MHz.
Für jeden Clock gibt es ein Datenwort.
Das FIFO soll nur Daten aufnehmen, wenn WR_EN auf HIGH ist.

von Fine in Fud out (Gast)


Lesenswert?

Man schreibt niemals während eines Reset und auch nicht zwingend direkt 
1 clk cycle danach.

Aber an sich kann man sich das schenken...wr_en dauerhaft auf 1 und mit 
der wr_clk schreiben wollen...das kann ja nix werden.

von Andreas N. (poolspieler)


Lesenswert?

OK,
das könnte ein Fehler sein.
Ich darf WR_EN nicht setzen, wenn der Reset anliegt.

WR_EN soll ja NICHT dauerhaft auf 1 sein.
Mit WR_EN will ich ja die Zeiten steuern, zu denen aufgezeichnet werden 
soll.

Grosse Frage: Darf WR_EN asynchron zu WR_CLK sein - oder nicht?

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


Lesenswert?

Dann lass den Takt doch einfach mal nach dem Reset ein paar Zyklen 
"leer" laufen. Evtl. muss sich da eine FSM erst mal einarbeiten...

Andreas N. schrieb:
> Grosse Frage: Darf WR_EN asynchron zu WR_CLK sein - oder nicht?
Ja klar. Du darfst nur die Setup- und Hold-Zeit nicht verletzen...

von Klaus (Gast)


Lesenswert?

Lothar Miller schrieb:
> Andreas N. schrieb:
>> Grosse Frage: Darf WR_EN asynchron zu WR_CLK sein - oder nicht?
> Ja klar. Du darfst nur die Setup- und Hold-Zeit nicht verletzen...

Manchmal ironierst du bis zu Sarkasmus ;-)

von Andreas N. (poolspieler)


Lesenswert?

Dieser Sarkasmus ist an dieser Stelle schon etwas schade.
Denn so abwegig finde ich die Frage ja nicht.
Es könnte ja sein, dass das FIFO intern die Eingänge synchronisiert - 
und dass dies der Grund für die 4 "verlorenen" Takte am Anfang ist.
OK, ist relativ unwahrscheinlich, wenn man etwas länger darüber 
nachdenkt - hätte aber sein können...

Ich werde nun mein Design überdenken - und schauen, wie ich die zwei 
Clockdomains ordentlich voneinander getrennt betrachten kann.

>Dann lass den Takt doch einfach mal nach dem Reset ein paar Zyklen
>"leer" laufen. Evtl. muss sich da eine FSM erst mal einarbeiten...

Gut, das kann ich natürlich machen. Leider habe ich dies in der Doku zur 
FIFO nicht gefunden... Es wird schon seine Richtigkeit haben...

Viele Grüße,

Andreas

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.