# 8b10b-Code

Der 8b10b-Code (auch 8b/10b-Code) ist ein 1983 von Albert Xavier Widmer und Peter Franaszek entwickelter Leitungscode in der Telekommunikationstechnik. Es werden 8 Informationsbits durch 10 Leitungsbits kodiert. Es wird ein vollständiger Gleichspannungsausgleich gewährleistet, weiterhin können der Takt und die Datenwortgrenzen einfach rückgewonnen werden. Die Bitrate erhöht sich um 25 Prozent (Overhead). Ein ähnlich aufgebauter Code ist der 16b18b-Code (auch Albert Xavier Widmer) mit nur 12,5 Prozent Overhead.
Andere, deutlich effizientere Codes sind der 64b66b-Code mit 3 Prozent Overhead, welcher 64 Bit auf 66 Bit abbildet, und der 128b130b-Code mit nur 1,5 Prozent Overhead. Allerdings gewährleisten diese Codes Eigenschaften (wie Gleichspannungsfreiheit, Wiederholrate gleicher Pegel, Datenwortgrenzenerkennung) nur noch im statistischen Mittel.

## Eigenschaften

Der 8b10b-Code benutzt zur Übertragung eines Oktetts ein zehn Bits langes Codewort. Dabei werden folgende Eigenschaften erfüllt:

### Gleichspannungs­ausgleich

Die Anzahl der Einsen pro Codewort unterscheidet sich maximal um zwei von der Anzahl der Nullen. Dies ergibt drei Typen von Codewörtern:
* 252 neutrale (neutral disparity): gleiche Anzahl von „1“ und „0“, also fünfmal „1“ und fünfmal „0“
* 210 positive (positive disparity): sechsmal „1“ und viermal „0“
* 210 negative (negative disparity): viermal „1“ und sechsmal „0“
In einem Datenstrom treten damit „1“ und „0“ mit gleicher Wahrscheinlichkeit auf. Überträgt man nun eine „1“ als eine positive Spannung +U und eine „0“ als eine negative Spannung −U, so hat das kodierte Signal (bei gegebener Datenrate) eine untere Grenzfrequenz, d. h., über eine längere Bitfolge mittelt sich die Spannung heraus, so dass das Signal keinen Gleichspannungsanteil enthält. Dieser Gleichspannungsausgleich erlaubt zum Beispiel eine kapazitive oder induktive Kopplung von Sender und Empfänger.

### Maximale Anzahl gleicher Leitungsbits in Folge

Bei reiner Datenübertragung ist durch das Design der Kodierung die maximale Anzahl (maximum run length) aufeinanderfolgender gleicher Leitungsbits (Symbole) auf fünf begrenzt, d. h. spätestens nach fünf Taktzyklen erfolgt ein Pegelwechsel.
Es gibt drei Steuerworte (sie stellen keine Nutzdaten dar), bei denen an einer bestimmten Stelle innerhalb der zehn Leitungsbits pro Datenwort absichtlich sechs Taktzyklen lang kein Pegelwechsel stattfindet (Kommas genannt). Dies ermöglicht eine einfache Rückgewinnung der Datenwortgrenzen. Die Taktrückgewinnung selbst stellt durch die häufigen Pegelwechsel sehr geringe Anforderungen.

### Disparität

Der 8b10b-Encoder hat als Eingangsgrößen neben dem zu kodieren Datenwort (D.00.0 bis D31.7 für reguläre Datenworte 0…255, Kxx.y für zwölf weitere mögliche Steuerworte) noch die vorausgegangene Disparität als Eingangsgröße. Daraus berechnen sich die zehn Leitungsbits sowie die folgende Disparität, die für die Kodierung des folgenden Datenwortes benötigt wird.
| voraus- gegangene Disparität | Disparität des Codewortes (folgende Disparität) | Disparität des Codewortes (folgende Disparität) | Disparität des Codewortes (folgende Disparität) |
| voraus- gegangene Disparität | −1 | ±0 | +1 |
| −1 | Nein × | Ja → (−1) | Ja ↗ (+1) |
| +1 | Ja ↘ (−1) | Ja → (+1) | Nein × |
Es wird dafür gesorgt, dass die Disparität nur die Werte −1 und +1 annehmen kann.
Im einfachsten Fall kann die Kodierung durch einen Festwertspeicher 1024 × 11 bit erfolgen: 10 bit (acht Datenbits, Umschaltung Datenwort/Steuerwort, vorangegangene Parität) → 11 bit (zehn Kanalbits, nachfolgende Parität). Der Code ist allerdings so aufgebaut, dass man die Kodierung in zwei deutlich kleinere Tabellen (128 × 7 bit und 32 × 5 bit) und ein wenig Zusatzlogik zerlegen kann.

### K-Wörter

Neben 256 möglichen Datenwörtern können zwölf mögliche Steuerworte übertragen werden. Diese Steuerworte nennt man K-Wörter. Sie sind für Steuerungsfunktionen in übergeordneten Protokollschichten notwendig. Drei dieser K-Wörter haben ein Bitmuster, das nicht über Codewortgrenzen hinweg entstehen kann. Das heißt, die letzten Bit eines Codewortes zusammen mit den ersten Bit eines nachfolgenden Codewortes können niemals das Bitmuster eines dieser drei speziellen K-Wörter ergeben. Das nutzt man in seriellen Datenströmen, um den Anfang und das Ende eines Codewortes zu erkennen. Diese drei speziellen K-Wörter nennt man auch Komma-Wörter.

### Fehlererkennung

Da von den mit zehn Bits darstellbaren 1024 Kombinationen nicht alle genutzt werden und außerdem strenge Auswahlregeln zu beachten sind, können einzelne Bitfehler mit einer gewissen Wahrscheinlichkeit (ca. 75 Prozent) detektiert werden. Es können allerdings auch gültige falsche Datenworte entstehen. Für gesicherte Übertragungen sind daher zusätzliche Prüfsummen oder eine Vorwärtsfehlerkorrektur erforderlich.

## Anwendungen

Der 8b10b-Code findet u. a. in folgenden Übertragungsstandards Verwendung:
* PCI-Express (nur 1.x und 2.x; 3.x verwendet 128b/130b)
* Serial ATA (bis SATA III)
* Serial Attached SCSI (bis SAS-3; ab SAS-4 wird 128b/150b verwendet)
* Fibre Channel (bis 8GFC; 10GFC, 16GFC verwenden 64b/66b)
* InfiniBand (bis QDR; FDR10, FDR und neuer verwenden 64b/66b)
* FireWire 800, S1600, S3200 („beta mode“)
* DisplayPort (bis Version 1.4)
* DVI und HDMI (bis Version 2.0) (TMDS)
* CPRI
* OBSAI
* USB 3.0 (USB bis 2.0 verwendet NRZI, USB 3.1 128b/132b), Abkehr bei USB 3.2 zu 128b132b-Kodierung
* Ethernet mit -X-PCS-Code, bis 1-Gigabit-Ethernet (keine Verwendung mehr bei allen Nachfolgern)
Die Hoch-Zeiten des 8b10b-Codes waren die Jahre 2007 bis 2013. In Neuentwicklungen sind diese den Scambling-Codes (64b66b bis 512b514b) und auch deren Nachfolgern (integrierte Fehlerkorrektur, Mehrpegel-Kodierungen) gewichen.