Hallo Leute, ich suche jemanden, der schonmal erfolgreich den MGT Transceiver instanziiert hat im HDL code. Auch mithilfe aller Datenblätter bin ich zwecks extrem mangelnder Beispiele völlig aufgeschmissen, was die ganzen Clock-Supports angeht. Es gibt da ca. 10 Clocks für einen Transceiver, und ich verstehe nicht die Direktionen und benötigten Frequenzen/Quellen der Clocks. Also hat da jemand Erfahrung? Ich benutze zwei SP605 Evalboards mit Spartan-6 LX45T FPGA und jeweils pro Board 3 differentiellen Signale über SMA Stecker rausgeführt: REFCLK, RX, und TX. Es geht schon los dass ich nicht verstehe welche Direktion der REFCLK hat. Gehe ich richtig in der Annahme, dass sich diese je nachdem ob ich gerade empfange oder sende ändert? Oder ist dies der Anschluss für einen Referenzclock, welcher dann per PLL intern weiterverarbeitet wird? Wird beim MGT der CLK somit als beim Senden "mitgeschickt" bzw. die Synchronisation, damit der Empfänger lesen kann, über RXDATA an sich realisiert wird? Alleine ein Beispielcode von euch würde mir schon riesig helfen, sodass ich dann sehen kann, wie ihr das verschaltet. Auch ein Problem: Der MGT Wizard gibt einem die Möglichkeit, Comma Alignment ohne 8b/10b Encoding zu verwenden... wie soll das denn noch Sinn machen? Da kann es doch sehr gut passieren, dass ein normaler Nutzwert, den ich übertragen will, zufällig den Wert des Comma-Symbols einnimmt... Naja... Hoffe, jemand hat das schonmal alles gemacht... Im Netz schauts da leider sehr düster aus. Vielen Dank an euch!
Gilles Backhus schrieb: > Auch ein Problem: Der MGT Wizard gibt einem die Möglichkeit, Comma > Alignment ohne 8b/10b Encoding zu verwenden... wie soll das denn noch > Sinn machen? Da kann es doch sehr gut passieren, dass ein normaler > Nutzwert, den ich übertragen will, zufällig den Wert des Comma-Symbols > einnimmt... Bist du sicher, dass du dann nicht 10bit pro Symbol anlieferen musst? Dieser Mode macht Sinn wenn nicht die Standard 8/10bit Tabelle benutzt wird. Das ist z.B. bei DVI/HDMI der Fall.
Ich habe auch auf dem SP605 die MGT erfolgreich implementiert. Ist nicht ganz einfach, aber mit dem Wizzard geht es. Außerdem wird ein Beispiel-Projekt erzeugt, wo man die Verbindung der CLKs sieht. Nehmen wir an, RX und TX haben die gleiche Datenrate. Dann brauchst du als Taktquelle den REF-CLOCK, der von außen kommt. Den musst du über ein IBUFDS anschließen. Intern wird mit der PLL dann der Serial-Clock erzeugt, der braucht dich aber nicht zu interessieren. Was dich interessiert sind TXUSERCLK und TXUSERCLK2. Bei einem 8 oder 10 Bit breitem Interface ist TXUSERCLK2 = TXUSERCLK, bei 16/20 Bit die Hälfte und bei 32/40 Bit ein Viertel. Das musst du mit hilfe eines DCM außerhalb des MGT machen. Mit dem TXUSERCLK2 läuft dann die Datenübergabe von deiner Logik an den Core. RXUSRCLK und RXUSRCLK2 schließt du einfach an TXUSRCLK und TXUSRCLK2 an. Die 8B/10B Kodierung brauchst du, da du keinen Takt mit schickst. Da wird jedes Byte in 10 Bit kodiert. Und da gibts dann noch jede Menge freie Steuersymbole, die k-characters. Mit denen kannst du das ganze synchronisieren. (Comma-Alignment) Funktioniert aber nur bei 8 Bit oder 16 Bit, weil man nur einstellen kann, ob das Komma an ungeraden oder geraden Byte-Grenzen liegen soll. Immer wenn du keine Nutzdaten überträgst, musst du ein Comma-Symbol übertragen. Auf der Empängerseite bekommst du ja dann RXCOMMADETECT als Ausgang, um festzustellen, ob Nutzdaten sind. So, das gilt für den einfachen Fall, dass du für den REFCLK auf Sender und Empfänger den selben jitterarmen Quarzoszillator nimmst. Also nicht 2 mit der gleichen Frequenz, sondern einen, dahinter einen LVDS Verteiler und an beide MGT geführt. Dann brauchst du keine Clock-Correction. Wenn du ohne REFCLK Leitung arbeiten musst, brauchst du noch eine Clock-Correction, das ist nochmal einen Zacken aufwendiger, da musst du nach einer bestimmten Menge Nutzdaten wieder mal ein COMMA senden, damit das synchron bleibt. Ich häng mal den Beispielcode an, ich denke, das war eine funktionierende Sache. Ich hatte da ein Loop aufgebaut mit kurzen SMA Kabeln und Gigabytes an Daten übertragen (Indata und Outdata im Code-Schnipsel). Ich häng auch mal die xco Files für den MGT und für den DCM an. Daraus kannst du die Cores regenerieren. Was mir sehr geholfen hat ist das Dokument "High SPeed serial I/O made simple" von Xilinx. Ist nicht das aktuelleste, aber di Techniken sind ja geblieben.
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.