Vous êtes sur la page 1sur 9

L’additionneur-soustracteur binaire

Michel Boyer

16 février 2001

§ 1. L’addition de binaires
L’addition d’entiers positifs en base deux se fait bit à bit, tout comme une addition en
base dix se fait chiffre par chiffre, sauf que la table d’addition est beaucoup plus simple: à
chaque fois, on a au plus trois bits (0 ou 1) à additionner, à savoir un bit pour chacun des
opérantes et possiblement une retenue. Suffit donc de savoir que 1 + 1 + 0 donne 0 et génère
1 comme retenue, que 1 + 1 + 1 donne 1 avec génère 1 comme retenue etc. Si on note Cout la
retenue générée et Cin celle en entrée on obtient la table suivante:
Cin A B S Cout
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
Si on applique à la somme s = a + b avec a = 11011 et b = 1101:
1 1011
+ 1101
on obtiendra
1 + 1 = 0 retenue 1
1 + 1 + 0 = 0 retenue 1
1 + 0 + 1 = 0 retenue 1
1 + 1 + 1 = 1 retenue 1
1 + 1 + 0 = 0 retenue 1
et la réponse (la somme mathématique) est donc
10 1000

1
Dans un ordinateur, on fixe a priori le nombre de bits pour les opérandes et la réponse. Si les
opérandes ci-dessus sont représentés sur 5 bits, ils seront 11011 et 01101 et la somme s sur 5
bits sera 01000, à savoir les 5 derniers bits du résultat mathématiquement correct. Le dernier
bit est soit perdu, soit conservé dans un registre spécial C (Carry, i.e. retenue).
Nous allons ici regarder comment construire un circuit qui non seulement calcule la
somme sur un nombre fixe de bits mais retourne des bits de conditions permettant de véfirier
si le résultat retourné est correct et même de faire des comparaisons de nombres non signés.

§ 2. L’additionneur 1 bit
La retenue générée Cout vaut 1 si au moins 2 inputs parmi Cin , A et B sont 1; ceci est la
fonction majorité que nous avons déjà rencontrée et on peut par conséquent écrire
Cout = AB + ACin + BCin
Quand l̀a la fonction S, elle s’écrit directement comme suit sous forme de somme de produits
à partir de la table, ce qui donne:
S = ĀB̄Cin + ĀB C̄in + AB̄ C̄in + ABCin
et on peut vérifier par Karnaugh que cettre expression est en fait minimale comme somme
de produits. Pour l’implanter sous forme de circuit, il faut donc 4 portes AND à trois inputs
et un OR à quatre inputs (et des inverseurs, ou NOT).
Une implantation naturelle simultanée des deux fonctions Cout et S est sous forme de
PLA. On obtient alors la figure A.38 de Heuring et Jordan, page 507.
Une autre implantation de S utilise la formule
S = A ⊕ B ⊕ Cin
car le XOR (ici représenté par ⊕) est la somme de deux bits modulo 2 i.e. le bit de somme
quand on oublie la retenue comme on le voit sur la table:
A B A⊕B
0 0 0
0 1 1
1 0 1
1 1 0
La somme des trois bits Cin , A et B est donc Cin ⊕ A ⊕ B ce qui donne un circuit plus
simple.
Cette implantation est cependant plus lente car la porte XOR peut être de 50% plus lente
que les portes AN D et OR.
Peu importe le choix d’implémentation, le circuit qui calcule S = A ⊕ B ⊕ Cin et Cout =
AB + ACin + BCin sera représenté par le symbole de la figure 1: Il y a trois entrées, à savoir
A, B et Cin et deux sorties à savoir S et Cout .

2
A B
FA
Co Ci
S

F IG . 1 – Additionneur 1 bit

§ 3. Additionneur n bits
La somme Sn−1 . . . S2 S1 S0 des deux nombres non signés de n bits An−1 . . . A2 A1 A0 et
Bn−1 . . . B2 B1 B0 se fait bit à bit en utilisant n additionneurs 1 bit en initialisant l’input c0 (le
Cin le plus à droite) par c0 = 0 puisqu’il n’y a jamais de retenue à additionneur aux deux
bits des unités.
Par exemple, si n = 4 bits, on obtient le circuit suivant (en notant bien le 0 qui entre sur
la droite):
C

C
0
4
8

0
4
8
D

D
1
5
9

1
5
9

A B
A
E

A
E
2
6

2
6
B

B
F

F
3
7

3
7

A3 A2A1A0 B3B2B1B0

A3 B3 A2 B2 A1 B1 A0 B0

A B A B A B A B
FA Ci FA Ci FA Ci FA Ci 0
Co Co Co Co
S S S S

S3 S2 S1 S0

F IG . 2 – Additionneur 4 bits

La dernière retenue qui sort sur la gauche, ici c4 et en général cn quand on additionne n
bits peut être ignorée ou conservée dans un registre spécial, coté C. On a alors que C = 0 si
et seulement si la valeur contenue dans S est bien la somme de A et de B.
Notons que si l’on veut exprimer de facon strictement mathématique les conditions ca-
ractérisant les bits Si de la somme, il nous faudrait écrire les équations suivantes (où le +

3
représente un ou logique ∨ et le ⊕ représente le ou exclusif:

Somme retenue
S0 = A0 ⊕ B0 c1 = A0 B0
S1 = c1 ⊕ A1 ⊕ B1 c2 = A1 B1 + A1 c1 + B1 c1
S2 = c2 ⊕ A2 ⊕ B2 c3 = A2 B2 + A2 c2 + b2 c2
... ...
Sn−1 = cn−1 ⊕ An−1 ⊕ Bn−1 cn = An−1 Bn−1 + An−1 cn−1 + Bn−1 cn−1

L’approche par additionneurs un bit est plus conceptuelle et a l’avantage de donner lieu à
un circuit facilement implantable sans grand risque d’erreur.

§ 4. La soustraction
Pour constuire un soustracteur, ou pourrait reprendre du début et essayer d’implanter
avec un circuit un algorithme de soustraction avec emprunt. Cette approche est prise par
Murdocca et Heuring. On peut cependant faire plus simple.
Soient deux nombres X et Y binaires positifs quelconques; écrivons Y ≡n Y si X et Y
concident sur les n derniers bits. En particulier, le nombre 2n termine avec n zéros et on a
donc que 2n ≡n 0. De fait, quel que soit le nombre X, on a toujours que X ≡n X +2n puisque
les n derniers bits ne sont pas changés quand on additionne un nombre dont les n derniers
bits sont 0. On peut appliquer cette idée pour obtenir un circuit qui calcule correctement les
n derniers bits de la soustraction, ce qui est exactement ce que l’on désire.
Soient donc X et Y deux nombre de n bits (puisque les entrées de notre soustracteur ont
n bits), on a que:

X − Y ≡n X − Y + 2n
≡n X + 2n − Y
≡n X + 2n − 1 + 1 − Y
≡n X + (2n − 1 − Y ) + 1

Donc, pour obtenir les n derniers bits de la soustraction X − Y , il suffit de faire l’addition
A + B + 1 avec A = X et B = 2n − 1 − Y et de conserver les n derniers bits du résultat. Le
nombre 2n − 1 est simplement le nombre binaire composé de n bits égaux à 1: 1111 . . . 1. Le
nombre 2n − 1 − Y n’est donc rien d’autre que la n’égation bit à bit de Y , que l’on peut noter
∼ Y . Le soustraction X − Y se fait donc en additionnant A + B + 1 avec Ai = Xi et Bi = Yi
pour tout bit 1 ≤ i ≤ n − 1.
De facon plus générale, on peut se donner un circuit avec deux entrées de n bits X et Y
et une entrée R de un bit tel que le circuit additionne si R = 0 et soustrait si R = 1. Donc, on

4
calcule

A + B + c0

avec A = X, B = Y et c0 = 0 quand R = 0 alors que A = X, B =∼ y et c0 = 1 quand R = 1.


On peut écrire de facon plus concise les entrées Ai et Bi de l’additionneur comme suit:

Ai = Xi
B i = Yi ⊕ R
co = R

Le circuit qui fait l’addition et la soustraction est donc donné par la figure suivante, où l’on
expliquera dans la section suivante le sens de C et de Z:

0 1 2 3
4 5 6 7
8 9 A B
C D E F

0 1 2 3

0
1
4 5 6 7
8 9 A B
C D E F
R

a3 b3
A B A B A B A B
FA FA FA FA
Co Ci Co Ci Co Ci Co Ci
S S S S

S3 S2 S1 S0

0 1

0
C Z

F IG . 3 – Additionneur/soustracteur avec bits C et Z; Additionne si R est 0, soustrait si R est 1.

§ 5. Les bits C et Z
On a déjà vu que pour l’addition, le bit C est égal à cn . C’est le bit sn de l’addition, si
on additionnait avec n + 1 bits. Dans le cas de la soustraction, il faut inverser ce bit, car la

5
soustraction a été faite justement en inversant le n + 1 ieme bit (en additionnant 2n à X − Y ).
Dans tous les cas on aura donc que

C = cn ⊕ R

Il est aussi utile d’avoir un bit qui nous permette de tester rapidement si le résultat de
l’opération (addition ou soustraction) est 0. C’est le rôle du bit de condition Z qui vaut 1
si et seulement si S = 0, et qui est donc défini par:

Z = S0 S1 . . . Sn−1 = S0 + S1 + . . . + Sn−1

§ 6. Comparaison des nombres non signés


Plusieurs unités centrales de traitement (CPU) utilisent les bits de conditions pour im-
planter les sauts conditionnels lors de comparaisons du type
if (x < y) {
actions 1
} else {
actions 2
}
C’est en particulier le cas du Pentium et de plusieurs CPU de type CISC (Complex Ins-
truction Set Computers). La comparaisons des nombres signés peut se faire par des circuits
très simples prenant en entrée les bits Z et C. Remarquons d’abord que X = Y si et seule-
ment si S = X − Y = 0, c’est-à-dire si Z = 1. De plus X ≥ Y si le nombre X − Y est bien
un nombre non signé (qui peut être nul), ce qui correspond à dire que C = 0, i.e. C. On peut
ainsi résumer les conditions pour la comparaison des nombres non signés avec le tableau
suivant:

Test Circuit Explication


X=Y Z S est nul
X 6= Y Z̄ S est non nul
X≥Y C̄ la soustraction ne génère pas d’emprunt
X>Y C̄ Z̄ . . . et est non nulle
X<Y C la soustraction génère un emprunt
X≤Y C +Z . . . ou encore est nulle.

§ 7. L’additionneur/soustracteur en complément à deux


Les nombre en compléments à deux sur n bits valent de −2n−1 à 2n−1 − 1. Il est à noter
que les nombres de 0 à 2n−1 − 1 ont exactement la même representation autant en non signé
qu’en complément à deux (ou à 1). Quant aux autres, le nombre qui vaut 2n−1 en non signé

6
vaut maintenant −2n−1 en complément à deux; il y a une différence de 2n entre les deux et de
facon générale, tous les nombres négatifs x ont pour représentation le nombre binaire x + 2n .
Par exemple, la représentation de −5 sur 4 bits est 1011 qui est la représentation standard de
1110 ; et on a bien −5+24 = −5+16 = 11. C’est grâce à ce fait que l’additionneur/soustracteur
que nous avons déjà construit servira sans modification pour les nombres en complément à
deux.

§ 8. Les bits de condition N et V


Reste à voir quels bits de conditions servent pour vérifier la correction du résultat et faire
la comparaisons de nombre signés en représentation complément à deux.
Regardons par exemple ce qui se passe si l’on met les nombres −5 et 7 en entrée de notre
additionneur 4 bits (avec R = 0 pour obtenir la somme). Les bits pour le nombre −5 sont
en fait ceux du nombre 32 − 5; les bits de 7 sont les bits standards. Si on effectue l’addition,
on obtiendra en sortie les 4 derniers bits de (32 − 5) + 7 = 32 + 2; on obtient donc 2 comme
somme avec une retenue de 1 (correspondant à 32).
On se rend ici compte de deux choses.
– La valeur retournée est bien la somme de −5 et 7.
– La retenue n’a rien à voir avec la correction du résultat.
De fait, en regardant tous les cas, on se rend compte que le résultat de l’addition est ou bien
correct, ou bien qu’il y a une difference de 2n avec la bonne réponse. De plus
– Si on additionne des nombres de signes contraires, le résultat est toujours correct
– Si on additionne des nombres de mêmes signes, le résultat est correct si et seulement
s’il a le même signe que les opérandes.
Ici, le signe d’un nombre de n bits est déterminé par son bit de signe, à savoir le bit An−1
pour A, le bit Bn−1 pour B et le bit Sn−1 pour S.
On peut donc construire un circuit qui retourne un bit V qui vaut 1 ssi la somme est
incorrecte (on dit qu’il y a débordement). Donnés deux nombres X = Xn−1 . . . X0 et Y =
Yn−1 . . . Y0 , la somme S = Sn−1 . . . S0 retournée par l’additionneur est incorrecte ssi X et Y
ont même signe et S le signe contraire; donc:

V = Xn−1 Yn−1 S̄n−1 + X̄n−1 Ȳn−1 Sn−1

Quant à la soustraction, il y a encore débordement si le signe du résultat est incorrect; ceci se


passe si X et Y sont de signes contraires et si S a le signe de Y , donc, pour la soustraction:

V = Xn−1 Ȳn−1 S̄n−1 + X̄n−1 Yn−1 Sn−1

Dans les deux cas, si l’on pose Ai = Xi et Bi = Yi ⊕ R, on a que

V = An1 Bn1 S̄n−1 + Ān−1 B̄n−1 Sn−1

7
et le circuit qui calcule V est directement connecté sur les entrées du dernier additionneur 1
bit.
Pour comparer deux nombres signés X et Y on calculera donc leur différence S = X − Y
et on utilisera les codes de condition suivants (dont seulement deux nécessitent un circuit):

Z S0 + . . . Sn−1
N Sn−1
V An−1 Bn−1 S̄n−1 + Ān−1 B̄n−1 Sn−1

avec

An−1 = Xn−1 ⊕ R
Bn−1 = Yn−1 ⊕ R

X3 Y3

A3
B3
C3

A B
FA
Co Ci
S

S3

F IG . 4 – Circuit pour le calcul de V: deux AND et un OR.

Les expressions booléennes (et conséquemment les circuits) permettant de comparer X


et Y comme nombres signés en complément à deux sont:

8
Test Circuit Explication
X=Y Z S est nul
X 6= Y Z̄ S est non nul
X≥Y N V + N̄ V̄ S est négatif et de mauvais signe ou non négatif et bon signe
X>Y (N̄ V̄ + N V )Z̄ . . . et en plus S est non nul
X<Y N V̄ + N̄ V S est négatif et de bon signe ou non négatif et de mauvais signe
X≤Y N V̄ + N̄ V + Z . . . ou encore est nul.

Vous aimerez peut-être aussi