Hallo zusammen,
ich habe einen I2S-Transmitter, den ich mit einem AXI-Stream Interface
ausstatten möchte. Der Transmitter alleine lässt sich ohne Probleme
synthetisieren und funktioniert im FPGA wunderbar. Mit dem AXI-Stream
Interface kombiniert ergeben sich aber Timing Violations beim Worst
Negative Slack und beim Total Negativ Slack. Jetzt habe ich gelesen,
dass es u. U. daran liegen könnte, dass ich die Signale nicht ordentlich
einsynchronisiert habe. Daher habe ich mir mal die Erklärung vom Lothar
Miller angeschaut
http://www.lothar-miller.de/s9y/categories/35-Einsynchronisieren
und versucht die Synchronisation für das Reset-Signal (für den Anfang)
meines Transmitters umzusetzen:
Das aktuelle Design ergibt einen WNS and TNS von -5,7 ns, sprich es wird
auch nicht funktionieren. Wo habe ich da den Denkfehler drin, bzw. muss
ich es ganz anders machen?
PS: Ja, ich weiß das man verschiedene Clock-Domainen meiden sollte, bzw.
es nicht ganz trivial ist (siehe mein Beispiel). Das Problem hier ist
allerdings, dass der AXI Bus des Systems leider auf einer komplett
anderen Frequenz läuft und das sich das mit dem I2S beißt (100 MHz AXI,
12,288 MHz I2S). Daher bleibt mir leider nichts anderes übrig.
Danke für ein paar Denkanstöße :)
Ich arbeite nicht mit Altera, darum nehme ich mal an, dass es für den
Reset so ist, wie Markus F. schreibt.
Für die I2S Komponente musst du das "Valid" Signal einsynchronisieren.
Dabei musst du aufpassen, dass es in der AXI Domäne genug lange aktiv
bleibt, bis es deine I2S Domäne sicher gelesen hat (die ist ja ca. 8 mal
langsamer). Also entweder einen Puls-stretcher einfügen oder auf
Vier-Phasen-Handshake umbauen.
Das Synchronisierte "Valid" und das "Data" Signal brauchen dann beide
noch eine False-path Constraint.
Christoph Z. schrieb:> Ich arbeite nicht mit Altera, darum nehme ich mal an, dass es für den> Reset so ist, wie Markus F. schreibt.>> Für die I2S Komponente musst du das "Valid" Signal einsynchronisieren.> Dabei musst du aufpassen, dass es in der AXI Domäne genug lange aktiv> bleibt, bis es deine I2S Domäne sicher gelesen hat (die ist ja ca. 8 mal> langsamer). Also entweder einen Puls-stretcher einfügen oder auf> Vier-Phasen-Handshake umbauen.>> Das Synchronisierte "Valid" und das "Data" Signal brauchen dann beide> noch eine False-path Constraint.
Das Valid-Signal habe ich erst einmal ausgeklammert. Mit den I2S
Signalen hatte ich einen TNS von -1000 ns und daher wollte ich erst
einmal schauen welche Signale da mit rein spielen. Aktuell habe ich nur
den Reset in beiden Clock-Domainen aktiv und da bekomme ich es schon
nicht hin den TNS auf 0 zu reduzieren...
Hab es auch schon mit dem ASYNC_REG Attribut probiert
Daniel K. schrieb:> Weiß noch nicht ob es das richtige ist, aber der Fehler ist weg...
Genau. Jetzt prüft es der Timing Analyzer einfach nicht mehr. Du musst
dann allerdings selbst dafür sorgen, dass das Signal entweder an einen
asynchronen Eingang geht oder passend eingetaktet wird.
Daniel K. schrieb:> Weiß noch nicht ob es das richtige ist, aber der Fehler ist weg...
Nochmals etwas klarer Übersetzt: Die Fehlermeldung ist jetzt weg, dein
Design behandelt den Übergang zwischen den Taktdomänen aber noch nicht
richtig, wird also in Realität hin und wieder komische Sachen machen
(Verhext, haunted design...).
Ich glaube ich habe jetzt eine Antwort gefunden. Das Problem mit dem
Reset habe ich durch einen zweiten Reset gelöst, der für das Interface
da ist und mittels "Processor System Reset" auf den entsprechenden Takt
synchronisiert wird. Für die Signale nehme ich dann einen entsprechenden
xpm_cdc Block:
https://www.xilinx.com/support/documentation/sw_manuals/xilinx2016_2/ug953-vivado-7series-libraries.pdf
Damit scheint es (zumindest) laut der Implementierung zu klappen. Ich
bin gespannt...
Kurzes Update:
Die Synchronisation und die Implementierung scheint nun zu funktionieren
und auch das AXI-Stream Interface funktioniert zu 95% so wie es soll.
Aktuell habe ich noch ein paar µs keine vernünftigen Daten, aber das
scheint noch ein Problem in der Software oder in der Hardware zu sein
(siehe Screenshot). Das ist aber definitiv ein anderes Problem...
Eine eigene Frage?
Dieser Thread ist über 6 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.