# Codage 8b/10b

Le codage 8b/10b (le terme « encodage », parfois utilisé, est impropre ; il provient d'une traduction erronée du mot anglais « encoding ») est un code en ligne qui consiste à coder, à l'aide d'une table de correspondance, tout symbole de 8 bits en un symbole de 10 bits (appelé Transmission Character).
Il y a donc 1024 (2$^{10}$) valeurs possibles ; seules 256 (2$^8$) valeurs sont utilisées pour coder les données (un octet). Les combinaisons utilisées sont telles que chaque symbole de 10 bits comprend au minimum quatre transitions d'un état logique (zéro ou un) vers l'autre, et que le flux codé ne présente jamais plus de six fois consécutives le même état logique (zéro ou un). Par exemple, aucun symbole ne finit par quatre zéros ou ne commence par trois zéros, car s'ils étaient envoyés l'un à la suite de l'autre, sept zéros consécutifs seraient transmis sur la ligne.
Le codage 8b/10b garantit ainsi une bonne récupération du signal d'horloge en réception à très haut débit et équilibre le nombre de zéros et de uns pour éviter la présence d'un courant continu sur la ligne. Cette technique de codage est utilisée pour les transmissions série, comme le FireWire, certaines versions des réseaux Ethernet, les transmissions CoaXPress, ou encore le Serial ATA.

## Description

Le procédé de codage 8b/10b est défini sur deux niveaux. Le premier code les cinq premiers bits de l'octet non codé en un sous-bloc de six bits en utilisant un codeur 5b/6b. L'entrée de ce niveau inclut la valeur de disparité courante (rd : running disparity). Le second niveau utilise un codeur 3b/4b pour coder les trois bits restants et la valeur de disparité en un autre bloc de 4 bits.
La disparité est un paramètre binaire qui peut prendre soit une valeur positive ou négative. La disparité est calculée sur deux sous-blocs où les six premiers bits forment le premier sous-bloc et les quatre derniers bits le second sous-bloc. Le calcul s'effectue de façon suivante :
* la disparité à la fin de n'importe quel bloc est positive si le sous-bloc contient plus de zéros que de uns. Ce sera positif dans le cas 000111 et 0011 ;
* la disparité à la fin de n'importe quel bloc est négative si le sous-bloc contient plus de uns que de zéros. Ce sera négatif dans le cas 111000 et 1100.
Si on a autant de zéros que de uns, on garde la disparité précédente. On parle alors de disparité neutre.
Le code 8b/10b va restreindre la génération de 000111, 111000, 0011 et 1100 pour limiter l'importance de zéros ou de uns compris entre les sous-blocs. Les sous-blocs comprenant 000111 et 0011 sont générés seulement quand la disparité au début du sous-bloc est positive. De façon similaire, les sous-blocs comprenant 111000 et 1100 sont générés seulement quand la disparité au début du sous-bloc est négative.

## Exemple de correspondance entre un caractère 8b et un caractère 10b

Les tableaux suivants illustrent le codage 8b/10b pour quelques caractères de données.
1er bloc de 5b/6b
| Input | Input | RD = −1 | RD = +1 | Input | Input | RD = −1 | RD = +1 |
| Dx | EDCBA | Output (ABCDEI) | Output (ABCDEI) | Dx | EDCBA | Output (ABCDEI) | Output (ABCDEI) |
| D.00 | 00000 | 100111 | 011000 | D.16 | 10000 | 011011 | 100100 |
| D.01 | 00001 | 011101 | 100010 | D.17 | 10001 | 100011 | 100011 |
| D.02 | 00010 | 101101 | 010010 | D.18 | 10010 | 010011 | 010011 |
| D.03 | 00011 | 110001 | 110001 | D.19 | 10011 | 110010 | 110010 |
| D.04 | 00100 | 110101 | 001010 | D.20 | 10100 | 001011 | 001011 |
| D.05 | 00101 | 101001 | 101001 | D.21 | 10101 | 101010 | 101010 |
| D.06 | 00110 | 011001 | 011001 | D.22 | 10110 | 011010 | 011010 |
| D.07 | 00111 | 111000 | 000111 | D.23 † | 10111 | 111010 | 000101 |
| D.08 | 01000 | 111001 | 000110 | D.24 | 11000 | 110011 | 001100 |
| D.09 | 01001 | 100101 | 100101 | D.25 | 11001 | 100110 | 100110 |
| D.10 | 01010 | 010101 | 010101 | D.26 | 11010 | 010110 | 010110 |
| D.11 | 01011 | 110100 | 110100 | D.27 † | 11011 | 110110 | 001001 |
| D.12 | 01100 | 001101 | 001101 | D.28 | 11100 | 001110 | 001110 |
| D.13 | 01101 | 101100 | 101100 | D.29 † | 11101 | 101110 | 010001 |
| D.14 | 01110 | 011100 | 011100 | D.30 † | 11110 | 011110 | 100001 |
| D.15 | 01111 | 010111 | 101000 | D.31 | 11111 | 101011 | 010100 |
2e bloc de 3b/4b
| Input | Input | Output (FGHJ) | Output (FGHJ) |
| Dx.y | HGF | rd=-1 | rd=+1 |
| D.x.0 | 000 | 1011 | 0100 |
| D.x.1 | 001 | 1001 | 1001 |
| D.x.2 | 010 | 0101 | 0101 |
| D.x.3 | 011 | 1100 | 0011 |
| D.x.4 | 100 | 1101 | 0010 |
| D.x.5 | 101 | 1010 | 1010 |
| D.x.6 | 110 | 0110 | 0110 |
| D.x.P7 | 111 | 1110 | 0001 |
| D.x.A7 | 111 | 0111 | 1000 |
Pour D.x.7, soit le codage Primary D.x.P7 soit le codage Alternate D.x.A7 doit être sélectionné pour éviter une succession de cinq '0' ou '1' combiné avec le bloc 5B/6B précédent.
Le codage 8b/10b se fait toujours en fonction de la rd résultant du codage précédent ou de la rd de départ. Maintenant prenons deux exemples :
| Initial rd | Character Name | abcdei output | 6bits sub block rd | fghj ouput | 4bits sub block rd | Encoded Character | Final rd |
| - | D10.2 | 010101 | - | 0101 | - | 010101 0101 | - |
| + | D11.7 | 110100 | + | 1000 | - | 110100 1000 | - |
On voit sur cet exemple les différentes disparités calculées.
Pour le caractère D10.2 : D10 correspond à la même valeur de codage quelle que soit la disparité précédente obtenue. Les six premiers bits obtenus sont 010101. Il y a dans ce cas autant de 0 que de 1, on hérite donc de la disparité précédente (négative). Pour le bloc 4 bits, c'est la même chose. La disparité reste la même que la précédente (des 6 bits). La disparité résultante (qui sera la disparité initiale du prochain bloc transmis) est calculée : il y a autant de 0 que de 1. On garde donc la disparité précédente : -.
Le principe est assez simple : en général, quand le nombre de bits à 1 et 0 est différent dans un bloc, deux sous-blocs d'un caractère ont toujours des disparités différentes. Cette vérification permet notamment de détecter certaines erreurs dans une transmission de données.