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
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.
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?
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
Andreas N. schrieb: > Deshalb kommt der Clock nur, wenn auch Daten anliegen. > Der Clock liegt aber schon stetig an Was denn nun?
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.
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.
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?
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...
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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.