Codages binaires
Non signé, complément à deux, code Gray, BCD, Excess-3, parité et Hamming : choisir le bon codage selon le circuit.
Un même mot binaire, plusieurs sens
Un bus de bits n'a pas de signification unique. La suite 1000 peut représenter :
8en entier non signé ;-8en complément à deux sur 4 bits ;- une position codée en Gray ;
- un chiffre BCD invalide si on attend une décimale entre 0 et 9.
Le codage est donc une partie du cahier des charges. Il doit être choisi avant d'écrire les comparaisons, additions ou conversions.
Entiers non signés
Le codage non signé représente uniquement des valeurs positives.
| Largeur | Plage |
|---|---|
| 4 bits | 0 à 15 |
| 8 bits | 0 à 255 |
| 16 bits | 0 à 65 535 |
En VHDL, on utilise unsigned pour rendre l'intention explicite :
signal counter : unsigned(7 downto 0);
counter <= counter + 1;Si counter vaut 255, l'incrément suivant revient à 0 sur 8 bits. Ce retour à zéro n'est pas une anomalie : c'est un dépassement modulo 256.
Complément à deux
Le complément à deux est le codage signé le plus utilisé. Sur N bits, la plage est :
-2^(N-1) à +2^(N-1)-1| Largeur | Plage signée |
|---|---|
| 4 bits | -8 à +7 |
| 8 bits | -128 à +127 |
| 16 bits | -32 768 à +32 767 |
Pour obtenir l'opposé d'un nombre :
- inverser tous les bits ;
- ajouter
1.
Exemple sur 4 bits :
+3 = 0011
NOT = 1100
+1 = 1101 donc -3En VHDL :
signal a, b, y : signed(7 downto 0);
y <= a - b;Le type signed permet au synthétiseur et au lecteur de comprendre que le MSB est un bit de signe.
Extension de taille
Avant une addition ou une soustraction, il faut parfois élargir les opérandes pour garder le résultat.
Pour un non signé, on ajoute des zéros à gauche :
1010₂ sur 4 bits devient 01010₂ sur 5 bitsPour un signé en complément à deux, on propage le bit de signe :
0010₂ (+2) devient 00010₂
1010₂ (-6) devient 11010₂En VHDL, utilisez resize avec le bon type :
signal a8 : signed(7 downto 0);
signal y12 : signed(11 downto 0);
y12 <= resize(a8, y12'length);La plupart des erreurs de codage signé viennent d'une extension incorrecte ou d'un mélange silencieux entre std_logic_vector, signed et unsigned.
Code Gray
Le code Gray change un seul bit entre deux valeurs consécutives. Il est utile quand une valeur est lue pendant une transition mécanique ou asynchrone.
| Décimal | Binaire | Gray |
|---|---|---|
| 0 | 000 | 000 |
| 1 | 001 | 001 |
| 2 | 010 | 011 |
| 3 | 011 | 010 |
| 4 | 100 | 110 |
| 5 | 101 | 111 |
| 6 | 110 | 101 |
| 7 | 111 | |
Exemples d'usage :
- encodeur rotatif ;
- mesure de position ;
- pointeurs de FIFO asynchrone ;
- passage d'information entre deux domaines d'horloge.
L'intérêt est de réduire le risque de lire une valeur intermédiaire incohérente quand plusieurs bits changeraient en même temps.
BCD
Le BCD (binary coded decimal) code chaque chiffre décimal sur 4 bits.
12₁₀ = 0001 0010 en BCD
12₁₀ = 0000 1100 en binaire purLe BCD est moins compact que le binaire pur, mais il simplifie les interfaces orientées affichage : afficheurs 7 segments, saisie décimale, montres, compteurs visibles par l'utilisateur.
Attention : en BCD, les codes 1010 à 1111 ne représentent pas des chiffres décimaux valides.
Le BCD 8421 est un code pondéré : chaque position possède un poids fixe.
| Bit | Poids |
|---|---|
| b3 | 8 |
| b2 | 4 |
| b1 | 2 |
| b0 | 1 |
Par exemple, 0101 vaut 4 + 1 = 5.
Excess-3
Le code Excess-3 est un autre codage décimal sur 4 bits. On ajoute 3 au chiffre décimal, puis on code le résultat en binaire naturel.
| Chiffre | +3 | Excess-3 |
|---|---|---|
| 0 | 3 | 0011 |
| 1 | 4 | 0100 |
| 5 | 8 | 1000 |
| 9 | 12 | 1100 |
Il n'est pas plus compact que le BCD, mais il apparaît dans certains cours car il illustre qu'un mot de 4 bits peut porter une convention différente du binaire naturel.
Parité
Un bit de parité ajoute une information minimale pour détecter certaines erreurs de transmission ou de stockage.
Avec une parité paire, le nombre total de bits à 1 doit être pair. En pratique, le XOR de tous les bits protégés et du bit de parité doit valoir 0.
Exemple :
données : 1011 (3 bits à 1)
parité paire : 1
mot protégé : 1011 1 (4 bits à 1)Une parité simple détecte une erreur sur un nombre impair de bits, mais elle ne dit pas quel bit est faux. Elle ne corrige donc pas l'erreur à elle seule.
Hamming (7,4)
Le code Hamming (7,4) protège 4 bits de données avec 3 bits de parité. Il produit un mot de 7 bits capable de corriger une erreur simple.
Dans la convention classique, les positions puissances de deux portent les parités :
| Position | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| Rôle | P1 | P2 | D1 | P4 | D2 | D3 | D4 |
Au décodage, on recalcule les équations de parité. Le résultat s'appelle le syndrome :
- syndrome
0: aucune erreur simple détectée ; - syndrome non nul : position du bit probablement erroné ;
- correction : inverser le bit indiqué par le syndrome.
Sans bit de parité globale supplémentaire, un Hamming (7,4) classique ne corrige pas deux erreurs et ne les détecte pas toujours proprement. Avec une parité globale, on obtient une logique de type SECDED : correction d'une erreur simple, détection d'une erreur double.
Choisir le codage
| Besoin | Codage recommandé |
|---|---|
| Compteur, adresse, taille | unsigned |
| Calcul avec valeurs positives et négatives | signed en complément à deux |
| Position lue pendant une transition | Gray |
| Affichage décimal direct | BCD |
| Détection d'erreur simple | Parité |
| Correction d'une erreur simple | Hamming |
| Masques, flags, trames | std_logic_vector |
Un bon design indique clairement le codage dans les noms, les types et les commentaires utiles. Cela évite les conversions implicites et rend les simulations plus lisibles.
📝 Tester mes connaissances - Quiz du chapitre