cours est imprimable

publicité
Op Art : tendance qui au sein de l'art cinétique privilégie les effets optiques générateurs d'illusion de
mouvement (Larousse).
Version 1
Portée:
De la porte logique aux opérateurs arithmétiques combinatoires.
Pédagogie:
Expérimenter, comprendre, améliorer
complément de notes de cours.
Méthode:
Animer les figures du cours :
Synthèse, simulation, diagramme, algorithme .
Chapitre 1 : Full-Adder en CMOS
Chapitre 2 : Additionneurs suivi de additionneurs spéciaux
Chapitre 3 : Multiplieurs suivi de Multiplieurs en "CS"
Chapitre 4 : Diviseurs suivi de Diviseurs rapides
Chapitre 5 : Extracteurs de racine carrée suivi de Extracteurs rapides
Chapitre 6 : Addition Virgule flottante
Chapitre 7 : Fonctions exponentielle et logarithme suivies de sinus, cosinus, tangente, arc sinus et arc tangente
Chapitre 8 : Représentation modulaire
Ce cours existe également en Anglais.
Opérateurs Arithmétiques Page 1
Fonction "FA" en CMOS
Technologie CMOS En technologie CMOS (Métal Oxyde Semiconducteur complémentaire) on utilise
des transistors canal N et des transistors canal P pour réaliser des fonctions logiques.
La technologie CMOS est actuellement la technologie dominante du marché. Son
principal intérêt par rapport à d'autres technologies comme le NMOS ou le bipolaire
est une consommation d'énergie remarquablement faible. En fait les circuits CMOS
ont un courant statique (quand ils sont au repos) pratiquement négligeable.
Dans les figures ci-dessous :
Un '1' logique est représenté électriquement par la tension d'alimentation Vdd (des
valeurs courantes de Vdd sont +5V ou +3,3V ou +2,8V) et est coloré en rouge.
Un '0' logique correspond à la tension de masse ou GND est coloré en bleu.
Une connexion non reliée est colorée en jaune.
Remarquez que le transistor canal N conduit quand sa grille est au '1' logique, et que
le transistor canal P conduit quand sa grille est au '0' logique. Les touches
permettent de changer le dessin des transistors.
L'inverseur CMOS L'inverseur est la porte CMOS la plus fréquente. Il est formé d'un transistor canal N
et un transistor canal P, reliés par leurs drains. La figure ci-dessous en illustre le
fonctionnement.
Les couleurs sont toujours le rouge pour '1' logique et le bleu pour '0' logique. Une
tension d'entré entre les deux cause un court-circuit en maintenant les deux
transistors en conduction. Une telle tension est colorée en vert. Cliquer sur l'entrée
"a" pour la faire passer de '0' à court-circuit (vert), puis à '1', puis de nouveau à '0'.
Remarquez que si l'entrée vaut '0' ou '1', un seul transistor conduit.
Opérateurs Arithmétiques Page 2
Délai et Nous venons de voir que l'inverseur n'a pas de dissipation d'énergie sauf lorsqu'il
consommation de commute. En effet si l'entrée vaut '0' ou '1' il n'y a pas de chemin de conduction
l'inverseur CMOS entre l'alimentation Vdd et la masse GND. Dans les conditions normales
d'utilisation, le courant de court-circuit (inévitable lorsque l'entrée commute) dure
très peu de temps, typiquement quelques picosecondes.
La contribution du courant de charge ou décharge des capacités à la consommation
est beaucoup plus importante. Les grilles G des transistors forment des capacités.
Ces capacités sont d'ailleurs nécessaires au fonctionnement du transistor à effet de
champs. Typiquement la capacité d'entré Cg vaut environ 10 fF. Si l'entrée a de
l'inverseur est à reliée à Vdd au temps t1, cette capacité est chargée (charge Q = Cg
* Vdd). Si par la suite l'entrée est reliée à GND au temps t2 la capacité se décharge.
Cette décharge produit un courant dans la grille de valeur I = dQ/dt = (Cg *
Vdd)/(t2-t1).
Bien que le courant de charge/décharge de grille soit faible, le courant total
consommé par un circuit intégré complexe peut être important.
Prenons un exemple :
• Un microprocesseur moderne peut contenir 50 millions de transistors, soit
environ dix millions de portes. A chaque cycle environ 1% de ces portes
commutent.
• Les fréquences d'horloge atteignent 500 MHz (temps de cycle 2 ns) avec une
tension d'alimentation Vdd = 3.3V.
• Les fis connectant les portes ont une capacité parasite Cw bien plus grande que
la capacité de grille Cg des portes. Chaque fois qu'une équipotentielle commute,
toutes les capacités qui lui sont attachées doivent être chargées ou déchargées :
Ctotal=Cg+Cw.
• La capacité d'un fil d'interconnexion atteint typiquement 1 pF
Il est assez difficile d'estimer le courant dû aux courts-circuits, il est en général
faible. En revanche le courant résultant de l'activité de commutation est important :
I = (portes actives) *(Ctotal*Vdd) / dt = (1%*1.000.000) * (1pF*3.3V) / 2ns = 16 A
Enfin le courant de repos dû aux fuites des transistors (pour une circuiterie
conventionnelle) est très faible. Une mémoire statique SRAM de 2K*8 bits en
CMOS laisse fuir µA au repos.
La figure ci-dessous illustre le courant, ou déplacement d'électrons de l'inverseur
CMOS . Si la tension d'entrée demeure à '1' ou à '0', soit le transistor canal P ou le
transistor canal N est bloqué et il n'y a pas de courant.
• Si l'entrée a commute, les grilles des deux transistors doivent être chargées ou
déchargées. Ceci est illustré par le passage d'un "électron" (de charge
négative) venant de GND ou bien allant à Vss..
• Quand l'entrée commute, elle passe par des tensions faisant conduire les deux
transistors pendant un temps très court. Le courant de court circuit résultant est
illustré par le passage d'un électron de GND à Vss.
• Enfin la sortie est chargée ou déchargée à travers les transistors. La capacité qui
y est attachée stocke deux "électrons".
Opérateurs Arithmétiques Page 3
La puissance dissipée par un circuit en logique CMOS conventionnelle est en
conséquence directement proportionnelle à la fréquence des commutations, qui est
la fréquence de l'horloge.
Simulation Quand vous cliquez dans le chronogramme ci-dessous, vous tracez la tension de
électrique de l'entrée "a" de l'inverseur (tracé en rouge sur le chronogramme). La tension de la
l'inverseur CMOS sortie "y" est alors calculée (tracée en bleu). Le courant traversant le transistor canal
N est dessiné en vert et celui du transistor canal P en jaune.
Pour stopper l'applet et figer le dessin, sortez le pointeur de la figure.
Portes de base Nous allons étudier maintenant les portes logiques de base en CMOS:
NOR et NAND successivement un NOR et un NAND à 2 entrées puis un NAND à 3 entrées.
Comme pour toutes les portes CMOS, chaque entrée est connectée à la grille d'un
transistor canal N et à la grille d'un transistor canal P.
• Conventions de couleurs: Ce sont celles de l'Inverseur. Les connexions à Vdd
( '1' logique) sont en rouge, les connexions à GND ( '0' logique) sont en bleu, les
connexions simultanément à Vdd et GND sont dessinées en vert. Enfin les
connexions ni à Vdd ni à GND (flottantes) sont en jaune. Ces dernières couleurs
n'ont pas d'image logique.
• Cliquer près d'une entrée pour changer sa valeur, notez le changement de l'état
des transistors.
• La ligne de la table de vérité correspondant à cette combinaison de valeurs
d'entrées est indiquée en blanc.
• En cliquant dans la table de vérité, on positionne les entrées aux valeurs de la
ligne.
• Cliquer sur le haut de la table parcourt progressivement cette table.
Opérateurs Arithmétiques Page 4
Pour simplifier les applets, seuls des '1' et '0' logiques sont permis en entrée. Il n'est
donc pas possible d'entrer des tensions provoquant un court-circuit entre Vdd et
GND.
La porte NOR à 2 La porte CMOS à 2 entées est l'une des portes les plus simples pour illustrer le
entrées qualificatif complémentaire: les transistors canal P sont connectés en série alors que
les transistors canal N sont connectés en parallèle. Les réseaux de transistors canal
N et de transistors canal P sont complémentaires.
Remarquez que si aucun des deux transistors canal P en série ne conduit, leur
connexion commune est flottante (jaune). Cette valeur non logique ne pose
toutefois pas de problème de fonctionnement logique car cette connexion n'est
reliée à aucune grille de transistor.
La porte NAND à 2 Dans le NAND à 2 entrées, les transistors canal P sont reliés en parallèle alors que
entrées les transistors canal N sont reliés en série.
L'additionneur La cellule "FA" (Full Adder) est formée de deux portes complexes connectées. Elle
binaire réalise une égalité arithmétique: la somme pondérée des 3 entrées "x", "y" et "z" a
Opérateurs Arithmétiques Page 5
toujours la même valeur que la somme pondérée des deux sorties "c" et "s", c'est à
dire que " x + y + z = 2*c + s ". On peut aisément vérifier cette propriété grâce à la
table de vérité.
Le réseau de transistors canal P est symétrique au réseau de transistors canal N. Un
circuit ayant cette propriété est appelé "miroir". Tous les additionneurs ont cette
propriété qui découle d'un lien arithmétique entre le complément logique et le
complément arithmétique. Enfin les sorties de ce circuit sont inversées. Cela
découle d'une propriété de la technologie CMOS qui ne permet de faire facilement
que les fonctions logiques non croissantes.
Opérateurs Arithmétiques Page 6
Additionneurs
Cellule "FA" Dans la cellule "FA", la somme pondérée des bits en sortie est égale à la somme
pondérée des bits en entrée c'est à dire que " x + y + z = 2*c + s ". Les trois bits en
entrée ont le même poids, disons 1 pour fixer les idées, le bit sortant "s" a le même
poids que "x", "y" et "z" et "c", un poids double (c'est-à-dire 2).
La cellule "FA" conserve la valeur numérique comme en électronique les nœuds
conservent le courant.
La cellule "FA" est également appelée "réducteur 3 ⇒2" car elle réduit le nombre
de bits de 3 à 2 tout en conservant la valeur numérique.
Additionneur à L'addition est de très loin l'opération arithmétique la plus commune des processeurs
propagation numériques. D'abord parce que l'addition en tant que telle est très fréquente, ensuite
parce que l'addition est la base d'autres opérations arithmétiques comme la
multiplication, la division, l'extraction de racines et les fonctions élémentaires.
Tout assemblage "cohérent" de cellules "FA" conserve la propriété: la somme
pondérée des bits qui sortent vaut la somme pondérée des bits qui entrent.
Pour obtenir l'additionneur S = A + B, il faut que les bits entrant soient ceux des
nombres A et B et les bits sortant forment le nombre S.
Le nombre de cellules "FA" nécessaires pour additionner les deux entiers A et B est
le nombre de bits des nombres A et B.
Opérateurs Arithmétiques Page 7
Additionneur La flèche verticale à côté du bouton de l'additionneur fait apparaître une double
signé interprétation des vecteurs binaires A, B et S: entier sans signe (en haut) et entier
signé dit en complément à 2 (en bas). Le même additionneur accepte ces deux
interprétations à un détail près: le calcul du bit retenue sortante cn. On a le dilemme
suivant:
• On ignore ce bit, on a un seul type d'additionneur et la somme S a autant de
bits que les addendes A et B mais le débordement est possible.
• On tient compte de ce bit, pas de débordement possible mais l'additionneur
d'entiers non signés est (légèrement) différent de l'additionneur d'entiers
signés et S a un bit de plus que A et B.
On préfère généralement la première solution. Une flèche verticale apparaît à côté
de S et passe de l'une à l'autre écriture de S: n bits ou n+1 bits.
Performance de Soit un additionneur à propagation à travers n cellules "FA", si on suppose que
l'additionneur à toutes les valeurs de A et B sont équiprobables et indépendantes, les résultats
propagation théoriques suivants viennent:
minimum
moyen
maximum
délai
0
log2(n)
n
activité
0
3n / 4
n /2
2
Le délai maximum (pire cas) n'est en général pas acceptable. Il est dû au chemin de la
retenue qui traverse toutes les cellules "FA". Etudions donc le cheminement de la
retenue.
Cheminement Pour chaque cellule "FA" un des 3 cas se produit :
de la retenue • la retenue ci+1 est mise à zéro, cas noté 'K', si ai = 0 et bi = 0
•
la retenue ci+1 est mise à un, cas noté 'G', si ai = 1 et bi = 1
•
la retenue ci+1 est propagée, cas noté 'P', si (ai = 0 et bi = 1) ou (ai = 1 et bi = 0).
Dans ce cas ci+1 = ci. Ce dernier cas, défavorable pour le délai, est matérialisé par
une flèche horizontale.
Ces trois cas 'K', 'G' et 'P' sont codés sur 2 bits. Une cellule "HA" calcule ces cas en
fonction de ai et bi .
Opérateurs Arithmétiques Page 8
Cellule "BK" La cellule "BK" permet de calculer la retenue pour un bloc de 2 cellules "FA" ou plus
(Brent et Kung) généralement pour 2 blocs de cellules "FA".
Additionneur de Pour concevoir un additionneur rapide, on va calculer toutes les retenues ci par des
Sklansky arbres binaires de cellules "BK". L'additionneur de Sklansky construit des opérateurs
additionnant des nombres de 2 bits, 4 bits, 8 bits, 16 bits, 32 bits, ... en assemblant
chaque fois 2 additionneurs de taille inférieure. L'architecture est simple et régulière,
mais n'est pas toujours la plus économique en nombre de cellules.
Chaque bit si = ai ⊕ bi ⊕ ci. Or ai ⊕ bi = '1' ssi la sortie de la cellule "HA" vaut 'P' .
"HA" calcule ai ⊕ bi et ensuite le calcul de si demande une porte "XOR".
Opérateurs Arithmétiques Page 9
Additionneurs Il y a une seule règle de construction des arbres imbriqués de cellules "BK":
rapides Toute sortie de rang i est reliée à toutes les entrées de rang j ≤ i par un arbre planaire
(Brent et Kung) de cellules "BK", ce qui permet d'entrelacer les arbres des n sorties de très
nombreuses façons en fonction du nombre de bit et du délai de l'additionneur. Ce
délai s'étend de (n-1) à log2(n), bornes comprises.
Dans les arbres de cellules "BK" on peut troquer des cellules "BK" contre du délai:
moins il y a de délai (cellules "BK" à traverser) de calcul , plus l'additionneur utilise
de cellules "BK".
• faites varier le nombre de bits et le délai
• vérifier que les arbres suivent la règle de construction en cliquant sur un
signal, remarquer que chaque signal a un nom unique composé de 2 chiffres.
• simuler un calcul de retenue en cliquant les touches.
• voir les détails de la construction des arbres avec la touche "Détails"
• voir la description en VHDL de l'additionneur avec la touche "VHDL". Pour
récupérer la description VHDL dans un éditeur de texte, la copier puis coller.
• voir la table qui décrit ces arbres en cliquant la flèche verticale "vue" .
Additionneurs Les arbres binaires de cellules "BK" des additionneurs de Kogge et Stone ne
de Kogge et partagent pas. En conséquence la sortance des signaux est réduite au minimum au
Opérateurs Arithmétiques Page 10
Stone prix de cellules "BK" plus nombreuses, et comme le délai dépend de la sortance, il
est un peu plus court.
Additionneurs de Dans un additionneur de Ling, les arbres de "BK" calculent une primitive appelée
Ling "pseudo retenue". Ceci permet d'éviter le calcul des pi et gi, mais impose en revanche
un calcul supplémentaire pour obtenir la retenue à partie de la "pseudo retenue".
L'astuce est que le délai de ce calcul supplémentaire est recouvert par le délai des
cellules "BK". En conséquence l'additionneur est plus rapide (un peu). La synthèse
VHDL de l'applet précédent en tire partie si l'option "Ling" est cochée.
Edition d'arbres Pour éditer la table qui décrit les arbres de "BK", cliquer dans une case puis enter la
de cellules "BK" valeur numérique de la case sélectionnée. Les valeurs incohérentes sont remplacées
par 0, indiquant "pas de cellule". La flèche verticale
dévoile les arbres.
Cellule "CS" Dans la cellule "CS", la somme pondérée des sorties est égale à la somme pondérée
des entrées c'est à dire que "a + b + c + d + e = 2*h + 2*g + f ". La cellule "CS" n'est
pas seulement un "réducteur 5⇒3", car en plus la sortie "h" ne dépend jamais de
l'entrée "e".
Additionneur La cellule "CS" ne propage pas la retenue de l'entrée "e" vers la sortie "h". Elle permet
sans donc de réaliser des additionneurs sans propagation de retenue. Le nombre de cellules
Opérateurs Arithmétiques Page 11
propagation CS nécessaires est déterminé par le nombre de chiffres des entiers à ajouter.
Cependant chaque chiffre est maintenant représenté sur 2 bits et la valeur du chiffre
est la somme de ces deux bits. Les valeurs possibles des chiffres sont donc '0', '1' et '2'
.
Ce système d'écriture des nombres entiers permet l'addition en un temps court et
indépendant du nombre de chiffre des opérandes.
Cependant il utilise deux fois plus de bits que la notation standard. En conséquence une
n
même valeur a plusieurs écritures (sauf 2 – 1). Parmi toutes les écritures, celle
n'utilisant que des '0' et des '1' est unique. La flèche verticale à côté des nombres en
change l'écriture sans changer la valeur. La flèche verticale à côté du bouton bascule
la présentation en chiffres "CS" ou bits.
Additionneur On appelle "hybride" les opérateurs acceptant des écritures différentes. Dans l'additihybride onneur ci-dessous, d'ailleurs très simple et très rapide, A est en binaire, alors que B et S
sont en "CS
Opérateurs Arithmétiques Page 12
Convertisseur Un nombre A en "CS" a une seule représentation n'utilisant que des '0' et des '1' .
Convertir A de "CS" en binaire consiste à calculer cette représentation. Le
convertisseur est un additionneur S = A' + A".
Un additionneur rapide comme Sklansky ou Kogge et Stone permet une conversion
rapide ; '0' donne 'K', '1' donne 'P' et '2' donne 'G' .
Opérateurs Arithmétiques Page 13
Additionneurs spéciaux
Additionneurs Certains algorithmes arithmétiques peuvent être réalisées en modifiant un additionneur.
spéciaux Par exemple :
n
n
n
•
si A + B < 2 alors S = A + B sinon S = A + B – 2 ; // addition modulo 2
•
•
•
•
•
•
•
•
si A + B < 2 alors S = A + B sinon S = 2 – 1 ; // addition à saturation
si a/s alors S = A – B sinon S = A + B ; // additionneur/soustracteur
si A > B alors S = A sinon S = B ; // plus grand de A ou B
S = A + B ; S' = A + B + 1 ; // additionneur à 2 sorties S et S'
S = A + B ; S' = A + B + 1 ; S" = A + B + 2 ; // additionneur à 3 sorties
S = A + B – 1 ; S" = A + B + 1 ; // additionneur à encadrement
si A – B ≥ 0 alors S = A – B sinon S = B – A ; // valeur absolue de la différence
n
n
n
si A + B < 2 – 1 alors S = A + B sinon S = A + B – 2 + 1 ; // modulo 2 – 1
n
n
n
n
n
• si A + B < 2 + 1 alors S = A + B sinon S = A + B – 2 – 1 ; // modulo 2 + 1
Le coût et le délai du nouvel opérateur restent proches de ceux d'un additionneur.
n
Addition avec Si on néglige la retenue sortante cn alors un additionner donne A + B – 2 lorsque A +
saturation B est trop grand. Pour conserver la continuité de lan sortie S et minimiser son erreur
moyenne, on préfère parfois à l'addition modulo 2 l'addition avec saturation à la plus
grande valeur que l'on peut écrire sur n bits : S = min ( A + B , 2n – 1) .
n
Additionneur/ Les additionneurs font spontanément les additions modulo 2 . Pour obtenir l'opposé -B
soustracteur d'un nombre B, on complémente logiquementntous ses bits puis on lui ajoute 1.
L'addition de B et de -B obtenu ainsi donne 2 c'est à dire 0. On se sert de la retenue
entrante c0 d'un additionneur pour ajouter 1 et de disjonctions pour complémenter
chaque bits de B.
Opérateurs Arithmétiques Page 14
Débordement de Si les valeurs de la retenue cn et de la retenue cn-1 diffèrent, il y a un débordement et
fausse:
l'addition/ la somme S est arithmétiquement
n
•
'0'
'1'
:
il
faut
ajouter
2
à
la
somme pour la corriger (débordement négatif)
soustraction
n
• '1' '0' : il faut soustraire 2 à la somme pour la corriger (débordement positif)
d'entiers signés
Comme pour l'addition à saturation, les deux retenues cn et cn-1 permettent de choisir
le plus grand nombre positif représentable ou le plus petit nombre négatif
représentable en cas de débordement. S = min ( max ( A ± B , -2n-1) , 2n-1– 1) .
Comparateur Lorsqu'on effectue une soustraction S = A – B, le signe de S indique A ≥ B ou au
contraire A < B, mais ne peut indiquer l'égalité. Si de plus on donne à c0 la valeur 'P'
lors de la soustraction (et 'K' pour l'addition) alors la valeur 'P' de la retenue sortante
cn ne peut qu'avoir été propagée sur toutes les positions et indique donc A = B, la
valeur 'K' indique A < B et 'G' indique A > B. Aux entrées des disjonctions, 'K' donne
'0', 'P' ou 'G' donnent '1' , cette transformation est représentée par un petit carré.
Opérateurs Arithmétiques Page 15
Plus grand de A Pour comparer deux nombres A et B, il n'est pas nécessaire de calculer complètement
ou de B leur différence S. Le signe de la différence S est donné par la retenue sortante. Ce
comparateur est plus simple (moins de cellules "BK") et plus rapide (moins de
sortance) qu'un soustracteur.
Additionneur a Si la retenue entrante c0 d'un additionneur est prête plus tard que les entrées A et B,
retenue entrante on utilise un additionneur à retenue entrante retardée est adéquat. Le délai entre
retardée l'entrée co et les sorties S est petit et indépendant du nombre de bits.
Opérateurs Arithmétiques Page 16
Si la retenue entrante co arrivait en même temps que les entrées A et B, une architecture
semblable à celle de l'additionneur/soustracteur serait plus indiquée car moins coûteuse en
cellules "BK".
Additionneur à Pour obtenir cet additionneur, on duplique les sorties de l'additionneur S = A + B + c0.
deux sorties Puis pour la sortie S on substitue à c la valeur '0' et pour l'autre sortie S' on substitue
0
à c0 la valeur '1'. L'additionneur calcule simultanément S = A + B et S' = A + B + 1 .
La sortie des cellules "BK" vaut 'P', 'G' ou 'K' (2bits) et les entrées de portes ⊕ valent
'0' ou '1' (1 bit), 'K' donne '0', 'G' donne '1' .
• Pour le calcul de S = A + B, 'P' donne '0' .
• Pour le calcul de S' = A + B + 1, 'P' donne '1'.
Opérateurs Arithmétiques Page 17
Additionneur à On veut calculer S = A + B, S' = A + B + 1, S" = A + B + 2. Pour calculer S et S" on
trois sorties calcule préalablement sans propagation de retenue deux nombres X et Y tels que
X + Y = A + B. On obtient ainsi s0 et s0". Ensuite on additionne les n-1 bits poids forts
de X et Y avec l'additionneur à deux sorties précédent.
Le calcul de S' à partir de S et S", soit S' = S + 1 ou bien S' = S" – 1, est très simple.
• Le bit poids faible s0' est le complément de s0.
• Pour les autres bits : si s0 = '0' alors s'i = si sinon s'i = s"i .
De semblable façon on peut également calculer S = A + B – 1 et
Opérateurs Arithmétiques Page 18
n
S" = A + B + 1 en calculant deux nombres X et Y tels que X + Y = A + B + 2 – 1
avec les cellules HA' , duales des cellules HA.
Valeur absolue Avec quatre légères modifications l'additionneur de Sklansky à retenue entrante
de la différence retardée rend S =  A – B .
•
•
•
•
insérer des inverseurs pour complémenter B (ou bien A)
modifier la cellule "BK" calculant cn pour éliminer la valeur 'P' dans le signal
"rebouclage" ('K' donne '0', 'P' ou 'G' donnent '1' ).
insérer une ligne de cellules "BK" avec "rebouclage" en entrée
modifier ces dernières cellules pour soit complémenter logiquement le résultat S
('K' ou 'P' donnent '1' ) si "rebouclage" = '0' ou bien lui ajouter 1 ( 'P' ou 'G'
donnent '1' ) si "rebouclage" = '1' .
–
–
–––––
–
si A + B ≥ 2n alors S = A + B + 1 sinon S = A + B
De plus la valeur 'P' de cn indique que A = B, donc S = 0.
Addition en Soit sa et sb les signes de A et B respectivement et Ma et Mb leurs valeurs absolues
représentation aussi appelées "magnitudes". L'addition de A et B est réalisée par l'addition de M et
a
"signe valeur
M si A et B sont de même signe, et par leur soustraction dans le cas contraire. Dans
absolue" b
tous les cas le signe du résultat S est le signe de l'addende de plus grande magnitude.
si (sa ⊕ sb) alors { Ms = Ma + Mb , ss = sa } // mêmes signes
sinon si Ma ≥ Mb alors { Ms = Ma – Mb , ss = sa }
sinon { Ms = Mb – Ma , ss = sb }
L'additionneur de représentations "signe/valeur absolue" hérite à la fois de
l'additionneur/soustracteur et de l'opérateur de valeur absolue de la différence.
Opérateurs Arithmétiques Page 19
La ligne horizontale "rebouclage" contrôle les cellules "BK" modifiées du bas :
si "rebouclage" = '2' alors Ms = Ma + Mb; // 'P' donne '0', 'G' donne '1' et 'K' donne '0'
si "rebouclage" = '1' alors Ms = Ma – Mb; // 'P' donne '1', 'G' donne '1' et 'K' donne '0'
si "rebouclage" = '0' alors Ms = Mb – Ma; // 'P' donne '1', 'G' donne '0' et 'K' donne '1'
Additionneur Un additionneur rend spontanément une somme modulo 2n. Avec une légère
n
modification l'additionneur de Sklansky à retenue entrante retardée rend une somme
n
modulo 2 – 1
modulo 2 – 1.
Opérateurs Arithmétiques Page 20
n
• si A + B < 2 – 1 alors S = A + B ;
n
• si A + B ≥ 2 – 1 alors S =  A + B + 1  modulo 2n ;
Dans les deux cas on a S =  A + B  modulo (2n– 1).
n
La condition du test est donnée par la retenue cn: si cn = 'K' alors A + B < 2 – 1, si cn
n
n
= 'P' alors A + B = 2 – 1, si cn = 'G' alors A + B > 2 – 1.
Donc pour le signal "rebouclage" qui contrôle " +1" , 'K' donne '0', 'P' ou 'G' donnent
'1' , comme pour la valeur absolue ci-dessus.
Additionneur
n
modulo 2 + 1
n
•
si A + B < 2 + 1 alors S = A + B ;
•
si A + B ≥ 2 + 1 alors S =  A + B – 1  modulo 2n;
n
n
On se ramène à l'additionneur modulo 2 en calculant préalablement sans
n
propagation de retenue deux nombres X et Y tels que X + Y = A + B + 2 – 1 + c0
avec les cellules HA' , duales de HA. La retenue entrante c0 vaut '0'.
n+1
si X + Y < 2 alors S =  X + Y + 1  modulo 2n ;
n+1
si X + Y ≥ 2
alors S =  X + Y  modulo 2n ;
Donc le signal "rebouclage" horizontal qui contrôle "+1" est le "nand" de xn et
(cn = 'G' ). Le bit poids fort sn est le "and" de xn et (cn = 'P' ) .
n
Les valeurs de A et B vont de 0 à 2 . Les bits an et bn manquent en entrée de
n
l'additionneur ci-dessus. Ces deux bits manquant indiquent A = 2 et B = 2
respectivement.
n
n
n
n
si A = 2 et B = 2 alors ( A + B ) modulo 2 + 1 = 2 – 1.
n
n
n
n
si A = 2 et B < 2 alors A se réécrit ( 2 – 1 ) + 1, c'est à dire tous les bits ai sont
forcés à '1' ainsi que la retenue entrante c0.
Opérateurs Arithmétiques Page 21
n
n
n
si A < 2 et B = 2 alors B se réécrit ( 2 – 1 ) + 1, c'est à dire tous les bits bi sont
forcés à '1' ainsi que la retenue entrante c0.
Opérateurs Arithmétiques Page 22
Multiplieurs
Multiplieur La multiplication vient en second pour la fréquence d'utilisation.
Porte "AND" Une porte "AND" multiplie 2 bits. Pour multiplier 2 nombres A et X de n bits
2
chacun, on utilise n portes "AND" qui multiplient chaque bit de A par chaque bit
2
de X. La somme pondérée de ces n bits a bien comme valeur le produit P = A * X.
Cependant cet ensemble de bits n'est pas un nombre, bien que sa valeur se calcule
comme celle d'un nombre.
n
n
2n
Comme A < 2 et X < 2 , le produit P < 2 et s'écrit donc sur 2n bits.
Multiplication Une structure régulière de portes "AND" et de cellules "FA" formant un assemblage
sans signe "cohérent" permet d'obtenir les produits partiels puis de les réduire pour finalement
obtenir le nombre P. Comme chaque cellule "FA" réduit le nombre de bits de 1
exactement (tout en conservant la valeur de P), la quantité de cellules "FA"
2
strictement nécessaire est n – 2n (nombre de bits entrant – nombre de bits sortant).
Cependant il y en a ici un peu plus car il entre aussi quelques '0' qu'il faut aussi
réduire, plus précisément un '0' par chiffre de X. La flèche verticale "vue" dévoile
ou bien cache le réseau des fil distribuant A et X. A chaque croisement de ces fils il y
a une porte "AND".
Multiplication Si le multiplicande A et le multiplieur X sont en complément à 2, alors les produits
n
signée avec les bits de signe an-1 et xn-1 doivent être inversés et la constante 2 ajoutée pour
obtenir le complément arithmétique des produits de X et A avec ces deux bits. Le bit
de signe de P doit également être inversé.
Opérateurs Arithmétiques Page 23
Multiplieurs Plusieurs pistes conduisent à une amélioration de la vitesse:
• Diviser le nombre de bits à réduire en utilisant des grandes bases.
rapides
•
•
•
•
Utiliser une structure cohérente de cellules "FA" en arbre.
Utilisation de cellules "CS", dont le pouvoir de réduction double de celui du
"FA" permet en outre les arbres binaires faciles à équilibrer.
Utiliser un modèle de délai fidèle pour construire les arbres.
Choisir un additionneur final rapide prenant en compte des délais d'entrée
inégaux
Codeur de Passer à une base de numération plus grande réduit mécaniquement le nombre de
Booth "BC" chiffres du multiplieur X.
Voyons la base 4, qui a utilise deux fois moins de chiffres que la base 2 pour
représenter le même nombre. Le "Code de Booth" ( ou "BC" ) est le code de redondance
minimale, symétrique, en base 4. Les chiffres ∈ {-2, -1, -0, 0, 1, 2}. Le code sur 3 bits
adopté ici, en "signe/valeur absolue", donne 2 notations pour le zéro.
Cependant les produits partiels sont calculés avec une cellule plus complexe qu'un
"AND".
Cellule du Pour faciliter le produit d'un nombre par un chiffre "BC", on réécrit ce dernier en
convertisseur "signe/valeur absolue" grâce à une cellule "B2BC". La cellule "B2BC" convertit un
pour le calcul de produits partiels. La somme est
de "BC" chiffre "BC" en "signe/valeur absolue"
s
conservée: -2 × x3 + x2 + x1 = (-1) × ( 2 × M2 + M1 ) ;
Opérateurs Arithmétiques Page 24
La conversion de X requiert deux fois moins de cellules "B2BC" que de bits de X.
Multiplieur des La multiplication par un chiffre "BC" ∈ {-2, -1, -0, 0, 1, 2} rajoute 2 bits à ceux de A:
bits de A par un un pour avoir A ou bien 2A, un autre pour la retenue entrante en cas de soustraction.
chiffre "BC" A étant signé, il faut éventuellement étendre son signe sur le bit ajouté.
La multiplication de A requiert autant de cellule "CASS" que de bit de A plus 1.
Le bit poids fort pn du produit partiel P est négatif. Pour cumuler ce bit à des bits
positifs, il faut l'inverser en sortie de la cellule "CASS".
Génération des La première étape de la multiplication génère à partie de A et de X des bits dont la
produits partiels somme pondérée vaut le produit P. Le bit de poids fort de P est positif pour la
multiplication d'entiers sans signe, et négatif pour la multiplication d'entiers en
complément à 2. L'applet propose cinq façons de calculer les produits partiels :
• Sans signe: les opérandes A et X sont en binaire.
• Signé: les opérandes A et X sont en complément à 2.
• Selon l'approche de Baugh et Wooley : A et X sont en complément à 2.
• Avec le "code de Booth": X est recodé en base 4 (code de Booth modifié)
• Enfin utilisant la "notation de Booth canonique": code de Booth modifié avec le
maximum de '0'
Opérateurs Arithmétiques Page 25
Les quatre derniers calculs sont signés.
Réduction des La deuxième étape de la multiplication réduit les produits partiels de l'étape
produits partiels précédente à deux nombres, en conservant la somme pondérée des bits. Ces deux
nombres seront additionnés dans la troisième étape.
La synthèse des arbres de Wallace suit l'algorithme de Dadda, qui garanti le
minimum d'opérateurs de réduction. Si de plus on impose d'effectuer les réductions le
plus tôt ou le plus tard possible, alors la solution est unique et synthétisée toujours de
la même façon.
Les deux nombres binaires à ajouter dans la troisième étape peuvent être vus comme
un seul nombre en "CS".
Exemple d'arbre L'applet suivant réduit 82 produits partiels (par exemple le produit de deux nombres
de Wallace sans signe de 8 bits chacun). Les arbres de Wallace réduisent "au plus tard" (touche
"tard" de l'applet ci-dessus). La somme pondérée des 16 bits qui sortent vaut toujours
la somme pondérée des 64 bits qui entent.
Opérateurs Arithmétiques Page 26
La case à cocher en haut à gauche autorise l'usage de cellules "CS" dans la réduction.
La flèche verticale supprime/rétabli l'additionneur final. Le résultat est en binaire
avec l'additionneur et en "CS" sans l'additionneur. Le délai de l'addition finale
(Kogge et Stone) est comparable à celui de l'arbre de réduction.
Délais du "FA" Un modèle plus fidèle du délai de la cellule "FA" permet de diminuer encore le délai
des arbres de réduction des produits partiels d'un multiplieur. L'entré "x" est prise
comme référence des délais de la cellule "FA", dxy et dxz sont les retards tolérés des
entrées "y" et "z", enfin dxc et dxs sont les délais de calcul de la retenue "c" et de la
somme "s" par la cellule "FA".
Le chronogramme trace les instants où les signaux internes sont prêts, les sorties vers
l'additionneur final sont tracées en magenta. La flèche verticale "vue" permet de
tracer un trait jusqu'à l'instant où ces signaux sont pris (c'est à dire les intervalles de
temps perdus) ou encore les cellules "FA" et "HA" des arbres de réduction.
Opérateurs Arithmétiques Page 27
Additionneur
final à "temps
d'arrivée
inégaux"
La figure précédente montre que les entrées de l'additionneur final ne sont pas toutes
prêtes en même temps. Typiquement les poids faibles sont tôt, les poids fort un peu
moins, et les bits du milieu sont très en retard. On peut tenir compte de ces différents
temps d'arrivée (indiqués par un trait magenta) dans la construction des arbres de
cellules "BK" calculant les retenues de l'additionneur final. Pour modifier le profil
des temps d'arrivée, tracer des traits dans la figure en maintenant la touche "ctrl"
enfoncée.
Multiplieurs en "CS"
Produits partiels Le multiplieur X et le multiplicande A sont tous les deux en "CS", c'est à dire avec
d'opérandes en des chiffres ∈ { 0, 1, 2}.
"CS" On génère des chiffres dont la somme pondérée est égale à A * X. Pour assurer que
ces chiffres sont des bits (faciles à additionner), il est nécessaire que dans A ou bien
dans X tout chiffre '2' soit précédé à droite par un '0'. Donc A ou bien X nécessite une
réécriture.
Opérateurs Arithmétiques Page 28
Réduction des Les produits partiels de la multiplication de nombres en "CS" sont simplement des
produits partiels bits, réduits de la même façon que pour les multiplieurs précédents.
Cellule "xCS" La cellule "xCS" permet de calculer le produit de deux chiffres "a" et "x" en "CS".
Son équation arithmétique est "2 × y + 2 × b + i = x × a + c + z". De plus les sorties
"b" et "y" ne dépendent jamais des entrées "c" ou "z" (pas de propagation). En effet
"c + z" ne prend pour valeur que 0 ou 1 (il est impossible que "c + z" vaille 2) et
"a × x" ne prend pour valeur que 0, 1, 2 ou 4. Seul la valeur 1 pourrait provoquer une
propagation, mais elle n'est possible que si c et z sont tous les deux 0.
Opérateurs Arithmétiques Page 29
Codeur Le transcodeur "CS2CS" passe de "CS" à "CS" en garantissant qu'en sortie un '2' est
"CS2CS" toujours précédé à droite par un '0'.
Cette propriété permet de calculer les produits partiels binaires avec un
multiplicande A et un multiplieur X tous les deux en "CS".
Codeur Le transcodeur "CS2BC" passe de "CS" à "BC" , c'est à dire du code à retenue
"CS2BC" conservée base 2 au code symétrique de redondance minimum base 4 (ou "Code de
Booth").
Multiplieurs par des constantes
Multiplication
d'un nombre
par une série de
constantes
La transformée de Fourier discrète, la transformée Cosinus ou son inverse, le filtre
numérique, etc..., contiennent des multiplications d'une variable X par plusieurs
constantes C1, C2, .. Cn. La factorisation de ces constantes permet de réduire le
nombre d'additions/soustractions de ces multiplications, parfois très fortement.
L'applet ci-dessous calcule Y1 = X*C1, Y2 = X*C2, .. Yn = X*Cn...
Opérateurs Arithmétiques Page 30
Opérateurs Arithmétiques Page 31
Diviseurs
Pesée du pain
avec restauration
sans restauration,
pesée RST
On veut calculer Q = A ÷ D. Par un coup de chance extraordinaire on dispose d'une
balance, d'un pain de mie dont le poids est justement A et enfin d'une série de poids
i
i
de valeur D, 2D, 4D, 8D, ... 2 *D marqués respectivement avec 1, 2, 4, 8, ... 2 .
i
En fait D est un nombre binaire, et 2 *D s'obtient simplement en décalant D de i
positions. La balance compare la somme des poids sur chacun de ses deux plateaux
( ≤ ou > ).
Divisions La division est peu fréquente, cependant comme son délai d'exécution est bien plus
récurrentes grand que celui de l'addition ou de la multiplication, son incidence sur le temps de
calcul est substantielle. Il convient donc de soigner la réalisation des diviseurs.
On veut calculer Q = A ÷ D. Ceci est équivalent à Q * D = A. Donc si Q et D
s'écrivent chacun avec n bits, A s'écrit avec 2n bits.
On va construire une suite Qn, Qn-1, ... Q2, Q1, Q0 et une suite Rn, Rn-1, ... R2, R1,
R0 telles que l'invariant A = Qj * D + Rj soit respecté pour tout j.
La récurrence est :
j-1
• Qj-1 = Qj + qj-1 × 2
j-1
• Rj-1 = Rj – qj-1 × D × 2
avec comme conditions initiales :
• Qn = 0
•
Rn = A.
Quand la récurrence se termine, on a Q = Q0 = Σj=0 qj * 2 . R = R0 est le reste de la
division.
n
Opérateurs Arithmétiques Page 32
j
Soustracteur Un "soustracteur conditionnel" donne le résultat S suivant:
conditionnel si R < D alors S = R sinon S = R – D ;
Chaque cellule "SC" calcule le résultat et la retenue de la soustraction R – D. Si la
retenue sortante (tout à gauche) vaut '1' alors S reçoit le résultat de la soustraction,
sinon S reçoit R. Cette dernière opération qui rétablit l'ancienne valeur de R est
parfois appelée "restauration", d'où le nom du diviseur.
La fonction du "soustracteur conditionnel": si R < D alors S = R sinon S = R – D, se
résume par sa fonction de transfert appelée "diagramme de Robertson". Pour
converger la division impose en outre que 0 ≤ R ≤ 2*D, ce que montre le diagramme.
Opérateurs Arithmétiques Page 33
Cellule "SC" du Vérifiez que vous maîtrisez les fonctions logiques de la cellule "SC" :
soustracteur si q = '0' alors { co = majorité ( r, –d, ci ) ; s = r } // identité
conditionnel
–
–
sinon { co = majorité ( r, d, ci ) ; s = r ⊕ d ⊕ ci } // soustraction
Diviseur avec Un diviseur "avec restauration" consiste en une suite de décalages et de tentative de
restauration soustractions. Il est formé d'une structure régulière de cellules de soustraction
conditionnelle "SC" (identité ou soustraction selon q j )..
Inverse de la Si on retourne le diviseur "avec restauration" tête en bas et replace les soustracteurs
division conditionnels "SC" par des additionneurs conditionnels "AC" ( identité ou addition
selon xi ) on obtient l'opérateur de l'inverse de la division c'est à dire la multiplication
avec "reste" : A = D × Q + R .
Opérateurs Arithmétiques Page 34
Opérateurs Arithmétiques Page 35
Diviseur sans Un diviseur "sans restauration" consiste en une suite de décalages et d'additions ou de
restauration soustractions. Il est formé d'une structure régulière de cellules d'addition/soustraction
"AS" (addition ou soustraction en fonction de q).
• si R < 0 et D < 0 alors {S = R – D ; q = '1'}
–
• si R < 0 et D ≥ 0 alors {S = R + D ; q = '1 '}
–
• si R ≥ 0 et D < 0 alors {S = R + D ; q = '1 '}
• si R ≥ 0 et D ≥ 0 alors {S = R – D ; q = '1'}
Le fonctionnement de l'addition/soustraction "AS" est donnée par le de "diagramme
de Robertson" si R < 0 alors S = R + D sinon S = R – D.
Avantage et
inconvénient
du diviseur
sans
Le diviseur sans restauration a l'avantage de la compatibilité de A et de D avec le
complément à 2. Cependant pour que le résultat soit unique on convient que le reste R
soit toujours du même signe que le dividende A. Une correction finale est alors
nécessaire pour que le diviseur sans restauration obéisse à cette convention. Enfin le
Opérateurs Arithmétiques Page 36
restauration
–
quotient Q est écrit avec les chiffres '1 ' et '1' , il faut donc le convertir en binaire, ce qui
est très simple.
Pour la division, on convient que si le reste R n'est pas nul alors il doit avoir le même
signe que le dividende A. Un ajustement ultime du quotient Q par +1 ou -1 est parfois
nécessaire pour faire obéir le diviseur sans restauration à cette convention.
• si A ≥ 0 et R < 0 et D ≥ 0 alors { Q = Q – 1 ; R = R + D }
• si A ≥ 0 et R < 0 et D < 0 alors { Q = Q + 1 ; R = R – D }
• si A < 0 et R > 0 et D ≥ 0 alors { Q = Q + 1 ; R = R – D }
• si A < 0 et R > 0 et D < 0 alors { Q = Q – 1 ; R = R + D }
Il reste un cas pathologique R = - | D | à détecter et corriger pour obtenir R = 0 .
Diagramme de Pour avoir un diagramme de Robertson carré, on normalise les restes successifs:
-j
Robertson ( Rj × b ) où b est la base de numération.
Les pentes noires représentent la fonction de transfert Rj ⇒ Rj-1, le trait rouge est la
fonction unité qui passe d'une étape à la suivante.
La base 10 nous est familière, elle ne sert ici que comme illustration car elle serait très
inefficace codée en binaire.
Diviseurs Trois approches se combinent pour réaliser des diviseurs rapides:
• Utiliser des additions/soustraction sans propagation de retenue.
rapides
•
•
Préconditionner le diviseur et le dividende pour simplifier la division.
Utiliser des grandes bases pour diminuer le nombre d'étapes.
Opérateurs Arithmétiques Page 37
Division "SRT" Pour éviter le délai dû à la propagation de retenue, on utilise ici une suite
sans d'additionneur/soustracteur à emprunt conservé ("BS"). La cellule "tail" , variante de la
bits de commande qui la traversent:
propagation de cellule "SC", exécute suivant les deux
j-1
• une addition : Rj-1 = Rj + 2 * D
retenue
j-1
•
une soustraction : Rj-1 = Rj – 2
•
une identité : Rj-1 = Rj
*D
Cette opération est choisie suivant le signe du reste Rj. Pour connaître précisément ce
signe il faudrait pouvoir examiner tous les chiffres du reste. On montre qu'il n'est
nécessaire d'en examiner que 3. De plus on connaît la position de ces 3 chiffres: celui
de droite est aligné avec le premier bit à "1" du diviseur. Pour éviter que cette position
ne se déplace avec les valeurs de D, D est "normalisé", c'est à dire que la position de
son premier bit à "1" dans le diviseur est fixé. La flèche marquée "vue" à côté du
bouton montre les chiffres ou bien les bits ou bien déplace la virgule juste après le
premier chiffre de D comme pour les mantisses ou bien après le dernier chiffre de D
comme pour les entiers. L'applet permet d'essayer le diviseur avec des entiers pour
lesquels D est normalisé entre 2n-1 et 2n–1 ou avec des mantisses pour lesquels D est
dans l'intervalle [1, 2 [ .
Additionneur/ Un "additionneur/soustracteur conditionnel" donne l'un des résultats S suivant:
• si q = '1' alors S = R – D ; // soustraction
Soustracteur
• si q = '0' alors S = R ;
// identité
conditionnel sans
–
• si q = '1 ' alors S = R + D ; // addition
propagation
Opérateurs Arithmétiques Page 38
Chaque cellule "tail" réalise l'addition/soustraction de 1 bit. La retenue n'est pas
propagée vers la cellule de gauche de la même ligne mais envoyée vers la cellule de la
ligne suivante.
La fonction de l' "additionneur/soustracteur conditionnel" se résume par sa fonction de
transfert appelée "diagramme de Robertson". Pour converger, la division impose en
outre que -2*D ≤ R ≤ 2*D. Si -D ≤ R ≤ 2 alors S a deux solutions.
Cellule "tail" du Vérifiez que vous maîtrisez les fonctions logiques de la cellule "tail" .
—
• si q = '1' alors 2*s1 – s0 = d0 + r0 ; // soustraction
diviseur "SRT"
•
•
// identité
si q = '0' alors 2*s1 – s0 = r0 ;
–
si q = '1' alors 2*s1 – s0 = d0 + r0 ; // addition
Opérateurs Arithmétiques Page 39
^
^
Cellule de tête du Soient R = r2* 4 + r1* 2 + r0 et S = s2* 4 + s1* 2 + s0 les valeurs respectivement des
diviseur "SRT" entrées et des sorties de la cellule de tête.
•
•
^ > 0 alors { S
^=R
^ – 2 ; q = '1' ; }
si R
^ = 0 alors { S
^=R
^ ; q = '0' ; }
si R
^ < 0 alors { S
^=R
^ + 1 ; q = '1–' ; }
si R
•
Lors d'une division correcte (sans débordement), la sortie s2 est toujours à 0. Cependant le débordement est utilisé dans la "double division" pour le calcul de sinus.
Cellules "head" Une cellule "head" suivie de cellules "tail" exécutent ensemble l'algorithme :
^ > 0 alors S = R – D ; // soustraction
et "tail"
• si R
•
•
^ = 0 alors S = R ;
si R
^ < 0 alors S = R + D ; // addition
si R
Nécessité du '0' Si R > 0 il ne faut pas faire d'addition et si R < 0 il ne faut pas faire de soustraction
dans l'écriture sous peine de débordement. Quand = 0, le signe de R n'est pas connu, donc on ne
de Q fait ni addition ni soustraction et q = '0' . ^
Pour la cellule "head", un reste est petit si R= 0 , c'est à dire si -1 < R < 1
Nécessité de la indépendamment de D. Dans ce cas R conserve sa valeur et sort du "diagramme de
Robertson" si 1 > D. En conséquence 1 ≤ D. La borne supérieure de D est destinée à
normalisation faciliter la réalisation: moins il y a de chiffres de D avant la virgule et moins il y a de
du diviseur D chiffres de R a examiner par "head" et plus le circuit est rapide, donc 1 ≤ D < 2 , D
est "normalisé"
Opérateurs Arithmétiques Page 40
Division "SRT" La division "SRT" précédente est simple car le premier bit du diviseur D est toujours
avec réduction '1'. Elle se simplifie davantage si les deux premiers bits d0 et d1 du diviseur D sont
du diviseur réduits à "1 0" par l'opération :
si d1 alors { D = D * 3/4 ; A = A * 3/4 ; } .
Cette multiplication de A et D par la même constante ne modifie pas le quotient Q,
par contre le reste R est aussi multiplié.
n-1
n-1
n-2
Pour un diviseur sur n bits, 2 – 1 < D < 2 + 2 .
^ =r
Cellule de tête du Soient R
1* 2 + r0 la valeur de l'entrée de la cellule de tête "head".
diviseur "SRT"
^
^
• si R > 1 alors { s0 = R – 3 ; q = '1' ; }
avec réduction
^ = 1 alors { s
• si R
q=-0;}
0=0;
–
^ = 0 alors { s = 0 ;
q = + 0 ; } ou bien { s0 = '1' ; q = - 0 ; }
• si R
0
^ = -1 alors { s = -1 ; q = + 0 ; }
• si R
0
–
^ < -1 alors { s
^
• si R
0 = R + 2 ; q = '1' ; }
La différence entre les deux écritures de 0 pour q : "- 0" et "+ 0" importe.
Opérateurs Arithmétiques Page 41
Convertisseur Le quotient Q du diviseur SRT est en notation redondante. Sa conversion en notation
de quotient conventionnelle passe par un additionneur (en fait un soustracteur). Comme les
chiffres q du quotient sont calculés séquentiellement (poids forts d'abord), la
conversion peut être menée en même temps que le calcul des chiffres q.
Soit "Ratio" le rapport entre le délai de la cellule de tête du diviseur SRT et le délai
de la cellule "BK".
Conception d'un diviseur Les chiffres du quotient Q sont redondants et symétriques. Ils sont définis
par la base de numération de Q et la valeur maximale du chiffre Q.
Le choix du nombre de chiffres du diviseur D et du reste partiel P pris en
compte détermine si on peut tracer des frontières séparant les chiffres de Q.
Opérateurs Arithmétiques Page 42
Le bouton à gauche passe à l'étape suivante ou revient à l'étape précédente.
1- diagramme de Robertson, donnant le reste partiel suivant en fonction du reste partiel P courant , sans tenir
compte explicitement de D
2- PD-plot symétrique tracé pour les valeurs de D dans [ 1/2 , 1 [
3- demi PD-plot continu, moitié supérieure du précédent. La moitié inférieure s'obtiendrait en changeant les signes.
4- demi PD-plot à discrétiser, le nombre de bits de D fixe le pas en abscisse, le nombre de chiffres de P fixe le pas
en ordonnée.
Ce choix détermine si on peut tracer des frontières pour séparer les chiffres de Q.
5- demi-table de vérité du demi PD-plot.
Opérateurs Arithmétiques Page 43
Extracteur de racine carrée
Extraction de L'extraction de racine carrée est relativement peu fréquente. Cependant elle intervient
racine carrée entre autres dans les distances euclidiennes et dans les moindres carrés. L'opérateur
d'extraction s'apparente au diviseur et tout ce que l'on sait de la division rapide
s'applique à la racine carrée. Souvent le même opérateur rapide exécute soit la
division, soit l'extraction de racine, les collisions étant trop rares pour justifier deux
opérateurs par ailleurs coûteux.
Algorithme Dans le dessin ci-dessous, la surface de chaque rectangle rouge représente le poids de
d'extraction de un bit. Seuls les bits à '1' sont dessinés. La surface totale dessinée est donc la somme
racine carrée pondérée de ces bits.
Le jeu consiste à trouver un carré de surface égale à un nombre donné, nombre dont
la valeur est représentée par la surface d'un cercle bleu, en observant un bit de test
( ≤ ou > ) et en cliquant des bits. Le côté de ce carré est alors la racine cherchée.
Extracteur de On veut calculer Q = A . Ceci est équivalent à Q = A ÷ Q. Donc si Q s'écrit sur n
racine carrée bits, A s'écrit avec 2n bits.
On va construire une suite Qn, Qn-1, ... Q2, Q1, Q0 et une suite R2n, R2n-2, ... R4, R2,
R0 telles que l'invariant A = Qj * Qj + R2j soit respecté pour tout j.
La récurrence est :
j-1
• Qj-1 = Qj + qj-1 * 2
j-1
j-1
• R2j-2 = R2j – qj-1 * 2 * ( 2 * Qj + 2 )
avec comme conditions initiales :
• Qn = 0
• R2n = A.
j
n
Quand la récurrence se termine, on a Q = Q0 = Σj=0 qj * 2 .
R = R0 est le reste de l'extraction de racine.
Si on remplace les fausses additions "+" par des concaténations, notées "&", la
récurrence devient:
Opérateurs Arithmétiques Page 44
•
•
Qj-1 = Qj & qj-1
j
R2j-2 = R2j – qj-1* 2 * ( Qj & 0 1 )
( soustraction conditionnelle )
Réalisation L'extracteur de racine carrée avec restauration utilise les mêmes soustracteurs
conditionnels "SC" que le diviseur avec restauration.
Opérateurs Arithmétiques Page 45
• si R2j ≥ ( Qj & 0 1 ) alors { qj-1 = '1' ; R2j-2 = R2j – ( Qj & 0 1 ) } //soustraction
• si R2j < ( Qj & 0 1 ) alors { qj-1 = '0' ; R2j-2 = R2j } // identité
De nombreuses cellules de ce circuit ont des entrées constantes ( '0' ou '1' ). Elles ne
sont pas simplifiées ici comme dans le diviseur avec restauration.
Extracteur sans L'extracteur de racine carrée sans restauration utilise les mêmes cellules
restauration d'addition/soustraction "AS" que le diviseur sans restauration.
• si R2j ≥ 0 alors { qj-1 = '1' ; R2j-2 = R2j – ( Qj & 0 1 ) } //soustraction
–
• si R2j < 0 alors { qj-1 = '1' ; R2j-2 = R2j + ( Qj & 11 ) } // addition
En fait les valeurs des Qj successifs sont impaires, c'est à dire terminés à droite par un
'1' implicite, qui ne sera explicité qu'à la conversion finale. Après quelques
distributions de signe :
• si qj-1 = '1' alors R2j-2 = R2j – ( Qj+1 & ( 1 0 0 + 0 0 1 ) ) //soustraction
–
• si qj-1 = '1' alors R2j-2 = R2j + ( Qj+1 & ( 1 0 0 – 0 0 1 ) ) // addition
Comme la racine Q est positive, son bit pois fort qn vaut toujours '1'. Cet extrateur donne
toujours une racine Q impaire. Si le reste final est négatif (bit de signe = 1), alors Q est
trop grand et il est facile de le diminuer car il est impair.
L'intérêt de ces deux extracteurs est de montrer que l'on peut utiliser des chiffres valant '0',
'1' ou '-1' (notation "BS") .
Extracteur On cherche à s'affranchir de la propagation de retenue en utilisant la notation "BS",
de racine carrée les mêmes cellules "head" et "tail" et une architecture similaire à celle de la division
rapide rapide. On se heurte à trois difficultés en cherchant à utiliser ce diviseur pour extraire
des racines.
Opérateurs Arithmétiques Page 46
Convertisseur La première difficulté est le rebouclage de la racine. Comme le diviseur, l'extracteur
de racine de racine carrée rapide fourni des racines partielles Qj en notation "BS". Utiliser les
mêmes cellules "head" et "tail" que le diviseur rapide exige une racine partielle en
notation binaire conventionnelle. On pourrait utiliser un soustracteur pour la
conversion de "BS" à binaire de chaque Qj mais ce serait coûteux en temps et en
circuit. Le convertisseur ci-dessous utilise une cellule "trc" à 4 entrées et 2 sorties
dérivées de la cellule "BK". Pour n entrées, il donne n(n+1)/2 bits à reboucler.
Ce circuit a un autre intérêt : il fourni l'entrée Q (la racine) convertie de "BS" en
binaire. Il fourni en plus une sortie Qm = Q0 – 1. Si le reste final R de l'extraction de
racine sans propagation de retenue est négatif, c'est que le Q calculé est trop grand
(de 1) et Qm est la bonne valeur de la racine. Dans le cas contraire, Q0 donne la
valeur de la racine.
Cellule du Vérifiez que vous maîtrisez les fonctions logiques de la cellule "trc" de conversion de
convertisseur de notation "BS" vers notation binaire conventionnelle.
racine L'entrée "si" est un bit du Qj, l'entrée "ci" indique que la retenue se propage à la
position de cette cellule. La retenue est utilisée pour la soustraction. Elle correspond
au 'P' de la cellule"BK".
–
• si qj = '1' alors { so = si ⊕ ci ; co = 0}//soustraction (somme – retenue),
retenue tuée
• si qj = '0' alors { so = si ; co = ci } //somme inchangée, retenue propagée
•
si qj = '1' alors { so = si ; co = 0 } //somme inchangée, retenue tuée
Opérateurs Arithmétiques Page 47
Extracteur de L'extracteur rapide utilise les mêmes cellules que le diviseur rapide pour effectuer à
racine carrée chaque itération une des opérations arithmétiques :
j
2j-1
–
sans
• si qj = '1' alors R2j-2 = R2j + 2 * Qj – 2
// addition
propagation de
• si qj = '0' alorsR2j-2 = R2j // identité
retenue
j
2j-1
•
si qj = '1' alors R2j-2 = R2j – 2 * Qj – 2
//soustraction
2j-1
La deuxième difficulté par rapport à la division est dans la soustraction de 2
quand qj = '-1' ou qj = '1'. Ce cas est détecté par une porte "ou" dont la sortie est relié
à l'entrée négative de la cellule "tail" en poids faible de chaque ligne.
Ramené à des entiers, une ligne calcule S = 4 * R + A – qj-1 * ( 4 * Qj + qj-1 )
ou encore S = R & a1 & a0 – qj-1 * ( Qj & 0 & qj-1 ), "&" désignant la concaténation.
^ du
Chaque cellule "head" détermine un qj grâce à la valeur d'un approximant R
2j
reste courant R2j limité aux 3 premiers chiffres de R2j.
Opérateurs Arithmétiques Page 48
La deuxième difficulté de l'extraction de racine par rapport à la division est dans la
2j-1
–
soustraction de 2
quand qj = '1' ou qj = '1'. On utilise pour cette soustraction de un
bit l'entrée négative de la cellule "tail" en poids faible de chaque ligne.
La troisième difficulté limite en fait le domaine d'utilisation. En effet tous les Qj
doivent commencer par un '1' en poids fort (implicite). Cette condition n'est pas
réalisée si les deux premiers bits du radicande A sont nuls tous les deux. On soustrait
ce '1' de A à la première ligne grâce à une entrée négative de "head".
La racine Q sort à gauche en notation "BS" et sort en bas convertie en binaire
conventionnel.
Diviseur et Le même circuit peut exécuter soit la division soit l'extraction de racine carrée grâce
extracteur de à des multiplexeurs "2 ⇒ 1" insérés sur les entrées de certaines cellules "tail". La
racine carrée flèche à côté du bouton permute les connexions des entrées d'environ la moitié des
cellules "tail" et permute ainsi la fonction réalisée.
Pour clarifier le dessin convertisseur n'est pas dessiné pour la division. Il est
cependant toujours connecté à Q et fourni en sortie un quotient ou une racine en
Opérateurs Arithmétiques Page 49
binaire conventionnel.
pour l'extraction de racine l'entrée D est déconnectée.
La comparaison de ces deux dessins montre où insérer les multiplexeurs.
Opérateurs Arithmétiques Page 50
Addition en Virgule Flottante
Format des Trois champs composent l'écriture binaire des nombres en virgule flottante. Le signe
nombres en S (1 bit), l'exposant E (8 bits) et la mantisse M, ou significande (23 bits).
S
(E - 127)
virgule flottante La valeur du nombre est (-1) * 2
* (1 + M / 8388608 ) . Cependant si E = 0,
S
(-126)
le nombre dénormalisé vaut (-1) * 2
* ( M / 8388608 ) et si E = 255, la valeur
est infinie.
Vérifiez que vous vous maîtrisez ce format en donnant l'écriture (32 bits) des
nombres proposés.
Addition et Les réels étant codés en "signe/valeur-absolue", un seul bit permet de changer le
soustraction signe d'un opérande. En conséquence le même opérateur effectue indifféremment
l'addition ou la soustraction suivant les signes des opérandes. L'addition/soustraction
de deux réels S = A + B est plus complexe que la multiplication ou la division.
Elle se déroule en 4 étapes:
• Alignement des mantisses si les exposants de A et B sont différents
• Addition ou soustraction des mantisses alignées
• Renormalisation de la somme S si elle n'est pas normalisée
• Arrondi de la somme S au plus près.
L'alignement produit un bit de garde, un bit d'arrondi et un bit collant utilisés pour
l'arrondi au plus près.
Opérateurs Arithmétiques Page 51
Additionneur/ Un additionneur flottant est formé des blocs ci-dessous:
soustracteur Bloc1: sort plus grand exposant (8 bits), sort la distance des exposants (5 bits), sort le
bit implicite du plus petit opérande et le bit implicite du plus grand opérande.
Bloc 2: sort à gauche la mantisse du plus petit opérande (23 bits), sort à droite la
mantisse du plus grand opérande (23 bits).
Décaleur 1: décale vers la droite la mantisse du plus petit, ajoute un bit de garde et
un bit collant; total 26 bits.
Complémenteur: fait sur commande le complément logique en vue d'une
soustraction.
Additionneur 1: additionne les deux entrées et la retenue, sort un résultat arrondi et
une retenue.
Compteur de zéros en tête: la sortie ZLC compte nombre de '0' en poids forts si le
résultat n'est pas normalisé et vaut '1' autrement.
Décaleur 2: décale vers la gauche ( ZLC – 1 ). Le bit sortant poids fort est perdu ( '1'
implicite).
Additionneur 2: soustrait du plus grand exposant ( ZLC – 1 ).
Décaleur rapide Pour l'addition en virgule flottante, il faut effectuer des additions d'entiers, des
décalages paramétrables (à droite pour l'alignement, à gauche pour la
renormalisation) et un comptage des zéros en poids forts.
Nous savons effectuer l'addition en temps log2(n). Le décalage paramétrable est
également en temps log2(n). Un réseau de portes logiques calcule le "bit collant".
Opérateurs Arithmétiques Page 52
Compteur de Un arbre binaire décompte le nombre de '0' en poids forts de la chaîne de bits S par
zéros en tête dichotomie. Si la taille des sous-chaînes est une puissance de 2, alors il n'y a pas
( ZLC ) besoin d'additionneur mais seulement de multiplexeurs. En fait seule la taille de la
sous-chaîne de gauche doit être une puissance de 2, la taille de la chaîne de droite
doit simplement être inférieure ou égale à celle de gauche.
Cellule de Cette cellule combine le nombre de '0' en poids forts de chacune de deux chaînes de
compteur de longueur 16 pour obtenir le nombre de '0' en poids forts de la concaténation des deux
zéros en tête chaînes.
. si X < 16 alors S = X sinon S = 16 + Y
Opérateurs Arithmétiques Page 53
Prédiction de A partir des mantisses A et B on peut construire une chaîne de bits P ayant (à 1 près)
zéros en tête le même nombre de zéros en tête que le résultat de la différence D = A – B sans
effectuer la soustraction. En entrée d'un ZLC, cette chaîne prédit le nombre de
décalage. Si le résultat du décalage a encore un zéro en tête, il faut décaler ce résultat
de une position. Dans le cas contraire, ce résultat est normalisé.
La prédiction est exploitable si A est normalisé et B inférieur ou égal à A, ce qui est le
cas dans une soustraction de mantisses. Alors les zéros en tête viennent de la séquence
de retenue 'P'* 'G' 'K'* , formée d'un certain nombre (éventuellement nul) de 'P' suivi de
un seul 'G' puis d'un certain nombre de 'K' . Le prédicteur sort un '0' pour toute paire
dans cette séquence: 'P' 'P' ; 'P' 'G' ; 'G' 'K' et 'K' 'K' et sort un '1' pour toute paire hors
de la séquence. Ce prédicteur ne tient pas compte de la propagation de retenue, d'où
une possibilité de bits faussement prédits. Cependant seul le dernier bit dans la
séquence 'P'* 'G' 'K'* peut être faussement prédit.
Opérateurs Arithmétiques Page 54
Cellule de La cellule de prédiction des zéros en tête génère un '1' à la fin de la chaîne 'P'* 'G' 'K'*
prédiction et des '0' à l'intérieur de celle-ci.
Ajustement de Ce circuit rend 'Y' si la prédiction du nombre de zéros en tête est fausse, donc trop
zéros en tête petite de 1. La prédiction est fausse si la séquence de retenues commence par 'P'* 'G'
'K'* 'P' 'P'* 'K'.
Z indique une chaîne 'K'* 'P'*
Q indique une chaîne 'P'* 'G' 'K'* 'P'* (contenant un seul 'G')
N indique une chaîne commençant par 'P'* 'K'
Y indique une chaîne commençant par 'P'* 'G' 'K'* 'P' 'P'* 'K', c'est à dire Q suivi de N.
U marque toute autre chaîne
Valeur absolue Le Bloc1 calcule la valeur absolue de la différence des exposants pour commander le
de la différence Décaleur 1. Le signal "rebouclage" indique A ≥ B qui choisit le plus grand exposant.
Arrondi au plus Dans une addition/soustraction virgule flottante, la sortie S de l'additionneur est
Opérateurs Arithmétiques Page 55
proche normalisée par décalage. Cette sortie S, de 28 bits, est étiquetée "sortie add." dans la
figure ci-dessus. Ensuite S est arrondie au plus proche par l'ajout de 0 ou 1 ulp pour
donner finalement la mantisse du résultat.
Le décalage à gauche de plus de 1 position n'entraîne jamais d'ajout. En pré-décalant la
soustraction de une position à gauche on se ramène pour l'arrondi simplement aux cas :
• décalage à droite de 0 ou 1 position (S ou S/2) puis
• ajout de 0 ou ulp (avec propagation de retenue) (S ou S/2 ou S + ulp ou S/2 + ulp)
Spéculation de Pour éviter la propagation de retenue au cours de l'arrondi, on pré-calcule avec un
l'arrondi additionneur à 3 sorties en même temps que S les sorties S' = S + 1 et S" = S + 2. Avec
le décalage des sorties S et S" le résultat final est S, S/2, S' = S + 1, S"/2 = S/2 + 1.
entity FloatAdd is
port ( A, B : in Std_Logic_Vector ( 31 downto 0 ) ; -- A,B: diffend
SO : out Std_Logic_Vector (31 downto 0 ) ) ; -- Summ
end FloatAdd;
architecture TEST of FloatAdd is
component AbsDiff is
port ( A, B : in Std_Logic_Vector ( 7 downto 0 ) ; -- A, B: diffend
D : out Std_Logic_Vector ( 4 downto 0 ) ) ; -- D: Distance
end component ;
component Compar is
port ( A, B : in Std_Logic_Vector ( 30 downto 0 ) ; -- A,B: diffend
AeqB : out Std_Logic ; -- A equals B
AgtB : out Std_Logic ) ; -- A greater than B
end component ;
component Decod is
port ( D : in Std_Logic_Vector ( 7 downto 0 ) ; -- D
S : out Std_Logic_Vector ( 23 downto 0 ) ) ; -- D decoded
Opérateurs Arithmétiques Page 56
end component ;
component ShiftR is
port ( E : in Std_Logic_Vector (23 downto 0 ) ; -- E : input
D : in Std_Logic_Vector (4 downto 0 ) ; -- D : positions
Z : out Std_Logic_Vector (23 downto 0 ) ; -- Z : E shifted D positions
g : out Std_Logic ; -- g : guard
r : out Std_Logic ; -- r : round
s : out Std_Logic ) ; -- s : sticky
end component ;
component ZLPC is
port ( A, B : in Std_Logic_Vector (23 downto 0 ) ; -- A : addend, B : subend
M : in Std_Logic_Vector (23 downto 0 ) ; -- M : mask
o : in Std_Logic ; -- o : inhibit ZLPC if add
Z : out Std_Logic_Vector (4 downto 0 ) ; -- Z : number of predicted leading zeroes
n : out Std_Logic ) ; -- n : result not normalisable
end component ;
component compoundadder is
port ( A, B : in Std_Logic_Vector (23 downto 0) ; -- A addend, B addend/subend
o : in Std_Logic ; -- o : operation 0=>add, 1=>sub
g : in Std_Logic ; -- g : guard
r : in Std_Logic ; -- r : round
s : in Std_Logic ; -- s : sticky
S0 : out Std_Logic_Vector (24 downto 0) ) ;
end component ;
component AddEx is
port ( E : in Std_Logic_Vector (7 downto 0 ) ; -- E : addend
o : in Std_Logic ; -- o : o : operation 0=>add, 1=>sub
u : in Std_Logic ; -- u : error in prediction, this input late
Z : in Std_Logic_Vector (4 downto 0 ) ; -- Z : subend, number of leading '0'
S : out Std_Logic_Vector (7 downto 0 ) ; -- S : if o then S = E - Z - u + u else S <= E - u
l : out std_Logic ) ; -- S : is nul
end component ;
component ShiftL is
port ( E : in Std_Logic_Vector (24 downto 0 ) ; -- E : input to be shifted
Z : in Std_Logic_Vector (4 downto 0 ) ; -- D : positions (subtract from exponent)
n : in Std_Logic ; -- n : inhibit prediction correction
S : out Std_Logic_Vector (23 downto 0 ) ; -- S : E shifted D positions
u : out Std_logic ) ; -- u : prediction was false (add 1 to exponent)
end component ;
signal Am0, Bm0, Am1, Bm1, Bm2 : Std_Logic_Vector (23 downto 0) ;
signal Sm0 : Std_Logic_Vector (24 downto 0) ;
signal Sm1 : Std_Logic_Vector (23 downto 0) ;
signal Sm2 : Std_Logic_Vector (22 downto 0 ) ;
signal Mask : Std_Logic_Vector (23 downto 0) ;
signal Se0, Se1, SeZ : Std_Logic_Vector (7 downto 0) ;
signal D : Std_Logic_Vector (4 downto 0) ; -- distance : abs( Ae - Be)
signal Z : Std_Logic_Vector (4 downto 0) ; -- zeros leading, must be subtracted from the exponent
signal ha, hb : Std_Logic ; -- hidden bits of A and B ( A or B subnormal)
signal o : Std_Logic ; -- operation, 0 : addition, 1 : subtraction
signal v : Std_Logic ; -- abs(A) and abs(B) are equal
signal w : Std_Logic ; -- A and B must be swapped around
signal g : Std_Logic ; -- guard bit from alignment
signal r : Std_Logic ; -- round bit from alignment
signal s : Std_Logic ; -- sticky bit from alignment
signal u : Std_Logic ; -- extra shift, must be added to the exponent
signal n : Std_Logic ; -- inhibit correction
signal l : Std_Logic ; -- Sm1 = 0 (S0 subnormal)
Opérateurs Arithmétiques Page 57
begin
-- step 1
ha <= A(30) or A(29) or A(28) or A(27) or A(26) or A(25) or A(24) or A(23) ; -- reveal A's hidden bit
hb <= B(30) or B(29) or B(28) or B(27) or B(26) or B(25) or B(24) or B(23) ; -- reveal B's hidden bit
with ha select Am0 <= '1' & A(22 downto 0) when '1' , A(22 downto 0) & '0' when others ;
with hb select Bm0 <= '1' & B(22 downto 0) when '1' , B(22 downto 0) & '0' when others ;
distance : AbsDiff port map (A(30 downto 23), B(30 downto 23), D ) ; -- exponents distance
sort : Compar port map (A(30 downto 0), B(30 downto 0), v, w) ; -- comparison
SeZ <= not ( (o and v) & (o and v) & (o and v) & (o and v) & "0000" ) ;
with w select Se0 <= A(30 downto 23) when '1', B(30 downto 23) and SeZ when others ; -- larger exponent
with w select Bm1 <= Bm0 when '1', Am0 when others ; -- smaller's mantissa
with w select Am1 <= Am0 when '1', Bm0 when others ; -- larger's mantissa
o <= A(31) xor B(31) ; -- 0 => addition, 1 => subtraction
-- step 2
alignment : ShiftR port map (Bm1, D, Bm2, g, r, s) ; -- mantissas alignment
maskgen : Decod port map (Se0, Mask) ;
-- step 3
count_0 : ZLPC port map (Am1 , Bm2, Mask, o, Z, n) ; -- prediction of the leading-one position
add_mant : compoundadder port map (Am1, Bm2, o, g, r, s, Sm0) ;
-- step 4
normalise : ShiftL port map (Sm0, Z, n, Sm1, u) ; -- mantissa normalisation
adjustExp : AddEx port map (Se0, o, u, Z, Se1, l) ; -- exponent adjust, u is late
with l select Sm2 <= Sm1(22 downto 0) when '0', Sm1(23 downto 1) when others ;
SO <= ((A(31) and w) or (B(31) and not w)) & Se1 & Sm2(22 downto 0) ;
end TEST;
Premier pas (Step 1)
Le bloc "AbsDiff"
La sortie D (5 bits) du bloc "AbsDiff" est la valeur absolue de la différence des exposants A(30,23) et B(30,23)
respectivement de A et de B, saturée à 31. Afin d'être rapide, le calcul de la retenue est "Kogge et Stone".
entity AbsDiff is
port ( A, B : in Std_Logic_Vector ( 7 downto 0 ) ; -- A,B: addends
D : out Std_Logic_Vector ( 4 downto 0 ) ) ; -- D: Distance
end AbsDiff ;
architecture structural of AbsDiff is
signal P0, G0, K0, G1, K1, G2, K2, G3, K3, S : Std_Logic_Vector ( 7 downto 0 ) ; -- prop, gen, not kill
begin
-- row 0
G0 <= A and not B ; -- generate
K0 <= A or not B ; -- spare (not kill)
P0 <= not G0 and K0 ; -- propagate
-- "BK" cells row 1 (distance 1)
G1 <= (K0(7 downto 1) and ( G0(7 downto 1) or G0(6 downto 0))) & G0(0) ;
K1 <= (K0(7 downto 1) and ( G0(7 downto 1) or K0(6 downto 0))) & K0(0) ;
-- "BK" cells row 2 (distance 2)
G2 <= (K1(7 downto 2) and ( G1(7 downto 2) or G1(5 downto 0))) & G1(1 downto 0) ;
K2 <= (K1(7 downto 2) and ( G1(7 downto 2) or K1(5 downto 0))) & K1(1 downto 0) ;
-- "BK" cells row 3 (distance 4)
G3 <= (K2(7 downto 4) and ( G2(7 downto 4) or G2(3 downto 0))) & G2(3 downto 0) ;
K3 <= (K2(7 downto 4) and ( G2(7 downto 4) or K2(3 downto 0))) & K2(3 downto 0) ;
-- feed-back row
with K3(7) select S <= P0 xor (not G3(6 downto 0) & '1') when '0', P0 xor (K3(6 downto 0) & '1') when others ;
-- reduction from 8 bits downto 5 bits with saturation
with S(7) or S(6) or S(5) select D <= S(4 downto 0) when '0', "11111" when others ;
end structural
Opérateurs Arithmétiques Page 58
Le bloc "Compar"
En parallèle avec le bloc "AbsDif", le bloc "Compar" compare les valeurs absolues (le signe est ignoré) de A et B
en calculant la retenue sortante c31 de la soustraction.
entity Compar is
port ( A, B : in Std_Logic_Vector ( 30 downto 0 ) ; -- A,B: addends
C31 : out Std_Logic ) ; -- A greater than B
end Compar ;
architecture structural of Compar is
signal G, P : Std_Logic_Vector (59 downto 0) ;
begin
-- "HA" cells row
G(30 downto 0) <= A and not B ; -- generate
P(30 downto 0) <= A xor not B ; -- propagate
-- "BK" cells row 1 (distance 1)
G(45) <= G(29) or (P(29) and G(28)) ; P(45) <= P(29) and P(28) ;
G(44) <= G(27) or (P(27) and G(26)) ; P(44) <= P(27) and P(26) ;
G(43) <= G(25) or (P(25) and G(24)) ; P(43) <= P(25) and P(24) ;
G(42) <= G(23) or (P(23) and G(22)) ; P(42) <= P(23) and P(22) ;
G(41) <= G(21) or (P(21) and G(20)) ; P(41) <= P(21) and P(20) ;
G(40) <= G(19) or (P(19) and G(18)) ; P(40) <= P(19) and P(18) ;
G(39) <= G(17) or (P(17) and G(16)) ; P(39) <= P(17) and P(16) ;
G(38) <= G(15) or (P(15) and G(14)) ; P(38) <= P(15) and P(14) ;
G(37) <= G(13) or (P(13) and G(12)) ; P(37) <= P(13) and P(12) ;
G(36) <= G(11) or (P(11) and G(10)) ; P(36) <= P(11) and P(10) ;
G(35) <= G(9) or (P(9) and G(8)) ; P(35) <= P(9) and P(8) ;
G(34) <= G(7) or (P(7) and G(6)) ; P(34) <= P(7) and P(6) ;
G(33) <= G(5) or (P(5) and G(4)) ; P(33) <= P(5) and P(4) ;
G(32) <= G(3) or (P(3) and G(2)) ; P(32) <= P(3) and P(2) ;
G(31) <= G(1) or (P(1) and G(0)) ;
-- "BK" cells row 2 (distance 2)
G(53) <= G(30) or (P(30) and G(45)) ; P(53) <= P(30) and P(45) ;
G(52) <= G(44) or (P(44) and G(43)) ; P(52) <= P(44) and P(43) ;
G(51) <= G(42) or (P(42) and G(41)) ; P(51) <= P(42) and P(41) ;
G(50) <= G(40) or (P(40) and G(39)) ; P(50) <= P(40) and P(39) ;
G(49) <= G(38) or (P(38) and G(37)) ; P(49) <= P(38) and P(37) ;
G(48) <= G(36) or (P(36) and G(35)) ; P(48) <= P(36) and P(35) ;
G(47) <= G(34) or (P(34) and G(33)) ; P(47) <= P(34) and P(33) ;
G(46) <= G(32) or (P(32) and G(31)) ;
-- "BK" cells row 3 (distance 4)
G(57) <= G(53) or (P(53) and G(52)) ; P(57) <= P(53) and P(52) ;
G(56) <= G(51) or (P(51) and G(50)) ; P(56) <= P(51) and P(50) ;
G(55) <= G(49) or (P(49) and G(48)) ; P(55) <= P(49) and P(48) ;
G(54) <= G(47) or (P(47) and G(46)) ;
-- "BK" cells row 4 (distance 8)
G(59) <= G(57) or (P(57) and G(56)) ; P(59) <= P(57) and P(56) ;
G(58) <= G(55) or (P(55) and G(54)) ;
-- "BK" cells row 5 (distance 16)
C31 <= G(59) or (P(59) and G(58)) ;
end structural;
Deuxième pas (Step 2)
Le bloc "Decod"
Le bloc "Decod" transcode la valeur de Se0 (8 bits) en "code thermométrique" (24 bits). La sortie Mask a autant de
'0' à gauche que la valeur de Se0, les autres bits sont à '1'.
entity Decod is
port ( D : in Std_Logic_Vector ( 7 downto 0 ) ; -- D
Opérateurs Arithmétiques Page 59
Mask : out Std_Logic_Vector ( 23 downto 0 ) ) ; -- D decoded
end Decod;
architecture structural of Decod is
signal P : Std_Logic_Vector (53 downto 0) ;
begin
with D(7) or D(6) or D(5) select Mask <= "000000000000000000000000" when '1',
P(23 downto 0) when others ;
with D(4) select P(23 downto 0) <= "00000000" & P(39 downto 24) when '1' ,
P(39 downto 24) & "11111111" when others ;
with D(3) select P(39 downto 24) <= "00000000" & P(47 downto 40) when '1' ,
P(47 downto 40) & "11111111" when others ;
with D(2) select P(47 downto 40) <= "0000" & P(51 downto 48) when '1' ,
P(51 downto 48) & "1111" when others ;
with D(1) select P(51 downto 48) <= "00" & P(53 downto 52) when '1' ,
P(53 downto 52) & "11" when others ;
P(53 downto 52) <= not D(0) & '1' ;
end ;
Le bloc "ShiftR"
Le bloc "ShiftR" décale Bm1 à droite de D positions pour donner Bm2.
Ce bloc calcule en parallèle les bits g, r et s.
entity ShiftR is
port ( E : in Std_Logic_Vector (23 downto 0 ) ; -- E : input
D : in Std_Logic_Vector (4 downto 0 ) ; -- D : positions
Z : out Std_Logic_Vector (23 downto 0 ) ; -- Z : E shifted right D positions
g, r, s : out Std_Logic ; -- g : guard, r : round, s : sticky
end ShiftR ;
architecture structural of ShiftR is
signal sticky : Std_Logic ;
signal P0, P1, P2, P3, P4, P5 : Std_Logic_Vector (25 downto 0) ; -- internal signals
begin
P5 <= E & "00" ; -- append room for guard and round bits
with D(4) select P4 <= P5 when '0' , "0000000000000000" & P5(25 downto 16) when others ;
with D(3) select P3 <= P4 when '0' , "00000000" & P4(25 downto 8 ) when others ;
with D(2) select P2 <= P3 when '0' , "0000" & P3(25 downto 4) when others ;
with D(1) select P1 <= P2 when '0' , "00" & P2(25 downto 2) when others ;
with D(0) select P0 <= P1 when '0' , "0" & P1(25 downto 1) when others ;
sticky <= ((P5(15) or P5(14) or P5(13) or P5(12) or P5(11) or P5(10) or P5(9) or P5(8) or
P5(7) or P5(6) or P5(5) or P5(4) or P5(3) or P5(2) or P5(1) or P5(0)) and D(4)) or
((P4(7) or P4(6) or P4(5) or P4(4) or P4(3) or P4(2) or P4(1) or P4(0)) and D(3)) or
((P3(3) or P3(2) or P3(1) or P3(0)) and D(2)) or
((P2(1) or P2(0)) and D(1)) or (P1(0) and D(0)) ;
Z <= P0(25 downto 2) ;
g <= P0(1) ; r <= P0(0) ; s <= sticky ;
end structural ;
Troisième pas (Step 3)
Le bloc "ZLPC"
Le bloc "ZLPC" compte le nombre de '0' en tête d'une prédiction du résultat de la soustraction Bm2 – Am2 (o =
'1') limité à Mask. En parallèle on regarde si le nombre de '0' est inférieur ou égal à Mask (Se0 traduit en code
thermométrique), dans ce cas le résultat est normalisable.
entity ZLPC is
port ( A, B : in Std_Logic_Vector (23 downto 0 ) ; -- A addend, B subtraend
Mask : in Std_Logic_Vector (23 downto 0 ) ; -- Se0 leading zeroes
o : in Std_Logic ; -- enable if subtraction, disable if addition
Z : out Std_Logic_Vector (4 downto 0 ) ; -- Z : number of leading zeroes
Opérateurs Arithmétiques Page 60
n : out Std_Logic ) ; -- N normalised
end ZLPC ;
architecture structural of ZLPC is
signal P : Std_Logic_Vector (93 downto 0) ; -- internal signals
signal Q, R : Std_Logic_Vector (23 downto 0 ) ;
begin
Q <= (A xor B) and ((A(22 downto 0) or not B(22 downto 0)) & '1') ; -- prediction
R <= not Q or Mask ;
n <= R(23) and R(22) and R(21) and R(20) and R(19) and R(18) and R(17) and R(16)
and R(15) and R(14) and R(13) and R(12) and R(11) and R(10) and R(9) and R(8)
and R(7) and R(6) and R(5) and R(4) and R(3) and R(2) and R(1) and R(0) ;
P(93 downto 70) <= not (Q or Mask) ;
-- counter row 1 (blocks of 2)
P(69 downto 68) <= (P(93) and P(92)) & (P(93) and not P(92)) ;
P(67 downto 66) <= (P(91) and P(90)) & (P(91) and not P(90)) ;
P(65 downto 64) <= (P(89) and P(88)) & (P(89) and not P(88)) ;
P(63 downto 62) <= (P(87) and P(86)) & (P(87) and not P(86)) ;
P(61 downto 60) <= (P(85) and P(84)) & (P(85) and not P(84)) ;
P(59 downto 58) <= (P(83) and P(82)) & (P(83) and not P(82)) ;
P(57 downto 56) <= (P(81) and P(80)) & (P(81) and not P(80)) ;
P(55 downto 54) <= (P(79) and P(78)) & (P(79) and not P(78)) ;
P(53 downto 52) <= (P(77) and P(76)) & (P(77) and not P(76)) ;
P(51 downto 50) <= (P(75) and P(74)) & (P(75) and not P(74)) ;
P(49 downto 48) <= (P(73) and P(72)) & (P(73) and not P(72)) ;
P(47 downto 46) <= (P(71) and P(70)) & (P(71) and not P(70)) ;
-- counter row 2 (blocks of 4)
P(45 downto 43) <= (P(69) and P(67)) & (P(69) and not P(67)) & (P(68) or (P(69) and P(66))) ;
P(42 downto 40) <= (P(65) and P(63)) & (P(65) and not P(63)) & (P(64) or (P(65) and P(62))) ;
P(39 downto 37) <= (P(61) and P(59)) & (P(61) and not P(59)) & (P(60) or (P(61) and P(58))) ;
P(36 downto 34) <= (P(57) and P(55)) & (P(57) and not P(55)) & (P(56) or (P(57) and P(54))) ;
P(33 downto 31) <= (P(53) and P(51)) & (P(53) and not P(51)) & (P(52) or (P(53) and P(50))) ;
P(30 downto 28) <= (P(49) and P(47)) & (P(49) and not P(47)) & (P(48) or (P(49) and P(46))) ;
-- counter row 3 (blocks of 8)
P(27 downto 24) <= (P(45) and P(42)) & (P(45) and not P(42)) & (P(44) or (P(45) and P(41))) & (P(43) or (P(45) and P(40))) ;
P(23 downto 20) <= (P(39) and P(36)) & (P(39) and not P(36)) & (P(38) or (P(39) and P(35))) & (P(37) or (P(39) and P(34))) ;
P(19 downto 16) <= (P(33) and P(30)) & (P(33) and not P(30)) & (P(32) or (P(33) and P(29))) & (P(31) or (P(33) and P(28))) ;
-- counter row 4 (blocks of 16)
P(14 downto 11) <= (P(27) and not P(23)) & (P(26) or (P(27) and P(22))) & (P(25) or (P(27) and P(21))) & (P(24) or (P(27) and P(20))) ;
-- counter row 5
P(4) <= P(27) and P(23) ; P(3) <= P(14) or (P(4) and P(19)) ; P(2) <= P(13) or (P(4) and P(18)) ;
P(1) <= P(12) or (P(4) and P(17)) ; P(0) <= P(11) or (P(4) and P(16)) ;
with o select Z <= "00000" when '0' , P(4 downto 0) when others ;
end structural;
Le bloc "CompoundAdder"
Le bloc "CompoundAdder" calcule le résultat correctement arrondi au plus près mais non encore normalisé. Afin
d'être rapide, le calcul de la retenue est "Kogge et Stone".
entity compoundadder is
port ( A, B : in Std_Logic_Vector (23 downto 0) ;
o, g, r, s : in Std_Logic ; -- operation, guard, round, sticky
S0 : out Std_Logic_Vector (24 downto 0) ) ; -- rounded, not normalised
end compoundadder ;
architecture structural of compoundadder is
signal c, m, k, i, plus1, minus0 : Std_Logic ;
signal G0, P0, K0, G1, K1, G2, K2, G3, K3, G4, K4, G5, K5 : Std_Logic_Vector (23 downto 0) ;
signal S1, S2 : Std_Logic_Vector (24 downto 0) ;
begin
with o select G0 <= A and B when '0' , A and not B when others ; -- generate
with o select K0 <= A or B when '0' , A or not B when others ; -- spare (not kill)
Opérateurs Arithmétiques Page 61
P0 <= not G0 and K0 ; -- propagate
k <= P0(1) xor G0(0) ; -- penultimate
i <= P0(0) ; -- least significant
-- "BK" cells row 1 (distance 1)
G1 <= (K0(23 downto 1) and ( G0(23 downto 1) or G0(22 downto 0))) & G0(0) ;
K1 <= (K0(23 downto 1) and ( G0(23 downto 1) or K0(22 downto 0))) & K0(0) ;
-- "BK" cells row 2 (distance 2)
G2 <= (K1(23 downto 2) and ( G1(23 downto 2) or G1(21 downto 0))) & G1(1 downto 0) ;
K2 <= (K1(23 downto 2) and ( G1(23 downto 2) or K1(21 downto 0))) & K1(1 downto 0) ;
-- "BK" cells row 3 (distance 4)
G3 <= (K2(23 downto 4) and ( G2(23 downto 4) or G2(19 downto 0))) & G2(3 downto 0) ;
K3 <= (K2(23 downto 4) and ( G2(23 downto 4) or K2(19 downto 0))) & K2(3 downto 0) ;
-- "BK" cells row 4 (distance 8)
G4 <= (K3(23 downto 8) and ( G3(23 downto 8) or G3(15 downto 0))) & G3(7 downto 0) ;
K4 <= (K3(23 downto 8) and ( G3(23 downto 8) or K3(15 downto 0))) & K3(7 downto 0) ;
-- "BK" cells row 5 (distance 16)
G5 <= (K4(23 downto 16) and ( G4(23 downto 16) or G4(7 downto 0))) & G4(15 downto 0) ;
K5 <= (K4(23 downto 16) and ( G4(23 downto 16) or K4(7 downto 0))) & K4(15 downto 0) ;
c <= G5(23) ; -- carry
m <= P0(23) xor G5(22) ; -- most significant
with c select plus1 <= i and ( k or g or r or s ) when '1' , g and ( i or r or s ) when others ;
with m select minus0 <= g and ( not i or r or s ) when '1' , g or ( r and s ) when others ;
with plus1 select S1 <= ('0' & P0) xor (G5 & '0') when '0', ('0' & P0) xor (K5 & '1') when others ;
with minus0 select S2 <= ('1' & P0) xor (G5 & '0') when '1', ('1' & P0) xor (K5 & '1') when others ;
with o select S0 <= S1 when '0', S2(23 downto 0) & g when others ; -- pre-shift
end structural ;
Quatrième pas (Step 4)
Le bloc "AddEx"
Le bloc "AddEx" calcule l'exposant du résultat. En parallèle on regarde si cet exposant est nul, ce qui implique que
résultat final est non normalisé et qu'il ne faut pas en effacer le bit pois fort.
entity AddEx is
port ( E : in Std_Logic_Vector (7 downto 0 ) ; -- E : positive input
o : in Std_Logic ; -- o : operation 0=>add, 1=>sub
u : in Std_Logic ; -- u : error in prediction, u is late
Z : in Std_Logic_Vector (4 downto 0 ) ; -- Z : number of leading '0'
S : out Std_Logic_Vector (7 downto 0 ) ; -- S : if o then S = E - Z - u else S <= E - u
l : out std_Logic ) ; -- S is nul
end AddEx ;
architecture structural of AddEx is
signal G0, P0, K0, G1, K1, G2, K2, G3, K3 : Std_Logic_Vector ( 7 downto 0 ) ; -- prop, gen, spare
signal L0 : Std_Logic_Vector ( 6 downto 0 ) ;
begin
-- row 0
with o select G0 <= "00000000" when '0', E(7 downto 5) & (E(4 downto 0) and not Z) when others ;
with o select K0 <= E when '0' , "111" & (E(4 downto 0) or not Z) when others ;
P0 <= not G0 and K0 ;
L0 <= not P0(7 downto 1) xor K0(6 downto 0) ; -- "111111" => S = 0
-- "BK" cells row 1 (distance 1)
G1 <= (K0(7 downto 1) and ( G0(7 downto 1) or G0(6 downto 0))) & G0(0) ;
K1 <= (K0(7 downto 1) and ( G0(7 downto 1) or K0(6 downto 0))) & K0(0) ;
-- "BK" cells row 2 (distance 2)
G2 <= (K1(7 downto 2) and ( G1(7 downto 2) or G1(5 downto 0))) & G1(1 downto 0) ;
K2 <= (K1(7 downto 2) and ( G1(7 downto 2) or K1(5 downto 0))) & K1(1 downto 0) ;
-- "BK" cells row 3 (distance 4)
G3 <= (K2(7 downto 4) and ( G2(7 downto 4) or G2(3 downto 0))) & G2(3 downto 0) ;
K3 <= (K2(7 downto 4) and ( G2(7 downto 4) or K2(3 downto 0))) & K2(3 downto 0) ;
-- last row
with u select S <= P0 xor (G3(6 downto 0) & '0') when '1', P0 xor (K3(6 downto 0) & '1') when others ;
with u select l <= L0(5) and L0(4) and L0(3) and L0(2) and L0(1) and L0(0) and not P0(0) when '1' ,
Opérateurs Arithmétiques Page 62
not G3(7) and K3(7) when others ;
end structural ;
Le bloc "ShiftL"
En parallèle avec "AddEx" le bloc "ShiftL" décale Sm0 à droite de Z positions. Le résultat n'est pas
obligatoirement normalisé car il peut y avoir une erreur de prédiction (soustraction) ou un débordement (addition).
Le denier étage corrige ces erreurs.
entity ShiftL is
port ( E : in Std_Logic_Vector (24 downto 0 ) ; -- E : input
Z : in Std_Logic_Vector (4 downto 0 ) ; -- Z : positions
n : in Std_Logic ; -- n : inhibit correction
S : out Std_Logic_Vector (23 downto 0 ) ; -- S : E shifted left Z + u positions
u : out Std_Logic ) ; -- add to exponent
end ShiftL ;
architecture structural of ShiftL is
signal P0, P1, P2, P3, P4 : Std_Logic_Vector (24 downto 0) ; -- internal signals
begin
with Z(4) select P4 <= E when '0' , E(8 downto 0) & "0000000000000000" when others ;
with Z(3) select P3 <= P4 when '0' , P4(16 downto 0) & "00000000" when others ;
with Z(2) select P2 <= P3 when '0' , P3(20 downto 0) & "0000" when others ;
with Z(1) select P1 <= P2 when '0' , P2(22 downto 0) & "00" when others ;
with Z(0) select P0 <= P1 when '0' , P1(23 downto 0) & "0" when others ;
with P0(24) or n select S <= P0(24 downto 1) when '1' , P0(23 downto 0) when others ;
u <= not ( P0(24) or n ) ;
end structural ;
Opérateurs Arithmétiques Page 63
Fonctions élémentaires
Fonctions On réalise les fonctions Exponentielle, Logarithme, Sinus, Cosinus et Arc
élémentaires tangente avec des additions/soustractions et des décalages fixes. Le décalage fixe
est de coût et délai nul si l'opérateur est câblé. Les additions/soustractions sont
sans propagation de retenue, donc à délai constant.
coût
délai max
addition/soustraction/décalage
n2
n
lecture en table (ROM)
n * 2n
log2(n)
Une lecture en table (ROM) serait plus rapide, mais la taille de la table, donc le
coût, croît exponentiellement avec le nombre de bits de précision requis. Toutefois
le partitionnement de la table en réduit la taille.
De la pesée du Supposons qu'on veuille calculer X = exp ( Y ). On dispose d'une balance, d'un
pain à pain dont-jle poids est justement Y et enfin d'une série de poids de valeur
l'exponentielle log(1 + 2 ). La pesée est classique, la somme des poids demande (Nb. poids – 1)
addition. Cependant la valeur des poids est choisie pour que l'exponentielle de la
somme des poids s'obtienne également avec (Nb. poids) additions. En effet la
valeur de l'exponentielle est un produit de rationnels (2j + 1) / 2j . La multiplication
par chacun de ces rationnels se réduit à un décalage et une addition.
Division sans On remplace la balance par un diviseur "SRT" dont voici le "diagramme de
propagation pour Robertson".
l'exponentielle
Opérateurs Arithmétiques Page 64
Diviseur "SRT" Le dividende Y (en haut) est dans l'intervalle ] -1 , +1 [ Les constantes log(1 + 2-j )
pour et -log(1 – 2-j ) entrant dans les cellules "tail" sont câblées. Il y a donc 4 variantes
l'exponentielle de la cellule "tail" fonction des valeurs de 2 bits.
^ , somme pondérée des
Opération d'une Chaque q est choisi par une cellule "head" en fonction de R
j
j
tranche de
2 chiffres poids forts r1 et r0 de l'écriture de Rj.
diviseur "SRT"
^ – 2 ; R = R + log(1 – 2-j ) } //
^ > 0 alors { q = '1' ; s = R
si R
j
j
0
j
j+1
j
pour •
soustraction
l'exponentielle
•
•
^ = -1 alors { q = '0' ; s = R
^ ; R = R + 0 } // identité
^ = 0 ou R
si R
j
j
j
0
j
j+1
j
-j
–
^
^
si Rj < -1 alors { qj = '1' ; s0 = Rj + 2 ; Rj+1 = Rj + log(1 + 2 ) } //addition
Opérateurs Arithmétiques Page 65
Suite de La suite de multiplications conditionnelles par 1, par (1 + 2-j ) ou par (1 – 2-j )
multiplications nécessite une seule propagation de retenue finale grâce à des additionneurs en "CS"
et des décalages câblés. Les additions en "CS" sont tronquées à 2 n chiffres, dont 2
avant la virgule. Le troisième chiffre poids fort ( tout à gauche ) est le signe. Bien que
les résultats partiels soient tous positifs ou nuls, exécuter des soustractions en "CS"
entraîne un signe qui doit être étendu lors du décalage. Le résultat final (en bas) doit
être traduit de "CS" en binaire par une addition (avec propagation). La fenêtre du bas
permet de comparer le produit "vraie" des multiplications (sans troncature) au produit
avec troncature.
Exemple Les tableaux ci-dessous montrent les restes partiels du diviseur "SRT" ("BS") puis les
numérique produits partiels ("CS") pour le calcul d'exponentielle. La fenêtre du bas permet de
d'exponentielle comparer -jla valeur "vraie"-jde l'exponentielle au produit de multiplications tronquées
par (1 + 2 ) ou par (1 – 2 ).
Opérateurs Arithmétiques Page 66
On a entré Y = 0,7 dans le diviseur, en fait 0.101100110011001100110011011sur 28 bits (0.6999999843).
-- -- -- - - --Le quotient sur 28 chiffres s'écrit 1000111011001101010011000111 et donnerait 2,0137522695814808.
-- -- -- - En ne gardant que 18 chiffres 100011101100110101 on obtient finalement X= 2,01375556178391 dont le
logarithme vaut environ 0,70000141740909895
Opérateurs Arithmétiques Page 67
Extension du Le circuit précédent fonctionne pour Y dans l'intervalle ] -1 , +1 [ . Pour
domaine l'exponentielle d'un nombre Y quelconque, on écrit Y = Q*log(8) + R, où Q est leQ
quotient entier de la division de Y par log(8) et R < log(8) < 1. Alors exp(Y) = 8 *
3Q
exp(R) = 2 * exp(R). Comme exp(R) < 1, il est calculable par le circuit précédent.
Logarithme et
exponentielle
Opérateur de calcul de Logarithme ou d'Exponentielle (c'est le même) avec des
additions/soustraction (c'est la même opération), des décalages et des constantes. Les
-j
-j
–
constantes sont log(1 + 2 ) et -log(1 – 2 ) et les chiffres ∈{ '1' , '0' , '1' }. Cette liberté
dans le choix des chiffres, qui fera défaut pour Sinus et Cosinus, permet
éventuellement de calculer plus vite avec des additions/soustractions sans propagation
Opérateurs Arithmétiques Page 68
De la pesée du On veut calculer sin ( A ) et/ou cos ( A ). On dispose d'une balance, d'un pain dont le
-j
pain au sinus et poids est justement A et enfin d'une série de poids de valeur ArcTangente( 2 ). Les
au cosinus poids ne peuvent être que sur l'un ou l'autre des deux plateaux.
Calcul de Sinus Soit un vecteur Vj d'extrémité (Xj, Yj ). Une "pseudoRotation" de Vj d'un angle arctg
Opérateurs Arithmétiques Page 69
et Cosinus (2-j) donne Vj+1 d'extrémité Xj+1 = Xj – Yj * 2-j et Yj+1 = Yj + Xj * 2-j.
-j
En décomposant un angle A en une somme pondérée d'arctg (2 ), une suite de
"pseudoRotations" calcule les coordonnées du vecteur d'angle A qui sont les valeurs
sin(A) et cos(A) cherchées. Pour chaque "pseudoRotations" on n'a effectué une
addition et une soustraction.
La constante k Chaque "pseudoRotation" de arctg(2-j ) entraîne un allongement du vecteur de
-2j
1+2
, car ce n'est pas exactement une rotation mais un déplacement de l'extrémité du vecteur
sur un vecteur perpendiculaire. Pour compenser par avance le produit des allongements
d'une suite de "pseudoRotations", le vecteur de départ est ( X0 = k , Y0 = 0 ) . Pour n
assez grand, k vaut environ 0,60725. Pour que k soit une constante, l'écriture dans la
-j
–
base arctg(2 ) utilise des chiffres ∈{ '1', '1' } .
Décomposition Quel est le domaine des angles A = Σ n a arctg (2-j) et quelle précision espérer de
j=0 j *
d'un angle cette écriture ? L'angle A est la valeur cherchée et l'angle T la valeur atteinte par la
suite de "pseudoRotations". Cliquer dans la figure pour changer A. Les valeurs sont en
radian. La touche "Mise à zéro" laisse effectuer 'à la main' la conversion de A dans la
-j
base arctg (2 ).
Opérateurs Arithmétiques Page 70
"Diagramme de Le "diagramme de Robertson" montre que l'itération de conversion de l'angle dans la
-j
Robertson" base arctg(2 ) peut être choisie comme suit:
-j
-j
–
pour sinus et
si R ≥ 0 alors { S = R – arctg(2 ) ; aj = '1' } sinon { S = R + arctg(2 ) ; aj = '1' }.
cosinus
Diviseur "sans L'angle A (en haut du diviseur) est dans l'intervalle [ -1,743.. +1,743...]. Les bits
restauration" de constants entrant dans les cellules "AS" sont câblés. Les opérations sont choisies par
sinus et cosinus le signe des restes partiels R précédent et par y0 pour la première opération .
Opérateurs Arithmétiques Page 71
Opérateur de
"PseudoRotation"
pour sinus et
cosinus
Si les "PseudoRotations" utilisent des additions/soustractions sans retenue (ici en
"CS") alors le délai est linéaire avec le nombre d'étages. Le premier étage n'effectue
pas vraiment une addition, puisque X0 = k , Y0 = 0.
si a0 = '1' alors { X1 = k ; Y1 = - k } sinon { X1 = k ; Y1 = k }.
Pour les étages suivants ( j > 0)
-j
-j
si aj = '0' alors { Xj+1 = Xj – Yj * 2 ;Yj+1 = Yj + Xj * 2 }
-j
-j
–
si aj = '1' alors { Xj+1 = Xj + Yj * 2 ; Yj+1 = Yj – Xj * 2 }.
-j
Pour simplifier le dessin, la nappe X * 2 n'y figure pas toujours complètement.
Opérateurs Arithmétiques Page 72
Cellule "RO" La cellule "RO" est une variante de la cellule d'addition "CS" avec en plus une
entrée "a/s" pour contrôler l'addition ou bien la soustraction. Observer que l'activité
de la retenue entrante "ci" ne se propage pas vers la flèche du haut de la sortie "co".
• si a/s = '0' alors 2 * co + s = eg + ed + ci // addition
• si a/s = '1' alors 2 * co + s = eg + 2 – ed + ci // soustraction
Opérateurs Arithmétiques Page 73
"Diagramme de On utilise une approximation ^R du reste R pour déterminer la rotation:
Robertson" ^
–
^
^
pour CORDIC à si R > 0 alors aj = '1' ; si R = 0 alors aj = '0' ; si R < 0 alors aj = '1' ;
"double On constate sur le diagramme que l'approximation peut être grossière.
rotation"
CORDIC à Ce diviseur a les mêmes cellules "head" et "tail" que le diviseur "SRT". Pour
"double s'accommoder du '0', l'angle A est préalablement divisé par 2 et les
rotation" "pseudoRotations" sont doublées. Grâce à cela l'allongement reste le même
( 1 + 4 j )2 quelque soit aj.
-j
-j
–
• si aj = '1' alors { rotation de (arctg(2 )) puis rotation de (arctg(2 )) } ;
-j
-j
• si aj = '0' alors { rotation de (arctg(2 )) puis rotation de (-arctg(2 )) } ;
-j
-j
• si aj = '1' alors { rotation de (-arctg(2 )) puis rotation de (-arctg(2 )) } ;
Opérateurs Arithmétiques Page 74
La "double rotation" est coûteuse: elle double le matériel de la rotation et probablement le délai. En regroupant les lignes par deux elle se réécrit :
-j
-2j
-j
-2j
–
si aj = '1'alors {Xj+1 = Xj + 2 * Yj * 2 – Xj * 2 ; Yj+1 = Yj – 2 * Xj * 2 – Yj * 2 }
-2j
-2j
si aj = '0' alors {Xj+1 = Xj + Xj * 2 ; Yj+1 = Yj + Yj * 2 }
-j
-2j
-j
-2j
si aj = '1' alors {Xj+1 = Xj – 2 * Yj * 2 – Xj * 2 ; Yj+1 = Yj + 2 * Xj * 2 – Yj * 2 }
Cette réécriture ne change pas le nombre d'addition/soustraction sauf lorsque les
-2j
termes multiples de 2 deviennent négligeables.
–
Peut on obtenir un résultat écrit avec des chiffres aj ∈{ '1', '1' } (sans le '0' ) avec un
délai comparable à celui du diviseur pour la double rotation? La conversion du
-j
–
quotient qui marche avec les poids 2 ( '0' '1' = '1' '1' ) ne marche plus avec les
-j
poids arctg(2 ) .
CORDIC à La "double division" est plus astucieuse que la conversion. Elle utilise deux divi"double seurs fonctionnant simultanément avec des cellules "head" légèrement modifiées.
"head" de diviseur2
division" "head" de diviseur1
^ = ^R – 2 ; a
^ = ^R – 2 ; a = '1' ; }
si ^R > 0 alors { S
si ^R ≥ 0 alors { S
j = '1' ; }
j
–
–
^
^
^
^
^
^
si R ≤ 0 alors { S = R +1 ; aj = '1' ; }
si R < 0 alors { S = R +1 ; aj = '1' ; }
^ = 0, diviseur1 parie que R ≤ 0 et diviseur2 que R ≥ 0. L'un
Il est clair que lorsque R
des deux au plus se trompe et en conséquence peut déborder, avant ou en même
^ = 0 suivant. Au débordement on saura que le résultat
temps que l'apparition du R
correct est celui de l'autre diviseur. Seul diviseur1 est affiché par l'applet cidessous.
Opérateurs Arithmétiques Page 75
Les "heads" des 2 diviseur détectent chacune le débordement pour afficher ensemble
un indicateur à 3 valeurs:
'K' le chiffre de diviseur1 est correct (divisieur2 déborde), 'G' le chiffre de diviseur2
est correct (diviseur1 déborde), 'P' propager l'indicateur suivant (pas de
débordement). Chaque fois qu'un diviseur déborde, il importe le reste partiel R de
l'autre diviseur. L'indication "Overflow" sur une cellule "head" signale un
débordement fatal de diviseur1 et de diviseur2 simultanément.
La résolution des 'P', 'K', 'G' est semblable à la propagation de retenue de l'addition.
Calcul de Arc Pour calculer l' ArcTangente(Y) on part du vecteur d'extrémité (1, Y). L'angle formé
Tangente par ce vecteur avec l'axe horizontal a la valeur cherchée. Pour mesurer cet angle, on fait
subir au vecteur une suite de "pseudoRotations" pour l'amener à l'horizontal, et on
-j
cumule les angles arctg (2 ) de ces "pseudoRotations" (la constante k n'intervient pas).
-j
-j
-j
si Yj > 0 alors { Xj+1 = Xj + Yj * 2 ; Yj+1 = Yj – Xj * 2 ; Aj+1 = Aj – arctg(2 ) ; }
-j
-j
-j
sinon { Xj+1 = Xj – Yj * 2 ; Yj+1 = Yj + Xj * 2 ; Aj+1 = Aj + arctg(2 ) ; }
Opérateurs Arithmétiques Page 76
Sinus, Cosinus Le "Nombre de bits" fixe à la fois la précision des calculs et le nombre de pas. En
et Arc Tangente cliquant flèche verticale on change la présentation. La touche "Mise à zéro" permet le
contrôle 'à la main' de la convergence.
Calcul de Arc Pour calculer l' ArcSinus(S) on part vecteur horizontal de module k et on lui fait subir une
Sinus suite de "pseudoRotations" pour amener son module à 1 et l'ordonnée Y de son extrémité à
S. L'angle formé par ce vecteur avec l'horizontale a la valeur cherchée.
Opérateurs Arithmétiques Page 77
Cet algorithme donne un résultat médiocre. En effet le vecteur est trop court (son module
croit de 0,858773 à 1) pour que son extrémité soit sur le cercle et en conséquence la
comparaison de l'ordonnée Y de son extrémité avec S est parfois erronée. A chaque
-2j
itération, le module du vecteur est multipliée par 1+ 2 , multiplier S par la même
constante rendrait la comparaison totalement pertinente.
La "double rotation" rend cette multiplication plus sympathique. En effet la multiplication
par le carré de cette constante se réduit à une addition.
Dans la figure tous les vecteurs sont dessinés avec le même module car sur le dessin leurs
coordonnées sont divisés par les constantes successives, ce qui fait que S ne bouge pas.
X1 = 1 ; Y1 = 0 ; A1 = 0 ; S1 = S ;
-j
-2j
si Yj > Sj alors { Aj+1 = Aj – 2 * arctg(2 ) ; Sj+1 = Sj + Sj * 2 ;
-j
-2j
-j
-2j
Xj+1 = Xj + 2 * Yj * 2 – Xj * 2 ; Yj+1 = Yj – 2 * Xj * 2 – Yj * 2 }
-j
-2i
sinon {Aj+1 = Aj + 2 * arctg(2 ) ; Sj+1 = Sj + Sj * 2 ;
-j
-2i
-j
-2j
Xj+1 = Xj – 2 * Yj * 2 – Xj * 2 ; Yj+1 = Yj + 2 * Xj * 2 – Yj * 2 }
Opérateurs Arithmétiques Page 78
Table Bipartite
On peut précalculer puis stocker les valeurs d'une fonction en table, cependant la taille
de cette table croît très vite avec la précision requise, ce qui limite en pratique cette
approche. Pour des fonctions continues avec une faible variation de pente (cas de
nombreuses fonctions), on peut ne stocker que la position de segments dans une
première table "TIV", et le ou les segment(s) dans une autre table "TO".
L'applet ci-dessous rempli les tables pour les fonctions et les intervalles listés à gauche
et permet d'observer graphiquement le résultat. La valeur des tables est imprimable en
VHDL.
La fonction arcsin(x) présente une très forte variation de pente quand x approche 1, elle
illustre autour de cette valeur les limites de la compression de table par bipartition.
Opérateurs Arithmétiques Page 79
Représentation Soit un ensemble { m1, m2, m3, ... mn} de n constantes entières premières entre elles
modulaire appelées moduli et soit M le produit de ces constantes, M = m m m ... m .
1*
2*
3*
*
n
Soit une variable entière A inférieure à M.
A peut s'écrire ( a1 | a2 | a3 |....| an )RNS où ai = A modulo mi (résidu).
Cette définition dit comment calculer les ai à partir de A.
Il est également possible de retrouver A à partir des ai en utilisant une autre série de
constantes { im1, im2, im3, ... imn} précalculées appelées "inverses modulo M" des
premières.
A = | a1 * im1 + a2 * im2 + a3 * im3 + ..... an * imn | modulo M
Ce résultat de réversibilité est démontré par le "théorème des restes chinois" .Vérifiez
que vous vous maîtrisez cette représentation en convertissant A de décimal à RNS ou
bien de RNS à décimal
Addition L'addition modulaire utilise n petits additionneurs calculant simultanément toutes les
modulaire sommes si =  ai + bi modulo mi .
Opérateurs Arithmétiques Page 80
Soustraction La soustraction modulaire utilise n petits soustracteurs calculant simultanément
modulaire toutes les différences di =  ai + mi - bi  modulo mi .
Multiplication La multiplication modulaire utilise n petits multiplieurs calculant simultanément tous
modulaire les produits pi =  ai * bi  modulo mi .
Opérateurs Arithmétiques Page 81
Conversion en La conversion d'une variable A binaire en RNS consiste à trouver les ai = A modulo
RNS m qui sont les restes de la division de A par m . Tous ces calculs peuvent se faire
i
i
simultanément, cependant utiliser des diviseurs n'est pas la meilleure méthode.
n
• le reste modulo 2 est immédiat,
•
n
le reste modulo 2 – 1 ne demande que des additions,
n
• le reste modulo 2 + 1 demande des additions et soustractions.
autrement on se ramène à celui des deux deniers qui a le n le plus petit. Des arbres
d'additionneurs (arbres de Wallace) réduisent A à la somme de 2 entiers de n bits sans
changer le reste modulo mi.
Les conventions graphiques sont celles de la réduction des produits partiels.
Réducteur L'applet ci-dessous réduit 64 bits en 6 bits en en conservant la valeur modulo 63
6
n
modulo 2 – 1 (63 = 2 – 1) . En sortie zéro a deux notations: "000 000" ou encore "111 111"
Opérateurs Arithmétiques Page 82
Additionneur L'additionneur "à rebouclage de retenue" ci-dessus offre deux avantages : il foncn
modulo 2 – 1 tionne correctement et il est simple, et aussi deux inconvénients: il est lent et
difficilement testable, et ce pour la même raison : il y a pour la valeur zéro deux états
n
stables. Un additionneur rend spontanément une somme modulo 2 . Avec une légère
modification l'additionneur de Sklansky à retenue entrante retardée rend une somme
n
modulo 2 – 1.
n
•
si A + B < 2 – 1 alors S = A + B ;
•
si A + B ≥ 2 – 1 alors S =  A + B + 1  modulo 2 n ;
n
Dans les deux cas on a S =  A + B  modulo (2 n– 1).
n
La condition est donnée par la retenue cn: si cn = 'K' alors A + B < 2 – 1, si cn = 'P'
n
n
alors A + B = 2 – 1, si cn = 'G' alors A + B > 2 – 1.
Donc le signal "rebouclage" qui contrôle " +1" vaut 'K' si cn = 'K' et vaut 'G'
autrement.
Opérateurs Arithmétiques Page 83
Multiplieur La multiplication de deux nombres de n bits modulo 2n – 1 déroule 3 étapes :
n
n
modulo 2 – 1
• production de n2 produits partiels modulo 2 – 1
•
n
réduction de ces n2 produits partiels 2 – 1 en 2 nombres de n bits
•
addition de ces deux nombres modulo 2 – 1 avec l'additionneur précédent.
n
2
Réducteur de La réduction des n produits partiels est semblable à celle de le multiplication rapide
produits partiels et les conventions graphiques sont les mêmes.
modulo 2n– 1
Opérateurs Arithmétiques Page 84
Réducteur L'applet suivant réduit 64 bits en 7 bits en conservant la valeur modulo 65 (65 = 26 + 1
n
modulo 2 + 1
Opérateurs Arithmétiques Page 85
Il dérive du réducteur précédent en complémentant logiquement tous les bits de rang
entre 6(2k + 1) et 6(2k + 1) + 5. On ne peut pas reboucler la retenue de l'additionneur
terminal, il faut au contraire l'ajouter au résultat de cet additionneur ce qui donne un
nombre de 7 bits.
Additionneur On peut remplacer l'additionneur terminal de la figure ci-dessus par un additionneur
n
n
modulo 2 + 1 modulo 2 + 1 :
n
•
si A + B < 2 + 1 alors S = A + B ;
•
si A + B ≥ 2 + 1 alors S = | A + B – 1 | modulo 2n ;
n
n
On se ramène à l'additionneur modulo 2 – 1 en calculant préalablement sans
n
propagation de retenue deux nombres X et Y tels que X + Y = A + B + 2 – 1 avec
les cellules HA' , duales de HA.
n
• si X + Y < 2 + 1 alors S = | X + Y + 1 | modulo 2n;
n
• si X + Y ≥ 2 + 1 alors S = | X + Y | modulo 2n;
Donc le signal "rebouclage" qui contrôle "+1" est le "nand" de xn et (cn = 'K' ). Le bit
poids fort sn est le "and" de xn et (cn = 'P' ) .
2
n-1
n
n-1
Multiplieur La génération des n produits partiels modulo 2 + 1 ajoute un biais valant 2 + 2
modulo 2n + 1 – n – 2. Le produit sera compensé de ce biais lors de la réduction des produits
partiels.
Opérateurs Arithmétiques Page 86
n-1
Réduction des L'applet réduit (n-1)*(n+1) +1 bits à deux nombres de n–1 bits chacun modulo 2 + 1.
produits partiels Les deux nombres en sortie sont à cumuler avec l'additionneur précédent. Cette
modulo 2n + 1 réduction ajoute un second biais valant n (nombre de rebouclages). La compensation
des deux biais consiste à ajouter 5 lors de la réduction.
Conversion de La notation "base mixe" ("MRS") est une notation de position avec les poids (1)
"RNS" en base (m1) (m1m2) (m1m2m3) (m1m2m3.....mn-1 ).
Opérateurs Arithmétiques Page 87
mixe "MRS" Dans cette notation X s'écrit ( z1 | z2 | z3 |....| zn )MRS où 0 ≤ zi < mi. Remarquer que
le domaine des chiffres "MRS" est le même qu'avec le "RNS" , mais les chiffres euxmêmes sont différents. La valeur X = z1 + m1 * (z2 + m2 * (z3 + m3 * ( ..... ))).
Opérateurs Arithmétiques Page 88
Téléchargement