Forum: FPGA, VHDL & Co. FPGA 2 Clk Synchron, timing problem


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Max M. (powerup)


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?

von Gustl B. (-gb-)


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.

: Bearbeitet durch User
von Max M. (powerup)


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?

von Fabian S. (fsasm)


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.

von Gustl B. (gustl_b)


Lesenswert?

Max M. schrieb:
> Nun eigentlich lange, da dieser wert ja die nächsten 3 clk des schnellen
> clks nicht ändert.

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

von Max M. (powerup)


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)?

von Max M. (powerup)


Angehängte Dateien:

Lesenswert?

Ich habe das RTL angeschaut, zwischen den Registern ist nur ein 16bit 
MUX. Dieser sollte der Fitter doch im MAX 10 in 2.5ns reinbringen 
können? Slack ist auch nur -0.14. Habt ihr evtl tipps wie der Fitter 
eingestellt werden könnte damits gehen könnte?

von Gustl B. (gustl_b)


Lesenswert?

Der MUX ist nur ein Teil vom Pfad. Da ist auch Routing (Leitungen im 
FPGA).

Bisher hast du leider nur von Timing Problemen geschrieben. Was sind das 
denn genau für Probleme, was sagt Quartus genau?
Und wieso willst du mit dem deserialisierten Vektor kein normales CDC 
machen?

von Max M. (powerup)


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.

von Gustl B. (gustl_b)


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.

von Max M. (powerup)


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?

von Gustl B. (-gb-)


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.

von Rick D. (rickdangerus)


Lesenswert?

@Max:
Wie willst Du bei Dir das 'Clock Recovery' realisieren?
Nimmst Du eine PLL dafür?

Bin gerade an einem ähnlichen Thema dran...

von Fpga I. (fpga-ing)


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

: Bearbeitet durch User
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.