3. Additionneur

On a découvert quelques portes logiques ainsi que la possibilité de les connecter pour en faire des circuits logiques plus complexes. Ces portes logiques vont maintenant permettre de réaliser l’additionneur annoncé en début de chapitre précédent.

On rappelle qu’on a deux bits de sortie à calculer pour la sortie \(S = A + B\). \(S\) est donc constitué de \(S_0\), le bit des unités, et de \(S_1\), le bit représentant la valeur décimale 2. On rappelle ici la table de vérité pour \(S_0\), tirée directement du chapitre précédent :

\(A\)

\(B\)

\(S_0\)

0

0

0

1

0

1

0

1

1

1

1

0

En comparant cette table de vérité avec celles des portes logiques, on se rend compte que \(S_0\) n’est autre qu’un OU-X (OU exclusif) de \(A\) et \(B\).

La table de vérité pour \(S_1\) est :

\(A\)

\(B\)

\(S_1\)

0

0

0

1

0

0

0

1

0

1

1

1

Et on constate que \(S_1\) n’est autre qu’un ET logique de \(A\) et \(B\). On peut dessiner l’additionneur de deux bits ainsi :

Exercice 1

Vérifiez que ce circuit livre bien les bonnes valeurs de sortie qui correspondent aux tables de vérité ci-dessous. Combien de combinaisons différentes devrez-vous tester ?

3.1. Additionneur complet

Le circuit précédent est particulièrement intéressant, car il montre qu’il est possible d’utiliser des opérateurs logiques pour réaliser l’opération arithmétique de l’addition. L’additionneur est limité: en fait, on l’appelle un demi-additionneur. Il n’est capable d’additionner que deux bits — c’est très limité. En fait, il serait intéressant d’avoir un additionneur de trois bits. Pourquoi ? À cause de la manière dont on pose les additions en colonnes.

Lorsqu’on additionne deux nombres à plusieurs chiffres, que ce soit en base 10 ou en base 2, on commence par la colonne de droite, les unités. On connait le concept de retenue: en base 10, si l’addition des unités dépasse 9, on retient 1 dans la colonne des dizaines. En base 2, de façon similaire, si l’addition des unités dépasse… 1, on retient 1 dans la colonne suivante à gauche. C’est ce qu’on a fait avec le demi-additionneur: on peut considérer que la sortie \(S_0\) représente la colonne des unités dans la somme, et la sortie \(S_1\) représente la retenue à prendre en compte dans la colonne suivante.

C’est ici que ça se complique : pour additionner les chiffres de la deuxième colonne, on doit potentiellement additionner trois chiffres, et plus seulement deux. On a donc, en entrée, les deux bits \(A\) et \(B\) qui viennent des nombres à additionner, et aussi potentiellement cette retenue qui vient de la colonne des unités, qu’on appellera \(C_{in}\) (pour carry, « retenue » en anglais). Ceci est vrai en base 2 comme en base 10. Il faut donc un additionneur plus puissant, à trois entrées, pour prendre en compte cette retenue. Il s’appelle additionneur complet et livrera deux sorties : le bit de somme, appelé simplement \(S\), et la retenue à reporter pour la colonne suivante, appelée \(C_{out}\).

Exercice 2 : bases de l’additionneur complet

  • Déterminez combien de combinaisons différentes sont possibles pour trois signaux d’entrée \(A\), \(B\) et \(C_{in}\) qui chacun peuvent valoir soit 1 soit 0.

  • Listez toutes ces combinaisons.

  • Pour chaque combinaison, déterminez la valeur binaire qui est la somme des trois signaux d’entrée.

  • Finalement, avec les informations ainsi obtenues, complétez la table de vérité d’un additionneur complet qui a deux sorties \(S\) et \(C_{out}\)

En faisant pour l’instant abstraction des détails d’un additionneur complet, on peut se dire qu’on le dessine simplement ainsi :

3.2. Chaînage d’additionneurs

La flexibilité de ce composant fait qu’on peut maintenant facilement l’utiliser pour construire un circuit qui additionne deux nombres \(A\) et \(B\) à 2 bits chacun (donc de \(0 + 0 = 0\) à \(3 + 3 = 6\)).

Si \(A\) est formé de deux bits \(A_0\) et \(A_1\) et que \(B\) est formé des deux bits \(B_0\) et \(B_1\) et avec une sortie \(S\) sur trois bits \(S_0\), \(S_1\) et \(S_2\), on a :

L’additionneur de droite, comme précédemment, additionne les deux bits des unités : \(A_0\) et \(B_0\). Son entrée \(C_{in}\), qui représente l’éventuel troisième chiffre à additionner issu d’une retenue, n’est pas connectée et est toujours 0, vu qu’il n’y a aucune colonne précédente dans l’addition qui aurait pu en livrer une. Il livre comme première sortie \(S_0\), le chiffre des unités, et sa seconde sortie \(C_{out}\) est la retenue à utiliser pour l’addition des chiffres suivants. C’est pourquoi elle est connectée à l’entrée de la retenue du second additionneur \(C_{in}\), qui va lui ajouter également les deux bits de la colonne suivante, \(A_1\) et \(B_1\). Les sorties du second additionneur livrent le deuxième bit \(S_1\) de la valeur de sortie, ainsi que la retenue pour la troisième colonne. Comme il n’y a plus de bits d’entrée pour la troisième colonne, cette retenue peut directement être considérée comme le troisième bit de sortie \(S_2\).

Exercice 3 : limite de cet additionneur à 2 bits

Avec l’additionneur ci-dessus, est-il possible d’obtenir des 1 sur toutes les sorties, donc d’avoir \(S_2 = S_1 = S_0 = 1\) ?

Exercice 4 : additionneur de demi-octets

En connectant des additionneurs complets, réalisez un circuit qui additionne deux nombres \(A\) et \(B\) de quatre bits, numérotés \(A_0\) à \(A_3\) et \(B_0\) à \(B_3\), respectivement. Combien de bits de sortie doit-il y avoir pour traiter toutes les valeurs possibles ?

Les entrées sont déjà disposées. Glissez autant d’additionneurs et de bits de sortie que nécessaire et connectez les composants du circuit.

Cet exercice démontre l’opportunité de penser en termes modulaires, ce qui revient souvent en informatique. Ici, on a réalisé qu’un additionneur complet résout un sous-problème bien défini d’une addition générale d’un nombre à \(n\) bits, et qu’une fois qu’on a créé un tel additionneur, il suffit d’en connecter plusieurs les uns derrière les autres de manière structurée pour additionner des nombres plus grands.

Exercice 5 : overflow

Le schéma ci-dessous montre le même additionneur de demi-octets de l’exercice précédent, mais, de plus, la valeur en base 10 de ses 4 bits d’entrée pour \(A\) et pour \(B\) est affichée avec un module d’affichage spécial à droite. La même chose est faite pour représenter la valeur \(S = A + B\) (mais seulement sur les quatre premiers bits de \(S\)). Actuellement, le circuit effectue le calcul \(0 + 0 = 0\).

Réglez les entrées du circuit de manière à lui faire effectuer les additions suivantes, et vérifiez le résultat. Dans quelles circonstances est-il correct et pourquoi est-il de temps en temps incorrect ? Comment, en regard de ceci, interpréter le bit de sortie \(S_4\), qui est la retenue de l’additionneur de gauche ?

  1. \(1 + 0\)

  2. \(3 + 1\)

  3. \(3 + 3\)

  4. \(10 + 5\)

  5. \(14 + 1\)

  6. \(14 + 2\)

  7. \(15 + 15\)

Exercice 6 : circuit défectueux

L’additionneur de demi-octets ci-dessous a été endommagé et ne fonctionne plus correctement. Par exemple, lorsqu’on lui demande d’effectuer le calcul \(11 + 1\), il livre comme réponse \(8\).

Déterminez quel composant est défectueux dans ce circuit et comment il faudrait le réparer. Vous pouvez changer les entrées pour vérifier ce qui ne fonctionne pas.

Exercice 7 : design d’un additionneur complet

Note : exercice difficile et actuellement peu guidé ici ; prochainement complété par davantage d’indications.

En s’aidant de la table de vérité d’un seul additionneur complet, créer un circuit logique qui calcule ses sorties \(S\) et \(C_{out}\) en fonction des entrées \(A\), \(B\) et \(C_{in}\).