Forum: FPGA, VHDL & Co. Spartan-6 MGT Transceiver


von Gilles B. (gilles_b)


Lesenswert?

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!

von Lattice User (Gast)


Lesenswert?

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.

von Christian R. (supachris)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.