Additionneur binaire
Lecture 14 min. âą
Bonjour Ă toutes et Ă tous đ
Additionner deux nombres, câest quelque chose dâassez simple, on lâapprend dĂšs le CP. Soit on le fait de tĂȘte, soit sur ses doigts soit on pose lâaddition sur papier.
JusquâĂ ce que les nombres soient trop grands ou que lâon ait la flemme de faire le calcul, on prend la calculette qui fait lâopĂ©ration Ă notre place.
Mais vous ne vous ĂȘtes jamais demandĂ© comment elle arrivait Ă faire le calcul ?
Moi, si, et comme dâhabitude, on va aller beaucoup trop loin. đ
Addition binaire
Avant dâautomatiser, il faut comprendre et analyser.
La premiĂšre chose Ă savoir câest quâun nombre aussi simple que $2$ est dĂ©jĂ compliquĂ© pour un ordinateur, ou plutĂŽt il ne reprĂ©sente rien de physique.
Câest nous qui lâinterprĂ©tons comme un $2$, la machine, elle ne sait pas ce que câest.
Pour lui permettre de comprendre, nous devons parler sa langue, le binaire et représenter notre $2$ dans sa langue.
Ainsi notre addition

est représentée en binaire par

Les rĂšgles de lâaddition en binaire sont comme suit

On remarque que $1 + 1 = 10$ et non $2$
On pose alors en suivant les rĂšgles de lâaddition apprise au CP.

JusquâĂ arriver au cas oĂč les deux Ă©lĂ©ments de la colonne sont des $1$.
On pose alors la retenu.

Que lâon fait redescendre dans le rĂ©sultat.

Si on fait la conversion de bases.
$$1011_{2} = 11_{10}$$
Note
$X_n$ signifie $X$ en base $n$.
Donc $11_{10}$ veut dire $11$ en base $10$, notre base de tous les jours
Or $5 + 6 = 11$
On retombe sur nos pattes đ
Table de vérité
Maintenant comment faire la mĂȘme que lâon a fait mais avec un ordinateur.
Dâabord, nous allons nous occuper de lâaddition que dâune seule colonne.
Voici les différentes additions possible avec 1 bit.
Note
$C$ pour carry en anglais ou âretenuâ.

On regroupe ça dans un tableau que lâon nomme table de vĂ©ritĂ©.
A | B | C | S |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 |
Nous allons dâabord dĂ©terminer lorsque lâaddition vaut $1$
Deux cas émergent:
A | B | S |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Ce que nous dit le tableau est que pour avoir un $1$, il faut que $A = 1$ ou $B = 1$ mais pas les deux ensemble.
On appelle ceci un OU EXCLUSIF ou XOR.
Et on note $A \oplus B = S$
Le second Ă©lĂ©ment que lâon dĂ©sire obtenir est la retenu.
A | B | C |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Ici, une seule maniĂšre dâobtenir un $1$ : $A =1$ et $B = 1$.
Il sâagit dâun ET Logique ou AND.
Et on note $ A \wedge B = C$
Portes logiques
Ok maintenant que lâon sait ce que lâon fait faire au systĂšme, il faut construire le cĂąblage qui le rĂ©alise.
Transistor
On part de la base de lâelectronique moderne : le transistor.
Il y a mille choses Ă en dire, mais nous allons nous contenter du minimum syndical.

$A$ est lâentrĂ©e et $S$ la sortie.
On applique du jus en âhautâ, on appelle ça un Ă©tat logique â1â. Ici signifiĂ© par le 5V rouge.
Et on met à la masse le bas séparé par une résistance pour que $S$ ne vaille pas 0 en permanence.
Lorsque $A = 0$, nous sommes en Ă©tat logique â0â.

Le transistor est affilié à un fil ouvert. $S = 0$
Lorsque $A = 1$, nous sommes en Ă©tat logique â1â.

Le transistor est affilié à un fil ouvert. $S = 1$
Félicitation, vous avez créé un fil !!!
Porte AND
Voyons pour rendre cela plus intéressant.
Si lâon prend 2 transistors, nous pouvons construire quelque chose comme ceci.

Si on joue avec les entrées

Nous avons bien quelque chose qui impose que les deux transistors soit passant pour que la sortie soit Ă â1â.
On peut récapituler ça dans une table de vérité.
A | B | $A \wedge B$ |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
On en fait une boĂźte qui a ce symbole.

Porte NAND
On peut également inverser le résultat.

Remarquez le rond Ă la gauche du symbole, cela signifie que lâon inverse la sortie, le $0$ donne $1$ et inversement.
Dans les formules cette négation devient une barre horizontale.
A | B | $\overline{A \wedge B}$ |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Porte OR
Et Ă©galement faire une alternative entre les entrĂ©es, lâune, lâautre ou les deux.
Voici le montage, ainsi que les variations de sorties en fonctions des entrées et le symbolce de la porte OR.

On note cette relation de OU : $S = A \vee B$
Et voici sa table de vérité.
A | B | $A + B$ |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Porte XOR
Mais nous ce quâon cherche câest cette table ci:
A | B | $S = A \oplus B$ |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Si ont réfléchi un peu ont peu écrire
$$ S = (A \wedge \overline{B}) \vee (\overline{A} \wedge B) $$
Autrement dit :
- $A = 1$ et $B = 0$
- $A = 0$ et $B = 1$
En bidouillant grĂące Ă lâalgĂšbre de Boole et la loi de De Morgan. On triche avec $$ X \wedge \overline{X} = 0 $$ Ce qui permet dâĂ©crire $$ S = (A \wedge \overline{A}) \vee (A \wedge \overline{B}) \vee (\overline{A} \wedge B) \vee (B \wedge \overline{B}) $$ On utilise lâitentitĂ© remarquable qui nous donne $$S = (A \vee B) . (\overline{A} \vee \overline{B})$$ Par de De MorganAlgĂšbre de Boole
On finit par atterir sur:
$$S = (A \vee B) . (\overline{A \wedge B})$$
Que lâon cable en

En faisant varier les entrĂ©es, nous avons bien ce que lâon dĂ©sire.
A | B | $A \vee B$ | $\overline{A \wedge B}$ | $(A \vee B) \vee (\overline{A \wedge B}) = A \oplus B$ |
---|---|---|---|---|
0 | 0 | 0 | 1 | 0 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 1 | 1 | 1 |
1 | 1 | 1 | 0 | 0 |
Voici son symbole:

Nous sommes ainsi capable de calculer la somme de deux bits ! đ
Enfin presque il manque la retenu.
Mais comme $ C = A \wedge B$, la porte AND suffit. đ
Half Adder
Nous allons pouvoir construire ce que lâon nomme un demi-additionneur.
Son rĂŽle est de calculer le rĂ©sultat de lâaddition et de lâĂ©ventuelle retenue.
Nous avons ainsi ces deux équations logiques :
$$ \begin{cases} S = A \oplus B\space(somme) \newline C = A \wedge B \space (retenue) \end{cases} $$
Que lâon cable en:

On enferme alors ce montage dans une boĂźte.

Que lâon peut alors alimenter pour voir son comportement

Cool ! đ
Full Adder
Par contre, on ne gĂšre pas un des cas.
Lorsquâune retenue vient dâune addition prĂ©cĂ©dente.

Notre nouvelle table de vérité devient
$C_{in}$ | A | B | $C_{out}$ | S |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
On peut alors se dire que ce nâest quâune addition de 3 nombres

Que lâon casse en deux additions successives.

Quâon peut alors cĂąbler

La question est maintenant de savoir comment combiner les retenues.
On sait que $C_{out} = C_1 \space ??? \space C_2$
Plus quâĂ dĂ©terminer $???$
$C_{in}$ | A | B | $Sâ=A \oplus B$ | $C_1 = A \wedge B$ | $C_2 = Sâ \wedge C_{in} $ | $C_{out}$ |
---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 0 | 0 | 0 |
0 | 1 | 1 | 0 | 1 | 0 | 1 |
1 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 1 | 0 | 1 |
Il en ressort quâun simple OU suffit, donc:
$$C_{out} = C_1 \vee C_2$$

On peut alors faire varier les entrĂ©es en fixant la retenue prĂ©cĂ©dente Ă â1â.

Nickel tout marche ! đ€©
Allez vite on empacte ! đŠ

Je mets exprÚs les retenues sur le cÎté, ça va nous servir.
RCA
Il est temps de faire notre vraie addition ^^

Je mets les retenues en jaune, pour les expliciter.
Pour rappel, nous avons cette formulation générale.

Nous pouvons passer en représentation binaire

Ce qui peut alors se variabiliser en

Que lâon cable en

Et oui! On chaĂźne tout le monde đ
Chaque bloc est responsable de gérer sa colonne, son bit.
Et propage lâĂ©ventuelle retenue au bloc suivant.
En dynamique cela donne.

On lit alors le résultat de la gauche vers la droite.

On obtient bien le $6_{10} + 5_{10} => 110_2 + 101_2 = 1011_2 => 11_{10}$
Vous nâĂȘtes pas impressionnĂ© parce que la retenue intermĂ©diaire vaut toujours $0$ ?
Ok, essayons $7_{10} + 5_{10} = 12_{10} => 111_2 + 101_2 = ??$

On obtient $1100_2 => 12_{10}$
Câest parfaitâŻ! On sait additionner deux nombres !
On peut alors généraliser à n bits.

Le fait de rĂ©percuter la retenue dâun Ă©tage Ă lâautre, donne son nom Ă ce montage, que nomme Riple Carry Adder.
Ripple car cela fait penser aux ricochets Ă la surface de lâeau. ^^
On peut alors en faire une boßte générale

Elle additionne deux bus de données $A$ et $B$. Et produit un bus $S$ et un signal $C_{out}$ qui si il est a $1$ signifie que le nombre additonné est trop grand pour le bus de sortie.
La largeur du bus conditionne jusquâĂ combien le rĂ©sultat de lâaddition est valide.
CLA
Mais ces ricochets posent des soucis.
Cela prend du temps de propager la retenue dâun Ă©tage Ă lâautre.
Oui parce que je nâen nâest pas trop parlĂ©.
Mais chaque transistor qui compose les portes qui composent les additionneurs prend un certain temps Ă commuter.
Ce qui veut dire que la retenue, mets un certain temps Ă arriver qui correspond aux combinaisons (certains en parrallĂšle dâautre en sĂ©rie) des temps de commutation des transistors.
Donc si on note $T_{a}$ le temps pour obtenir le rĂ©sultat dâun additionneur.
Alors la durée pour obtenir le résultat final est la somme des $T_{a}$
Du coup $T = n * T_a$ oĂč $n$ est les nombres de bits et donc le nombre dâadditionneurs.

On va devoir ĂȘtre plus malin et rĂ©flĂ©chir diffĂ©remment.
Quâest ce qui est parrallĂ©lisable et quâest ce qui ne lâest pas.
$C_{in}$ | A | B | $C_{out}$ |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 0 | 0 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
On sort
$$ C_{out} = (\overline{C_{in}} \wedge A \wedge B) \vee (C_{in} \wedge A \wedge \overline{B}) \vee (C_{in} \wedge \overline{A} \wedge B) \vee (C_{in} \wedge A \wedge B) $$ On peut factoriser. $$ C_{out} = [(A \wedge B) \wedge (C_{in} \vee \overline{C_{in}})] \vee [C_{in} \wedge ((A \wedge \overline{B}) \vee (\overline{A} \wedge B))] $$ Or $$ (A \wedge \overline{B}) \vee (\overline{A} \wedge B) = A \oplus B $$ Et $$C_{in} \vee \overline{C_{in}} = 1$$ donc $$(A \wedge B) \wedge (C_{in} \vee \overline{C_{in}}) = A \wedge B) \wedge 1$$ Or $$X \wedge 1 = X$$ Donc $$ (A \wedge B) \wedge (C_{in} \vee \overline{C_{in}}) = A \wedge B $$AlgĂšbre de Boole
Finalement
$$ C_{out} = C_{in} \wedge ( A \oplus B ) \vee (A \wedge B) $$
On pose alors
$$ \begin{cases} P = A \oplus B\space(propagateur) \newline G = A \wedge B \space (générateur) \end{cases} $$
Si $P$ est vrai la retenue se propage, si $G$ est vrai, la retenue se gĂ©nĂšre, dâoĂč les noms.
On observe que ces deux valeurs sont complÚtement disjointes des retenues et donc parallélisable.
Le gros du travail est alors de déterminer les retenues
Ainsi
$$ C_{out} = (C_{in} \wedge P) \vee G $$
On généralise
$$ \begin{cases} C_{n} = (C_{n-1} \wedge P_n) \vee G_n \newline P_n = A_n \oplus B_n \newline G_n = A_n \wedge B_n \end{cases} $$ Ce qui donne $$ \begin{cases} C_{0} = (C_{-1} \wedge P_0) \vee G_0 \newline C_{1} = (C_{0} \wedge P_1) \vee G_1 \newline C_{2} = (C_{1} \wedge P_2) \vee G_2 \newline \end{cases} $$ Or $C_{-1} = 0$ car il nây a pas de retenu au dĂ©but Donc $C_{0} = P_0 \vee G_0$ On remplace $$\begin{cases} C_{0} = P_0 \vee G_0 \newline C_{1} = ([P_0 \vee G_0] \wedge P_1) \vee G_1 \newline C_{2} = (C_{1} \wedge P_2) \vee G_2 \end{cases} $$ On dĂ©veloppe $$\begin{cases} C_{0} = P_0 \vee G_0 \newline C_{1} = ([P_1 \wedge P_0] \vee [P_1 \wedge G_0]) \vee G_1 \newline C_{2} = (C_{1} \wedge P_2) \vee G_2 \end{cases} $$ On remplace $$\begin{cases} C_{0} = P_0 \vee G_0 \newline C_{1} = [P_1 \wedge P_0] \vee [P_1 \wedge G_0] \vee G_1 \newline C_{2} = [[P_1 \wedge P_0] \vee [P_1 \wedge G_0] \vee G_1] \wedge P_2) \vee G_2 \end{cases} $$AlgĂšbre de Boole
Finalement
$$ \begin{cases} C_{0} = P_0 \vee G_0 \newline C_{1} = [P_1 \wedge P_0] \vee [P_1 \wedge G_0] \vee G_1 \newline C_{2} = [P_2 \wedge P_1 \wedge P_0] \vee [ P_2 \wedge P_1 \wedge G_0] \vee [P_2 \wedge G_1] \vee G_2 = C_{out} \end{cases} $$
Cela donne grosso modo ça

Câest le bazar, hein ? đ€Ł
On va mettre tout ça dans une boĂźte et ne plus y penser đ
Lâimportant, câest que lâon a les retenues de tous les Ă©tages sans propagation.
Donc, il suffit de brancher notre additionneur de 1 bit Ă la boĂźte magique.

On a donc un systÚme qui est capable de nous donner $S$ sans avoir à attendre les différents étages vu que tout se fait en parrallÚle.
Merci la black magic de la boĂźte. đ
Vous venez de créer un Carry Look Ahead, prévision de retenue.
Attention
Mais attention, plus la boßte est compliqué plus le temps de générations des retenues devient grand, et peut si on a beaucoup de bits et donc de retenues à calculer dépasser le temps de propagation du RCA.
En effet, les Ă©quations deviennent de plus en plus compliquĂ© je vous laisse faire $C_{32}$ đ
Conclusion
Oui additionner des nombres, ce nâest pas de la tarte ^^
Merci de votre lecture â€ïž