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 (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

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 suivant illustrent le codage 8b/10b pour quelques caractères de données.

1er bloc de 5b/6b

inputRD = −1RD = +1 inputRD = −1RD = +1
DxEDCBAOuput (ABCDEI)DxEDCBAOuput (ABCDEI)
D.0000000100111011000D.1610000011011100100
D.0100001011101100010D.1710001100011
D.0200010101101010010D.1810010010011
D.0300011110001D.1910011110010
D.0400100110101001010D.2010100001011
D.0500101101001D.2110101101010
D.0600110011001D.2210110011010
D.0700111111000000111D.23 †10111111010000101
D.0801000111001000110D.2411000110011001100
D.0901001100101D.2511001100110
D.1001010010101D.2611010010110
D.1101011110100D.27 †11011110110001001
D.1201100001101D.2811100001110
D.1301101101100D.29 †11101101110010001
D.1401110011100D.30 †11110011110100001
D.1501111010111101000D.3111111101011010100

2e bloc de 3b/4b

InputOuput (FGHJ)
Dx.yHGFrd=-1rd=+1
D.x.000010110100
D.x.10011001
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 rdCharacter Nameabcdei output6bits sub block rdfghj ouput4bits sub block rdEncoded CharacterFinal rd
-D10.2010101-0101-010101 0101-
+D11.7110100+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

    Liens externes

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

    • Portail de l’informatique
    • Portail des télécommunications
    Cet article est issu de Wikipedia. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.