Kann ich mit ODELAY von Xilinx für RGMII ein 90°-Taktsignal erzeugen?

Vor einiger Zeit habe ich eine GMII-Schnittstelle für meinen Gigabit-Ethernet-Core implementiert. Jetzt versuche ich dasselbe mit dem RGMII-Protokoll . Die Referenzimplementierung von Xilinx verwendet IDELAY[|E1|E2]-Primitive, um die Eingangsverzögerung anzupassen. Das würde ich gerne mit ODELAY machen...

Die Referenzimplementierung verwendet zwei Sendetakte: TX_Clockund TX_Clock90(um 90° phasenverschoben). Der normale Takt wird für ODDR-Register verwendet und der phasenverschobene Takt wird an das PHY-Gerät gesendet.

Ich weiß, dass ich diesen Takt mit einem DCM/MMCM oder PLL generieren könnte, aber ich möchte nicht meinen gesamten Gigabit-Ethernet-Stack neu entwerfen, um einen neuen TX-Takt für meine physische Abstraktionsschicht bereitzustellen.

Ich dachte, ich könnte eine ODELAY-Primitive verwenden, um die TX_Clock wie gewünscht zu verschieben. Aber wie berechne ich die Anzahl der Abgriffe/Verzögerungen?

DS182 – Kintex-7 DC Switching Guide – Seite 28 definiert „ODELAY Chain Delay Resolution“ wie folgt:

T ICH D E L A Y R E S Ö L U T ICH Ö N = 1 32 2 F R E F = 1 32 2 200 M H z = 0,078125 N S = 78.125 P S

Meine IDELAYCTRL-Primitive wird mit einem 200-MHz-Referenztakt bezogen und TX_Clock läuft mit 125 MHz (8 ns). Eine Phasenverschiebung von 90° würde eine Verzögerung von 2 ns bedeuten, was 25,6 Verzögerungsabgriffen von 78,125 ps entspricht.

Ist es also richtig, den Wert von ODELAY auf 26 zu setzen?

Abkürzungen:
GMII – Gigabit Media Independent Interface
RGMII – Reduziertes GMII (mit DDR-Technik)
ODDR – DDR-Ausgangsregister

Wenn Sie fragen, ob Ihre Verzögerungsberechnung korrekt ist, ja, ich glaube, so funktioniert es. Sie werden natürlich nicht in der Lage sein, genau 2 ns zu erhalten.
Die maximal mögliche Verzögerung entspricht also einer Phasenverschiebung von 180 Grad oder der Verwendung einer fallenden Flanke.

Antworten (1)

Vielleicht ist es keine direkte Antwort auf Ihre Frage, aber ich möchte Ihre Aufmerksamkeit auf die folgenden möglichen Problemumgehungen lenken:

  • Die Skew-Rate ist sowohl bei RGMII PHY als auch bei FPGA-IC steuerbar

    Typischerweise implementiert RGMII PHY einen De-Skewing-Mechanismus (z. B. kann KSZ9021 Verzerrungen bis zu 1,8 ns absorbieren, was sehr nahe an dem liegt, was Sie benötigen), daher (wenn Ihr Phy es hat, natürlich) aktivieren Sie es. Verschieben (verzögern) Sie die Uhr an Ihrem PHY, wobei die Daten gleich bleiben. Schattierte Bereiche auf dem Bild unten veranschaulichen dies grafisch.

    Geben Sie hier die Bildbeschreibung ein

    Außerdem können Sie zusätzlich zu den PHY-Verschiebungen, falls dies nicht ausreicht, die Anstiegsgeschwindigkeit am FPGA entsprechend konfigurieren, um die Daten zu verlangsamen, während der Takt beschleunigt wird.

  • pcb-tracing könnte dennoch flexibel sein, nicht dogmatisch

    (wenn natürlich) Sie können (dann) die Taktspur "proportional" länger als die Daten routen (oder umgekehrt, je nach direkter / invertierter Taktung).

  • fpga treibt tx-Leitungen an

    Sie können Ihre Ausgangstreiber normal (anstelle von DDR) verwenden und sie durch Multiplexing wie assign output[0:3] = (txclk) ? txdata[0:3] : txdata[4:7].

Dein Weg (nicht nur Berechnungen) über ODELAY sieht richtig aus, aber ich (und ich denke jeder) kann es nicht bestätigen/widerlegen, weil diese Korrektheit letztendlich nur im Design (Board) bestätigt werden kann, wo verschiedene Nebenwirkungen, wie Taktzittern, die sind schwierig vorherzusagen und zu simulieren, können beobachtet und geschätzt werden.

Außerdem erscheint es etwas seltsam, dass Sie nicht ganzzahlig teilbare Takte von 125 (=25*5?) und 200 (=25*8?) MHz verwenden, anstatt dass 125 und 250 ganzzahlig teilbar sind (dh 250/125=2). . Im Fall eines aus einer einzigen Quelle stammenden, phasenausgerichteten, teilbaren Uhrenpaars könnten Sie die höchste verwenden, um die Leitungen zu treiben, die auf der niedrigsten Uhr geändert wurden, auch mit Nicht-DDR-Ausgängen.


BEARBEITEN 1


wenn TX_Clock der Sendelogik-Referenztakt ist (dh der Block ist um aufgebaut always @(posedge TX_Clock)), dann sollten die ODDRs (im SAME_EDGE-Modus) ihre um 90 Grad verschobene Version verwenden, dh TX_Clock90, nicht umgekehrt. Aber du hast geschrieben:

Der normale Takt wird für ODDR-Register verwendet und der phasenverschobene Takt wird an das PHY-Gerät gesendet.

Ist es richtig? Könnten Sie den Link zu "Die Referenzimplementierung" geben, die Sie hier erwähnt haben?

Auch der Sendetakt zu einem RGMII PHY sollte so generiert werden

ODDR  otxclkbuf ( .D1(1), .D2(0), .C(TX_Clock90), .CE(1), .SR(0), Q(RGMII_TXCLK) )

Phase für Phase mit den Datensignalen RGMII_TXDs und RGMII_TXCTRL synchron zu sein, wie es das RGMII-Protokoll erfordert.

Dies wird auch im 7er SelectIO Guide vermerkt:

Uhrweiterleitung

Der Ausgangs-DDR kann eine Kopie der Uhr an den Ausgang weiterleiten. Dies ist nützlich, um einen Takt und DDR-Daten mit identischen Verzögerungen zu verbreiten und um mehrere Takte zu erzeugen, bei denen jede Taktlast einen eindeutigen Takttreiber hat. Dies wird erreicht, indem der D1-Eingang des ODDR-Primitives High und der D2-Eingang Low verbunden werden. Xilinx empfiehlt die Verwendung dieses Schemas, um Takte von der FPGA-Logik an die Ausgangspins weiterzuleiten.

Nochmals, wenn Sie die Verwendung von DCM vermeiden, wie planen Sie zu arbeiten, wenn Ihr PHY im Slave-Modus 1000BASE-T oder im DPLL-basierten Empfangsmodus 1000BASE-X/SGMII arbeitet, für beide, wobei GMII_RXCLK ein CDR-basierter niedriger Qualität ist das nicht direkt zum Takten der Empfangslogik und auch der Sendelogik in 1000BASE-T verwendet werden könnte?


Bearbeiten 2

Zuerst müssen Sie unterscheiden, was Sie wollen: "reines" RGMII (in dem von Ihnen erwähnten Dokument als Original-GMII bezeichnet) oder "uhrverschobenes" RGMII (RGMII-ID im Dokument). Ihr rgmii.vhdl-Code ist ungefähr der "verschobene". Hier empfehle ich Ihnen, sich wieder für "reines" RGMII zu entscheiden, da (aus dem RGMII-Dokument aus dem Jahr 2002 und aus den von mir verwendeten PHY/SERDES-ICs) jeder moderne GbE-PHY Takt-/Datenverschiebung unterstützt und Sie Ihren Code nicht ausklügelten müssen .

Zweitens müssen Sie jeden Wert, den Sie für ODELAY auswählen, genehmigen und hundert zu eins auf dem Live-Board mit einem Oszilloskop in Ihren Händen einstellen. 26 ist normal, lassen Sie es Ihr erster Tipp für schrittweise Iterationen sein.

Außerdem empfehle ich Ihnen, eine neue Frage zu stellen, z

  • Wie programmiere ich ODELAY richtig (in Xilinx FPGA)?
  • Wie verschiebt man eine Uhr um 90 Grad ohne DCM/PLL (in Xilinx FPGA)?
  • Wie verwendet man ODDR mit nur einer Uhr und ohne seine verschobene Nachbildung (in Xilinx FPGA)?

ohne die Tags "Ethernet" und "Gigabit", denn wie ich sehe, gilt Ihr Interesse insgesamt xilinx-fpga-oddr-odelay, ohne Ethernet-Gigabit.

Viel Glück.

PS Aus dem von Ihnen gezeigten Code wird erwartet, dass der MAC die Daten aktualisiert posedge !tx_clk90, während Ihr ursprünglicher GMII-Client-Code, wie ich annehmen kann, keine solche Erwartung hat.

Die 200 MHz sind eine Anforderung von Xilinx FPGAs. Die IDELAY- und ODELAY-Grundelemente teilen sich ein gemeinsames DELAY_CTRL-Grundelement, das einen Referenztakt von 200 oder 300 MHz verwendet, um die Verzögerungsabgriffe von IDELAYs und ODELAYs zu kalibrieren. Also bin ich darauf beschränkt. Die Verwendung von DDR-Flip-Flops von IOB hat mehrere Vorteile gegenüber der Verwendung eines taktgesteuerten Multiplexers.
Ich habe die drei Antworten zu einer kombiniert. Bitte bearbeiten Sie in Zukunft Ihre ursprüngliche Antwort mit neuen Informationen.
@W5VO Es scheint, als hätte Alex drei verschiedene Konten erstellt, da der Ruf jeder Antwort unterschiedlich war.
@Paebbels Ja, ich weiß.