FPGA 2 Clk Synchron, timing problem

OP #7808383
Lesenswert?

Hallo Ich generiere mit einem PLL C0 = 100MHz sowie C1 = 400MHZ ohne phase shift.

Nun sample ich ein Input mit C1 und deserialise diesen in einen 4 Bit Vektor welcher mit C0 ausgelesen wird.

Wie teile ich nun Quartus mit, dass dieses Signal während 4CLK von C1 anliegt und er mir keine Fehlermeldung bringen soll, dass das timing nicht in 1/400MHz zeit möglich ist?

#7808544
Lesenswert?

Verwendest du die Hardware SerDes im FPGA?

Wenn nein hängt das stark von deiner implementierung ab. Wieviel Zeit hat denn der langsame Takt um das zuletzt deserialisierte Bit zu erfassen? Ist das eine ganze Periode von C0 oder doch eher nur eine Periode von C1?

Du kannst ja die deserialisierten Bits mit C1 in einen Vektor schreiben und dann mit diesem Vektor ein CDC nach C0 machen.

OP #7808670
Lesenswert?

Gustl B. schrieb:

Verwendest du die Hardware SerDes im FPGA?

Nein HDL

Gustl B. schrieb:

Wenn nein hängt das stark von deiner implementierung ab. Wieviel Zeit hat denn der langsame Takt um das zuletzt deserialisierte Bit zu erfassen? Ist das eine ganze Periode von C0 oder doch eher nur eine Periode von C1?

Nun eigentlich lange, da dieser wert ja die nächsten 3 clk des schnellen clks nicht ändert. Quartus versteht dies vermutlich nicht (da nicht mitgeteilt) und versucht das timing innerhalb eines Zykluses des schnellen clk zu erreichen - was nicht geht.

Also: DFF(400MHz, update alle 4 CLK) -> DFF (100MHz)

Wie kann quartus gesagt werden, dass dieser übergang nicht das timing vom 400MHz clk einhalten muss da output konstant über mehrere clk?

#7808688
Lesenswert?

Ich hab schon seit Jahren nicht mehr mit Quartus gearbeitet und ich kenne mich eher mit Vivado aus. Was du brauchst nennt sich multi-cycle path und das gibst du als constraints in deine SDC-Datei ein. Zur Not kann man auch ein false path zwischen den DFF nehmen, aber davon rate ich eher ab.

Falls es noch nicht von dir oder Quartus gemacht wurde, solltest du auch die Relation zwischen deinen clocks C0 und C1 angeben. Ansonsten wird angenommen, dass beide clocks eine willkürliche Phasenverschiebungen zueinander haben, aber in deinem Fall sind sie aber 0° verschoben und somit synchron.

OP #7808718
Lesenswert?

Fabian S. schrieb:

multi-cycle path und das gibst du als constraints in deine SDC-Datei ein.

Das scheint genau das zu sein.

Gustl B. schrieb:

aber vom letzten Bit mit dem schnellen Takt bis zur Flanke vom langsamen Takt ist es nur eine Periode vom Schnellen Takt.

Oh, hoppla, wo du recht hast hast du wohl recht.

Hmm Multi-Cycle path contstraints können gefährlich sein bez solcher stolperfallen? Also würde ich gewarnt werden wenn ich dies fälschlicherweise als multi-cycle path constraint hätte, aber das letzte bit dies gar nicht erfüllt? - Oder bekommt man ein nicht timing conformes design ohne Warnung?

Zum Design: Nun wollte möglichst wenig delay und hohe abtastungsrate. Dahr 2FF Sync + Deser mit 400MHz und danach system clk 100. Wie kann ich dies timingmässig entschärfen? mit 2 paralellen Schieberegistern arbeiten und jeweils deren Auslesen um 1 (400Mhz) clk verzögern (mit abwechselndem Wechsel der Schieberegister)?

OP #7808921
Lesenswert?

Gustl B. schrieb:

Bisher hast du leider nur von Timing Problemen geschrieben. Was sind das denn genau für Probleme, was sagt Quartus genau?

Slack negativ. Konnte das Problem nun lösen in dem ich diesen MUX hinter das nächste Register verschieben konnte (geringfügiges umschreiben des codes). Also nun ist DFF (400) -> DFF (100) direkt und hat positiven slack.

Gustl B. schrieb:

Und wieso willst du mit dem deserialisierten Vektor kein normales CDC machen?

Würde ich gerne, mangelt aber an soft CDC IP. Wenn du hier etwas hast, sehr gerne; das einzige was ich kenne ist das rechtlich/ethisch nicht unproblematische reverseing des Aurora IP wo dieser noch als SRC verfügbar war.

Also es wird ja nicht nur CDC benötigt, sondern auch framesync, 8b10b, crc etc.

#7808928
Lesenswert?

CDC ist nur das clock domain crossing, das geht auch ganz ohne IP. Man muss nur sicherstellen, dass die Daten zu dem Zeitpunkt zu dem sie in der Ziel Clock Domäne erfasst werden stabil sind. Und man kann da mit Constraints arbeiten. Register als asynchron definieren und so.

OP #7808965
Lesenswert?

Gustl B. schrieb:

CDC

Entschuldige habe CDC und CDR verwechselt.

Du meinst damit sicher einen FIFO block?

Gustl B. schrieb:

das geht auch ganz ohne IP

Hmm oder auch nicht :P

Gustl B. schrieb:

Man muss nur sicherstellen, dass die Daten zu dem Zeitpunkt zu dem sie in der Ziel Clock Domäne erfasst werden stabil sind. Und man kann da mit Constraints arbeiten. Register als asynchron definieren und so.

Hier mangelts an meiner Expertise. Also ich habs nun einfach direkt ohne constraints 400->100FF erreicht ohne negativen Slack.

Aber wie die CDC "sinnvoler/professioneller" und algemeiner gestalten mit constraints - wie genau?

#7808991
Lesenswert?

Also ich würde die Daten eine Zeit lang in Ruhe lassen um die mit dem langsamen Takt zu erfassen. Also bei dir zwei Vektoren A und B mit je 4 Bits. Während du mit dem schnellen Takt in A oder B deserialisierst, liegt der B oder A (also der jeweils Andere) in Ruhe rum und kann von dem langsamen Takt abgetastet werden.

#7811019
Lesenswert?

Wenn Dein FPGA mit 400 MHZ zurechtkommt (das muss es ja zum deserialisieren) und deine Clocks einen Phasenversatz von 0° haben und das Quartus auch bewusst ist (z.B. 100M und 400M Clock kommen aus der selben PLL), dann sollte es reichen, in der 100MHz Domain ein einfaches Register einzufügen und nicht direkt mit dem Wert aus der 400MHz Domain weiter zu rechnen. Dadurch bekommst Du 1 100MHz Takt Delay rein, aber das ist ja vielleicht verschmerzbar. Alternativ kannst Du in der 100M Domain ein Toggle signal implementieren, und damit in der 400M Domain erkennen, wann gesampelt wird. Dann musst Du dein SReg zum geeigneten Zeitpunkt in der 400M Domain kopieren und entsprechende Multicycle Constraints definieren.

Wenn Du uns Deine aktuelle Implementierung zeigst, dann können wir Dir konkrete Tips geben, so bleibt nur der Blick in die Glaskugel.

@Rick: Mit Clock Recovery hat das nichts zu tun, da die Takte ja Phasensynchron und bekannt sind

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren