Aller au contenu

Codage 8b/10b

Un article de Wikipédia, l'encyclopédie libre.

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 (210) valeurs possibles ; seules 256 (28) 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

[modifier | modifier le code]

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

[modifier | modifier le code]

Les tableaux suivants illustrent le codage 8b/10b pour quelques caractères de données.

1er bloc de 5b/6b

Input RD = −1 RD = +1 Input RD = −1 RD = +1
Dx EDCBA Output (ABCDEI) Dx EDCBA Output (ABCDEI)
D.00 00000 100111 011000 D.16 10000 011011 100100
D.01 00001 011101 100010 D.17 10001 100011
D.02 00010 101101 010010 D.18 10010 010011
D.03 00011 110001 D.19 10011 110010
D.04 00100 110101 001010 D.20 10100 001011
D.05 00101 101001 D.21 10101 101010
D.06 00110 011001 D.22 10110 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 D.25 11001 100110
D.10 01010 010101 D.26 11010 010110
D.11 01011 110100 D.27 † 11011 110110 001001
D.12 01100 001101 D.28 11100 001110
D.13 01101 101100 D.29 † 11101 101110 010001
D.14 01110 011100 D.30 † 11110 011110 100001
D.15 01111 010111 101000 D.31 11111 101011 010100

2e bloc de 3b/4b

Input Output (FGHJ)
Dx.y HGF rd=-1 rd=+1
D.x.0 000 1011 0100
D.x.1 001 1001
D.x.2 010 0101
D.x.3 011 1100 0011
D.x.4 100 1101 0010
D.x.5 101 1010
D.x.6 110 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.

Notes et références

[modifier | modifier le code]

Articles connexes

[modifier | modifier le code]

Liens externes

[modifier | modifier le code]

2 documents définissant ce codage par Franaszek and Widmer :