Diese Seite ist der erste Beitrag einer Artikelserie, die den Multi-Gigabit-Transceiver (MGT) vorstellt, und gibt einen Überblick über das, was in dieser Serie noch behandelt wird.
Einführung
Multi-Gigabit-Transceiver (MGTs) spielen eine wichtige Rolle bei der Kommunikation zwischen verschiedenen Teilen innerhalb eines Computers oder eines elektronischen Systems. Mehrere bekannte Schnittstellen im Inneren eines Computers basieren auf MGTs, zum Beispiel PCIe und SATA. Andere bekannte Schnittstellen dienen der Kommunikation zwischen einem Computer und seinen Peripheriegeräten, etwa Gigabit-Ethernet, SuperSpeed-USB, Thunderbolt und DisplayPort.
MGTs werden auch eingesetzt, um elektronische Komponenten miteinander zu verbinden, beispielsweise zwei FPGAs. In diesem Fall basiert die Kommunikation oft auf einem der weniger bekannten Protokolle oder sogar auf einem nicht standardisierten Protokoll. Man kann MGTs aber auch verwenden, um ein FPGA mit einem anderen Komponententyp zu verbinden, oder andere Komponenten untereinander, etwa mit Xillyp2p.
So sind Glasfaser-Transceiver oft Standardmodule (insbesondere im SFP+-Formfaktor), die direkt an MGTs anschließen, wie in diesem Beispiel-Design gezeigt. Einige Highspeed-ADC/DACs verwenden MGTs ebenfalls, um die Abtastdaten zu übertragen (üblicherweise auf der Grundlage des JESD204-Protokolls). Es gibt auch Protokolle für die Übertragung von Videodaten (z. B. einige MIPI-Protokolle für die physikalische Schicht).
Auch wenn MGTs häufig für bidirektionale Protokolle verwendet werden, besteht ein MGT eigentlich aus zwei unabhängigen Teilen: einem Sender und einem Empfänger. Daher ist es möglich, ein MGT für eine unidirektionale Übertragung zu nutzen, indem man einen der beiden Teile abschaltet. Bei den meisten FPGA-MGTs können die Parameter von Sender und Empfänger unabhängig voneinander konfiguriert werden.
Zusammenfassend: MGTs werden in vielen Anwendungen eingesetzt. Oft geht aus dem Namen der Schnittstelle nicht hervor, dass MGTs verwendet werden (z. B. Gigabit-Ethernet, SATA und DisplayPort), aber die physikalische Schicht besteht aus MGTs.
Erwähnenswert ist, dass Xilinx (und später AMD) ihre MGTs mit verschiedenen Namen bezeichnet: RocketIO, GTX, GTH, GTY, GTP, GTM usw. Jeder Name steht für eine bestimmte Hardware-Implementierung des Transceivers. Der Name sagt also etwas über die Datenraten und andere Leistungsmerkmale aus, die der Transceiver besitzt.
Diese Artikelserie erklärt die Grundlagen der MGTs und einige Fachbegriffe, die in diesem Zusammenhang häufig verwendet werden. Ziel ist es, das Lesen der technischen Dokumentation zu erleichtern und insbesondere zu erkennen, welche Parameter für Ihr Projekt relevant sind und welche nicht.
Was ist ein MGT?
Wichtig ist, sich klarzumachen, dass hinter all den komplizierten Funktionen ein MGT im Grunde nur ein SERDES ist: ein elektronischer Baustein, der Daten empfängt und sendet. Die elektrische Schnittstelle des MGTs zur Außenwelt besteht aus zwei Leitungen, die ein Differenzpaar bilden. Wenn die Spannung auf der ersten Leitung (der „Plus“-Leitung beziehungsweise der positiven Leitung) höher ist als die Spannung auf der anderen Leitung (der „Minus“-Leitung beziehungsweise der negativen Leitung), entspricht der physikalische Zustand einer „1“. Andernfalls liegt eine „0“ vor. Das ist dasselbe Prinzip wie bei Differenzschnittstellen, etwa LVDS.
Eine weitere Ähnlichkeit mit einem SERDES besteht darin, dass die Schnittstelle des MGTs zur Anwendungslogik aus einem parallelen Datenwort besteht: In jedem Taktzyklus der Anwendungslogik wird eine Anzahl von Bits zwischen der Anwendungslogik und dem MGT übertragen. Diese Anordnung ist notwendig, weil die Datenrate weit höher ist als die maximale Taktfrequenz, die bei einem FPGA möglich ist.
Es gibt jedoch einige wichtige Unterschiede zwischen einem gewöhnlichen SERDES und einem MGT. Hier sind einige davon:
- Die MGTs unterstützen deutlich höhere Datenraten als ein gewöhnlicher SERDES.
- Der Empfänger eines SERDES benötigt zusätzlich zum Datenstrom auch den Takt des Senders. Ein MGT-Empfänger kann sich dagegen allein auf das Signal des Datenstroms verlassen: Der MGT erzeugt einen Takt, der zum Signal des Datenstroms passt, und verwendet diesen. Diese Fähigkeit wird als Takt- und Datenrückgewinnung (Clock Data Recovery, CDR) bezeichnet. Selbst wenn ein MGT-Empfänger Zugriff auf den Takt des Senders hat, wird dieser nur als Referenztakt verwendet, nicht als Datentakt.
- Bitfehler sind auf einer Datenverbindung, die ein MGT verwendet, erlaubt und normal. Die Bitfehlerrate (BER) wird üblicherweise mit unter 10-12 oder 10-15 erwartet. Wenn bei einem gewöhnlichen SERDES ein Bitfehler auftritt, gilt das als Fehlfunktion – bei einem MGT jedoch nicht.
- Wenn ein MGT verwendet wird, gibt es Einschränkungen für den Inhalt des Datenstroms, der über das Leitungspaar übertragen wird. Der Datenstrom muss stets gleichspannungsfrei (DC-balanced) sein. Anders ausgedrückt: Im Mittel müssen im Datenstrom gleich viele Nullen und Einsen vorkommen. Außerdem wird häufig verlangt, dass die gesendeten Bits statistisch voneinander unabhängig sind. Mehr dazu weiter unten.
- Ein MGT kann Out-of-Band-Signale (OOBs) erzeugen und erkennen. Diese Signale werden übertragen, wenn der reguläre Datenfluss abgeschaltet wird, um Energie zu sparen. Ihr Zweck ist es vor allem, den Empfänger auf der Gegenseite aufzuwecken, damit die Übertragung von Datenbits wieder aufgenommen werden kann.
Warum also ist ein MGT so kompliziert?
Wer schon einmal einen MGT-Block für ein FPGA-Projekt konfiguriert hat, weiß, dass es zahlreiche Parameter und Wahlmöglichkeiten gibt. Warum muss das so sein?
Eigentlich muss es nicht kompliziert sein: Wie in diesem Beispiel-Design gezeigt, entfällt ein Großteil der Komplexität, wenn der MGT einfach nur als SERDES verwendet wird.
Allerdings ist die Verwendung eines MGTs meist kompliziert – und dafür gibt es hauptsächlich drei Gründe. Erstens implementiert der MGT-Block viele Funktionsblöcke, die man auch in der Logikstruktur unterbringen könnte, die aber aus Effizienzgründen in den MGT integriert sind. So sind alle MGTs zum Beispiel in der Lage, 8b/10b zu kodieren und zu dekodieren, obwohl diese Aufgabe auch von der Anwendungslogik übernommen werden könnte. Da diese Kodierungstechnik so verbreitet ist, übernimmt der MGT sie stattdessen.
Der zweite Grund hängt mit der Taktversorgung zusammen: Für den ordnungsgemäßen Betrieb eines MGTs sind mehrere Takte erforderlich. Um die Sache noch komplizierter zu machen, sind die Anforderungen an die Taktqualität, insbesondere an den Jitter (jitter), strenger als bei den Takten, die in der Logikstruktur des FPGAs verwendet werden. Und manchmal kommt noch SSC (Spread Spectrum Clocking) hinzu, was die Sache weiter verkompliziert.
Die Taktversorgung also richtig hinzubekommen, ist manchmal nicht weniger schwierig, als die richtigen Parameter für den MGT insgesamt zu wählen.
Der dritte Grund ist, dass MGTs dafür ausgelegt sind, mehrere standardisierte Kommunikationsprotokolle zu unterstützen. Daher stammen die Namen von Funktionen, die ein bestimmtes Protokoll benötigt, oft aus der Spezifikation dieses Protokolls. Für jemanden, der das betreffende Protokoll nicht kennt, sind solche Begriffe bedeutungslos. Das macht es schwierig zu entscheiden, welche Funktionen man aktivieren muss, wenn man einen MGT-Block für ein FPGA einrichtet.
Alle diese Themen werden im weiteren Verlauf dieser Artikelserie ausführlicher behandelt.
Was Sie beachten sollten
In den meisten Anwendungsfällen dienen MGTs als physikalische Schicht für ein anderes etabliertes Protokoll, insbesondere PCIe. In diesen Situationen kümmern sich die FPGA-Tools um die Details, und man muss nicht viel darüber verstehen, was auf der niedrigen Ebene geschieht.
Wenn Sie jedoch vorhaben, Ihre Anwendungslogik direkt mit einem MGT zu verbinden, ist es wichtig, sich einiger Herausforderungen bewusst zu sein, die diese Logik bewältigen muss. Einige dieser Punkte werden von Protokollen für den Einsatz zwischen FPGAs übernommen.
Hier ist eine kurze Liste von Themen, die Sie berücksichtigen sollten. Jedes dieser Themen wird im weiteren Verlauf dieser Artikelserie ausführlicher behandelt.
- Wortausrichtung: Wie bei jedem SERDES weiß ein MGT nicht von vornherein, wo ein Byte oder ein größeres Wort beginnt. Bei einem SERDES wird dieses Problem üblicherweise dadurch gelöst, dass man das parallele Wort bitweise verschiebt (Bit-Slipping), bis der ankommende Datenstrom einen Sinn ergibt. Protokolle, die auf MGTs basieren, verwenden zu diesem Zweck meist ein Synchronisationswort.
- Die Bits auf den physikalischen Leitungen müssen gleichspannungsfrei (DC-balanced) sein. Die einfachste Lösung ist eine 8b/10b-Kodierung, aber es gibt andere und manchmal besser geeignete Möglichkeiten.
- Scrambling: Es ist fast immer sinnvoll, auf dem empfangenden MGT einen Entzerrer (Equalizer) einzusetzen. Der Entzerrer gleicht die Unzulänglichkeiten des physischen Übertragungsmediums aus und reduziert dadurch die Bitfehlerrate. Das gilt insbesondere bei hohen Datenraten, bei preiswerten Kabeln oder großen Entfernungen. Manche Arten von Entzerrern verlangen allerdings, dass die übertragenen Daten statistisch zufällig sind: Es darf keine Korrelation zwischen den einzelnen Bits im gesendeten Datenstrom geben. Die übliche Lösung ist ein Verwürfler (Scrambler), der eine XOR-Verknüpfung zwischen den Nutzdaten und einer pseudozufälligen Bitfolge durchführt. Der Empfänger führt dieselbe XOR-Verknüpfung mit derselben pseudozufälligen Folge durch und erhält so den ursprünglichen Datenstrom zurück.
- Bitfehler: Die Daten können mit Fehlern beim empfangenden MGT ankommen. Die Logik, die diese Daten verarbeitet, muss so ausgelegt sein, dass sie solche Fehler toleriert. In manchen Anwendungen hält man die Fehler für selten genug, um sie zu ignorieren (zum Beispiel bei der Übertragung von Roh-Videodaten, wenn die Bitfehlerrate unter 10-15 liegt). In anderen Anwendungen ist ein Mechanismus zur Fehlererkennung und/oder Neuübertragung erforderlich, damit die Datenverbindung zuverlässig ist.
- Unterschiede bei den Taktfrequenzen: Wenn ein MGT einen Datenstrom empfängt, basiert dieses Signal auf dem Takt der Gegenseite (also dem Takt des Senders). Dieser Takt kann eine etwas andere Frequenz haben als der Takt auf der Empfängerseite. Die Schnittstelle zwischen dem MGT und der Anwendungslogik basiert allerdings oft auf dem lokalen Takt. Ist der Takt des Senders schneller als der des Empfängers, empfängt der MGT die Daten schneller, als er sie an die Anwendungslogik weitergeben kann. Die überschüssigen Daten sammeln sich im MGT-Block an, und irgendwann kommt es zu einer Art Überlauf (Overflow). Ist die ankommende Datenrate dagegen niedriger, als es der lokale Takt vorgibt, kann der MGT nicht in jedem Taktzyklus Daten liefern. Diese Probleme treten selbst dann auf, wenn der Referenztakt zusammen mit dem Datenstrom vom Sender zum Empfänger übertragen wird: Schon geringe Frequenzschwankungen des Takts reichen aus, um derartige Probleme zu verursachen. Das Protokoll löst dieses Problem normalerweise mithilfe von Idle-Wörtern.
- Energieverbrauch: MGTs neigen dazu, relativ viel Energie zu verbrauchen. Das liegt zum Teil an der hohen Datenrate, und oft erweisen sich auch die hochwertigen PLLs als recht energiehungrig. Daher ist es häufig wünschenswert, ein MGT abzuschalten, wenn es nicht verwendet wird – selbst für sehr kurze Zeiträume. Eine SuperSpeed-USB-Verbindung schaltet ihren Datenstrom zum Beispiel oft ab, wenn schon für einen Zeitraum von nur 50 μs keine Daten übertragen wurden. Danach wird ein OOB-Handshake verwendet, um den Betrieb bei Bedarf wieder aufzunehmen.
PMA, PCS und Taktversorgung
Dieses Blockdiagramm zeigt die Bausteine eines MGT sowie seine Interaktion mit der Anwendungslogik:
Die Funktionalität eines MGTs ist üblicherweise in drei Bereiche unterteilt:
- Taktversorgung: Wie bereits erwähnt, sind für den Betrieb eines MGTs mehrere Takte erforderlich. Auch wenn die FPGA-Tools die Parameter dieser Takte automatisch konfigurieren, muss man dennoch wissen, wie diese Takte erzeugt werden.
- PMA (Physical Medium Attachment): Dieser Teil enthält den SERDES des MGTs sowie die analogen Signal-Subsysteme (OOB-Signale, Empfängererkennung, Entzerrer, Pre-Emphasis usw.). Außerdem wird hier die CDR implementiert.
- PCS (Physical Coding Sublayer): Dieser Teil enthält Logik, die für die Umsetzung des Kommunikationsprotokolls nützlich sein kann: Kodierer und Dekodierer, Wortausrichtung, Gearboxen, FIFOs usw. Die meisten Funktionen des PCS könnten auch in der Logikstruktur realisiert werden, sind aber aus Gründen der Einfachheit und Effizienz im MGT untergebracht.
Diese Themen werden in dieser Artikelserie weiter behandelt.
Die PIPE-Schnittstelle
Der PIPE-Standard ist erwähnenswert: Er definiert die Verbindungen zwischen einem MGT und der Logik, die PCIe, SuperSpeed USB oder SATA implementiert. Dazu gehören die Ports für die Übertragung von Daten sowie für Steuer- und Statussignale.
In diesem Standard wird der MGT als PHY-Schicht und das Protokoll als MAC-Schicht bezeichnet. Diese Terminologie wird auch von Standards verwendet, die Ethernet, USB 1.x und USB 2.0 definieren. Diese Standards werden üblicherweise mit zwei getrennten Chips umgesetzt. Um zum Beispiel Ethernet auf einem Prozessor-Chip zu implementieren, sitzt die MAC-Schicht in diesem Chip und die PHY-Schicht in einem separaten Chip. Der PIPE-Standard folgt derselben Grundidee, auch wenn PCIe, SuperSpeed USB oder SATA praktisch immer vollständig auf demselben Chip implementiert sind. Die Verbindungen zwischen MAC-Schicht und PHY-Schicht, die der PIPE-Standard definiert, liegen innerhalb des Chips und sind nach außen selten sichtbar.
Eine wichtige Auswirkung des PIPE-Standards ist, dass ein brauchbarer FPGA-MGT die PIPE-Schnittstelle immer so implementiert, wie es für PCIe erforderlich ist. Die PIPE-Schnittstelle für SATA wird oft ebenfalls unterstützt. Das ist bei der Implementierung dieser beiden Protokolle offensichtlich nützlich, hat aber noch einen weiteren wichtigen Vorteil: Verschiedene FPGAs bieten eine ähnliche Schnittstelle zum MGT. Insbesondere gibt es einige funktionale Elemente, die sich in praktisch allen MGTs finden.
Fazit
Auf dieser Seite wurde ein Überblick über den MGT und seine Komplexität gegeben. Im weiteren Verlauf dieser Artikelserie werden viele der oben erwähnten Konzepte erklärt. Zuvor beginnen wir jedoch mit einem kurzen Überblick über Protokolle, die häufig beim Verbinden zweier FPGA-MGTs verwendet werden.
