Codages binaires
Non signé, complément à deux, code Gray et BCD : 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.
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 |
| 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