Codage 8b/10b

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher

Le codage 8b/10b (le terme « encodage » est impropre et influencé par l'anglais encoding[réf. nécessaire]) 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) sont retenues, 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 encodé 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. Cette technique de codage est utilisée pour les transmissions en série, comme le FireWire, les réseaux Ethernet, 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 zero que de un. 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 un que de zero. 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 un 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]

Le tableau suivant illustre le codage 8b/10b pour quelques caractères de données

Input Ouput (ABCDEI) rd'
Dx EDCBA rd+ rd-
D0 00000 011000 100111 -rd
D1 00001 100010 011101
D2 00010 010010 101101
D3 00011 110001 rd
D4 00100 001010 110101 -rd
Input Ouput (FGHJ) rd'
Dx.y HGF rd+ rd-
Dx.1 000 0100 1011 -rd
Dx.2 001 1001 rd

(Tableaux à compléter)

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.

Liens externes[modifier | modifier le code]

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