# 64b66b-Code

Der 64b/66b-Code ist ein Leitungscode, welcher ein 64 bit-Datenwort in ein 66 bit-Codewort abbildet. Anwendung findet dieser Leitungscode im Rahmen von Gigabit-Ethernet, wie 10-Gigabit-Ethernet, 40-Gigabit-Ethernet und 100-Gigabit-Ethernet. Der 64b/66b-Leitungscode ist völlig anders aufgebaut und hat andere spektrale und statistische Eigenschaften als z. B. der 8b10b-Code.
Wie jeder Leitungscode dient er dazu, eine Nutzdatenfolge spektral an die physikalischen Anforderungen des Übertragungsmediums wie einer Leitung anzupassen. Durch die Art der Umsetzung wird insbesondere die Gleichanteilsfreiheit der erzeugten Codefolge gewährleistet, was die Übertragung über Impulstransformatoren erlaubt, welche keinen Gleichanteil im Signal passieren lassen. Impulstransformatoren werden im Bereich der physischen Ethernet-Schnittstelle zur galvanischen Trennung eingesetzt. Außerdem ist im Rahmen der 64b/66b-Codierung garantiert, dass der Empfänger aus dem Codewort den Takt rückgewinnen kann. Dies ist notwendig, damit der Empfänger erkennen kann, zu welchen Zeitpunkten ein bestimmter Zustand übertragen wird.

## Funktionsweise

Die 66 Bit eines Codewortes werden durch eine Präambel von 2 Bits eingeleitet. Die vier möglichen Kombinationen der Präambel bedeuten jeweils:

### Präambel 01

    Die folgenden 64 Bit sind Nutzdaten.

### Präambel 10

    Es folgt unmittelbar ein Type-Feld mit 8 Bit Länge mit daran anschließenden 56 Bit an Kontroll- und Steuerinformationen oder Nutzdaten. Die Bedeutung richtet sich nach dem Type-Feld. Das Type-Feld ist 8 Bit lang, es sind aber nur 16 Werte und damit Funktionen zulässig, diese haben untereinander eine Hamming-Distanz von mindestens 4.

### Präambeln 00 und 11

    Nicht erlaubt. Erzeugen (beim zweiten aufeinanderfolgenden Auftreten) beim Empfang einen Fehler.
Die Verwendung von 01 bzw. 10 als gültige Präambel gewährleistet eine Signalflanke innerhalb der Präambel. Dadurch kann empfangsseitig mittels einer Phasenregelschleife der Symboltakt bestimmt werden.
Die 64-Bit-Nutzdaten bzw. 56 Bit an Steuer- und Kontrolldaten werden mittels eines selbstsynchronisierenden Scramblers verknüpft, wodurch die Gleichanteilsfreiheit der Datenfelder sich nur im langfristigen Mittel einstellt. Der Scrambler ist in Form eines linear rückgekoppelten Schieberegisters realisiert. Der Ansatz mittels Scrambler bei der 64b/66b-Codierung ist ein wesentlicher Unterschied gegenüber dem tabellenbasierenden Leitungscode 8b10b. Die im Type-Feld verwendeten Codes bestehen aus jeweils vier 0- und 1-Bits, so dass kein Scrambler benötigt wird.
Das Scrambling-Polynom ist: x$^{58}$ + x$^{39}$ + 1.

## Modifikationen des 64b/66b-Codes
### 128b/130b-Code

Der Präambel folgen nicht 64 bit, sondern 128 bit. Wird bei PCI Express ab Version 3 verwendet.
Das Scrambling-Polynom ist: x$^{23}$ + x$^{21}$ + x$^{16}$ + x$^8$ + x$^5$ + x$^2$ + 1.

### 128b/132b-Code

Die Präambeln lauten nicht 01 und 10, sondern 0011 und 1100. Weiterhin folgen, wie schon beim 128b/130b-Code, 128 Datenbits; findet Verwendung bei USB 3.1.

### 64b/67b-Code

Die Präambeln lauten:

#### Präambel 001

    Die folgenden 64 Bit sind Nutzdaten.

#### Präambel 101

    Die folgenden 64 Bit sind Nutzdaten. Sie sind invertiert.

#### Präambel 010

    Die folgenden 64 Bit sind Kontroll- und Steuerinformationen.

#### Präambel 110

    Die folgenden 64 Bit sind Kontroll- und Steuerinformationen. Sie sind invertiert.

#### Präambeln x00 und x11

    Nicht erlaubt.
Durch geeignetes Setzen des ersten Bits kann der Encoder aktiv gegen eine DC-Drift vorgehen und kann die Disparität auf −33…+33 begrenzen. Bei einem 64b/66b-Code ist die Disparität selbst im statistischen Mittel nicht begrenzt, was zu Base Line Drifts führt, die zu deutlich schlechteren Übertragungseigenschaften als z. B. denen von 8b/10b-Codes führt.
Die statistischen und spektralen Eigenschaften sind wesentlich gutmütiger als die der 64b/66b-Kodierung. Verwendung findet dieser Code im von Cisco Systems und Cortina Systems entwickelten Interlaken-Protokoll, was u. a. zur Kommunikation zwischen FPGAs von Xilinx und Altera verwendet wird.