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Ă©.

ABCS
0000
0101
1001
1110

Nous allons d’abord dĂ©terminer lorsque l’addition vaut $1$

Deux cas émergent:

ABS
000
011
101
110

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.

ABC
000
010
100
111

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é.

AB$A \wedge B$
000
010
100
111

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.

AB$\overline{A \wedge B}$
001
011
101
110

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é.

AB$A + B$
000
011
101
111

Porte XOR

Mais nous ce qu’on cherche c’est cette table ci:

AB$S = A \oplus B$
000
011
101
110

Si ont réfléchi un peu ont peu écrire

$$ S = (A \wedge \overline{B}) \vee (\overline{A} \wedge B) $$

Autrement dit :

En bidouillant grñce à l’algùbre de Boole et la loi de De Morgan.

AlgĂšbre de Boole

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 Morgan

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.

AB$A \vee B$$\overline{A \wedge B}$$(A \vee B) \vee (\overline{A \wedge B}) = A \oplus B$
00010
01111
10111
11100

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}$AB$C_{out}$S
00000
00101
01001
01110
10000
10110
11010
11111

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}$AB$S’=A \oplus B$$C_1 = A \wedge B$$C_2 = S’ \wedge C_{in} $$C_{out}$
0000000
0011000
0101000
0110101
1000000
1011011
1101011
1110101

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}$AB$C_{out}$
0000
0010
0100
0111
1000
1011
1101
1111

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) $$

AlgĂšbre de Boole

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

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} $$

AlgĂšbre de Boole

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} $$

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 ❀