Section 2.6

Additionneurs

Dans cette section, nous allons voir comment concevoir des circuits qui effectuent des opérations arithmétiques, et plus particulièrement des additions.

Pour cela, nous allons nous baser sur la notation binaire des nombres entiers, un sujet que nous avons abordé dans la section précédente. Nous utiliserons aussi la technique de l'addition en colonne vue lors de cette même section.

1 + 1 = 10

Nous allons commencer par un circuit capable de réaliser l'opération d'additionner deux nombres binaires de 1 bit chacun. Concrètement, nous allons concevoir un circuit qui permet de calculer 0 + 0, 0 + 1, 1 + 0 et 1 + 1. Nous appellerons ce circuit un demi-additionneur.

Demi-additionneur

Le demi-additionneur est un circuit à deux entrées et deux sorties. Les deux entrées sont les deux bits à additionner, et les deux sorties sont le résultat de l'addition. On est en effet obligé d'avoir deux sorties car le résultat de l'addition peut valoir deux (1 + 1), qui est représenté en base 2 par deux bits, à savoir 10.

Avant toute chose, regardons la table de vérité que l'on souhaite obtenir pour ce circuit.

Les deux colonnes de gauche correspondent aux deux entrées du circuit. Ensemble, elles représentent les deux bits à additionner. Les deux colonnes de droite correspondent aux deux sorties du circuit. Ensemble, elles forment le résultat de l'addition. La colonne C correspond au bit de poids 2 et la colonne S correspond au bit de poids 1.

! Remarque

On appelle la première colonne C car elle correspond à la retenue (carry en anglais) pour la colonne suivante dans le contexte d'une addition en colonne. Quant au nom S, il fait référence à somme.

En observant suffisamment longtemps cette table de vérité, on peut remarquer que la colonne C correspond à l'opération ET entre les deux entrées A et B, et que la colonne S correspond à l'opération OU-X (ou exclusif) entre ces deux même entrées A et B.

Nous pouvons donc concevoir le circuit suivant qui correspond à cette table de vérité.

À essayer

Essayez de changer les valeurs des entrées A et B et vérifiez que les valeurs aux sorties C et S correspondent bien à celles indiquées dans la table de vérité.

Ce circuit implémente une fonctionnalité intéressante et présente déjà une certaine complexité. Pour gérer cette complexité, nous allons faire un mouvement d'abstraction et créer un nouveau composant qui encapsule ce circuit. Ce composant sera appelé un demi-additionneur et pourra être réutilisé très facilement dans d'autres circuits. On représente schématiquement un demi-additionneur de la façon suivante :

À essayer

Essayez de changer les valeurs des entrées A et B dans le circuit ci-dessous et vérifiez que les valeurs correspondent bien à celles attendues.

Le demi-additionneur, bien que très utile, ne permet pas de faire l'addition de nombres binaires plus grands que 1 bit. Pour réaliser cela, il nous faudra considérer un circuit plus complexe, qui sera basé sur la méthode de l'addition en colonne. En vue de concevoir ce circuit, nous allons d'abord nous intéresser à la façon dont on peut additionner non pas deux bits, mais trois bits. Ce troisième bit permettra de prendre en compte la retenue de l'addition précédente dans le processus d'addition en colonne. On appelle ce circuit un additionneur complet.

Additionneur complet

L'additionneur complet est un circuit à trois entrées et deux sorties. Les trois entrées sont les trois bits à additionner, et les deux sorties sont le résultat de l'addition. Le maximum que l'on peut obtenir en additionnant trois bits est trois, qui est représenté sur deux bits.

Voici la table de vérité que l'on souhaite obtenir pour ce circuit. Pour chaque ligne, les deux colonnes de droite correspondent au résultat de l'addition des trois bits des colonnes de gauche.

Le nom Cin est l'abréviation de carry in, qui signifie retenue d'entrée en anglais. En effet, ce troisième bit d'entrée correspond souvent à l'usage à la retenue de l'addition précédente. De la même façon, le nom Cout est l'abréviation de carry out, qui signifie retenue de sortie. Ce bit correspond à la retenue pour la colonne suivante lors de l'addition en colonne.

Le circuit suivant correspond à la table de vérité ci-dessus. Le circuit est un peu plus complexe que le demi-additionneur. On compte ici un total de cinq portes logiques.

À essayer

Essayez de changer les valeurs des entrées A, B et Cin et vérifiez que les valeurs aux sorties Cout et S correspondent bien à celles indiquées dans la table de vérité.

À nouveau, comme ce circuit est très utile mais un peu complexe, nous allons en faire un composant que nous pourrons réutiliser à guise dans d'autres circuits. On appelle ce nouveau composant l'additionneur complet et on le représente par le symbole suivant :

À essayer

Essayez de changer les valeurs des entrées A, B et Cin et vérifiez que les valeurs aux sorties Cout et S correspondent bien à celles attendues dans le circuit ci-dessous.

La disposition un peu particulière des entrées et sorties de ce composant est due au fait que nous allons l'utiliser, en plusieurs exemplaires, dans un circuit plus complexe. Cette disposition permettra de mieux visualiser les connexions entre les différents composants.

Additionneur 4 bits

Équipés de l'additionneur complet, nous pouvons maintenant nous attaquer à un circuit plus complexe : un circuit qui réalise l'addition entre deux nombres représentés chacun sur 4 bits. On parle dans ce cas d'un additionneur 4 bits.

! Remarque

Bien que nous allons regarder le cas particulier d'un additionneur 4 bits, il est possible de généraliser la méthode à n'importe quel nombre de bits.

Pour réaliser l'addition entre deux nombres sur 4 bits, nous allons réaliser un circuit qui réalise une addition en colonne. Pour chaque colonne, nous allons utiliser un additionneur complet pour réaliser l'addition. Le circuit complet est représenté ci-dessous :

L'addition procède colonne par colonne, depuis la droite. Pour chaque colonne, un composant additionneur complet est utilisé pour réaliser l'addition entre les deux bits de même poids de chaque nombre et le bit de retenue issu de la colonne précédente.

À essayer

Essayez de modifier les valeurs des entrées A et B afin de vérifier que les valeurs aux sorties S correspondent bien à l'addition de A et B.

Que constatez-vous si vous essayez de faire une addition dont le résultat dépasse la plus grande valeur possible représentable sur 4 bits (c'est-à-dire 15) ? Essayez par exemple d'additionner 15 (1111) et 15 (1111), 10 (1010) et 7 (0111), ou encore 15 (1111) et 1 (0001). Que se passe-t-il ?

Dépassement de capacité

Dans le circuit ci-dessus, le résultat de l'addition est représenté sur 4 bits, tout comme les deux nombres d'entrée. Or, il est possible que le résultat de l'addition dépasse la plus grande valeur représentable sur 4 bits, c'est-à-dire 15. Dans ce cas, le résultat est un petit peu surprenant. Ce phénomène est appelé dépassement de capacité. Essayons d'en comprendre la raison.

La raison pour laquelle le résultat de l'addition est parfois erroné est que la valeur de la retenue de sortie pour la colonne tout à gauche n'est pas prise en compte dans le résultat. La valeur de la retenue de sortie pour la colonne tout à gauche est donc perdue. Lorsque cette retenue est égale à 1, la valeur qu'elle représente (16) n'est pas prise en compte dans le résultat. On obtient donc un résultat 16 de moins que le résultat attendu.

! Remarque

L'opération effectuée par l'additionneur 4 bits peut être interprétée comme l'addition modulo 16. L'opération modulo 16 consiste à prendre le reste de la division entière par 16. Le résultat est donc toujours compris entre 0 et 15.

Il est légitime de se poser la question « Pourquoi ne pas simplement utiliser un bit de plus pour le résultat ? ». En effet, si nous utilisions 5 bits pour représenter le résultat, nous pourrions représenter fidèlement le résultat de l'addition de deux nombres sur 4 bits.

La réponse à cette question est assez subtile. Dans un ordinateur, le résultat d'une addition pour être stocké et utilisé par la suite dans d'autres opérations, comme par exemple d'autres additions. Si nous utilisions 5 bits pour représenter le résultat, il faudrait également utiliser 5 bits pour représenter les nombres d'entrée. Dans ce cas là, il faudrait 6 bits de sortie pour représenter le résultat de l'addition de deux nombres sur 5 bits. Et ainsi de suite.

Il se trouve que dans l'architecture d'un ordinateur, on travaillera généralement avec des nombres entiers encodés sur un nombre fixe de bits, par exemple 32 bits ou 64 bits. Ce grand nombre de bits permet de représenter des nombres très grands généralement sans risquer de dépassement de capacité.

Le dépassement de capacité, bien que parfois problématique, peut aussi être utilisé de manière astucieuse pour réaliser des opérations arithmétiques plus complexes, comme nous allons le voir dans la section suivante.

! À maîtriser

Avant de poursuivre, assurez-vous de pouvoir :

  • Expliquer ce qu'est un demi-additionneur et un additionneur complet.
  • Expliquer le fonctionnement interne d'un demi-additionneur et d'un additionneur complet.
  • Reconnaître les schémas d'un demi-additionneur et d'un additionneur complet dans un circuit.
  • Déterminer la valeur des sorties d'un demi-additionneur et d'un additionneur complet en fonction des valeurs des entrées.
  • Concevoir un circuit pour réaliser une addition sur un nombre fixe mais arbitraire de bits à l'aide d'un enchaînement additionneurs complets.
  • Expliquer ce qu'est un dépassement de capacité.