Un processeur additionne avec des portes
Un additionneur est un circuit qui additionne deux nombres écrits en binaire. Un processeur en contient plusieurs, et chacun répète le même petit bloc, colonne après colonne.
Quand vous calculez 5 + 9 à la main, vous posez une retenue. Le circuit fait exactement la même chose, avec des bits.
À la fin de cette leçon
Remarque
Je peux construire un additionneur complet à partir de deux demi-additionneurs.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Somme | le bit qui reste dans la colonne | 1 + 1 donne 0 |
| Retenue | le bit qui passe à la colonne de gauche | 1 + 1 donne 1 |
| Demi-additionneur | additionne deux bits et rend une somme et une retenue | |
| Additionneur complet | additionne trois bits : deux bits et une retenue entrante | |
| Retenue entrante | la retenue venue de la colonne de droite |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un demi-additionneur additionne deux bits
Additionner deux bits donne 0, 1 ou 2. Le nombre 2 s’écrit 10 en binaire : un bit ne suffit pas, il en faut deux.
La somme est le bit de droite. C’est un OU exclusif. La retenue est le bit de gauche. C’est un ET. Le circuit s’appelle « demi » parce qu’il ne sait pas recevoir une retenue de la colonne voisine.
Exemple travaillé : le demi-additionneur
| a | b | Retenue (a ET b) | Somme (a OU exclusif b) | Valeur |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 + 0 = 0 |
| 0 | 1 | 0 | 1 | 0 + 1 = 1 |
| 1 | 0 | 0 | 1 | 1 + 0 = 1 |
| 1 | 1 | 1 | 0 | 1 + 1 = 2, soit 10 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Aller dans le dossier de travail
cd ~/hdlAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire les calculs du fichier donné
grep -n assign half_adder.vAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un additionneur complet ajoute aussi la retenue entrante
Dans une colonne au milieu d’un nombre, on additionne trois bits : a, b et la retenue venue de la droite. Le total va de 0 à 3, soit 11 en binaire. Il reste deux bits à rendre, la somme et la retenue sortante.
On l’obtient avec deux demi-additionneurs et une porte OU. Le schéma ci-dessous montre les branchements.
La retenue voyage de droite à gauche
Pour additionner des nombres de plusieurs bits, on chaîne des additionneurs complets, un par colonne. La retenue sortante de chaque colonne devient la retenue entrante de la suivante.
Le tableau suit le calcul de 5 + 3, soit 0101 + 0011, de la droite vers la gauche.
Exemple travaillé : 0101 + 0011
| Colonne | a | b | Retenue entrante | Somme | Retenue sortante |
|---|---|---|---|---|---|
| Bit 0 | 1 | 1 | 0 | 0 | 1 |
| Bit 1 | 0 | 1 | 1 | 0 | 1 |
| Bit 2 | 1 | 0 | 1 | 0 | 1 |
| Bit 3 | 0 | 0 | 1 | 1 | 0 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Verilog sait additionner d’un seul signe
Dans un vrai projet, on n’écrit pas chaque colonne. Le signe + décrit un additionneur, et l’outil construit les portes.
Le module somme4 additionne deux nombres de 4 bits. Son résultat a 5 bits : quatre pour la somme et un pour la retenue sortante.
Un additionneur de 4 bits avec +
module somme4(input [3:0] a, input [3:0] b,
output [3:0] s, output cout);
// L addition de deux nombres de 4 bits donne 5 bits :
// les 4 bits de la somme et une retenue de sortie.
assign {cout, s} = a + b;
endmodule
Écrire somme4.v
printf 'module somme4(input [3:0] a, input [3:0] b, output [3:0] s, output cout);\n assign {cout, s} = a + b;\nendmodule\n' > somme4.vAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire son banc de test
printf 'module somme4_tb;\n reg [3:0] a, b;\n wire [3:0] s;\n wire cout;\n somme4 dut(.a(a), .b(b), .s(s), .cout(cout));\n initial begin\n a = 5; b = 9; #1 $display("%%0d + %%0d = %%0d, retenue %%b", a, b, s, cout);\n a = 9; b = 9; #1 $display("%%0d + %%0d = %%0d, retenue %%b", a, b, s, cout);\n a = 15; b = 1; #1 $display("%%0d + %%0d = %%0d, retenue %%b", a, b, s, cout);\n end\nendmodule\n' > somme4_tb.vAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compiler les deux fichiers
iverilog -o /tmp/somme4 somme4.v somme4_tb.vAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lancer la simulation
vvp /tmp/somme4Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Erreur fréquente
Attention
Beaucoup de gens pensent que 9 + 9 sur quatre bits donne 18. Quatre bits ne vont que de 0 à 15. Le résultat est 2 avec une retenue sortante de 1 : le 1 de la retenue est le bit qui manque. Ne jetez jamais la retenue du dernier rang.
Pour aller plus loin
Dans le labo, full_adder.v vous attend avec un banc de test, full_adder_tb.v. Vous pouvez maintenant l’écrire avec deux demi-additionneurs et un OU.
Avant de simuler, remplissez sur papier la table des huit lignes. Comparez ensuite avec ce que votre module affiche.