Soustracteur#

De l'addition à la soustraction#

Nous savons maintenant additionner avec un circuit. Pour soustraire, on pourrait inventer un tout nouveau circuit, avec des "emprunts" à la place des retenues. Mais il existe une idée bien plus économique : transformer la soustraction en addition. En effet, soustraire, c'est ajouter l'opposé :

\[a - b = a + (-b)\]

Il suffit donc de savoir représenter -b en binaire. C'est exactement ce que permet le complément à deux, que vous avez rencontré en 1ère année.

Le complément à deux#

Sur n bits, le complément à deux code un nombre négatif -b par la valeur \(2^n - b\). En pratique, on n'a pas besoin de faire cette soustraction : on obtient -b en deux gestes simples :

  1. inverser tous les bits de b (remplacer chaque 0 par 1 et inversement) : c'est le rôle de la porte NON, et on le note ¬b ;

  2. ajouter 1 au résultat.

Prenons b = 3, soit 0011 sur 4 bits :

b        = 0011   (3)
¬b       = 1100   (on inverse chaque bit)
¬b + 1   = 1101   (on ajoute 1)  ->  -3

Le motif 1101 représente donc -3. On peut le vérifier : ajouté à 0011 (3), il doit donner 0 (sur 4 bits). Et c'est bien le cas, 0011 + 1101 = 10000, dont seuls les 4 bits de droite comptent : 0000.

Important

Pour obtenir -b en complément à deux : on inverse tous les bits de b (¬b), puis on ajoute 1.

Note

Sur n bits, le complément à deux représente les entiers de \(-2^{n-1}\) à \(2^{n-1} - 1\). Sur 4 bits, cela va donc de 1000 (\(-8\)) à 0111 (\(+7\)) ; sur 8 bits, de \(-128\) à \(+127\). L'intervalle est asymétrique : il y a toujours un négatif de plus que de positifs, car le motif 0…0 occupe une des places positives.

Soustraire, c'est additionner#

En remplaçant -b par ¬b + 1 dans notre égalité de départ, on obtient la formule clé du soustracteur :

\[a - b = a + \neg b + 1\]

Autrement dit, pour calculer a - b, il suffit de reprendre le même additionneur que dans le chapitre précédent, et de lui fournir :

  • a tel quel ;

  • ¬b, c'est-à-dire chaque bit de b inversé par une porte NON ;

  • une retenue entrante Cin égale à 1, qui réalise le + 1.

Voici par exemple 7 - 2 posé de cette façon :

retenues   1 1 1
           0 1 1 1    ( a = 7 )
         + 1 1 0 1    ( ¬b, avec b = 2 )
         +       1    ( Cin = 1 )
           -------
        (1) 0 1 0 1    ( résultat : 5 )

Le résultat sur 4 bits est 0101, soit 5 : on a bien 7 - 2 = 5. La retenue sortante (1) déborde et n'est pas conservée.

Le circuit#

Il ne reste plus qu'à câbler cette idée. On reprend la chaîne d'additionneurs complets du chapitre précédent, on inverse chaque bit de b avec une porte NON, et on fixe la première retenue entrante à 1.

Un soustracteur 4 bits formé de quatre additionneurs complets ; chaque entrée b passe par une porte NON avant d'entrer dans l'additionneur, et la retenue entrante du premier additionneur vaut 1

Un soustracteur 4 bits : les additionneurs complets sont inchangés, seuls ¬b et Cin = 1 diffèrent de l'additionneur.#

Le circuit est donc presque identique à l'additionneur : les additionneurs complets ne changent pas du tout, on ajoute simplement quatre portes NON et on force Cin = 1.

Astuce

La retenue sortante Cout renseigne sur le signe du résultat (en non signé) : elle vaut 1 quand a b (le résultat est positif, il n'y a pas eu d'emprunt) et 0 quand a < b (le résultat est négatif, écrit en complément à deux).

Un circuit qui additionne et soustrait#

On peut aller un cran plus loin. Remarquons qu'une porte XOR se comporte comme un inverseur commandé : b 0 = b (on ne change rien) mais b 1 = ¬b (on inverse). En remplaçant les portes NON par des portes XOR pilotées par un même signal de commande M, et en reliant aussi M à la retenue entrante, on obtient un circuit qui additionne quand M = 0 et soustrait quand M = 1.

Voyons d'abord cet inverseur commandé isolément. Dans la démonstration ci-dessous, cliquez sur M : quand M = 0, la sortie recopie b ; quand M = 1, elle l'inverse.

Un additionneur-soustracteur 4 bits ; chaque bit de b passe par une porte XOR dont la seconde entrée est le signal de commande M, qui pilote aussi la retenue entrante Cin

L'additionneur-soustracteur : le signal M inverse b (via les XOR) et fixe la retenue entrante. M = 0 additionne, M = 1 soustrait.#

Quand M = 0, chaque XOR laisse passer b inchangé et Cin = 0 : le circuit additionne. Quand M = 1, chaque XOR inverse b en ¬b et Cin = 1 : on retrouve exactement le soustracteur a + ¬b + 1. C'est précisément la brique dont nous aurons besoin pour construire l'unité de calcul du processeur.

Exercices#

Exercice 22#

Donnez le complément à deux sur 6 bits, c'est-à-dire la représentation de -b, pour chacune des valeurs suivantes. Détaillez les deux étapes (¬b puis + 1).

  1. b = 20

  2. b = 13

  3. b = 25

  4. b = 32

Exercice 23#

Effectuez les soustractions suivantes sur 4 bits, en passant par l'addition a + ¬b + 1. Donnez le résultat en binaire, puis en décimal.

  1. 7 - 4

  2. 4 - 7

  3. 5 - 5

Exercice 24#

On applique a = 6 (0110) et b = 2 (0010) au soustracteur.

  1. Quelles valeurs arrivent réellement sur les entrées des additionneurs, après les portes NON ? Que vaut la retenue entrante ?

  2. Donnez la sortie s (en binaire et en décimal) ainsi que la retenue sortante Cout, et interprétez cette dernière.

Exercice 25#

Dans le simulateur ci-dessous, transformez un additionneur 4 bits en soustracteur a - b. Les quatre « Additionneur complet » sont déjà en ligne (comme sur le schéma), avec a et b au-dessus et s en dessous. Rappel : a - b = a + ¬b + 1. Ajoutez donc une porte NON sur chaque b, reliez a directement à son additionneur, et forcez la première retenue entrante (à droite, celle de a0) à 1 avec une entrée réglée sur 1. Chaînez ensuite les retenues et reliez les sorties. Testez sur 6 - 3, 4 - 7 et 5 - 5 : le résultat est en complément à deux.