Vous êtes sur la page 1sur 251

Concevoir son microprocesseur

structure des systmes logiques

Jean-Christophe Buisson

Collection Technosup

Ellipses

Avant-propos
Ce livre sadresse aux tudiants en informatique de licence et matrise, aux lves ingnieurs, ainsi quaux professionnels de linformatique - programmeurs ou autres soucieux de comprendre le fonctionnement des systmes logiques prsents dans les dispositifs lectroniques qui nous entourent, et en particulier les microprocesseurs et les microcontrleurs. Il est bas sur le cours, les travaux dirigs et les travaux pratiques darchitecture des ordinateurs dispenss en 1re anne du dpartement informatique de lEcole Nationale Suprieure dElectronique, dInformatique, dHydraulique et de Tlcommunications (ENSEEIHT) de Toulouse, et il est le fruit de plus de 15 ans dexprience dans ce domaine. Le livre est organis en deux grandes parties. La premire (chapitres 1 3) prsente dabord toutes les notions de base pralables la comprhension : le systme de numration binaire et son utilisation dans le codage des nombres entiers naturels et relatifs, des caractres et des nombres rels ; ses proprits dans les oprations daddition, de comparaison, etc. On dcrit ensuite les atomes de base des systmes logiques que sont les portes et les bascules, et on dcrit les mthodes danalyse et de synthse qui permettent dassembler de tels lments pour former des modules de complexit croissante. Le lecteur est ainsi amen crer des circuits combinatoires et squentiels, en employant des mthodes rutilisables dans des contextes varis. On construit des encodeurs et des dcodeurs, des compteurs, des squenceurs de diffrents types pour automatismes, etc. On examine galement en dtail des modules qui seront utiliss dans des microprocesseurs : comparateurs, units arithmtiques et logiques, multiplexeurs, mmoires, etc. Dans toute cette partie, laccent est mis sur la modularit et la rutilisabilit, notion aussi importante ici que dans les disciplines logicielles. La deuxime partie (chapitres 4 6) dcrit le fonctionnement des microprocesseurs et des microcontrleurs au travers dun processeur 32 bits spcique ce livre appel CRAPS, dont tous les organes sont des modules qui auront t tudis dans la premire partie. Son langage machine de type RISC est un sous-ensemble de celui du SPARC, et il est sufsamment riche pour pouvoir tre utilis dans des applications concrtes, ou pour quon y incorpore un systme dexploitation comme Linux. Le but de cette partie est de dvoiler le mystre de lexcution dun programme, quon pourra observer jusqu lchelle du bit lmentaire. De nombreux programmes crits en assembleur CRAPS/SPARC sont fournis, qui permettent de mettre en oeuvre des aspects importants de la vie dun processeur : dclenchement et prise en compte dune interruption, dialogue avec des priphriques dentres-sorties, appels de sous-programmes rcursifs, etc. Au del de la simple comprhension, cet ouvrage a pour objectif de permettre la conception de systmes logiques digitaux, et il en fournit tous les moyens. De nombreuses mthodes de conception sont prsentes, parfois algbriques ou tabulaires, parfois fonctionnelles ou intuitives ; pour chacune, plusieurs exemples dtaills sont fournis, qui appliquent les techniques prsentes des problmes concrets, et qui donnent au lecteur la possibilit de se construire un vritable savoir-faire dans ce domaine. Un outil logiciel de simulation appel SHDL est prsent, libre et gratuit, la fois bas sur un langage structurel

de description matrielle, et qui permet de voir fonctionner les dispositifs conus. Un second outil logiciel libre appel CRAPSEMU permet de programmer le processeur dcrit avec de nombreux exemples fournis, an que le lecteur puisse simprgner correctement des modes de fonctionnement du processeur CRAPS. Enn, des lments concrets sont fournis au lecteur pour lui permettre dimplmenter tous les circuits dcrits, jusque et y compris le processeur CRAPS, dans des circuits logiques programmables de type CPLD ou FPGA, maintenant utilisables laide de cartes dexprimentation moindre cot.

iv

Table des Matires


Avant-propos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii 1 1 3 5 6 10 15 18 18 20 20 23 26 28 30 37 56 61 61 62 63 63 64 66 69 77 84 85 92

. . . . . . . . Chapitre I. Principes gnraux 1. Organisation gnrale dun ordinateur . . . 2. Bits et signaux lectriques . . . . . . . 3. Technologies de fabrication des circuits intgrs 4. Mots binaires . . . . . . . . . . . 5. Codage des principaux types de donnes . . 6. Exercices corrigs . . . . . . . . . .

Chapitre II. lments de logique combinatoire . . . . . . 1. Circuits combinatoires . . . . . . . . . . . 2. Tables de vrit . . . . . . . . . . . . . . 3. Algbre et oprateurs de base . . . . . . . . . 4. Autres portes logiques . . . . . . . . . . . . 5. SHDL, un langage de description matrielle pdagogique 6. Circuits logiques recongurables ; PLD et FPGA . . . 7. Mthodes de simplication des fonctions combinatoires 8. Circuits combinatoires rutilisables . . . . . . . 9. Exercices corrigs . . . . . . . . . . . . . Chapitre III. lments de logique squentielle . . . . . . 1. Dnition . . . . . . . . . . . . . . . . 2. Latch RS . . . . . . . . . . . . . . . . 3. Fronts et niveaux ; signaux dhorloge . . . . . . . 4. Circuits squentiels synchrones et asynchrones : dnitions 5. Graphes dtats . . . . . . . . . . . . . . 6. Tables de transitions . . . . . . . . . . . . 7. Bascules synchrones . . . . . . . . . . . . 8. Synthse dun circuit squentiel synchrone . . . . . 9. Chronologie dun circuit squentiel synchrone . . . 10. Circuits squentiels rutilisables . . . . . . . . 11. Exercices corrigs . . . . . . . . . . . .

Chapitre IV. lments fonctionnels dun processeur 1. Sorties haute-impdance . . . . . . . 2. Les bus parallles . . . . . . . . . 3. Dcodeurs . . . . . . . . . . . 4. Multiplexeurs . . . . . . . . . . 5. Encodeurs de priorit . . . . . . . . 6. Circuit dextension de signe . . . . . . 7. Dcaleur barillet . . . . . . . . . 8. Lunit arithmtique et logique . . . . . 9. Circuit timer/PWM . . . . . . . . 10. RAMs et ROMs . . . . . . . . . 11. Exercices corrigs . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98 98 101 103 104 105 107 108 111 114 115 122 129 129 131 145 148 152 153 158 159 163 170 178 186 186 190 195 198 201 203 205 209 216 219

. . Chapitre V. Programmation du processeur 32 bits CRAPS/SPARC 1. Le langage machine, la frontire entre logiciel et matriel . . . 2. Ressources du programmeur CRAPS/SPARC . . . . . . . . 3. Directives dun programme assembleur . . . . . . . . . . 4. Exemple de programme : crible dratosthne 5. Appels de sous-programmes terminaux . . 6. Utilisation de la pile . . . . . . . . 7. Techniques de programmation diverses . . 8. Langages structure de blocs et stack-frames 9. Programmation des entres/sorties . . . 10. Programmation des exceptions . . . . 11. Exercices corrigs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Chapitre VI. Construction du processeur 32 bits CRAPS 1. Les registres . . . . . . . . . . . . 2. Lunit arithmtique et logique . . . . . . 3. Les bus du processeur CRAPS . . . . . . 4. Structure du sous-systme mmoire . . . . 5. Structure du circuit dentres/sorties . . . . 6. Structure du circuit timer/PWM . . . . . 7. Structure du sous-systme dexceptions . . . 8. Squencement des instructions . . . . . . 9. Exercices corrigs . . . . . . . . . . Rfrences

. . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . .

vi

Annexe A. Tables diverses

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

220 221 221 223 228 228 230 231 231 231 232 233 242

Annexe B. CRAPS : guide du programmeur . . B.1. Instructions synthtiques . . . . . B.2. Jeu dinstructions du processeur CRAPS B.3. Tables des branchements conditionnels B.4. Format binaire des instructions de CRAPS B.5. Directives de lassembleur CRAPS . B.6. Cartographie mmoire de CRAPS . . B.7. Programmation des entres/sorties . . B.8. Programmation du timer . . . . . B.9. Liste des exceptions . . . . . . . Glossaire Index

. . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

vii

Chapitre I Principes gnraux

1. Organisation gnrale dun ordinateur


1.1. Le modle de Von Neumann
La plupart des ordinateurs ont lorganisation gnrale de la gure I.1.
mmoire centrale

adr#1 adr#2 adr#3

instruction #1 instruction #2 instruction #3

instruction

processeur = unit de contrle et de calcul registres r1 r2 r3

adr#4 adr#5

donne #1 donne #2

donnes

donnes

donnes

contrleurs de priphriques

priphriques

Figure I.1. Organisation gnrale dun ordinateur; les ches sont des chemins de donnes. Cette organisation est dite de Von-Neumann, car elle ressemble beaucoup la machine conue par John Von Neumann sur la machine IAS peu aprs la deuxime guerre mondiale. Elle suppose et implique un certain nombre de proprits caractristiques des ordinateurs actuels : La mmoire est un composant central ; cest un tableau de mots de taille xe On voit sur le schma que la mmoire centrale est au dpart et larrive de lexcution dun programme. Cest elle qui contient le programme excuter et les donnes

CHAPITRE I. PRINCIPES GNRAUX

initiales ; cest dans elle que seront stocks les rsultats intermdiaires ou naux. Cest un tableau de mots binaires de taille xe. Chaque mot est repr par un nombre appel adresse, et les programmes feront rfrence aux donnes et aux instructions en mmoire par leurs adresses. Le programme excut est dans la mmoire centrale Le programme quexcute un ordinateur nest pas sur le disque dur, comme le pensent beaucoup de gens. Une copie du programme est effectivement souvent stocke sur un CDROM ou un disque dur, mais ce nest pas avant davoir t copi en mmoire centrale, comme le serait nimporte quelle autre ensemble de donnes, que son excution peut commencer. Un programme quexcute un ordinateur est compos dinstructions sous forme de mots mmoire. Le langage utilis pour coder les instructions en mots binaires est appel langage machine, cest le seul que comprenne le processeur. La taille des instructions varie beaucoup selon le type des processeurs. Parfois toutes les instructions ont la mme taille, gale un ou plusieurs mots mmoire ; parfois elles ont des tailles variables selon la complexit de linstruction. Le processeur est le coordonnateur de lexcution Le processeur contrle lexcution des programmes, en organisant le chargement des instructions et le dtail de leur excution ; cest aussi lui qui effectue tous les calculs, notamment sur les nombres entiers. Ces deux fonctions sont associes dans la mme unit car le contrle de lexcution ncessite souvent des calculs entiers, lorsque par exemple il faut faire une somme pour dterminer ladresse de linstruction suivante. Le processeur a besoin de garder la trace dun certain nombre dinformations pendant lexcution des instructions : ladresse de linstruction en cours par exemple, ou le rsultat de la dernire opration arithmtique. Il utilise pour cela des registres, qui sont des mots mmoire xes, accs trs rapide. Le processeur ne dialogue pas directement avec les priphriques On voit sur la gure que le processeur dialogue avec des contrleurs de priphriques et non avec les priphriques eux-mme. Par exemple un processeur na aucune conscience de lexistence dun disque dur ; il dialogue avec un contrleur de disque, laide dinstructions gnriques dentres/sorties.

1.2. Organisation en bus


Les ches entre les composants de la gure I.1 taient prendre dans un sens fonctionnel; si elles devaient reprsenter effectivement les chemins par lesquels transitent les donnes, le fonctionnement serait trs inefcace. En pratique, les donnes circulent entre les diffrents sous-systmes dun ordinateur sur des bus, sortes dautoroutes, et des circuits spcialiss jouent le rle dchangeurs aux carrefours de ces bus, de faon permettre des transferts simultans dans certaines circonstances. La gure I.2 montre une organisation typique dun systme de type compatible PC. Un circuit appel north-bridge rgle les changes trs grande vitesse, notamment entre le processeur et la mmoire centrale. Il exploite de faon synchrone le bus FSB (front side bus), encore appel bus systme, dont la vitesse est trs corrle la puissance gnrale

1. Organisation gnrale dun ordinateur

cache niveau 2

64/256 bits

processeur FSB 64 bits 66/100/133/200 MHz

64 bits 66/100/133/200 MHz mmoire RAM bus mmoire

north bridge 533/800 Mo/s

IDE south bridge USB

LAN

PCIE PCI

Figure I.2. Architecture gnrale des bus dun ordinateur compatible PC. de lensemble. Un second circuit appel south-bridge effectue quant lui des changes moins rapides avec des priphriques SATA, rseau, etc. La gure I.3 montre une photo de carte mre typique, avec lemplacement physique des diffrents bus. La mmoire et le north bridge sont placs trs prs du processeur, car ils sont sur les bus les plus rapides. Le north-bridge est quip dun radiateur cause de lintensit du travail de transfert quil ralise.

2. Bits et signaux lectriques


Linformation est stocke et vhicule dans un ordinateur, logiquement sous forme de chiffres binaires ou bits (binary digit), et physiquement sous forme de signaux lectriques. La logique binaire est utilise parce quil est plus facile de construire des systmes lectriques possdant deux tats stables, et parce quon a maintenant beaucoup de rsultats mathmatiques en algbre de Boole, mais des implmentations sur des systmes possdant plus de deux tats stables sont envisageables. Ces deux tats sont nots 0 et 1 ; ils correspondent le plus souvent aux deux tensions lectriques 0v et +Vcc respectivement, Vcc valant exactement +5v pour des circuits utilisant la technologie TTL, et une valeur comprise entre 2v et 15v environ en technologie CMOS (des valeurs de Vcc=3.3v, 2.5v et 1.8v tant utilise de plus en plus souvent). Pour tenir compte du fait que ces signaux lectriques vont tre dforms lors des transmissions, des plages de valeurs plus larges ont t affectes ces tats. Par exemple, en technologie TTL, elles sont reprsentes gure I.4. Il faut noter que ces assignations sont lgrement diffrentes selon quune tension est considre en entre ou en sortie dun circuit. Les circuits logiques qui sont utiliss pour combiner et transmettre les signaux lectriques logiques ont des caractristiques non linaires qui ont entre autres pour fonction de remettre en forme un signal dform par le bruit. On voit gure I.5 une porte non qui

CHAPITRE I. PRINCIPES GNRAUX

Figure I.3. Carte mre typique. Les bus rouges (FSB et mmoire), trs rapides, sont grs par le north bridge ; les bus verts (PCI, SATA, etc.), plus lents, sont grs par le south bridge.
+ 5v + 5v

1 logique

1 logique

2.4v

2.4v

interdit 0.8v 0 logique

interdit

0.4v 0v

0 logique 0v (b)

(a)

Figure I.4. Assignation des tensions lectriques aux valeurs logiques (a) en entre de circuit, (b) en sortie de circuit (technologie TTL). inverse le bit dentre, tout en produisant un signal de sortie de meilleure qualit que le signal dentre. Les signaux pourront donc traverser un nombre quelconque dtages de circuits logiques sans que les dformations initiales ne soient amplies. On notera sur la gure I.5 la prsence dun temps de propagation tpHL (HL indiquant : de haut vers bas) qui correspond la dure que met le circuit pour calculer sa sortie aprs que ses entres se soient modies. Ces temps de propagation se cumulent lors de la traverse de plusieurs tages, et cest nalement eux qui limiteront la vitesse de fonctionnement maximale dun circuit.

2. Bits et signaux lectriques

5v 2.4v 0.4v

tp HL

Figure I.5. Remise en forme dun signal aprs traverse dune porte non.

3. Technologies de fabrication des circuits intgrs


Les premiers ordinateurs ont t construits durant la deuxime guerre mondiale avec des tubes cathodiques (des lampes) comme dispositif de commutation. En 1947, les laboratoires Bell inventent le premier transistor, qui va trs vite supplanter la lampe et apporter un facteur de rduction de taille important. Mais la vritable rvolution ninterviendra quavec linvention des circuits intgrs VLSI dans les annes 1970, qui amneront la ralisation des premiers microprocesseurs. Un grand nombre de technologies de fabrication de circuits intgrs existent, qui se distinguent par des qualits diffrentes en termes de vitesse de propagation, densit dintgration, consommation et dissipation thermique. On va baucher rapidement dans cette section les trois familles les plus connues, en terminant par celle qui est actuellement la plus rpandue et la plus signicative, la famille CMOS. Technologie TTL La technologie TTL tait la technologie standard utilise partir des annes 1960 pour la ralisation de tous les types dordinateurs. Elle salimente typiquement en +5V, a une consommation modre, est robuste et a des rgles dinterface simples. Une trs grande famille de circuits spcialiss, la famille 7400, est disponible sous forme de circuits en botier DIL, et fournit des modules tout prts : portes, bascules, compteurs, etc. Les capacits dintgration de circuits TTL sont faibles, et on ne peut gure mettre plus de quelques milliers de portes TTL sur une puce de circuit intgr. On lutilise encore aujourdhui pour des petites ralisations, notamment dans linterfaage avec dautres circuits. Technologie ECL La technologie ECL est caractrise par sa trs grande rapidit, mais aussi par une consommation de courant leve. Elle est de plus assez difcile utiliser, notamment en raison de lemploi de tensions dalimentation ngatives. Elle est utilise dans des petites ralisations o la vitesse est critique, mais certains experts prvoient un dveloppement de

CHAPITRE I. PRINCIPES GNRAUX

la technologie ECL avec lutilisation de nouveaux types de semi-conducteurs. Technologie CMOS Cest la technologie reine actuelle. La technologie CMOS a dabord t dveloppe et vendue comme une alternative au TTL, plus lente mais avec une consommation rduite. Comme par ailleurs elle peut utiliser des tensions dalimentation faibles (jusqu 1V), elle a immdiatement t trs utilise par les fabricants de montres digitales, pour qui la vitesse de traitement importait peu par rapport la consommation. Mais on a progressivement ralis que sa grande qualit tait son taux dintgration trs lev ; de plus, des tailles de transistors de plus en plus petites ont amenes avec elles des temps de commutation de plus en plus faibles. Cest la technologie CMOS qui est utilise actuellement pour la fabrication de tous les processeurs et microcontrleurs du march, ainsi que pour toutes les mmoires statiques et les mmoires ash. Par ailleurs, un circuit CMOS ne consomme signicativement du courant que lors des commutations des transistors. Cette proprit a t lorigine de circuits qui consomment moins de courant que leur quivalent TTL, qui eux en consomment au repos et lors des commutations. Nanmoins, au fur et mesure quon diminue leur tension dalimentation, les courants de fuite des transistors CMOS deviennent de plus en plus proches des courants de commutation, et par consquent la consommation de ces circuits au repos nest plus aussi ngligeable quauparavant.

4. Mots binaires
Les signaux binaires sont souvent regroups pour former des mots. La largeur dun mot binaire est le nombre des signaux qui sont regroups. On appelle par exemple octet un mot de 8 bits (un mot de largeur 8). Un mot de n bits permet de coder 2n valeurs diffrentes ; 256 valeurs par exemple pour un octet. On peut utiliser un octet pour coder un caractre alphanumrique la norme ISO-8859 ; un mot de 32 bits pour reprsenter un nombre entier relatif ; un mot de 16 96 bits pour reprsenter des nombres rels en notation scientique ottante selon la norme IEEE 754. Des structures de donnes plus complexes (tableaux, listes, ensembles, dictionnaires, etc.) ncessitent une agrgation de ces types simples. Codage en binaire pur On crira les nombres binaires avec le chiffre 2 en indice. Par exemple : 011011012. Sur n bits, lintervalle des valeurs reprsentes est [0, 2n 1]. Comme en dcimal, le total est une somme pondre, plus prcisment le produit de chaque chiffre par la puissance de 2 de mme rang : s= o bi est le bit de rang i du mot. Par exemple, on a reprsent sur la gure suivante les poids respectifs des bits du mot de 8 bits 100110102 = 15410 :
n1 i=0

2i bi

4. Mots binaires
76543210

10011010 S = 128+16+8+2=154 2 128 16 8

Poids forts, poids faibles Par rfrence cette notion de pondration des chiffres, on emploie couramment des expressions telles que les n bits de poids les plus forts, ou les n bits de poids les plus faibles pour dsigner les n bits les plus gauche (respectivement les plus droite) dans un mot binaire. Dans les documentations en anglais, on trouvera frquemment des libells tels que MSB (most signicant bits) ou LSB (least signicant bits) avec les mme sens. 1 Kilo nest pas 1000 (en informatique) Lorsque vous achetez un kilowatt-heure dlectricit, il est bien entendu avec votre fournisseur quil sagit de 1000 watts-heure. Ce nest pas la mme chose en informatique ! Pour continuer numrer en utilisant la base 2, les informaticiens ont dcid dutiliser lunit 1K = 210 = 1024, donc un peu plus de 1000. Le sufxe mga est : 1M = 1K 1K = 220 ; un giga est : 1G = 1K1M = 230; un Tera est : 1T = 1K1G = 240. Un grand nombre de valeurs usuelles sexpriment alors directement en multiples de 1K, 1M, 1G ou 1T, par exemple la taille des mmoires RAM, car elle est ncessairement une puissance de 2 cause de leur organisation matricielle. 1K, 1M et 1G valent environ mille, un million et un milliard, mais la petite diffrence entre 1000 et 1K augmente lorsquon passe 1M et 1G : 1M = 1024 * 1024 = 1 048 576, et 1G = 1024 * 1048576 = 1 073 741 824, soit presque 1,1 milliard. Les vendeurs de disques durs exploitent cette ambigut : le plus souvent si vous achetez un disque tiquet 100 giga-octets, il sagit dun disque de 100 milliards doctets, et non de 107 374 182 400 octets, soit une diffrence de 7%. 64 bits, la taille idale pour les donnes ? Les microprocesseurs manipulent des mots binaires de taille xe, les plus petits de 8 bits, dautres de 16 bits, 32 bits et maintenant 64 bits. Un processeur 8 bits, sil veut ajouter 1000 et 1000, doit effectuer deux additions et non une seule, puisque 1000 ne rentre pas dans un codage 8 bits. Un processeur 16 bits code directement des nombres entiers de lintervalle [-32768,+32767], ce qui ne permet pas de coder des nombres un tant soit peu grands. On semble dnitivement laise avec 32 bits, mais ce nest pas le cas : le plus grand entier qui peut tre cod est 232, soit environ 4 milliards, ce qui ne suft pas reprsenter le montant en euros dune journe de transactions la bourse de Paris. Avec 64 bits, on est dnitivement sauvs ct entiers, moins de vouloir compter les grains de sable sur la plage. Pour le codage des nombres rels, 64 bits est la taille de codage en double prcision la plus usuelle, qui donne une prcision dune dizaine de chiffres aprs la virgule, sufsante dans la majorit des applications. Comme on doit aussi souvent stocker des adresses de mmoire dans des mots, 64 bits est aussi une taille sufsante, alors que 32

8 bits ne permettent pas de dpasser 4 giga-octets.

CHAPITRE I. PRINCIPES GNRAUX

Une taille de mot de 64 bits a donc des qualits intrinsques que navaient pas jusque l 16 bits ou 32 bits. Utiliser une taille plus grande de 128 bits dans un processeur conduirait beaucoup de gaspillage, puisque la plupart des mots manipuls seraient trs peu remplis. Ma prdiction personnelle est que, dans le futur, cette taille du mot mmoire ne va pas augmenter indniment, mais va se stabiliser 64 bits du fait des qualits qui viennent dtre dcrites. Nombres binaires virgule Comme en dcimal, on peut manipuler des nombres virgule en binaire. Les chiffres placs aprs la virgule ont alors des poids qui sont les puissances ngatives dcroissantes de 2. Ainsi, 0.12 = 2 1 = 0.5 ; 0.012 = 2 2 = 0.25, etc. Si on cherche la reprsentation binaire approche du nombre , on trouvera = 11.001001 (gure I.7).
1 0 1 2 3 4 5 6

1 1 , 0 0 1 0 0 1 ... pi = 2 + 1 + 0.125 + 0.015625 + ... 2 1 0,125 0,015625

Figure I.7. criture binaire virgule (approche) du nombre Pi. Pour chaque position, on met 1 ou 0 de faon ce que la valeur courante ne dpasse pas la valeur reprsenter, tout en sen approchant le plus possible. Par exemple aprs avoir choisi 11.001 (total courant = 21 + 20 + 2 3 = 2 + 1 + 0.125 = 3.125), on ne peut pas mettre de 1 en position -4 ou -5, car cela dpasserait . On doit attendre la position -6, et on a une valeur approche de 21 + 20 + 2 3 + 2 6 = 3.140625. Lannexe A fournit les valeurs des premires puissances ngatives de 2. Incrmenter et dcrmenter en binaire Une opration frquente effectue sur des nombres binaires est le comptage. Par exemple sur 3 bits, passer de 000 001, puis 010, etc. Selon quel algorithme une valeur se transforme-t-elle en la suivante ? On peut essayer de sinspirer du comptage en dcimal, quon sait faire depuis notre petite enfance, et pour lequel on ne nous a pourtant jamais donn lalgorithmique. Pour passer de 124 125, seul le chiffre des units sest incrment.En fait ce chiffre sincrmente toujours, avec un passage de 9 0. Le chiffre des dizaines sera recopi avec incrmentation, si le chiffre des units vaut 9, comme dans le passage de 129 130, sinon il sera recopi sans changement, comme dans le passage de 124 125. On tient notre algorithme : pour passer dun nombre dcimal son suivant, on considre chaque chiffre un par un, et on le recopie en lincrmentant si tous les chiffres qui sont sa droite valent 9, ou sinon on le recopie sans changement. On remarquera que lordre de traitement sur les chiffres est indiffrent, et quon peut effectuer cet algorithme en parallle sur tous les chiffres. La gure I.8 montre un

4. Mots binaires exemple.


1
des chiffres droite diffrents de 9 on recopie sans changer

2
tous les chiffres droite valent 9 on recopie en incrmentant

9
tous les chiffres droite valent 9 on recopie en incrmentant

toujours incrmente

Figure I.8. Incrmentation dun nombre dcimal.Un chiffre est recopi avec incrmentation si tous les chiffres sa droite valent 9 ; sinon il est recopi sans changement. Le mme algorithme sapplique en binaire, mais cette fois lopration dincrmentation dun chiffre est encore plus simple, car elle se rsume une inversion du bit. Pour incrmenter un nombre binaire, on considre chaque bit du mot initial, et on le recopie avec inversion si tous les bits qui sont sa droite valent 1, ou on le recopie sans changement sinon. Le bit le plus droite est toujours invers. La gure I.9 montre un exemple.
1
des bits droite diffrents de 1 on recopie sans changer

0
tous les bits droite valent 1 on recopie en inversant

1
tous les bits droite valent 1 on recopie en inversant

toujours inversion

Figure I.9. Incrmentation dun nombre binaire.Un bit est invers si tous les bits sa droite valent 1 ; sinon il est recopi sans changement. L encore lalgorithme peut seffectuer en parallle sur tous les bits, ce qui est un norme avantage pour un circuit logique, dont cest le mode de fonctionnement naturel. Attention, il faut noter quon ne peut pas incrmenter la valeur sur place: le mot binaire qui contient le nombre de dpart et le mot binaire qui contient le rsultat doivent tre distincts, et ne peuvent pas tre confondus. Un algorithme analogue existe pour le dcomptage : on recopie un bit avec inversion si tous les bits sa droite valent 0, sinon on le recopie sans changement. Par vacuit, le bit le plus droite est toujours invers. Par exemple, on passe de 110 101 en inversant les deux bits de poids faible, car tous les bits qui sont leur droite valent 0. Hexadcimal Les mots manipuls par un ordinateur ont souvent une largeur suprieure 16 ou 32 bits, et sont donc difciles transcrire en binaire. Pour obtenir une criture concise,

10

CHAPITRE I. PRINCIPES GNRAUX

on utilise souvent la base 16, appele hexadcimal, dont les 16 chiffres sont nots : 0,1,2,3,4,5,6,7,9,A,B,C,D,E,F.Chaque chiffre hexadcimal permet de coder 4 bits (24 = 16). Pour passer dune notation binaire une notation hexadcimale, il suft de grouper les bits par paquets de 4, de droite gauche partir des poids faibles. Par exemple : 0110.11012 = 6D16 = 10910 0110.1000.1010.11002 = 68AC16 Si lon considre le dernier exemple, on peut montrer le regroupement par groupes de 4 bits en utilisant une notation matricielle : 0110.1000.1010.11002 =

0 1 1 0

= 0 1 1

214 213 + 1 0 2 212 3 22 2 12 0 2 1 + 2 20


15

0 0

210 2 9 + 2 28
11

1 0 1 0

1 0 0 0

3 22 28 21 + 2 20

26 25 + 2 24
7

1 1 0 0

1 0 1 0

3 22 24 21 + 2 20

3 22 21 2 20

1 1 0 0

3 22 20 21 2 20

en introduisant les puissances de 16 : 0110.1000.1010.11002 =


0 1 1 0

3 22 163 21 + 2 20

1 0 0 0

= 6 163 + 8 162 + 10 161 + 12 160 = 68AC16

3 22 162 21 + 2 20

1 0 1 0

3 22 161 21 + 2 20

1 1 0 0

3 22 160 21 2 20

5. Codage des principaux types de donnes


5.1. Codage des caractres
Les caractres usuels anglo-saxons utilisent gnralement un code sur 7 bits appel codage ASCII ; les codes varient entre 0 et 127. Comme ces codes de 7 bits sont toujours plongs dans un octet (mot de 8 bits), des codages tendus sur 8 bits ont t dvelopps, dabord de faon propritaire, puis de faon organise par la norme ISO-8859, qui est en fait un ensemble de normes spciques diffrentes rgions du monde : ISO-8859-1 (dite aussi ISO-Latin-1, la notre, qui couvre toute lEurope de louest, y compris les caractres espagnols, allemands et scandinaves), ISO-8859-2 (Europe de lest), etc. Il y a actuellement 15 sous normes spciques ; chacune delles est un sur ensemble du codage ASCII ; pour les codes de 0 127. Par contre, laspect graphique et typographique n des caractres (ligatures, etc.) nest pas bien pris en compte par ces codages, qui ont t conus essentiellement pour lchange de donnes. Pour tenter de rsoudre les problmes de codage de toutes les langues crites du

5. Codage des principaux types de donnes

11

monde, le consortium UNICODE, qui incorpore la plupart des grands constructeurs et diteurs informatiques, a cr un encodage de caractres universel. Il est maintenant utilis comme codage interne dans des langages tels que Java, dans les navigateurs Internet et de nombreuses applications ; son adoption gnralise permettrait de rsoudre dnitivement les disparits dencodages de caractres entre pays. Chaque caractre possde un code point unique, not par exemple U+03B3 (pour la lettre grecque minuscule gamma ). Les codes-points sont dans lintervalle U+0000 et U+10FFFF (plus dun million dentres !) ; les 256 premiers codes-points sont identiques lISO-8859-1, et dautres mappings par blocs existent pour faciliter le passage danciens codes UNICODE. La suite doctets reprsentant un caractre nest pas lcriture binaire du code-point ; un encodage doit tre utilis, et plusieurs dentre eux existent. Le plus rpandu est sans doute lUTF-8, qui reprsente chaque code-point par une suite de 1 4 octets. Les codes-points infrieurs 0+0080 (les codes ASCII) sont reprsents par un unique octet contenant cette valeur : lUTF-8 est donc rtrocompatible avec lASCII et cest cette qualit qui a provoqu sa diffusion rapide. Les autres codes-points sont encods par un nombre doctets entre 2 et 4 ; par exemple le caractre U+03B3, qui reprsente la lettre grecque minuscule gamma, est cod en UTF-8 : CE16 , B316. Les codes-points suprieurs 0+FFFF, les plus rarement employs, sont encods par une suite de 4 octets.

5.2. Codage des nombres entiers naturels


On utilise le binaire pur, dj dcrit en section 4. Avec n bits, on peut coder les nombres entiers positifs de lintervalle [0, 2n 1]. Laddition et la soustraction seffectuent de la manire habituelle ; il y a dbordement de laddition lorsquune retenue doit tre propage au del du dernier bit de rang n. Lecteur et imprimeur dcimal Si un programme utilise des nombres entiers naturels cods en binaire pur, la reprsentation externe de ce nombre lutilisateur du programme est gnralement faite dans une autre base, le plus souvent la base 10. Un sous-programme appel imprimeur est charg de convertir une valeur en binaire pur en son criture dcimale, et un autre appel lecteur fait la traduction inverse. On peut examiner rapidement les algorithmes quils utilisent. Ils seraient bien sr facilement transposables dautres bases. Traduction du binaire vers le dcimal Considrons par exemple un mot de 8 bits N = 101101102 ; on cherche la suite des caractres qui reprsente ce nombre en criture dcimale. Cest un programme dordinateur qui ralise cette conversion, et qui dispose donc doprateurs arithmtiques (binaires) tels que addition et multiplications, qui sait faire des comparaisons, etc. Cette traduction ne comportera pas plus de 3 chiffres dcimaux, notons les : XYZ. On choisit pour X le chiffre le plus grand tel que 100X N. Ici X = 1 convient car 1100 N et 2100 > N. Pour faire ce choix de X, on peut effectivement raliser des multiplications, ou utiliser une table prconstruite. Il reste traduire N 1 = N X100 = 10100102. Pour cette valeur, on cherche la plus grande des valeurs de Y telle que 10Y N 1 ; on trouve Y = 8, et il reste convertir N 2 = N 1 Y 10 = 000000102 ; on trouve alors Z = 2. Finalement, les trois chiffres dcimaux cherchs sont XYZ = 182.

12 Traduction du dcimal vers le binaire

CHAPITRE I. PRINCIPES GNRAUX

On cherche donc convertir lcriture dcimale dun nombre en un mot binaire. Le problme nest pas le symtrique du prcdent, car lordinateur sait faire toutes les oprations sur le codage binaire, alors quil ne sait en faire aucune directement en base 10. Pour un nombre dcimal tel que XYZ (qui conduit une valeur binaire sur 8 bits), il suft en fait de faire le calcul n = 100x + 10y + z o x, y et z sont les numros dordre associs aux chiffres X, Y et Z respectivement.

5.3. Codage des nombres entiers relatifs


Aux dbuts de linformatique, on codait gnralement les nombres entiers signs en mettant dans le premier bit le signe (1 signiant moins) et dans les suivants la valeur absolue. -3 se codait par exemple 10000011 sur 8 bits. Lencodage et le dcodage dun tel nombre taient simple (bien quon notera que 0 peut tre cod +0 ou -0), mais on ne pouvait plus raliser une simple addition comme avec des nombres naturels. Si par exemple on tente de faire laddition bit bit de 10000011 (-3) et de 00000100 (+4), on obtient : 10000111, cest dire -7, ce qui est absurde. Codage en complment 2 Un codage appel complment deux sest rapidement impos dans les annes 1970. Il utilise les deux rgles suivantes : un nombre positif est reprsent en binaire pur. pour calculer la reprsentation de linverse arithmtique dun nombre, on inverse tous ses bits et on ajoute 1, sans tenir compte de lventuelle retenue.

Considrons par exemple le codage des nombres relatifs sur 8 bits. +3 va tre cod 00000011. Pour obtenir le codage de -3, on inverse tous les bits du codage prcdent (00000011 11111100) et on ajoute 1, soit 11111101. Proprits On peut prouver que ce codage a les proprits remarquables suivantes : cest un codage quilibr: sur n bits, on reprsente les nombres relatifs de lintervalle [ 2n 1, 2n 1 1] soit autant de nombre positifs ou nuls que de nombres strictement ngatifs. 0 se code sous forme dun champ uniforme de 0 ; il na quun seul codage. le bit de poids fort du codage reprsente le signe du nombre. les oprations daddition ou de soustraction en binaire pur sappliquent galement avec des oprandes cods en complment deux, avec la diffrence que la retenue na pas de sens et doit tre nglige lors dune opration en complment deux.

Pour illustrer le fait que le mme oprateur daddition est utilis pour le binaire pur et le complment 2, considrons laddition de la gure I.10.

5. Codage des principaux types de donnes


interprtation non signe (retenue prise en compte) 233 11101001 interprtation signe (retenue ignore) 23

13

66 299

+ 01000010 1
00101011

+ +66
+43

Figure I.10. Une mme opration mcanique daddition sinterprte de deux faons dif frentes. La mme opration effectue mcaniquement sur des codages (colonne centrale) sinterprte de deux faons diffrentes selon quon considre les nombres comme tant signs ou non. Cercle des nombres Les diffrentes proprits du codage en complment 2 peuvent tre retrouves avec la mtaphore du cercle des nombres, ici reprsent pour un codage sur 3 bits (gure I.11).

positifs ngatifs 0 000 111 2 110 001 soustraction 1

010 2

101 3

011 100 4 3 addition limite de franchissement de signe

Figure I.11. Cercle des nombres de 3 bits en complment 2. On effectue une addition en parcourant le cercle dans le sens des aiguilles dune montre, et une soustraction dans le sens inverse. Si on recherche le codage de -3, on part de 0 et on tourne de 3 positions dans le sens inverse des aiguilles dune montre, pour trouver : 1012. Si on veut lui ajouter 5, on tourne de 5 positions dans le sens des aiguilles dune montre, et on trouve : 0102, cest dire 2.

14

CHAPITRE I. PRINCIPES GNRAUX

Si on franchit la limite -4 / +3 pendant une opration, cela signie quil y a eu dbordement. Dbordement Quand y a-t-il dbordement lors dune addition de deux nombres signs ? Il est clair quil ne peut pas se produire lorsque les oprandes sont de signes opposs, puisque la valeur absolue du rsultat est alors infrieure la plus grande des valeurs absolues des deux oprandes. Il ne peut donc se produire que sils sont de mme signe, tous les deux positifs ou tous les deux ngatifs. On dmontre facilement qualors il y a dbordement si et seulement si laddition des deux donne un rsultat de signe oppos au signe commun des deux oprandes. Graphiquement sur le cercle des nombres, cela se produit lorsquon traverse la frontire -4 +3. Comparaison de nombres en complment 2 On se pose ici le problme de savoir les positions respectives de deux nombres entiers cods en complment 2 A et B : sont ils gaux, ou lun est-il plus grand que lautre ? Il faut examiner les signes des deux nombres comparer A et B, cest dire leurs bits de poids forts. Si les signes sont diffrents, la comparaison est immdiate. Si les signes sont identiques, il suft de comparer les n 1 autres bits, lordre tant direct si leur signe commun est positif, invers si leur signe commun est ngatif. criture sous forme dune somme pondre du codage en complment 2 Les proprits remarquables du codage en complment 2 peuvent tre facilement dmontres si on remarque quen fait, il sagit galement dune somme pondre comme en binaire pur, mais avec un poids particulier de 2n 1 pour le bit de poids le plus fort de rang n 1. s= 2 o bi est le bit de rang i du mot. On peut maintenant dmontrer pourquoi le premier bit est un bit de signe. Puisque 2i est toujours plus petit ou gal 2n 1 1, alors s < 0 si et seulement si bn 1 = 1.
n1

bn 1 +

n2 i=0

2i bi
n2 i=0

5.4. Codes de Gray


Un code de Gray sur n bits est tel que deux codes successifs ne diffrent que dun seul bit. On sen sert par exemple pour encoder la position dun axe en rotation, tel quun commutateur rotatif ou une girouette. Plusieurs codes de Gray sont possibles pour un nombre donn de bits ; on parle de code de Gray rchi lorsquil possde certaines proprits de symtrie. Une mthode rcursive pour construire un code de Gray rchi sur n + 1 bits partir dun code sur n bits est la suivante : sous les codes n bits, on recopie la liste en miroir. on ajoute un bit gauche, valant 0 pour la premire moiti, et 1 pour la deuxime.

5. Codage des principaux types de donnes

15

On a reprsent gure I.12 la construction rcursive par cette mthode des codes de Gray rchis 2 puis 3 bits. Par construction, les codes ne diffrent que dun bit pour chacune des deux moitis, au passage entre les deux moitis, ainsi que de la dernire la premire ligne : cest donc un code de Gray.
code de Gray sur 1 bit
0 1 0 1 1 0

code de Gray sur 2 bits


0 0 0 1 1 0 1 1 1 0 1 0 1 1 0 1 1 0 0 0 1

code de Gray sur 3 bits


0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 0 0

copie en miroir

copie en miroir ajouts de 0 en premire moiti et de 1 en deuxime

1 0 0

1 ajouts de 0 en premire moiti 1 0 1 et de 1 en deuxime 0

Figure I.12. Construction rcursive dun code de Gray sur 2 bits, puis sur 3 bits.

6. Exercices corrigs
6.1. Exercice 1 : conversion
nonc crire 54321 en binaire, puis en hexadcimal. Solution On peut se reporter la table donne en annexe A pour obtenir la liste des premires puissances de 2. La plus grande qui soit infrieure 54321 est 215 = 32768. On peut crire alors : 54321 = 215 + 21553. On recommence avec 21553 : il contient 214 = 16384, et il reste 21553 - 16384 = 5169, donc : 54321 = 215 + 214 + 5169. 5169 contient 212 = 4096, reste 1073 : 54321 = 215 + 214 + 212 + 1073. 1073 contient 210 = 1024, reste 49 : 54321 = 215 + 214 + 212 + 210 + 49. En continuant ce processus, on trouve :

16 54321 = 215 + 214 + 212 + 210 + 25 + 24 + 20. Lcriture binaire est alors : 54321 = 11010100001100012

CHAPITRE I. PRINCIPES GNRAUX

Pour trouver lcriture hexadcimale, on regroupe les bits par paquets de 4 : 54321 = 1101.0100.0011.00012 On convertit ensuite chaque groupe en un chiffre hexadcimal quivalent : 54321 = D43116

6.2. Exercice 2 : arithmtique binaire


nonc 1 2 3 Donner lintervalle des valeurs possibles pour des nombres non signs cods en binaire pur sur 11 bits. Donner lintervalle des valeurs possibles pour des nombres signs cods en complment 2 sur 11 bits. Effectuer la somme en binaire : 11012 + 01112 et interprter le rsultat en arithmtique signe et non signe.

Solution 1 Intervalle des valeurs possibles en binaire pur sur 11 bits. Avec 11 bits, le nombre de combinaisons possibles est 211 = 2048. Lintervalle des valeurs est donc : [0, 2047]. 2 Intervalle des valeurs possibles en complment 2 sur 11 bits. On a vu dans le chapitre prcdent que le codage en complment 2 tait quilibr, cest dire quil code autant de nombres strictement ngatifs que de nombres positifs ou nuls. Pour respecter cet quilibre avec 2048 codes, il nous faut ncessairement 1024 codes positifs ou nuls et 1024 codes strictements ngatifs, soit lintervalle : [-1024, +1023]. 3 En effectuant la somme bit bit, on trouve 01002 avec 1 de retenue sortante. En arithmtique non signe, la retenue doit tre prise en compte, et elle signale un dbordement ; on peut tout de mme intgrer ce bit de retenue comme bit de poids fort du rsultat. On a donc fait la somme 13 + 7 et on trouve 101002, soit la valeur attendue 20. En arithmtique en complment 2, la retenue est ignore. Les nombres ajouts sont -3 et +7 et le rsultat est +4, ce qui est galement correct.Un dbordement tait impossible Somme binaire 11012 + 01112.

6. Exercices corrigs ici, car on ajoutait un nombre positif un nombre ngatif.

17

Chapitre II lments de logique combinatoire


1. Circuits combinatoires
En 1854, Georges Boole publia son ouvrage sminal sur une algbre manipulant des informations factuelles vraies ou fausses. Son travail a t redcouvert et dvelopp sous la forme que nous connaissons maintenant par Shannon. Le nom de Boole est entr dans le vocabulaire courant, avec ladjectif boolen qui dsigne ce qui ne peut prendre que deux valeurs distinctes vrai ou faux. Circuits combinatoires : dnition Un circuit combinatoire est un module tel que ltat des sorties ne dpend que de ltat des entres. Ltat des sorties doit tre valu une fois que les entres sont stables, et aprs avoir attendu un temps sufsant la propagation des signaux. On comprend intuitivement que les circuits combinatoires correspondent des circuits sans tat interne : face la mme situation (les mmes entres), ils produisent toujours les mmes rsultats (les mmes sorties). Un module daddition en est un bon exemple : il a en entres les signaux A et B additionner, ainsi quune retenue CIN dun tage prcdent ; il fournit en sortie la somme S et une retenue COUT pour un tage suivant :

Si un circuit combinatoire est compos lui-mme de sous-circuits combinatoires, on dmontre que la dnition de base est quivalente au fait que ces sous-circuits sont connects entre eux sans rebouclages. Plus prcisment, si on range les signaux de gauche droite, en mettant tout a fait gauche les entres, puis dans chaque colonne les sous-circuits qui ont des entres parmis les signaux produits dans la colonne de gauche, ou de colonnes plus gauche, alors le circuit est combinatoire si et seulement sil ny a aucune liaison qui reboucle en arrire, en allant dun tage un tage plus gauche (gure II.2). Limplication dans le sens sans rebouclage combinatoire est facile dmontrer : si les entres gauche sont stables, alors par construction toutes les sorties des sous-circuits de la premire colonne sont stables, et ne dpendent que de ces entres. Donc les sorties des sous-circuits de la colonne 2 sont stables, et ne dpendent que des entres. On dmontre ainsi par rcursion que les sorties des circuits de chaque colonne sont stables et ne dpendent que des valeurs des entres, jusquaux sorties nales. Le circuit est donc combinatoire.
18

1. Circuits combinatoires
entres sorties

19

... ...

Figure II.2. Circuit combinatoire : les signaux internes et les sorties ne rebouclent pas en arrire. Les gures II.3 et II.4 montrent des exemples de circuits combinatoires et non combinatoires forms partir de portes logiques, dont on verra dans les sous-sections suivantes quelles sont elles-mmes combinatoires.

Figure II.3. Exemples de circuits combinatoires : les lments internes sont eux-mmes combinatoires, et il ny a pas de rebouclage interne.

Figure II.4. Exemples de circuits non combinatoires : il y a des rebouclages internes.

20

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE

2. Tables de vrit
Une des contributions essentielles de Boole est la table de vrit, qui permet de capturer les relations logiques entre les entres et les sorties dun circuit combinatoire sous une forme tabulaire. Considrons par exemple un circuit inconnu possdant 2 entres A et B et une sortie S. Nous pouvons analyser exhaustivement ce circuit en lui prsentant les 22 = 4 jeux dentres diffrents, et en mesurant chaque fois ltat de la sortie. Le tout est consign dans un tableau quon appelle table de vrit du circuit (gure II.5).

A 0 0 1 1

B 0 1 0 1

S 0 0 0 1

Figure II.5. Un circuit deux entres et une sortie, et sa table de vrit. Ici, on reconnat lopration logique ET : S vaut 1 si et seulement si A et B valent 1. La construction dune table de vrit est bien sr gnralisable un nombre quelconque n dentres et un nombre m de sorties. Elle possdera alors 2n lignes, ce qui nest praticable que pour une valeur de n assez petite.

3. Algbre et oprateurs de base


Plutt que de dcrire en extension la relation entre les entres et une sortie, on peut la dcrire en intention laide dune formule de calcul utilisant seulement trois oprateurs boolens : NON, ET, OU. NON NON (NOT en anglais) est un oprateur unaire, qui inverse son argument. On notera gnralement NOT (A) = A ; et sa table de vrit est :

A 0 1

A 1 0

Figure II.6. Table de vrit du NON, et dessin de la porte correspondante. On a bien sr : A = A.

3. Algbre et oprateurs de base ET

21

ET (AND en anglais) est un oprateur 2 entres ou plus, dont la sortie vaut 1 si et seulement si toutes ses entres valent 1. On le note algbriquement comme un produit, cest dire S = A B ou S = AB. La table de vrit dun ET deux entres, et le dessin usuel de la porte correspondante sont reprsents gure II.7.

A 0 0 1 1

B 0 1 0 1

AB 0 0 0 1

Figure II.7. Table de vrit du ET, et symbole de la porte correspondante. De par sa dnition, le ET est associatif : A B C = (A B) C = A (B C). Il est galement idempotent : A A = A. OU OU (OR en anglais) est un oprateur 2 entres ou plus, dont la sortie vaut 1 si et seulement si une de ses entres vaut 1. On le note algbriquement comme une somme, cest dire S = A + B. La table de vrit dun OU deux entres, et le dessin usuel de la porte correspondante sont reprsents gure II.8.

A 0 0 1 1

B 0 1 0 1

A+B 0 1 1 1

Figure II.8. Table de vrit du OU, et symbole de la porte correspondante. De par sa dnition, le OU est associatif : A + B + C = (A + B) + C = A + (B + C). Il est galement idempotent : A + A = A. De la table de vrit la formule algbrique On peut automatiquement crire la formule algbrique dune fonction boolenne combinatoire ds lors quon a sa table de vrit. Il suft de considrer seulement les lignes qui donnent une sortie gale 1, dcrire le minterm correspondant, qui code sous forme dun ET la combinaison de ces entres. Par exemple, le minterm associ au vecteur (A, B, C) = (1, 0, 1) est : ABC. La formule algbrique qui dcrit toute la fonction est le OU de tous ces minterms.

22

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE

Considrons par exemple la table de vrit de la fonction majorit 3 entres, qui vaut 1 lorsquune majorit de ses entres (2 ou 3) vaut 1 (gure II.9). A 0 0 0 0 1 1 1 1 B 0 0 1 1 0 0 1 1 C 0 1 0 1 0 1 0 1 MAJ(A,B,C) 0 0 0 1 0 1 1 1

Figure II.9. Table de vrit de la fonction majorit 3 entres. La table de vrit contient 4 lignes avec une sortie S 1, ce qui donne : S = ABC + ABC + ABC + ABC Cette formule est simpliable, comme on le verra dans une section ultrieure. Est-on sr que la formule obtenue par cette mthode est correcte ? Pour une combinaison des entres qui doit donner une sortie 1, la formule possde le minterm correspondant, et donne aussi une valeur de 1. Pour toutes les autres combinaisons dentres, la table donne une sortie 0, et la formule aussi, puisquaucun minterm nest prsent qui corresponde ces combinaisons. La formule donne donc toujours le mme rsultat que la table. Corollairement, cela dmontre le rsultat fondamental suivant : Nimporte quelle fonction combinatoire sexprime sous forme dune somme de minterms.

Thormes de lalgbre de Boole Le tableau de la gure II.10 rsume les principaux thormes et proprits de lalgbre de Boole. On peut les dmontrer de faon algbrique, ou en utilisant des tables de vrit. Les thormes de De Morgan permettent de transformer les ET en OU et vice-versa. Le couple (ET,NON) ou le couple (OU,NON) sufsent donc exprimer nimporte quelle formule algbrique combinatoire. Le thorme dabsorption A + AB = A montre quun terme plus spcique disparat au prot dun terme moins spcique. Par exemple dans lquation + AB + ABC , le terme ABC sefface au prot de AB, moins spcique et qui donc linclut.

3. Algbre et oprateurs de base relation AB = BA A(B + C) = AB + AC 1A = A AA = 0 0A = 0 AA = A A(BC) = (AB)C A=A AB = A + B A(A + B) = A A + AB = A + B relation duale A+B= B+A A + BC = (A + B)(A + C) 0+A=A A+A= 1 1+ A = 1 A+A= A A + (B + C) = (A + B) + C A + B = AB A + AB = A A(A + B) = AB Proprit Commutativit Distributivit Identit Complment Zro et un Idempotence Associativit Involution Thormes de De Morgan Thormes dabsorption Thormes dabsorption

23

Figure II.10. Proprits et thormes de lalgbre de Boole.

4. Autres portes logiques


NAND NAND (= NOT AND) est un oprateur 2 entres ou plus, dont la sortie vaut 0 si et seulement si toutes ses entres valent 1. On le note , et on a donc deux entres : AB = A B La table de vrit dun NAND deux entres, et le dessin usuel de la porte correspondante sont reprsents gure II.11.

A 0 0 1 1

B 0 1 0 1

A B 1 1 1 0

Figure II.11. Table de vrit du NAND, et dessin de la porte correspondante. Le NAND est un oprateur dit complet, cest dire quil permet lui seul dexprimer nimporte quelle fonction combinatoire. Il permet en effet de former un NOT, en reliant ses deux entres : A = A A. Les thormes de De Morgan assurent donc quil peut exprimer un ET et un OU, et donc nimporte quelle expression combinatoire. NOR NOR (= NOT OR) est un oprateur 2 entres ou plus, dont la sortie vaut 0 si et seulement au moins une de ses entres 1. On le note , et on a donc deux entres : A

24
B

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE

= A + B La table de vrit dun NOR deux entres, et le dessin usuel de la porte correspondante sont reprsents gure II.12.

A 0 0 1 1

B 0 1 0 1

A B 1 0 0 0

Figure II.12. Table de vrit du NOR, et dessin de la porte correspondante. Comme le NAND, le NOR est galement un oprateur complet. Il permet en effet de former un NOT, en reliant ses deux entres : A = A A. Les thormes de De Morgan assurent donc quil peut exprimer un ET et un OU, et donc nimporte quelle expression combinatoire. XOR XOR (= EXCLUSIVE OR) est un oprateur 2 entres ou plus. On peut le dnir de plusieurs faons ; la dnition qui permet le plus directement de dmontrer ses proprits est celle qui consiste en faire un dtecteur dimparit : sa sortie vaut 1 si et seulement si un nombre impair de ses entres est 1. On le note ; la table de vrit dun XOR deux entres, et le dessin usuel de la porte correspondante sont reprsents gure II.13.

A 0 0 1 1

B 0 1 0 1

AB 0 1 1 0

Figure II.13. Table de vrit du XOR, et dessin de la porte correspondante. On voit partir de la table que A B = AB + AB. Lorsquil a deux entres, il mrite son nom de OU exclusif puisque sa sortie ne vaut 1 que si lune de ses entres vaut 1, mais seulement une. Il possde plusieurs autres proprits intressantes : lorsquon inverse une entre quelconque dun XOR, sa sortie sinverse. Cest vident puisque cela incrmente ou dcrmente le nombre dentres 1, et donc inverse la parit. le XOR deux entres est un inverseur command. En effet, en examinant la table de vrit du XOR (gure II.13)), on constate que lorsque A vaut 0, la sortie S reproduit

4. Autres portes logiques

25

lentre B, et lorsque A vaut 1, la sortie S reproduit linverse de lentre B. Lentre A peut tre alors vue comme une commande dinversion dans le passage de B vers S. Cette fonction sera trs utile lorsquon souhaitera corriger une erreur dtecte sur une ligne, par exemple. le XOR est un oprateur daddition arithmtique. Cette proprit est valable quel que soit le nombre dentres du XOR. Bien sr, il nest question ici que du bit de poids faible du rsultat (ajouter n termes de 1 bit produit un rsultat sur log2 (n) bits). Et en effet, si on regarde la table de vrit du XOR deux entres, on constate que la sortie est bien la somme arithmtique des deux entres. Bien sr la dernire ligne, le rsultat une retenue que le XOR lui seul ne peut pas produire. On peut dmontrer que ce rsultat est gnral par une simple rcurrence. Si en effet on suppose que XOR(e1, e2, , en ) fournit le bit de poids faible de la somme sn = e1 + e2 + + en, alors : s XOR(e e , e e ) = s si e = 0 ; si e = 1 = sn avec inversion commande par en + 1 = sn en + 1
1, 2, n, n + 1 n n+1 n n+1

XOR est un oprateur associatif.Sa dnition mme, en tant quindicateur dimparit, assure cette proprit. Quelle que soit la faon de grouper les termes, le calcul donnera le mme rsultat. Ce rsultat permet de construire avec un minimum de circuits des XORs 3 entres ou plus, en cascadant des XORs 2 entres.

Formule algbrique dun XOR plus de 2 entres Considrons le calcul du XOR de trois variables A, B et C. On sait que son expression algbrique peut se mettre sous forme dune somme de minterms ; on va donc chercher parmi tous les minterms possibles ceux quil faut inclure dans la formule, et ceux quil faut rejeter. Avec ces trois variables A, B et C, il y a 8 minterms possibles : ABC, ABC, ABC, ABC ne doit pas tre inclus dans le rsultat, puisquil donne 1 pour le vecteur (0,0,0) qui ne comporte pas un nombre impair de 1. ABC doit ltre, car il donne 1 pour le vecteur (0,0,1) qui possde un nombre impair (1) de 1. La rgle est simple : on doit inclure seulement les minterms qui ont un nombre impair de variables non barres. Pour le XOR trois entres, on peut le faire de faon organise en mettant dabord les 3 minterms ayant une variable non barre, puis le minterm ayant les 3 variables non barres : XOR(A, B, C) = ABC + ABC + ABC + ABC On peut montrer que cette formule nest pas simpliable en tant que somme de termes. Pour un XOR 4 entres, on inclut les 4 minterms ayant 1 variable non barre, puis les 4 minterms ayant 3 variables non barres : XOR(A, B, C, D) = ABC D + AB C D + ABC D + AB CD + ABC D + AB CD + ABCD + AB CD Pour un nombre quelconque dentres, on peut montrer que le rsultat comporte toujours la moiti de tous les minterms possibles, et que cette somme nest jamais simpliable en tant

26 que somme de termes. Le multiplexeur

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE

Le multiplexeur est une porte trois entres, qui joue un rle daiguillage. Son dessin indique bien cette fonction (gure II.14).

SEL 0 1

S A B

Figure II.14. Table de vrit condense du multiplexeur, et dessin de la porte correspondante. Lorsque la commande de slection vaut 0, laiguillage est du ct de A, et S prend la valeur de A ; lorsquelle vaut 1, S prend la valeur de B. Algbriquement, on a donc : S = SELA + SELB partir de la comprhension du rle du multiplexeur, il est clair que : S = SELA + SELB Or ce nest pas si facile tablir algbriquement : S = SELA + SELB = SELASELB S = (SEL + A)(SEL + B) = ASEL + SELB + AB On a un terme en trop, AB ! En fait, on peut le faire disparatre en crivant AB = AB SEL + ABSEL : S = ASEL + SELB + ABSEL + ABSEL S = ASEL(1 + B) + SELB(1 + A) = SELA + SELB On a ici un exemple o la comprhension dune fonction a permis de se dispenser de calculs algbriques ou de mthodes de simplication.

5. SHDL, un langage de description matrielle pdagogique


Les langages de description matrielle (HDL) Un langage de description matrielle, ou HDL (Hardware Description language), permet la description de circuits logiques sous une forme textuelle. Cette description peut ensuite tre utilise par un simulateur pour tre teste, ou elle peut tre traduite par un

5. SHDL, un langage de description matrielle pdagogique

27

programme de synthse an dtre utilise pour la fabrication dun circuit logique spcique (ASIC), ou pour pouvoir programmer un circuit logique recongurable tel quun PLD ou un FPGA (section 6). Certains langages de description sont structurels et dautres sont fonctionnels. Un langage de description structurel prcise explicitement tous les modules et sous modules qui sont utiliss dans le circuit. Si lon veut implmenter une addition, il va falloir entrer dans tous les dtails de sa conception. linverse, un langage fonctionnel va dcrire certains aspects de son fonctionnement sous forme dune fonction et donc de faon non explicite ni extensive. Laddition de deux registres A et B sera par exemple crite A + B, sans entrer dans les dtails de sa ralisation matrielle. La plus grande lourdeur des langages de description structurels doit tre tempre par le fait quils sont gnralement tous modulaires, et que des circuits tels que des additionneurs existent dj sous forme de modules tout prts disponibles dans des bibliothques. Nanmoins, ce sont les langages fonctionnels qui deviennent les plus largement utiliss, tels que VHDL et Verilog. ABEL et PALASM sont des exemples de langages structurels, ABEL tant le plus populaire. ABEL existe depuis 1983, et il a encore une grande communaut de concepteurs qui lutilise. SHDL, un langage structurel pdagogique SHDL est un langage de description matrielle issu du langage MDL conu initialement par Jean Conter, au dpartement informatique de lENSEEIHT de Toulouse. SHDL signie Simple Hardware Description Language; il est dune criture trs simple et il encourage en effet une conception hautement modulaire, en supprimant tout simplement les dclarations habituelles faire pour quun circuit dj conu puisse tre rutilis en tant que bote noire dans un circuit de niveau suprieur. La syntaxe de SHDL est proche de celle dABEL, en en tant encore plus simple, et il est comme lui un langage de description structurel. Comme il a dabord une vise pdagogique, ce choix permet dexaminer le fonctionnement des circuits conus, jusqu la plus petite chelle. Un diteur graphique et un simulateur ont t conus pour le langage SHDL. Cet environnement est disponible sous forme de licence GPL, donc gratuit, utilisable et modiable volont. Le lecteur est fortement encourag simuler tous les exemples de ce livre dans lenvironnement SHDL. Lenvironnement libre et complet ddition graphique et de simulation, ainsi quune documentation complte du logiciel sont disponibles ladresse http://diabeto.enseeiht.fr/download/shdl. Premiers lments de syntaxe SHDL La syntaxe de SHDL sera dcrite progressivement au l des chapitres. Un exemple simple sera plus parlant quun long discours :
module half_adder(a,b: s,r) s = /a*b+a*/b ; r = a*b ; end module

Ce module, appel half_adder, possde 2 entres appeles a et b, et deux sorties s et r. La premire ligne module half_adder(a,b :s,r) fournit donc le nom et linterface du module.

28

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE

On notera la prsence du signe : pour marquer la sparation entre les entres et les sorties ; en ralit ce signe nest pas obligatoire car le logiciel peut deviner seul les fonctions de ces signaux, mais ils peuvent rendre lcriture plus lisible. Lcriture module half_adder(a,b,s,r) aurait donc t quivalente. On notera galement la prsence de la dernire ligne end module, qui termine la dnition du module. Elle est obligatoire, et elle permet ainsi de placer plusieurs dnitions de modules dans un mme chier, chaque dnition tant encadre par un dbut commenant par module et une n end module. Viennent ensuite des lignes, termines par le signe ;, qui dcrivent comment les signaux s et r sont produits partir de a et b. Le signe / indique la ngation, et sapplique a au symbole immdiatement sa droite. /a et /b signient donc et b. Les signes + et * indiquent les oprations OU et ET respectivement ; les deux lignes sinterprtent donc : s = + a et r = ab. ab b Les parenthses sont interdites en SHDL dans les expressions ; elles ne peuvent apparatre que dans la description de linterface. En particulier, on ne peut pas crire des ngations de la forme /(a+b) ; il faudra utiliser le thorme de De Morgan et crire /a*/b. Cette contrainte nest pas une limitation, puisquon sait que toute formule algbrique peut se mettre sous forme dune somme de minterms. Par ailleurs cette criture est adapte la synthse de circuits logiques recongurables de type PLD ou FPGA. Finalement, lditeur graphique de lenvironnement SHDL permet dafcher le contenu dun tel module (gure II.15).

module half_adder(a,b: s,r) s = /a*b+a*/b ; r = a*b ; end module

Figure II.15. Demi-additionneur en SHDL.

6. Circuits logiques recongurables ; PLD et FPGA


Un circuit logique programmable est un composant lectronique qui ralise des fonctions combinatoires et squentielles, mais dont le contenu est modiable, dcrit lors dune phase de programmation (ou reconguration).Les premiers modles ne pouvaient tre programms quune fois, mais la plupart des modles actuels permettent plusieurs milliers

6. Circuits logiques recongurables ; PLD et FPGA

29

de cycles deffaage et rcriture. Un tel circuit est un peu plus lent que le mme circuit xe qui aurait t produit spciquement (ou ASIC), mais son cot est faible pour des petites productions, et sa reprogrammmation permet une phase de mise au point interactive, et autorise des mises jours aprs dploiement. PLD PLD signie Programmable Logic Device. Un PLD se caractrise par : un nombre de composants plus faible quun FPGA. une consommation plus faible que celle dun FPGA. une absence de phase de bootstrap. Une fois congur, un PLD conserve sa conguration mme hors tension, et il est oprationnel immdiatement aprs la mise sous tension.

Les premiers PLDs sappelaient PALs et GALs, et ils ntaient programmables quune fois. Leur programmation ncessitait lutilisation dun programmateur spcial, et ils devaient tre placs sur un support si on voulait proter de leur reprogrammabilit. Les PLDs plus complexes sont souvent appels CPLDs. Leur conguration est stocke dans une EEPROM ou mmoire ash, qui peut tre mise jour en utilisant le protocole JTAG (voir plus loin). FPGA Un FPGA (Field Programmable Gate Array) utilise une organisation de type matrice de portes, qui permet un nombre de composants plus grands. Sa conguration est stocke dans une RAM, qui doit tre recharge chaque remise sous tension, gnralement partir dune ROM prsente sur la carte. Cette particularit qui semble tre un inconvnient lui donne la possibilit trs intressante de pouvoir tre recongur dynamiquement, durant son fonctionnement. Programmation JTAG La plupart des PLDs et des FPGAs sont congurables directement sur le circuit imprim o ils vont tre placs, sans programmateur, en utilisant un protocole standard de programmation laide dun ux sriel de donnes appel protocole JTAG. Tous les composants programmables prsents sur le circuit imprim sont relis ensemble en daisy chain (gure II.16).
TDO

TDI

TDI

TDO

TDI

TDO

TDI

TDO

CPLD
TMS TCK TMS TCK

FPGA
TMS TCK

ROM Flash
TMS TCK

Figure II.16. Chane de programmation JTAG.On peut mlanger des circuits de tous types, et mme parfois de diffrents constructeurs.

30

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE

Un interface trs simple permet gnralement dexploiter les 5 signaux du protocole partir de lordinateur de dveloppement. Un logiciel de programmation permet deffectuer une opration de lecture ou de conguration sur un ou plusieurs des composants de la chane, sans affecter les autres. Comme ce protocole est standard, il est gnralement possible de mlanger dans cette chane des composants de diffrents constructeurs. Des cartes dexprimentation base de PLD ou de FPGA, programmables laide dun tel cble JTAG sont maintenant accessibles faible cot, et permettent de raliser des systmes quivalents plusieurs centaines de milliers de portes. Les outils de dveloppement et de conguration sont tous ferms et propritaires, et le dveloppement denvironnements ouverts est dcourag par la non divulgation des spcications internes prcises des composants.

7. Mthodes de simplication des fonctions combinatoires


7.1. Tables de Karnaugh
Une table de Karnaugh est utilise pour trouver visuellement les simplications faire sur une somme de termes. Elle est trs facile utiliser, pour peu quil ny ait pas plus de 4 variables en jeu. Au del, il vaut mieux employer la mthode de Quine-Mc Cluskey dcrite plus bas. Considrons par exemple la fonction ayant la table de vrit de la gure II.17.
A 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 B 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 C 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 D 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 S 0 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1

Figure II.17. Table de vrit dune fonction simplier. On va reprsenter les valeurs de S dans un tableau 4X4, chaque case correspondant un des 16 minterms possibles avec 4 variables A,B,C et D (gure II.18). On remarquera dabord les libells des lignes et des colonnes, qui forment un code de Gray : dune ligne lautre ou dune colonne lautre, il ny a quun bit dentre qui change. La table a une forme de cylindre dans les deux directions, cest dire que les colonnes 00 et 10 doivent tre considres comme cte cte, tout comme les lignes 00 et 10.

7. Mthodes de simplication des fonctions combinatoires


A,B C,D 0,0 0,1 1,1 1,0 1 1 1 1 1 0,0 0,1 1,1 1,0 1 1 1 1 1 1

31

Figure II.18. Table de Karnaugh reprsentant la table de vrit. Les 11 sorties 1 de la table de vrit ont t reportes dans la table de Karnaugh. En effectuant des groupes de 1 connexes de 2, 4 ou 8, on ralise une simplication (gure II.19).
AB A,B C,D 0,0 0,1 1,1 1,0 1 1 1 ABC 1 1 0,0 0,1 1,1 1,0 1 1 1 1 1 1 D

Figure II.19. Table de Karnaugh avec les regroupements. Par exemple le regroupement ABC correspond la simplication ABCD + ABC D = ABC(D + D) = ABC. De mme, le regroupement AB correspond la simplication des 4 termes : ABC D + ABCD + ABC D + ABCD = AB(C D + CD + C D + CD) = AB. On repre facilement le rsultat en regardant les libells des lignes et des colonnes impliqus dans la simplication. Pour le terme simpli D par exemple, il concerne les lignes CD=01 ;11 et les colonnes AB=**; seul D = 1 est constant, et toutes les autres variables disparaissent. Finalement on a : S = D + AB + ABC Utilisation des combinaisons non spcies Il y a des situations dans lesquelles certaines combinaisons des entres ne se produisent jamais, quon peut appeler combinaisons interdites ou combinaisons non spcies. Considrons par exemple un dcodeur 7 segments, qui convertit un nombre binaire sur 4 bits en un vecteur de 7 bits qui commande un afcheur Leds de type calculette (gure II.20). La spcication de ce convertisseur nous prcise quil ne faut convertir que les chiffres de 0 9, cest dire les valeurs du vecteur (A,B,C,D) de (0,0,0,0) (1,0,0,1). Ainsi le fonctionnement du circuit nest pas spci pour les valeurs de (1,0,1,0) (1,1,1,1), et on va

32

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE


a (A,B,C,D) 4 (a,b,c,d,e,f,g) 7 e d f g c b

Figure II.20. Convertisseur 7 segments pour afcheur de calculette. exploiter cette latitude pour simplier les quations. Si on considre par exemple la table de vrit du segment a, elle comporte ainsi 6 lignes pour lesquelles la valeur de la sortie nest pas spcie, quon note * (gure II.21).
A 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 B 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 C 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 D 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 a 1 0 1 1 0 1 1 1 1 1 * * * * * *

Figure II.21. Table de vrit du segment a. Dans la table de Karnaugh correspondante, les * peuvent tre incluses dans les regroupements (gure II.22) ce qui conduit leur donner la valeur 1. Bien sr on ne doit pas chercher inclure toutes les *dans les regroupements : on cherche inclure tous les 1, mais les *permettent de trouver des regroupements plus grands. Ici par exemple, on trouve le rsultat trs simple : a = C + A + BD + BD Dtection et correction des glitches Un autre usage des tables de Karnaugh est la dtection des glitchs, cest dire des changements trs brefs des signaux de sortie dune fonction combinatoire lors de changements des entres. Considrons par exemple la fonction suivante : S = ABC D + ABC D + ABC D + ABCD + ABC D + ABCD On construit directement la table de Karnaugh associe cette fonction, et on trouve

7. Mthodes de simplication des fonctions combinatoires

33

BD A,B C,D 0,0 0,1 1,1 1,0 1 1 0,0 0,1 1 1 1 1 BD 1,1 * * * * 1,0 1 1 * * A C

Figure II.22. Table de Karnaugh du segment a, avec les combinaisons non spcies marques par des *. On peut inclure les * pour former des regroupements plus grands. immdiatement deux regroupements (gure II.23).
A,B C,D 0,0 0,1 1,1 1,0 0,0 1 1a 1 b 0,1 1,1 1,0 1 1 1

Figure II.23. Table de Karnaugh avec les regroupements. Un glitch est possible dans le passage de a b, car les deux regroupements sont tangents cet endroit. Lquation simplie est alors : S = AB + AC D Cette quation est plus simple que la premire, mais elle va se comporter lgrement diffremment lors de certains changements de valeurs des entres. Considrons par exemple le changement du vecteur dentres (A,B,C,D) de (0,1,0,0) (1,1,0,0), qui correspond au passage de a b sur la gure II.23. Dans ce cas, seul A a chang, et la sortie S devrait rester 1, aussi bien pour lquation initiale que pour lquation simplie. Or pour lquation simplie, le terme AB va passer de 0 1 tandis que le terme AC D va passer de 1 0 ; si ce changement se fait exactement en mme temps, S restera 1, mais si le premier terme passe 0 lgrement avant que le deuxime ne passe 1, un lger glitch sur S apparatra (gure II.24). Ce glitch tait prvisible visuellement sur la table de Karnaugh, par le fait des deux regroupements qui sont adjacents sans se recouvrir. On constate galement que cest le seul changement dune seule variable qui peut conduire un tel problme. La solution est de rajouter un regroupement qui va faire la liaison entre ces deux groupes, en valant 1 pendant toute la transition (gure II.25). Finalement, on obtient lexpression simplie sans glitch :

34

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE

A.B A.C.D S = A.B + A.C.D glitch

Figure II.24. Glitch sur lquation S = AB + ACD,lors du passage de (A,B,C,D) de (0,1,0,0) (1,1,0,0).
terme supplmentaire A,B C,D 0,0 0,1 1,1 1,0 0,0 1 1a 1 b 0,1 1,1 1,0 1 1 1
B.C.D A.C.D

A.B

S = A.B + A.C.D + B.C.D

Figure II.25. Ajout du terme BC D pour maintenir S 1 lors de la transition de a vers b. Le glitch disparat sur le signal de sortie S. S = AB + AC D + BC D

7.2. Mthode de Quine-Mc Cluskey


On va montrer son usage en simpliant la fonction 5 variables suivante : f (A, B, C, D, E) = AB C D E + AB CD E + AB C D E + AB CD E + ABC D E + ABC DE + ABCDE + ABC DE + ABCDE Une table de Karnaugh serait dlicate utiliser dans ce cas, car elle aurait une taille de 4 x 8, et certains regroupements possibles pourraient ne pas tre connexes. Par conomie dcriture, on commence par reprsenter chaque minterm par le nombre associ sa reprsentation binaire : f (A, B, C, D, E) =

(0, 2, 8, 10, 12, 13, 26, 29, 30)

7. Mthodes de simplication des fonctions combinatoires

35

On place ensuite ces minterms dans un tableau, en les groupant selon le nombre de 1 quils possdent (gure II.26). nombre de 1 0 1 2 3 4 minterm 0 2 8 10 12 13 26 29 30 valeur binaire 00000 00010 01000 01010 01100 01101 11010 11101 11110

Figure II.26. On classe les minterms selon le nombre de 1 de leur valeur binaire. Les simplications ne peuvent se produire quentre groupes adjacents. La simplication entre les minterms 1 et 2 se notera par exemple : 000-0, en mettant un tiret lendroit o la variable a disparu. Lorsquon a effectu toutes les simplications possibles, on recommence partir des nouveaux groupes forms, jusqu ce quaucune simplication ne soit possible (gure II.27). tape 1 0 2 8 10 12 13 26 29 30 00000 00010 01000 01010 01100 01101 11010 11101 11110          0-2 0-8 2-10 8-10 8-12 10-26 12-13 13-29 26-30 tape 2 000-0 0-000 0-010 010-0 01-00 -1010 0110-1101 11-10     tape 3 0-2-8-10 0-0-0

Figure II.27. On simplie entre groupes adjacents, tape par tape. Les termes qui ont t utiliss dans une simplication sont cochs. Maintenant, il suft de choisir dans ce tableau les termes qui vont inclure tous les minterms de dpart, en essayant de trouver ceux qui correspondent lexpression la plus

36

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE

simple. On peut le faire de faon purement intuitive, en commenant par les termes les plus droite : par exemple les groupes 0-2-8-10, 8-12, 13-29, 26-30 vont inclure tous les minterms. On trouve donc : S = AC E + ABDE + BC DE + ABDE Dans les cas complexes, ou si on veut programmer cet algorithme, on numre la liste des implicants premiers, qui sont les termes du tableau prcdent qui nont t utiliss dans aucune simplication. Dans le tableau prcdent, on a coch avec une  les termes qui ont t utiliss dans une simplication, donc la liste des implicants premiers est : 8-12, 10-26, 12-13, 13-29, 26-30, 0-2-8-10. Il est clair que le rsultat simpli ne comportera que des termes de cette liste, et le but est de dterminer parmi eux ceux quil est indispensable de placer dans le rsultat, appels implicants premiers essentiels. On construit pour cela la table des implicants premiers (gure II.28). 0 8-12 10-26 12-13 13-29 26-30 0-2-8-10 01-00 -1010 0110-1101 11-10 0-0-0 * * *     2 8         10 12   13 26 29 30

Figure II.28. Table des implicants premiers ; les implicants premiers sont en lignes et les minterms de dpart sont en colonnes. Un implicant premier est dit essentiel sil est le seul couvrir un des minterms en colonne ; on le repre avec une marque *. Parmi les 5 minterms placs en ligne dans le tableau, 3 sont dits essentiels, parce quils sont les seuls couvrir un des minterms placs en colonnes : limplicant premier 13-29 est le seul couvrir le minterm 29, 26-30 est le seul couvrir 26 et 30, et 0-2-8-10 est le seul couvrir les minterms 0 et 2. 8-12 et 12-13 ne sont pas essentiels, car 8, 12 et 13 sont couverts par dautres implicants premiers. Les implicants premiers essentiels sont ncessaires, mais pas forcement sufsants. Ici par exemple, si on ne prenait queux, le minterm 12 ne serait pas couvert. Il reste donc une phase heuristique de choix parmi les implicants premiers non essentiels pour couvrir tous les minterms non encore couverts. Dans notre exemple, on peut ajouter, soit 8-12, soit 12-13 pour couvrir le 12 manquant, ce qui donne les deux possibilits suivantes : version avec 8-12 : S = AC E + ABDE + BC DE + ABDE version avec 12-13 : S = AC E + ABC D + BC DE + ABDE

8. Circuits combinatoires rutilisables

37

8. Circuits combinatoires rutilisables


Nous cherchons dvelopper une bibliothque de circuits combinatoires (et ensuite squentiels) qui seront rutilisables dans diffrents contextes, et notamment celui des microprocesseurs et des microcontrleurs. Parmi eux gurent des oprateurs efcaces darithmtique entire : additionneurs, multiplieurs, comparateurs. Un interface adapt permettra une rcursivit ou une interconnection aises.

8.1. Problmatique de laddition


Lorsquon effectue une addition en binaire, la mthode la plus simple consiste leffectuer bit bit, en commenant par le bit de poids faible (gure II.29).

A[3..0] B[3..0] S[3..0]

1 0 1

0 0 1

0 1 0

1 1 0

addition demi complte addition

Figure II.29. Addition en binaire bit bit. A chaque rang i de laddition, on fait la somme des bits A[i] et B[i], ainsi que de lventuelle retenue qui viendrait du rang prcdent i 1. Ce calcul produit le bit S[i] du rsultat, ainsi quune retenue qui sera passe au rang suivant. Lorsquon a effectu toutes ces additions depuis le bit de poids le plus faible (rang 0) jusquau bit de poids le plus fort, la retenue nale sera la retenue qui sort du dernier rang daddition. On appelle demi-additionneur le circuit qui fait le calcul du rang 0, car il na pas prendre en compte de retenue qui viendrait dun tage prcdent. On appelle additionneur complet le circuit qui prend en compte le calcul dun bit de rang quelconque diffrent de 0.

8.2. Demi-additionneur
Un demi-additionneur est le circuit qui ralise une addition entre deux bits A et B, et qui produit la somme sur un bit S avec lventuelle retenue R. La table de vrit et le module correspondant sont reprsents gure II.30. Il est clair en effet que la somme est le XOR entre A et B, et la retenue ne peut intervenir que lorsque A et B valent 1 tous les deux.

8.3. Additionneur complet


Un additionneur complet est un demi-additionneur qui comporte en plus en entre une retenue entrante qui viendrait dun autre tage daddition. Les entres sont donc les deux

38

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE

A 0 0 1 1

B 0 1 0 1

S 0 1 1 0

R 0 0 0 1

Figure II.30. Table de vrit et schma du demi-additionneur. bits A et B et la retenue entrante RE ; les sorties sont le bit rsultat S et la retenue sortante RS. Il est facile de dterminer S et RS au vu de leur fonction, sans avoir besoin de leur table de vrit : S est la somme des trois bits A, B et RE, et on sait depuis la section 3 que cest un XOR trois entres : S = A B RE. RS est la retenue de cette addition, et vaut 1 lorsquil y a au moins deux valeurs 1 dans le triplet (a, b, c) : cest donc la fonction majorit dj vue en section 3, RS = AB + A RE + BRE.
module FULLADDER(A,B,RE: S,RS) S = /A*/B*RE+/A*B*/RE+A*/B*/RE+A*B*RE ; RS = A*B + A*RE + B*RE ; end module

Figure II.31. Additionneur complet : la somme est un XOR, et il y a retenue lorsquune majorit des entres vaut 1.

8.4. Additionneur ripple-carry


Un additionneur ripple carry ralise littralement la mthode daddition colonne par colonne, en commenant par une demi-addition des poids faibles et en enchanant ensuite laddition complte des bits suivants. Sur n bits, il ncessitera un demi-additionneur, et n 1 additionneurs complets. Sur 4 bits par exemple, il prend la forme de la gure II.32. La description en langage SHDL est trs simple : il suft de combiner les critures dun demi-additionneur et de 3 additionneurs complets (gure II.33). Ce type dadditionneur est simple, mais lent : il faut attendre que toutes les retenues se soient propages depuis le bit de poids le plus faible jusquau bit de poids le plus fort pour que le calcul soit termin. Or un calcul daddition est un calcul combinatoire, donc qui peut tre effectu en thorie en une tape de propagation, sous forme dune somme de minterms,

8. Circuits combinatoires rutilisables

39

Figure II.32. Addition ripple carry 4 bits. Le rang 0 est calcul avec un demi-additionneur, et les autres rangs avec des additionneurs complets.
module ripplecarry4(a3,b2,a1,a0,b3,b2,b1,b0: s3,s2,s1,s0,carry) halfadder(a0,b0:s0,c0); fulladder(a1,b1,c0:s1,c1); fulladder(a2,b2,c1:s2,c2); fulladder(a3,b3,c2:s3,carry); end module module halfadder(a,b: s,cout) s = /a*b+a*/b; cout = a*b; end module module fulladder(a,b,cin: s,cout) s = /a*/b*cin+/a*b*/cin+a*/b*/cin+a*b*cin; cout = a*b + a*cin + b*cin; end module

Figure II.33. criture SHDL dun additionneur ripple-carry 4 bits.On combine un module halfadder et 3 modules fulladder. et sans tous ces termes intermdiaires que reprsentent les retenues. Mais les quations crire deviennent trs complexes ds le rang 3, et sont donc impraticables. Entre ces deux extrmes, il est ncessaire de concevoir des additionneurs de complexit raisonnable pour un nombre de bits suprieur 8, et avec des temps de propagation qui ne croissent pas linairement avec ce nombre de bits. On va voir en section 8.5 comment les additionneurs carry lookahead parviennent ce compromis.

8.5. Additionneur carry-lookahead


On a vu en section 8.1 que ctait la propagation de la retenue qui ralentissait le calcul dune somme dans un additionneur ripple carry. Si on calcule an..a0 + bn..b0, on a pour chaque additionneur complet : si = ai bi ci

40 ci = ai bi + ai ci + bi ci

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE

Calculer s3 par exemple ncessite de calculer c3, donc s2, donc c2, etc. La mthode carry lookahead part du constat quon peut facilement dterminer chaque tage sil y aura une retenue ou non, en raisonnant en termes de retenue propage et de retenue gnre. Considrons laddition des deux termes suivants : P 1 0 P 0 1 P 1 0 G 1 1 G 1 1 P 0 1 0 0 P 1 0

Un G est plac au dessus dune colonne de rang i lorsque les termes ajouter ai et bi valent tous deux 1 : on est alors sr quune retenue sera Gnre pour ltage suivant. Sinon, un P est plac lorsquun des deux termes vaut 1 : si une retenue arrive depuis ltage prcdent, alors cet tage va la Propager, puisquon sera alors sr quil y a au moins deux 1 parmi les trois bits additionner ce rang. En raisonnant uniquement sur les P et les G, on trouve facilement quels tages vont mettre une retenue. Ainsi sur lexemple, ltage 0 peut propager une retenue, mais aucune na encore t gnre. Les tages 3 et 4 gnrent une retenue, et les tages suivants 5, 6 et 7 la propagent. Les termes Gi et Pi sont trs faciles calculer : Gi = ai bi Pi = ai + bi Un module autonome peut prendre en entres les valeurs des Gi et Pi de tous les rangs et les utiliser pour calculer les retenues entrantes de chaque additionneur complet, selon le schma gnral de la gure II.34. On notera que les retenues sortantes cout des additionneurs complets ne sont pas exploites, puisque cest le module carry_lookahead qui soccupe du calcul de toutes les retenues. Il faut maintenant raliser un module carry_lookahead qui effectue ce calcul dans le temps le plus court. Lide gnrale est quil y a une retenue au rang i si Gi = 1 ou si Pi = 1 et si une retenue existe au rang i 1 : ci + 1 = Gi + ci Pi On trouve : c1 = G0 + cinP0 c2 = G1 + c1P1 = G1 + G0 P1 + cinP0 P1

c4 = G3 + c3P3 = G3 + G2 P3 + G1P2 P3 + G0 P1P2 P3 + cinP0 P1P2 P3 Il ne faut pas se leurrer : il y a l aussi une cascade dans les calculs, mais elle porte sur des termes plus simples que si on avait opr directement sur les terme ai et bi. Au del

c3 = G2 + c2 P2 = G2 + G1P2 + G0 P1P2 + cinP0 P1P2

8. Circuits combinatoires rutilisables

41

Figure II.34. Schma gnral dun additionneur carry-lookahead.On calcule pour chaque rang i deux bits Gi et Pi qui indiquent si cet tage va gnrer une retenue, ou en propager une de ltage prcdent. Un module spcique carry_lookahead calcule rapidement partir des Gi et Pi les retenues ci pour tous les rangs. de 7 8 bits, les quations du module carry_lookahead deviennent trop complexes pour tre implmentes sous forme de sommes de termes, et des signaux intermdiaires doivent tre introduits. Si on considre la somme de produits comme unit de calcul et de propagation (hypothse dimplmentation dans un CPLD ou un FPGA), le calcul complet dune somme ncessite 1temps pour le calcul des Gi et Pi, 1temps pour le calcul des retenues, et 1temps pour ladditionneur complet, soit un total de 3 temps de propagation, contre 4 pour ladditionneur ripple carry. Le gain est faible, mais il augmente mesure que le nombre de bits grandit. Lcriture complte dun tel additionneur 4 bits en langage SHDL est donne gure II.35. Association dadditionneurs carry-lookahead La technique de ladditionneur carry-lookahead ne peut pas tre utilise au del de 7 8 bits, mais on souhaite continuer lexploiter sur des additionneurs de plus grande taille. On peut subdiviser les mots additionner en groupes de 4 bits par exemple, et effectuer dans chaque groupe une addition carry-lookahead. Se pose alors le problme de lassociation de ces groupes : va-t-on se contenter de les chaner en ripple carry ? On peut en fait appliquer nouveau la technique carry-lookahead lchelle des groupes. Chaque additionneur carry-lookahead sur 4 bits CLAi va gnrer deux signaux GGi (group generate) et GPi (group propagate). GGi indiquera que le groupe gnrera

42

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE


module full_adder(a, b, rin : s, rout) s = /a*/b*rin+/a*b*/rin+a*/b*/rin+a*b*rin; rout = a*b+a*rin+b*rin; end module module carry_lookahead(G3,P3,G2,P2,G1,P1,G0,P0,c0:c4,c3,c2,c1) c1=G0+P0*c0; c2=G1+P1*G0+P1*P0*c0; c3=G2+P2*G1+P2*P1*G0+P2*P1*P0*c0; c4=G3+P3*G2+P3*P2*G1+P3*P2*P1*G0+P3*P2*P1*P0*c0; end module module cla4(a3..a0,cin,b3..b0:s3..s0,cout) G3..G0 = a3..a0 * b3..b0; P3..P0 = a3..a0 + b3..b0; carry_lookahead(G3,P3,G2,P2,G1,P1,G0,P0,cin:cout,c3,c2,c1); full_adder(a3,b3,c3:s3,c4_); full_adder(a2,b2,c2:s2,c3_); full_adder(a1,b1,c1:s1,c2_); full_adder(a0,b0,cin:s0,c1_); end module

Figure II.35. criture SHDL dun additionneur 4 bits carry-lookahead. On notera lcriture vectorielle pour les quations des termes Gi et Pi. ncessairement une retenue et GPi indiquera que si une retenue arrive dans ce groupe (par son entre cin), elle sera propage travers lui au groupe suivant. La mme mthode est ainsi applique lchelle des groupes, chaque groupe jouant ici le mme rle que jouait un tage de 1 bit dans ladditionneur carry-lookahead ordinaire. Le mme module carry_lookahead est dailleurs employ pour calculer rapidement les retenues c 4 , c 8, c12 et c16 qui sont envoyes aux diffrents groupes. La gure II.36 montre un exemple daddition , et la gure II.37 prsente lorganisation gnrale dun tel groupement.
#3 #2 #1 #0 cin=0

0000 0000 1010 0100 0000 0000 0101 1100 0000 0001 0000 0000 GG=0 GP=1 c8=1 GG=1 GP=0 c4=1

Figure II.36. Exemple daddition 16 bits avec un additionneur group carry-lookahead.Le groupe #0 gnre une retenue,qui est propage au travers du groupe #1, et dont leffet vient se terminer dans le groupe #2. Il nous reste seulement trouver les quations de GG et GP. GG indique quune retenue est gnre par le groupe, cest dire gnre an niveau du bit 3, ou gnre au niveau du bit 2 et propage au rang 3, etc. :
GG = G3+G2*P3+G1*P2*P3+G0*P1*P2*P3

8. Circuits combinatoires rutilisables

43

Figure II.37. Schma gnral dun groupement de 4 additionneurs 4 bits carry-lookahead. Chaque additionneur fournit deux signaux GG et GP qui indiquent sil gnre ou propage une retenue pour le groupe suivant.Un module carry_lookahead effectue le calcul rapide des retenues entrantes de chaque groupe partir de ces signaux. GP indique quune retenue arrivant par cin sera propage tout au long du groupe, cest dire qu chaque rang de bit i il y a au moins un 1sur ai ou bi, cest dire encore qu chaque rang i on a Pi = 1 :
GP = P0*P1*P2*P3

La gure II.39 donne lensemble complet des quations SHDL de cet additionneur. Les modules carry_lookahead et fulladder sont les mme qu la gure II.35, cla4 a t lgrement modi puisquil produit maintenant les signaux GG et GP.

8.6. Soustraction
Problmatique de la soustraction Comme laddition, la soustraction peut tre effectue bit bit, en commenant par le bit de poids faible (gure II.38).
0 1 1 0

A[3..0] B[3..0] S[3..0]

1 0
1

0 0
1

0 1
0

1 1
0

Figure II.38. Soustraction en binaire bit bit. Un bit demprunt est propag des bits de poids faibles vers les bits de poids forts. Le bit qui est propag de rang en rang est un bit demprunt : il vaut 1 lorsque ai est plus

44

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE


module cla16(a15..a0,b15..b0,cin:s15..s0,cout) cla4(a3..a0,b3..b0,cin:s3..s0,c4_,GG0,GP0); cla4(a7..a4,b7..b4,c4:s7..s4,c8_,GG1,GP1); cla4(a11..a8,b11..b8,c8:s11..s8,c12_,GG2,GP2); cla4(a15..a12,b15..b12,c12:s15..s12,c16_,GG3,GP3); carry_lookahead(GG3,GP3,GG2,GP2,GG1,GP1,GG0,GP0,cin:cout,c12,c8,c4); end module module cla4(a3,a2,a1,a0,b3,b2,b1,b0,cin:s3,s2,s1,s0,cout,GG,GP) G3..G0 = a3..a0 * b3..b0; P3..P0 = a3..a0 + b3..b0; carry_lookahead(G3,P3,G2,P2,G1,P1,G0,P0:cout,c2,c1,c0); full_adder(a3,b3,c2:s3,cout3); full_adder(a2,b2,c1:s2,cout2); full_adder(a1,b1,c0:s1,cout1); full_adder(a0,b0,cin:s0,cout0); GG = G3+G2*P3+G1*P2*P3+G0*P1*P2*P3; GP = P0*P1*P2*P3; end module

Figure II.39. criture SHDL dun additionneur 16 bits carry-lookahead. Les modules
cla4, carry_lookahead et fulladder sont ceux utiliss dans la version 4 bits, cla4 ayant t lgrement modi pour produire les signaux GG et GP.

petit que bi, ou plus exactement lorsque ai est plus petit que bi plus le bit demprunt de ltage prcdent. Chaque rang de soustraction est un circuit combinatoire 3 entres et 2 sorties appel soustracteur complet dont la table de vrit est donne gure II.40. On a not EE lemprunt entrant, qui vient du rang prcdent et ES lemprunt sortant qui est pass au rang suivant.

A 0 0 0 0 1 1 1 1

B 0 0 1 1 0 0 1 1

EE 0 1 0 1 0 1 0 1

S 0 1 1 0 1 0 0 1

ES 0 1 1 1 0 0 0 1

Figure II.40. Table de vrit dun soustracteur complet. On soustrait B A ; EE est lemprunt entrant et ES lemprunt sortant. On voit immdiatement que S est le XOR des trois entres A, B et EE. Lemprunt sortant ES vaut 1 lorsque A vaut 0 et quun des deux B ou EE vaut 1, ou lorsque A vaut 1 et que B et EE valent tous les deux 1. On trouve donc ES = AB + AEE + EEB.

8. Circuits combinatoires rutilisables Le schma du soustracteur complet et son criture SHDL sont donns gure II.41.
module FULLSUB(A,B,EE: S,ES) S = /A*/B*EE+/A*B*/EE+A*/B*/EE+A*B*EE; ES = /A*B + /A*EE + B*EE; end module

45

Figure II.41. Soustracteur complet : la diffrence est un XOR, et il y a retenue lorsquune majorit des signaux (/A,B,EE) vaut 1. Soustracteur ripple-borrow Comme un additionneur ripple-carry, un soustracteur ripple-borrow est form par chanage de plusieurs tages de soustracteurs complets. Comme lui il est trs simple de conception, mais prsente aussi les mmes inconvnients de lenteur dus la propagation des signaux demprunt. Les gures II.42 et II.43 montrent un additionneur 4 bits ripple-borrow et lcriture SHDL associe.

Figure II.42. Schma gnral dun soustracteur 4 bits ripple-borrow. Transformation dun additionneur en soustracteur On peut faire la soustraction A B en effectuant laddition A + ( B). B est obtenu en prenant le complment 2 de B, cest dire le complment 1 de B auquel on ajoute 1. Lajout +1 peut se faire en exploitant un signal de retenue entrante, comme on peut le voir sur la gure II.44. Cette gure montre un additionneur/soustracteur : si ADD/SUB vaut 0 il effectue une addition ; sil vaut 1 les n XORs effectuent le complment 1 du vecteur B, et le forage 1 de la retenue entrante va conduire ajouter 1, donc construire le complment 2 de B, donc raliser une soustraction. On perd malheureusement le signal de retenue entrante ; la retenue sortante cout par contre a bien le sens dune retenue pour laddition, et son inverse

46

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE


module rippleborrow4(a3..a0,b3..b0,ee: s3..s0,es) fullsub(a0,b0,ee:s0,e1); fullsub(a1,b1,e1:s1,e2); fullsub(a2,b2,e2:s2,e3); fullsub(a3,b3,e3:s3,es); end module module fullsub(a,b,ee:s,es) s = /a*/b*ee+/a*b*/ee+a*/b*/ee+a*b*ee; es = /a*b + /a*ee + b*ee; end module

Figure II.43. quations SHDL dun soustracteur 4 bits ripple-borrow.

Figure II.44. Additionneur/soustracteur ralis partir dun additionneur. Lorsque lentre ADD/ SUB vaut 0 laddition A + B est ralise ; lorsquelle vaut 1, les XORs calculent le complment 1 de B et le forage 1 de la retenue entrante cin cr le complment 2, do la soustraction. le sens dun emprunt, do linversion nale commande par le signal ADD/SUB. La gure II.45 donne le code SHDL associ pour un additionneur/soustracteur 16 bits ; elle reprend le module additionneur carry-lookahead 16 bits cla16 tudi la section prcdente.
module addsub16(a[15..0],b[15..0],addsub: s[15..0],cout) bb[15..0] = /addsub*b[15..0] + addsub*/b[15..0]; cla16(a[15..0],bb[15..0],addsub:s[15..0],co); cout=/addsub*co+addsub*/co; end module

Figure II.45. quations SHDL dun additionneur/soustracteur 16 bits. On rutilise ladditionneur carry-lookahead 16 bits tudi auparavant.

47

8.7. Multiplicateur systolique


Problmatique de la multiplication On souhaite multiplier deux nombres de n bits non signs. Le rsultat est sur 2n bits, puisque la multiplication des deux plus grands nombres sur n bits donne : (2 1)(2 1) = 22n 22 + 1 < 22n 1
n n n

La problmatique est la mme que pour laddition : puisquil sagit dun calcul combinatoire, il peut se faire en thorie sous forme dune somme de minterms, en une tape de propagation (en considrant une fois encore que lunit de propagation est la somme de produit). Mais bien sr en pratique, les quations implmenter seraient beaucoup trop complexes. En binaire, la mthode la plus directe pour effectuer une multiplication consiste la poser comme lcole (gure II.46).
0 1 1 0 X 1 1 0 1 0 1 1 0 0 0 0 0 0 1 1 0 0 1 1 0 1 0 0 1 1 1 0 ai bi

ai bi

Figure II.46. Exemple de multiplication de nombres non signs de 4 bits. Cette opration est plus facile faire en binaire quen dcimal, car il ny a pas connatre ses tables de multiplication ! Plus prcisment, lorsquon multiplie un chiffre ai avec un chiffre bi, on produit (cest le cas de le dire) ai bi (gure II.46). Il reste ensuite faire la somme des produits partiels ainsi obtenus. Quand on fait cette somme la main, on la fait colonne par colonne, en commenant par la colonne la plus droite, et on additionne la fois tous les chiffres qui apparaissent dans une colonne et la ou les retenues qui proviennent de la colonne prcdente. Il peut en effet y avoir une retenue suprieure 1 lors de la sommation des chiffres dune colonne, contrairement au cas de laddition. Lide du multiplicateur systolique (matriciel) consiste raliser cette somme des produits partiels dans une matrice de cellules qui a la mme forme que les ranges ajouter (gure II.47). Chaque fois quune cellule produit une retenue, elle est passe directement la colonne immdiatement gauche, un rang plus bas (situation (a)). Cette technique permet de ne pas laisser les retenues saccumuler chaque colonne, en les traitant immdiatement un niveau local. Chaque cellule doit faire laddition de trois termes : le produit partiel aibi, la somme du niveau prcdent, et la retenue qui provient de la cellule en haut droite (situation (b)). Un additionneur complet permet deffectuer cette somme, qui est passe la cellule immdiatement en bas, et de calculer une retenue passer la cellule en bas gauche (gure II.48). Le schma gnral dun tel multiplicateur est donn gure II.49. Les cellules ont

48
0 X 1 0 0 0 0 1 1
1

1 0 1 1 0
1

1 1 1 1

1 1 1

0 1
1

1
X

0 1 0

1 0 1 1 0
1

1 1 1 1

1 1 1

1 0 1
1 1

0 1
1 1

0
0 0 1
1

0 0
1

1 0 1
1

1
1

1 (a)

1 (b)

Figure II.47. (a) Les retenues peuvent tre propages un niveau local, et non lchelle de toute la colonne. (b) entres et sorties au niveau dune cellule.
0 1
1

0 1
1

cin

full adder s cout

Figure II.48. Multiplicateur systolique : chaque cellule est un additionneur complet. la mme disposition que la somme des termes partiels, avec un recadrage droite. On remarquera la dernire range, qui fournit les bits de poids forts du rsultat nal s7..s4. Les bits de poids faibles s3..s0 proviennent quant eux des cellules de la colonne de droite. Le texte SHDL correspondant ce schma est donn gure II.50. On voit facilement que ce multiplicateur 4x4 ncessite 6 temps de propagation (unit : somme de termes). De faon plus gnrale, un multiplicateur systolique n bits x n bits ncessite n+2 temps de propagation. Cest donc une mthode assez efcace, qui est facile implmenter dans des circuits matriciels tels que CPLDs et FPGAs.

8.8. Division entire


Problmatique de la division Comme pour la multiplication, on va essayer de concevoir un rseau de cellules qui ralise une division non signe en utilisant la mthode euclidienne. Prenons un exemple (gure II.51). On a ralis ici une division non signe 8 bits / 4 bits -> 8 bits. Le dividende est p7..p0

49

Figure II.49. Schma gnral dun multiplicateur systolique 4 bits x 4 bits vers 8 bits. = 11010101012 = 213 et le diviseur est d3..d0 = 10112 = 11; on trouve un quotient q7..q0 = 000100112 = 19 et un reste r3..r0 = 01002 = 4. On voit que le nombre dtages de cette division est gal la largeur du dividende, 8 dans lexemple. chaque tape, on effectue une soustraction entre un terme courant et le diviseur. Au dpart, ce terme courant est le poids fort du dividende complt de 4 zros gauche. Le diviseur est galement complt dun zro gauche et cest une soustraction sur 5 bits qui est ralise. Il y a alors deux cas : la soustraction donne un rsultat ngatif, signal par le bit demprunt 1; on ne doit alors pas prendre son rsultat pour le terme courant, mais le laisser tel quel. On lui rajoutera droite un bit supplmentaire du dividende, ltage suivant. On ajoute un zro droite au quotient.

50
module multsyst(a[3..0], b[3..0]: s[7..0]) // premire range ; produit s0 p30=a3*b0; p20=a2*b0; p10=a1*b0; p00=a0*b0; fulladder(0,0,p30:s30,c30); fulladder(0,0,p20:s20,c20); fulladder(0,0,p10:s10,c10); fulladder(0,0,p00:s0,c00); // deuxime range ; produit s1 p31=a3*b1; p21=a2*b1; p11=a1*b1; p01=a0*b1; fulladder(c30,0,p31:s31,c31); fulladder(c20,s30,p21:s21,c21); fulladder(c10,s20,p11:s11,c11); fulladder(c00,s10,p01:s1,c01); // troisime range ; produit s2 p32=a3*b2; p22=a2*b2; p12=a1*b2; p02=a0*b2; fulladder(c31,0,p32:s32,c32); fulladder(c21,s31,p22:s22,c22); fulladder(c11,s21,p12:s12,c12); fulladder(c01,s11,p02:s2,c02); // quatrime range ; produit s3 p33=a3*b3; p23=a2*b3; p13=a1*b3; p03=a0*b3; fulladder(c32,0,p33:s33,c33); fulladder(c22,s32,p23:s23,c23); fulladder(c12,s22,p13:s13,c13); fulladder(c02,s12,p03:s3,c03); // range du total final pour s7..s4 fulladder(0,c33,0:s7,c3x); fulladder(s33,c23,0:s6,c2x); fulladder(s23,c13,0:s5,c1x); fulladder(s13,c03,0:s4,c0x); end module

Figure II.50. criture SHDL dun multiplicateur systolique 4 bits x 4 bits. la soustraction donne un rsultat positif, signal par le bit demprunt 0; on remplace le terme courant par le rsultat de cette soustraction, et on lui ajoutera droite un bit supplmentaire du dividende, ltage suivant. On ajoute un 1 droite au quotient.

Le reste r3..r0 est la valeur du terme courant aprs la dernire tape. Structure du diviseur On souhaite ainsi raliser un diviseur 2n bits / n bits -> 2n bits; on va prendre ici comme dans lexemple n = 4, mais la technique est bien sr gnralisable toute valeur de n. La gure II.53 montre la structure ncessaire du diviseur. chaque tage on ralise la soustraction entre le terme issu de ltage prcdent et d3,..d0. On utilise pour cela des soustracteurs 5 bits sans retenue entrante, et avec une retenue sortante; on a vu aux sections prcdentes comment les raliser. chaque tage il faut aussi construire le terme courant, en fonction des deux cas examins dans la discussion prcdente et dtermins par la valeur du bit demprunt de la soustraction. On devra pour cela utiliser des multiplexeurs dont la commande sera le bit demprunt. La gure II.54 donne le code SHDL complet associ ce diviseur.

51
p7
0 0 0 0

p0 d3

d0

1 1 0 1 0 1 0 1 0 1 0 1 1 q7=0 1 0 0 1 1 0 0 0 0 1 1 0 1 0 1 1 1 1 1 0 0 0 0 0 1 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 0 0 1 0 0 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 0 1 0 1 1 1 1 1 1 1 0 1 0 0 1 0 0 1 0 1 1 0 0 0 1 1 1 1 0 1 0 1 1 0 0 0 1 0 0 r3 r0

1 0 1 1 0 0 0 1 0 0 1 1 q0 q7

q6=0

q5=0

q4=1 q3=0

q2=0

q1=1 q0=1

Figure II.51. Exemple de division euclidienne en binaire.

8.9. Comparateurs
Lopration de comparaison entre nombres entiers est fondamentale dans un ordinateur. Si on souhaite comparer deux nombres de n bits, linterface gnrale quon peut utiliser est celle de la gure II.52.

Figure II.52. Interface dun comparateur sur n bits. Une sortie indique que A et B sont gaux, une autre indique que A > B. Une sortie SUP indique que A > B, lautre EQ indique que A = B. Avoir ces deux sorties permet de tout savoir sur les positions respectives de A et B : A > B : SUP = 1.

52

Figure II.53. Structure du diviseur non sign 8 bits / 4 bits -> 8 bits. chaque tage on teste si on peut soustraire le diviseur au terme courant.Les bits du quotient sont les inverses des bits demprunt des soustractions; le reste est la valeur du terme courant aprs la dernire tape. A B : SUP = 1 ou EQ = 1. A = B : EQ = 1 A < B : SUP = 0 et EQ = 0. A B : SUP = 0.

Il faut maintenant savoir si les nombres que lon compare sont des nombres entiers naturels, ou des nombres relatifs cods en complment 2. En effet, si A = 1111 et B = 0101, une

53
module div8(p7..p0,d3..d0:q7..q0,r3..r0) // soustracteur sub5(0,0,0,0,p7,0,d3,d2,d1,d0:x74,x73,x72,x71,x70,nq7); q7=/nq7; // multiplexeur s74=nq7*z+/nq7*x73; s73=nq7*z+/nq7*x73; s72=nq7*z+/nq7*x72; s71=nq7*z+/nq7*x71; s70=nq7*p7+/nq7*x70; sub5(s73,s72,s71,s70,p6,0,d3,d2,d1,d0:x64,x63,x62,x61,x60,nq6); q6=/nq6; s64=nq6*s73+/nq6*x64; s63=nq6*s72+/nq6*x63; s62=nq6*s71+/nq6*x62; s61=nq6*s70+/nq6*x61; s60=nq6*p6+/nq6*x60; ... // code analogue pour q4,...,q1 ... sub5(s13,s12,s11,s10,p0,0,d3,d2,d1,d0:x04,x03,x02,x01,x00,nq0); q0=/nq0; s04=nq0*s13+/nq0*x04; r3=nq0*s12+/nq0*x03; r2=nq0*s11+/nq0*x02; r1=nq0*s10+/nq0*x01; r0=nq0*p0+/nq0*x00; end module

Figure II.54. criture SHDL dun diviseur non sign 8 bits / 4 bits -> 4 bits comparaison non signe va donner A > B (car A = 15 et B = 5), alors quune comparaison signe donnera A < B (car A = 1 et B = + 5). Comparateur non sign Supposons que A et B soient cods en binaire pur, par exemple sur 4 bits. On commence dabord par comparer leurs poids forts A3 et B3 ; si celui de A est plus grand que celui de B, on peut conclure SUP = 1 ; sinon SUP ne peut valoir 1 que si A3 = B3 et que si A2..A0 > B 2..B0. On a ainsi une dnition rcursive de SUP : SUP = (A3 > B3) + (A3 = B3)(A2..A0 > B2..B0) SUP = (A3 > B3) + (A3 = B3)((A2 > B2) + (A2 = B2)(A1..A0 > B1..B0)) SUP = (A3 > B3) + (A3 = B3)((A2 > B2) + (A2 = B2)((A1 > B1) + (A1 = B1)(A0 > B0))) Ai > B1 correspond en fait lunique situation Ai = 1 et Bi = 0 et sexprime donc Ai Bi. Pour Ai = Bi, on peut utiliser le fait quun XOR est un oprateur de diffrence, et donc que son inverse est un oprateur de concidence : (Ai = Bi ) = Ai Bi = Ai Bi + Ai Bi SUP = A3B3 + A3 B3(A2B2 + A2 B2(A1B1 + A1 B1A0B0)) Le code SHDL correspondant est :

54
module cmpu4(a[3..0], b[3..0]: sup, eq) sup=a[3]*/b[3]+eq3*sup2; eq3=a[3]*b[3]+/a[3]*/b[3]; sup2=a[2]*/b[2]+eq2*sup1; eq2=a[2]*b[2]+/a[2]*/b[2]; sup1=a[1]*/b[1]+eq1*a[0]*/b[0]; eq1=a[1]*b[1]+/a[1]*/b[1]; eq0=a[0]*b[0]+/a[0]*/b[0]; eq=eq3*eq2*eq1*eq0; end module

Comparateur sign Une comparaison signe est un peu plus dlicate quune comparaison non signe ; lessentiel de la comparaison se joue en examinant les signes an 1 et bn 1 des termes A = an 1..a0 et B = bn 1..b0 comparer : si A < 0 (an 1 = 1) et B > 0 (bn 1 = 0) alors la comparaison est immdiate : SUP = 0 et EQ = 0. si A > 0 (an 1 = 0) et B < 0 (bn 1 = 1) alors la comparaison est immdiate : SUP = 1 et EQ = 0. si A > 0 (an 1 = 0) et B > 0 (bn 1 = 0) alors il suft de comparer les n 1 bits de poids faibles. si A < 0 (an 1 = 1) et B < 0 (bn 1 = 1) alors il suft galement de comparer les n 1 bits de poids faibles. En effet, les nombres de lintervalle [2n 1,0] scrivent en complment 2 : [1000..000, 1000..001, 1111..111] et on voit que les n 1 bits de poids faible voluent de faon croissante.

On a reprsent sur la gure II.56 un comparateur sign sur 5 bits utilisant un compteur non sign de 4 bits. Un multiplexeur 4 vers 1 spare les 4 situations dcrites.
module cmps5(a[4..0],b[4..0]: sup, eq) cmpu4(a[3..0], b[3..0]: sup1, eq1); mux4(sup1, 1, 0, sup1, a4, b4: sup); eq=a4*b4*eq1+/a4*/b4*eq1; eq=eq4*eq1; end module

Figure II.55. criture SHDL dun comparateur sign sur 5 bits. Assemblage de comparateurs non signs Il est facile de chaner 2 comparateurs non signs de n et m bits pour former un comparateur non sign de n + m bits (gure II.57). On compare dabord les n bits de poids forts ; si ceux de A sont plus grands que ceux de

55

Figure II.56. Comparateur sign sur 5 bits. Si les signes a4 et b4 sont diffrents, la comparaison est immdiate ; sils gaux on compare en non sign les 4 bits de poids faibles.

Figure II.57. Association de deux comparateurs n bits non signs. Le rsultat forme un comparateur 2n bits avec le mme interface. B, le SUP nal est assert au travers du OU. Si les poids forts de A et ceux de B sont gaux, on compare les m bits de poids faibles et on conclue. La sortie nale EQ est quant elle asserte lorsque les deux sorties EQ sont assertes.On a reprsent en gure II.58 le code SHDL dun comparateur non sign sur 10 bits, form par lassemblage de deux comparateurs non signs de 5 bits. La sortie de module EQ a t essentielle ici pour permettre dassocier les circuits. Par ailleurs, le nouveau module form expose le mme interface que ses parties : A et B en entres, et SUP et EQ en sorties, ce qui permet nouveau et rcursivement dassocier ces circuits. Comme dans les disciplines logicielles de linformatique, il est intressant de trouver le bon interface un module, qui va permettre une bonne rutilisation.

56
module cmpu(a[9..0], b[9..0]: sup, eq) cmpu5(a[9..5], b[9..5]: sup1, eq1); cmpu5(a[4..0], b[4..0]: sup2,eq2); eq=eq1*eq2; sup=sup1+eq1*sup2; end module

Figure II.58. criture SHDL dun comparateur non sign sur 10 bits form par association de deux comparateurs non signs de 5 bits.

9. Exercices corrigs
9.1. Exercice 1 : simplications algbriques
nonc Simplier algbriquement : 1. 2. 3. F1 = ABC + AC + AB + A B C F2 = ABC D + ABD + AC + BC + AC F3 = A + BC + ADE + ABCDE + BCDE + ACD Solution 1. F1 = ABC + AC + AB + A B C Ici des termes disparaissent car ils sont plus spciques que dautres. Par exemple ABC est plus spcique que AB et le premier disparat au prot du deuxime. De la mme faon, ABC est plus spcique que AC et disparat. On a : F1 = A B + AC F2 = ABC D + ABD + AC + BC + AC F2 = AB(C D + D) + AC + BC + AC Avec le thorme dabsorption, C D + D = C + D, donc : F2 = ABD + ABC + AC + BC + AC Par ailleurs, AC + AC = C, donc : F2 = ABD + ABC + BC + C F2 = ABD + ABC + C On peut encore utiliser le thorme dabsorption sur ABC + C : F2 = ABD + AB + C F2 = AB + C F3 = A + BC + BCDE + ACD (A inclue ADE)

2.

3.

9. Exercices corrigs F3 = A + BC F3 = A + BC F3 = A + BC F3 = A + BC + BCDE + CD (absorption entre A et ACD) + D(BC E + C) + D(BE + C) (absorption de C) + BDE + CD

57

Avec des tables de Kanaugh, des simplications non adjascentes donneraient le mme rsultat.

9.2. Exercice 2 : utilisation des tables de Karnaugh


nonc Concevoir un circuit qui dtecte la prsence dun chiffre dcimal (entre 0 et 9) sur ses entres A, B, C, D. Solution La table de vrit de ce dtecteur donne 1 pour les valeurs de (0,0,0,0) (1,0,0,1), et 0 pour les valeurs suivantes (gure II.59).

A 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1

B 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1

C 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1

D 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

S 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0

Figure II.59. Table de vrit dun dtecteur de chiffre dcimal. On peut maintenant dessiner la table de Karnaugh correspondante, et chercher le plus petit nombre de regroupements qui recouvrent tous les 1 (gure II.60). Il y a deux regroupements, ce qui donne lexpression simplie :

58

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE


B.C.D A,B C,D 0,0 0,1 1,1 1,0 0,0 0,1 1,1 1,0 1 1 1 1 1 1 1 1 A 1

Figure II.60. Table de Karnaugh avec les regroupements pour le dtecteur de chiffres dcimaux. S = A + BC D On peut trouver le mme rsultat de faon algbrique : S = ((A, B, C, D) 8) + ((A, B, C, D) = 9)) = A + ABCD Par absorption de A : S = A + BCD

9.3. Exercice 3 : analyse inductive des tables de vrit


nonc Concevoir les transcodeurs suivants : 1. 2. Binaire pur vers Gray rchi. Gray rchi vers binaire pur.

Solution La gure II.61montre la table de vrit qui relie une valeur binaire (X,Y,Z,T) un code de Gray (A,B,C,D). Le code de Gray a t construit selon la mthode rcursive dcrite la section 5.4. On pourrait dessiner des tables de Karnaugh, mais elles ne donneraient rien ici. Par ailleurs on va voir que les codes de Gray sont trs troitement associs loprateur XOR, et on va essayer de deviner les relations directement. 1. Binaire pur vers Gray rchi. On voit tout de suite que A = X. B est gal Y pendant la premire moiti de la table, puis il est gal Y. tre dans la premire moiti de la table est gouvern par X ; en rsum B est gal Y avec une inversion commande par X. Cest XOR loprateur dinversion commande, donc : B = X Y. De faon analogue, on remarque que C est gal Z lorsque Y vaut 0, et est gal

9. Exercices corrigs X 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 Y 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 Z 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 T 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 A 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 B 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 C 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 D 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0

59

Figure II.61. Binaire code de Gray. Z lorsque Y vaut 1, donc : C = Y Z. On trouve de mme D = Z T. 2. Gray rchi vers binaire pur. On a bien sr X = A, et on voit aussi que Y = A B. Par contre pour Z, il est bien gal C ou C, mais linversion nest pas simplement commande par B. Il y a inversion durant le deuxime et le troisime quart de la table : cela voque un XOR. Il y a en fait inversion lorsque A B = 1, donc : Z = A B C. Par induction on devine, et on vrie ensuite, que T = A B C D.

9.4. Exercice 4 : circuit incrmenteur


nonc Concevoir un circuit combinatoire prenant en entre un nombre binaire a3 a0 et donnant en sortie b3 b0 la valeur dentre incrmente de 1. crire le code SHDL correspondant. Solution Lalgorithme de base de lincrmentation a t donn en section 4. Le bit de poids faible b0 est toujours invers par rapport a0. Ensuite, bn est linverse de an si et seulement si tous les bits qui sont la droite de an valent 1, soit lorsque an 1a0 = 1. On a donc une inversion commande par cette valeur, et on a vu en section 4 que le XOR est la porte adapte cette opration : bn = an (an 1a0)

60 Finalement, sur 4 bits : b0 = a0 b1 = a1 a0

CHAPITRE II. LMENTS DE LOGIQUE COMBINATOIRE

b2 = a2 (a1a0 )

b3 = a3 (a2 a1a0 ) Exprim sous forme de sommes de termes :

a2 a1a0 a2 a1 a0 a2 a1 a0 b2 = a1a0 + a2 = a1a0 + a2 ( + ) = a1a0 + a2 + a2 b = a a a + a = a a a + a + a + a a aaa a a a a


3 3 2 1 0 3 2 1 0 3 2 1 0 3 2 3 1 3 0

b0 = a0 b = a + a a a
1 1 0

1 0

Finalement, le module SHDL correspondant est :

module incr(a3..a0: b3..b0) b0=/a0; b1=/a1*a0+a1*/a0; b2=/a2*a1*a0+a2*/a1+a2*/a0; b3=/a3*a2*a1*a0+a3*/a2+a3*/a1+a3*/a0; end module

Chapitre III lments de logique squentielle


1. Dnition
Un circuit est dit squentiel, si les valeurs de ses sorties ne dpendent pas que des valeurs de ses entres. Cest donc le contraire dun circuit combinatoire, dont les valeurs des sorties ne dpendaient que de celles de ses entres, avec une propagation sans retour arrire des signaux des entres vers les sorties. linverse, les sorties dun circuit squentiel dpendent non seulement des valeurs des entres au moment prsent, mais aussi dun tat interne qui dpend de lhistorique des valeurs dentres prcdentes. En vertu de ce que nous avions dmontr pour les circuits combinatoires, cela implique un rebouclage vers larrire de certains signaux internes au circuit (gure III.1).

entres

sorties

... ...

Figure III.1. Circuit squentiel : certains signaux internes ou sorties rebouclent en arrire. Ce type de circuit peut donner lieu des fonctionnements trs complexes ; il peut galement tre instable dans certaines congurations. Plus encore que pour les circuits combinatoires, des mthodes pour matriser leur complexit sont ncessaires. Une des voies pour la simplication de leur conception consiste synchroniser les changements dtats sur les fronts dune horloge unique et globale, et cela conduit ltude des circuits squentiels dits synchrones purs, quon tudiera principalement dans ce livre.

61

62

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

2. Latch RS
La notion de circuit squentiel avec ses tats internes incorpore la notion de mmoire (retour sur son pass). La cellule mmoire la plus simple est le latch RS (RS tant les initiales de Reset-Set), parfois appel bistable (gure III.2.
module latch_rs(s,r: q) q=/nq*/r ; nq=/q*/s ; end module

Figure III.2. Latch RS, cellule mmoire de 1 bit. Ce circuit a clairement des connexions qui reviennent en arrire. Il sagit dune cellule de mmorisation de 1 bit, dont le mode demploi est le suivant : 1. la cellule est en mode lecture lorsque les entres R et S sont toutes les deux 0 ; la paire Q, Q est alors ncessairement dans un des deux tats (0, 1) ou (1, 0), car on peut constater que ces deux tats, et seulement eux, sauto-entretiennent lorsque R et S valent 0. pour mmoriser 0 (cest dire que les sorties soient dans ltat Q, Q = (0, 1) lorsque la cellule reviendra dans le mode lecture), il faut appliquer un 1 sur R (reset), puis le remettre 0. Quelquait t son tat antrieur, la cellule se retrouve alors dans ltat auto-stable Q, Q = (0, 1). pour mmoriser 1 (cest dire que les sorties soient dans ltat Q, Q = (1, 0) lorsque la cellule reviendra dans le mode lecture), il faut appliquer un 1 sur S (set), puis le remettre 0. Quelquait t son tat antrieur, la cellule se retrouve alors dans ltat auto-stable Q, Q = (1, 0).

2.

3.

Ce circuit est bien squentiel : ses sorties ne dpendent pas uniquement de ses entres. La notion dtat interne est ici clairement prsente sous la forme dun bit mmoris. Graphe dtats Les modes de fonctionnement dcrits prcdemment peuvent tre rsums dans le graphe de la gure III.3. Un tel graphe est appel graphe dtat du circuit ; il synthtise compltement son fonctionnement. Les deux noeuds correspondent aux deux tats stables du circuit ; les arcs montrent les passages du circuit dun tat vers un autre lors dun changement des valeurs des entres. La valeur de la sortie Q est associe chacun des deux tats : 0 pour ltat a et 1 pour ltat b. On ne reprsente que les tats stables du circuit, et non les congurations intermdiaires fugitives entre deux tats.

2. Latch RS
Q=0 (R, S) = (1, 0) a

63

(R, S) = (0, 0)

(R, S) = (0, 1) (R, S) = (1, 0) (R, S) = (0, 1) b Q=1 (R, S) = (0, 0)

Figure III.3. Graphe dtats dun latch RS. Les noeuds correspondent aux tats stables du circuit, et les arcs reprsentent les transitions entre les tats.

3. Fronts et niveaux ; signaux dhorloge


Le niveau dun signal, cest sa valeur 0 ou 1. On parle de front lors dun changement de niveau : front montant lorsque le signal passe de 0 1, front descendant lorsquil passe de 1 0. En pratique, ces transitions ne sont pas tout fait instantanes, mais leur dure est trs infrieure aux temps de propagation des portes (gure III.4).
niveau 1

1 niveau 0

0 t front montant : drive trs positive front descendant : drive trs ngative

0 t

Figure III.4. Fronts et niveaux dun signal rel, et leur quivalent logique simpli. Une horloge est un signal priodique, produit partir dun quartz ou dun rseau RC. Il produit donc une succession priodique de fronts montants et/ou descendants. Comme en physique ou en mathmatiques, on emploie les termes de frquence et de priode pour qualier la chronologie dun signal dhorloge ; elle a gnralement une forme carre, mais ce nest pas obligatoire.

4. Circuits squentiels synchrones et asynchrones : dnitions

64 Circuits asynchrones purs

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

On appelle circuits squentiels asynchrones purs des circuits squentiels sans signaux dhorloge, et dans lesquels ce sont les changements de valeur des entres qui sont la source des changements dtats. Le latch RS est un exemple de circuit asynchrone pur : il nest pas gouvern par une horloge, et ce sont les changements des entres qui provoquent les changements dtat. Circuits synchrones purs On appelle circuit squentiels synchrones purs des circuits squentiels qui possdent une horloge unique, et dont ltat interne se modie prcisment aprs chaque front (montant ou descendant) de lhorloge. Les circuits squentiels synchrones purs sont plus simples tudier et concevoir que les circuits squentiels asynchrones purs, car le moment de la transition est dni de lextrieur et sur un seul signal. Ils peuvent par contre tre moins rapides quun quivalent asynchrone, et consommer plus dnergie. En effet, on se rappelle (section 3) que les circuits CMOS consomment essentiellement du courant lors des changements dtats. Un circuit squentiel synchrone consommera ainsi du courant chaque front dhorloge, contrairement un circuit asynchrone pur. Cet effet est toutefois relativiser avec certains circuits CMOS dont on a beaucoup abaiss la tension dalimentation, et pour lesquels le courant de fuite (consomm au repos) est proche du courant de commutation (consomm lors des changements). Autres circuits squentiels Les circuits squentiels qui ne sont, ni synchrones purs, ni asynchrones purs, nont pas de dnomination particulire. Ils sont souvent lunion de plusieurs sous-ensembles qui sont chacun gouverns de faon synchrone par une horloge, mais linterface entre ces sous-domaines est souvent la cause de problmes de abilit. On ntudiera pas de tels circuits dans cet ouvrage.

5. Graphes dtats
Considrons le fonctionnement du circuit squentiel synchrone de la gure III.5, dtecteur de la squence 1,0,1 :

CLK

Figure III.5. Dtecteur de squence 1,0,1. Une suite de chiffres binaires arrive sur E, et les instants dchantillonnage (moments o la valeur de E est prise en compte) sont les fronts montants de CLK. On souhaite que la sortie S vaille 1 si et seulement si les deux dernires valeurs de E sont : 1,0,1. Cette spcication est en fait imprcise, car elle ne dit pas exactement quel moment par rapport lhorloge CLK la sortie doit prendre sa valeur. Il y a deux possibilits :

5. Graphes dtats 1.

65

la sortie ne dpend que de ltat interne du circuit, et ne peut changer que juste aprs chaque front dhorloge. Elle ne pourra changer ensuite quau prochain front dhorloge, mme si les entres changent entre temps. On appelle schma de MOORE une telle conception, et elle conduit au graphe de MOORE de la gure III.6.
S=0 0 1 S=0 0 a
...000

S=0 c

0 0 1 1 1 0 1 0

e
...100

S=1 f
...101

S=0 1 b
...001

...010

1 S=0 d
...011

S=0 g
...110

S=0 h
...111

Figure III.6. Dtecteur de squence 1,0,1 de type Moore, non simpli. Chaque tat est associ la rception dune certaine squence des 3 derniers bits. Seul ltat g provoque la sortie S = 1. La valeur de la sortie S est clairement associe aux tats, et ne peut donc changer quavec eux. Les changements dtat se produisent chaque front de lhorloge CLK, qui nest pas reprsente sur la graphe, mais dont la prsence est implicite. Un arc libell 0 par exemple indique un changement dtat lorsque E = 0. 2. la sortie dpend de ltat interne du circuit et de ses entres, et on dit alors quil sagit dun schma de MEALY. Pour le dtecteur de squence par exemple, la sortie S pourrait valoir 1 ds que E passe 1 pour la deuxime fois, avant mme que sa valeur ne soit ofciellement chantillonne au prochain front dhorloge. Cela conduit au graphe de MEALY de la gure III.7. Larc libell 1/0 de a vers b par exemple indique un changement dtat de a vers b lorsque E = 1, avec une valeur de la sortie S=0. Mais attention : le changement dtat ne se produira quau prochain front dhorloge, alors que le changement de sortie se produit immdiatement aprs le changement des entres.

Diffrences entre les circuits de MOORE et de MEALY La principale diffrence tient dans le fait que dans un circuit de MEALY, on obtient les sorties un temps dhorloge plus tt. Par exemple dans la transition de c vers f pour E = 1, la sortie S = 1 sera chantillonnable (= mmorise et utilisable) au front dhorloge suivant, en mme temps que ltat courant passera f . Dans le circuit de MOORE, la sortie passera 1 aprs le front dhorloge suivant, et ne sera stable et chantillonnable quau front dhorloge encore ultrieur, cest dire un temps plus tard que dans le circuit de MEALY.

66
0/0

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

0/0 1/0 c 0/0 0/0 a


...000 ...010

e
...100

0/0 1/1 1/0 1/1 0/0 g


...110

f
...101

0/0

1/0

b
...001

1/0 d
...011

0/0 1/0 h
...111

1/0

Figure III.7. Dtecteur de squence 1,0,1 de type Mealy, non simpli. Pour certains types de circuits, il est plus facile de dessiner un graphe de MOORE, qui correspond une vision plus statique du problme. La bonne nouvelle est quil existe une mthode automatique de transformation dun graphe de MOORE en graphe de MEALY, lorsque lon veut proter des avantages de ce dernier. Transformation dun graphe de Moore en graphe de Mealy On voit sur la gure III.8 comment un arc dans un graphe de MOORE se transforme en un arc dans un graphe de MEALY quivalent.
S a e b a e/S b

Figure III.8. Un arc dun graphe de MOORE transform en un arc quivalent dun graphe de MEALY. Si avec lentre e on va en a associ une sortie S, alors cette sortie peut tre directement attache larc : e/S. On a donc une mthode automatique pour transformer les graphes de MOORE en graphes de MEALY, trs utile car les graphes de MOORE sont souvent plus faciles concevoir. Cest elle quon a utilise par exemple pour transformer le graphe de MOORE de la gure III.6 en graphe de MEALY (gure III.7). Transformation dun graphe de Mealy en graphe de Moore Ce nest pas toujours possible, et donc aucune mthode gnrale ne peut exister. Les circuits de MEALY sont donc intrinsquement plus riches que ceux de MOORE.

6. Tables de transitions
Les tables de transitions, encore appeles tables de Huffman ne sont rien dautre quune version tabulaire des graphes de transitions. Par exemple, les tables associes aux graphes de MOORE et de MEALY du dtecteur de squence sont reprsentes gure III.9 et III.10.

6. Tables de transitions

67

avant tat a a b b c c d d e e f f g g h h

E 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

aprs tat a b c d e f g h a b c d e f g h

tat a b c d e f g h

S 0 0 0 0 0 1 0 0

Figure III.9. Table de transitions du graphe de MOORE pour le dtecteur de squence 1,0,1. chaque arc du graphe correspond une ligne dans la table. On notera la table complmentaire,qui donne les sorties associes chaque tat.
avant tat a a b b c c d d e e f f g g h h aprs tat a b c d e f g h a b c d e f g h

E 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

S 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0

Figure III.10. Table de transitions du graphe de MEALY pour le dtecteur de squence 1,0,1. chaque transition du graphe correspond une ligne de la table.La valeur de la sortie S est associe chaque transition. Simplication des tables de transition Une table de transitions permet notamment de reprer facilement des tats quivalents. Un groupe G dtats sont dits quivalents si, pour chaque combinaison possible des entres, ils conduisent des tats du groupe G avec les mmes sorties. On peut alors diminuer le nombre dtats en remplaant tous les tats du groupe G par un seul, puis tenter de rappliquer

68

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

cette procdure de rduction sur lensemble dtats rduit. Par exemple, sur la table de transitions prcdente associe au diagramme de MOORE, on constate que a et e sont quivalents, que c et g sont quivalents, que d et h sont quivalents. Attention : b et f ne sont pas quivalents car, bien quils aient mmes tats suivants, ils sont associs des sorties diffrentes. On peut rcrire la table de transitions en supprimant les lignes associes e, g et h, et en remplaant partout e par a, g par c, h par d (gure III.11).

avant tat a a b b c c d d f f

E 0 1 0 1 0 1 0 1 0 1

aprs tat a b c d a f c d c d

tat a b c d f

S 0 0 0 0 1

Figure III.11. Table de transitions du dtecteur de squence 1,0,1aprs une premire phase de simplication. Sur cette table, on constate que b et d sont quivalents, ce qui ne pouvait pas tre dtermin ltape prcdente. La gure III.12 montre la table encore simplie.

avant tat a a b b c c f f

E 0 1 0 1 0 1 0 1

aprs tat a b c b a f c b

tat a b c f

S 0 0 0 1

Figure III.12. Table de transitions du dtecteur de squence 1,0,1 aprs une deuxime phase de simplication. Le processus de simplication sarrte ici. Finalement, 4 tats sufsent pour ce dtecteur de squence. Ceux-ci ont perdu la signication quils avaient initialement dans le graphe 8 tats. Le graphe simpli est reprsent gure III.13. Cette procdure de simplication sapplique galement aux graphes de MEALY, en cherchant des identits dans les couples tat/sortie. Sur lexemple prcdent, on constate que a et e sont quivalents, que b et f sont quivalents, que c et g sont quivalents, et que d et h sont quivalents. En procdant aux suppressions et substitutions associes, on trouve la

6. Tables de transitions
1 S=0 0 a 1 b S=0 0 0 c S=0 1 f S=1 1 0

69

Figure III.13. Graphe de MOORE simpli du dtecteur de squence 1,0,1. nouvelle table (gure III.14).
avant tat a a b b c c d d aprs tat a b c d a b c d

E 0 1 0 1 0 1 0 1

S 0 0 0 0 0 1 0 0

Figure III.14. Table de transitions de MEALY pour le dtecteur de squence 1,0,1, aprs une premire phase de simplication. Cette fois, on voit que b et d sont quivalents (gure III.15).
avant tat a a b b c c aprs tat a b c b a b

E 0 1 0 1 0 1

S 0 0 0 0 0 1

Figure III.15. Table de transitions de MEALY pour le dtecteur de squence 1,0,1, aprs une deuxime phase de simplication. Le processus sarrte ici. Comme cest souvent le cas, le graphe de MEALY est plus simple que le graphe de MOORE associ au mme problme, ne comportant que 3 tats (gure III.16).

7. Bascules synchrones
Notre but est maintenant de raliser laide de circuits logiques les machines squentielles telles quelles peuvent tre dcrites par les graphes dtats. Pour faciliter cette synthse, il a t imagin de crer des composants appels bascules, qui formeraient

70
0/0 1

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE


1/0 0/0 1/1

0/0

Figure III.16. Graphe de MEALY simpli du dtecteur de squence 1,0,1. les briques de base utiliser. Une bascule mmorise un seul bit et permet de reprsenter seulement deux tats distincts, mais lutilisation dun vecteur de n bascules permet de coder jusqu 2n tats distincts. Par exemple, pour le dtecteur de squence analys la section prcdente, le graphe de Moore simpli comportait 4 tats, et un vecteur de deux bascules va permettre de les encoder. Par ailleurs, pour que tout un vecteur de bascules volue de faon able dtat en tat, il est souhaitable que chacune delles ait une entre dhorloge relie une horloge commune (circuit synchrone), et ne puisse changer dtat quau moment prcis dun front de cette horloge (montant ou descendant), et jamais entre deux fronts, mme si les autres entres du circuit sont modies plusieurs fois entre temps. De tels circuits sont de conception difcile ; on les prsente dans cette section.

7.1. Latch RS actif sur un niveau dhorloge


Dans le but de rendre synchrone le latch RS vu prcdemment, on peut limiter la priode dcriture (gure III.17).

Figure III.17. Latch RS. Ltat de ce circuit est modiable lorsque H = 1, cest dire sur un niveau du signal H. Tant que H est au niveau 1, les modications de S et de R vont avoir un effet sur ltat du bistable. Un tel latch peut avoir certaines applications, mais il nest pas adapt la ralisation de circuits squentiels synchrones, o les changements dtats de leurs diffrentes parties doivent se produire de faon parfaitement synchronise, au moment prcis dni par un front dune horloge commune. La section suivante va prsenter un tel circuit.

7. Bascules synchrones

71

7.2. Bascule active sur front dhorloge


Nous avons donc besoin de composants squentiels qui changent dtat sur un front dhorloge, et seulement ce moment prcis. Le latch RS vu la section prcdente ne remplissait pas cette condition, puisque le bistable pouvait changer de valeur tant que H tait au niveau 1. Le circuit de la gure III.18, qui ralise ce quon va appeler une bascule D (D pour delay), ne change dtat quant lui que sur le front descendant de lhorloge H.

module basculeD(h,d: q) s=/h*/r*/ns ; ns=/s*/d ; r=/nr*/h ; nr=/ns*/r ; q=/r*/nq ; nq=/s*/q ; end module

Figure III.18. Bascule D synchrone : ltat du bistable q ne change quau moment o h passe de 1 0. La comprhension dtaille du fonctionnement de ce circuit est difcile, et lutilisation dun simulateur tel que celui de SHDL peut y aider. On peut dj remarquer que lorsque h vaut 1, on a ncessairement R=0 et S=0, et donc le bistable nal qui produit q est dans ltat de repos : tant que h vaut 1, ltat interne q ne peut pas changer, mme si d change de valeur un nombre quelconque de fois. Lorsque h passe de 1 0, on peut montrer que le bistable du haut va stocker la valeur de D et la placer sur R, et que celui du bas va stocker la valeur de D et la placer sur S. On a donc au moment du front descendant un set ou un reset du bistable nal, dans le sens de la mmorisation de la donne d en entre. Enn, et cest le point important, on peut montrer galement que lorsque h est maintenu 0, les valeurs de R et de S ne peuvent pas changer mme si d change, et donc les changements de d naffectent pas le bistable nal. On a donc bien dmontr la proprit essentielle de ce circuit, qui est que son tat interne q est affect durant la priode trs courte o lhorloge h passe de 1 0, cest dire durant un front descendant de celle ci, et que tous les changements sur d en dehors de cette priode nont pas deffet sur q.

7.3. Bascule D
Une telle bascule D est reprsente couramment par le schma de la gure ?? On a indiqu galement lcriture SHDL associe cette bascule. Le signal de remise zro RST ntait pas prsent sur la gure III.18. Il sagit dune remise zro asynchrone, qui provoque le forage 0 du contenu de la bascule, sans quil y ait besoin dun front dhorloge. Tant que le signal RST est actif (sur niveau 1 sur la gure), la bascule est force 0 et son contenu ne peut pas voluer. Il sagit du mme signal reset que celui qui est prsent sur votre micro-ordinateur, votre tlphone portable, etc. : en

72

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

module test(e,h,reset: x) x:=e ; x.clk=h ; x.rst=reset ; end module

Figure III.19. Reprsentation habituelle dune bascule D synchrone. lappliquant, vous remettez dans ltat 0 tous les composants squentiels de votre machine. Du point de vue graphique, le triangle devant lentre CLK indique un signal dhorloge. Sil tait prcd dun rond, cela indiquerait une horloge active sur front descendant ; en son absence elle est active sur front montant. De la mme faon, un rond devant lentre RST indique une activit sur niveau bas. La gure III.20 illustre ces diffrentes situations.

module test(e,h,reset: x) x:=e ; x.clk=/h ; x.rst=reset ; end module

module test(e,h,reset: x) x:=e ; x.clk=h ; x.rst=reset ; end module

module test(e,h,reset: x) x:=e ; x.clk=/h ; x.rst=/reset ; end module

(a)

(b)

(c)

Figure III.20. Diffrentes bascules D. (a) horloge sur front descendant. (b) reset actif sur niveau bas. (c) horloge front descendant et reset actif sur niveau bas. Bascules et langage SHDL En SHDL, la notation := est appele affectation squentielle, et les sufxes .clk et .rst servent reprer les signaux dhorloge et de remise zro. Des horloges actives sur front descendant, ou des reset actifs sur niveau bas se traduisent par un signe / devant le nom du signal dhorloge ou de reset. Par ailleurs, on notera quon ne peut pas crire quelque chose comme :
x.clk = a*b ; // incorrect

Cela impliquerait lexistence dune bascule et dune porte combinatoire, ce qui doit se traduire par deux quations distinctes :
x.clk = i ; i = a*b ;

Lorsquon crit x.clk = /h ;, on ne fait pas appel une porte supplmentaire dinversion : on utilise une bascule active sur front descendant, et donc on na pas crer de

7. Bascules synchrones ligne supplmentaire. Pour les mmes raisons, on ne doit pas crire : x:=a*b ;, mais :
x := i ; i = a*b ;

73

On a tout de mme la possibilit dcrire x:=/i ;, qui correspond une bascule D qui charge linverse de son entre, et qui se traduit par la prsence dun rond devant lentre D (gure III.21).

module test(e,h,reset:x) x:=e ; x.clk=/h ; x.rst=reset ; end module

module test(e,h,reset:x) x:=/e ; x.clk=h ; x.rst=reset ; end module

(a)

(b)

Figure III.21. Les deux formes possibles dune bascule D. (a) entre normale. (b) entre inverse. quation dvolution Lquation dvolution dune bascule, cest lquation de la valeur que prendra ltat aprs le front dhorloge. Dans le cas de la bascule D cest tout simplement la valeur prsente son entre : Q := D

7.4. Bascule T
Tout comme la bascule D, la bascule T (trigger) mmorise galement un bit de faon synchrone, mais elle a des modalits diffrentes dutilisation. Son schma, une table de transitions synthtique et lcriture SHDL associe sont donns gure III.22. Ltat mmoris de la bascule T sinverse (aprs le front dhorloge) si et seulement si son entre T vaut 1. Lorsque son entre T vaut 0, cet tat reste inchang.Elle est donc adapte aux problmatiques de changements dune valeur et non un simple stockage comme la bascule D. En dehors des variations sur les fronts dhorloge et la ligne de reset asynchrone, les deux seules versions possibles de la bascule T sont donnes gure III.23. quation dvolution Q := T Q + T Q

74

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

avant T 0 1 Q x x

aprs Q x x

module test(e,h,reset: x) x:=/e*x+e*/x ; x.clk=h ; x.rst=reset ; end module

Figure III.22. Bascule T synchrone. Lorsque lentre T est 0 elle ne change pas dtat ; lorsque lentre T vaut 1 son tat sinverse.

module test(e,h,reset: x) x:=/e*x+e*/x ; x.clk=h ; x.rst=reset ; end module

module test(e,h,reset: x) x:=e*x+/e*/x ; x.clk=h ; x.rst=reset ; end module

(a)

(b)

Figure III.23. Les deux formes possibles dune bascule T. (a) entre normale. (b) entre inverse. On notera la diffrence dcriture en langage SHDL. Le premier terme exprime bien que, si T est 0, Q ne change pas, et que si T est 1, Q sinverse. On retrouve lcriture SHDL de laffectation squentielle.

7.5. Bascule JK
Comme les bascules D et T, la bascule JK (Jack-Kilby) mmorise un bit de faon synchrone. Son schma, sa table de transitions simplie et lcriture SHDL associe sont donns gure III.24.

avant J 0 0 1 1 K 0 1 0 1 Q x x

aprs Q x 0 1 x
module test(reset,h,j,k:x) x:=/k*x+j*/x ; x.clk=h ; x.rst=reset ; end module

Figure III.24. Bascule JK synchrone,table de transitions simplie et criture SHDL.Selon les valeurs de ses entres J et K, elle permet le forage de son tat 0 ou 1, mais aussi la conservation ou linversion de son tat.

7. Bascules synchrones

75

Elle fonctionne de faon analogue au latch RS, J jouant le rle de S et K de R. Lorsque J et K sont 0, ltat de la bascule ne change pas au front dhorloge. Si on veut faire une mise 1ou une mise 0, on applique 1sur J (respectivement sur K) puis on applique un front dhorloge. De plus, mettre la fois J et K 1 est autoris, et ltat de la bascule sinverse au front dhorloge. quation dvolution Q := K Q + J Q Elle est moins immdiatement vidente que celle des bascules D et T. On vrie que dans tous les cas, on a le rsultat attendu : si J = 0 et K=0, K Q + J Q = 0 + Q = Q si J = 0 et K=1, K Q + J Q = 0 + 0 = 0 si J = 1 et K=0, K Q + J Q = Q + Q = 1 si J = 1 et K=1, K Q + J Q = 0 + Q = Q

La bascule JK existe galement avec des entres J et K inverses. La gure III.25 montre ces diffrentes formes, et lcriture SHDL associe.

7.6. Choix des bascules


La bascule D est clairement adapte aux situations o on doit stocker un bit prsent. La bascule T est adapte aux situations qui se posent en termes de changement ou dinversion. La bascule JK semble plus versatile, et elle est dailleurs souvent appele bascule universelle. Par analogie avec les portes combinatoires, on pourrait se demander si cette bascule JK est plus puissante que les bascules D ou T, cest dire sil est possible de fabriquer avec elle des circuits que les autres ne pourraient pas faire. La rponse est non. Ces trois types de bascules ont une puissance dexpression quivalente : elle mmorisent un bit, et elles ne diffrent que par les modalits de stockage de ce bit. Par exemple, on vrie facilement quon peut fabriquer une bascule JK avec une bascule T et rciproquement (gure III.26). Dans le cas (a), il est clair quen reliant les deux entres J et K, la bascule reste dans le mme tat si t vaut 0, et elle sinverse si t vaut 1, ce qui correspond bien au fonctionnement dune bascule T. Dans le cas (b), on a gur la solution avec un multiplexeur pour plus de clart. La valeur mise en entre de la bascule T dpend de la valeur du couple j, k, et on vrie quon a le rsultat souhait dans tous les cas : 1 2 3 si jk = 00, on place 0 sur lentre de la bascule T et elle ne changera pas de valeur au front dhorloge. Si jk = 10, on place sur lentre de la bascule T linverse de son tat interne, et il est facile de voir que cela conduit la mise 1 de la bascule au prochain front dhorloge. Si jk = 01, on place ltat courant de la bascule T sur son entre, ce qui conduit la

76

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

module test(reset,h,j,k: x) x:=/k*x+j*/x ; x.clk=h ; x.rst=reset ; end module

module test(reset,h,j,k: x) x:=/k*x+/j*/x ; x.clk=h ; x.rst=reset ; end module

(a)

(b)

module test(reset,h,j,k: x) x:=k*x+j*/x ; x.clk=h ; x.rst=reset ; end module

module test(reset,h,j,k: x) x:=k*x+/j*/x ; x.clk=h ; x.rst=reset ; end module

(c)

(d)

Figure III.25. Les diffrentes formes possibles dune bascule JK et leurs critures SHDL associes. (a) entre normales. (b) entre J inverse. (c) entre K inverse. (d) entres J et K inverses.

(a)

(b)

Figure III.26. (a) construction dune bascule T avec une bascule JK,(b) construction dune bascule JK avec une bascule T. forcer 0 au prochain front. 4 Enn si jk = 11, on place 1 en entre de la bascule T ce qui va dclencher son inversion.

7. Bascules synchrones

77

7.7. Schma gnral dun circuit squentiel synchrone de type MOORE


La gure III.27 montre le schma gnral dun circuit squentiel synchrone de type MOORE. Ltat interne est mmoris dans un vecteur de n bits (2n tat au plus) constitu de bascules de type quelconque. Pour que ce circuit soit bien de type synchrone pur, toutes les horloges des bascules ont bien t relies ensemble directement lhorloge gnrale, de faon garantir un changement dtat de toutes les bascules exactement au mme moment. Les proprits des bascules garantissent que cet tat ne peut pas changer entre deux fronts dhorloge, mme si les entres du circuit changent plusieurs fois entre temps. Par ailleurs on voit que les sorties ne dpendent que de ltat interne, tant un simple transcodage combinatoire de celui-ci.
entres CLK m tat interne
Q

transcodeur

sorties

Figure III.27. Schma gnral dun circuit squentiel synchrone de type MOORE.

7.8. Schma gnral dun circuit squentiel synchrone de type MEALY


La gure III.28 montre le schma gnral dun circuit squentiel synchrone de type MEALY. Il sagit galement dun circuit synchrone pur, dans lequel les horloges de toutes les bascules sont relies entre elles lhorloge gnrale.Avec un vecteur dtat compos de n bascules, on peut galement coder au plus 2n tats diffrents, et la mcanique de changement dtats est analogue celle dun circuit de type MOORE. La seule diffrence est dans le calcul des sorties : on voit quelles ne dpendent pas que de ltat interne, mais quelles dpendent aussi des entres. Cest ce qui va leur permettre dobtenir les mmes sorties quun circuit de MOORE, un temps plus tt.

8. Synthse dun circuit squentiel synchrone


8.1. tapes de la synthse dun circuit squentiel synchrone
Lors de la synthse dun circuit squentiel synchrone laide de bascules, quil soit de type MOORE ou de type MEALY, on obtiendra le circuit le plus simple en suivant les tapes suivantes : 1 dessin du graphe dtats : il permet une spcication claire du circuit.

78
entres CLK m

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

n
Q

transcodeur
Q

p sorties

tat interne

Figure III.28. Schma gnral dun circuit squentiel synchrone de type MEALY. 2 3 4 table de transitions : forme plus lisible du graphe, qui permet de vrier quaucune transition nest oublie, et prpare la phase de simplication. simplication de la table de transitions : on applique la mthode vue prcdemment, parfois en plusieurs tapes. dtermination du nombre de bascules : le nombre dtats du graphe simpli permet dtablir un nombre minimum n de bascules employer. On ne choisit pas encore le type des bascules employer, car la phase dassignation fournira de nouvelles informations. assignation des tats : pour chaque tat, un vecteur unique de n bits est assign, appel vecteur dtat. Des rgles heuristiques dassignation permettent de trouver celle qui conduira des calculs simples. table de transitions instancie : on rcrit la table de transitions, en remplaant chaque symbole dtat par le vecteur associ. choix des bascules : en observant la table de transitions instancie, certains types de bascules peuvent tre prfrs. On emploiera une bascule D lorsquun tat suivant est la recopie dune valeur de ltat prcdent, une bascule T lorsque ltat suivant est linverse dun tat prcdent ; dans les autres cas, la bascule JK peut tre employe. calcul des entres des bascules et calcul des sorties du circuit.

6 7

8.2. Synthse du dtecteur de squence, version MOORE


A titre dexemple, on va dtailler la synthse du circuit dtecteur de la squence 1,0,1 dcrit prcdemment, en version MOORE. On reprend donc toutes les tapes numres en introduction. Graphe dtat, table de transitions, simplication Ces trois tapes ont t ralises en section 6, et ont abouties au graphe simpli et la table de transitions des gures III.29 et III.30.

8. Synthse dun circuit squentiel synchrone


1 S=0 0 a 1 b S=0 0 0 c S=0 1 f S=1 1 0

79

Figure III.29. Graphe de MOORE simpli du dtecteur de squence 1,0,1.

avant tat a a b b c c f f

E 0 1 0 1 0 1 0 1

aprs tat a b c b a f c b

tat a b c f

S 0 0 0 1

Figure III.30. Table de transitions simplie du dtecteur de squence 1,0,1. Dtermination du nombre de bascules Il y a quatre tats coder, donc 2 bascules seront employes, dont on appellera les sorties X et Y. Assignation des tats La phase dassignation consiste donc affecter un vecteur dtat chacun des tats du circuit ; ici un couple (X,Y) pour chacun des 4 tats. Nimporte quelle assignation peut tre employe. Nanmoins, on peut toujours affecter ltat initial le vecteur dtat (0,0,), qui sera forc lors dun RESET asynchrone du circuit. Par ailleurs, certaines assignations donnent lieu des calculs plus simples que dautres. On les trouve souvent en appliquant les rgles heuristiques suivantes, par ordre de priorit dcroissante : 1 2 3 rendre adjacents les tats de dpart qui ont mme tat darrive dans le graphe. rendre adjacents les tats darrive qui ont mme tat de dpart dans le graphe. rendre adjacents les tats qui ont mmes sorties.

Lide est de minimiser le nombre de bits qui changent (tat ou sorties) lors des changements dtats. Appliqu notre circuit, la premire rgle prconise dassocier a et c, a et f, b et f ; la deuxime rgle prconise dassocier a et b, b et c, a et f ; la troisime rgle prconise dassocier a, b et c. La gure III.31 propose une assignation qui respecte au mieux ces rgles.

80

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE


X 0 Y 0 a 1 c

1 f b

Figure III.31. Assignation des tats : chaque tat est associ une conguration binaire des bascules. Table de transitions instancie On recopie la table de transitions prcdente, en remplaant chaque symbole dtat par son vecteur dtat (gure III.32).

avant XY 00 00 11 11 01 01 10 10

E 0 1 0 1 0 1 0 1

aprs XY 00 11 01 11 00 10 01 11

XY 00 11 01 10

S 0 0 0 1

Figure III.32. Table de transitions instancie. Choix des bascules En observant la table instancie, on constate que X ltat suivant reproduit lentre E : une bascule D simpose pour X. Dans le cas de Y, il reproduit presque la valeur de X de ltat prcdent, sauf pour la deuxime ligne. A titre dexemple, on va choisir une bascule JK. Calcul des entres des bascules et de la sortie du circuit Plusieurs mthodes sont possibles pour ces calculs. Celle qui sera employe ici est base sur une rcriture de la table de transitions, laquelle on rajoute les entres des bascules, ici DX pour la bascule X et JY,KY pour la bascule Y (gure III.33). En fait on connaissait dj le rsultat pour X : DX = E, qui est la raison pour laquelle on avait choisi une bascule D. Pour Y, on trouve facilement que JY = E + X et KY = X. Par ailleurs, on a S = X Y. La synthse est termine, et notre squenceur se rduit au schma de la gure III.34. On notera lcriture des affectations squentielles de x et y : x := e est lquation dvolution de la bascule D, et y := x*y+jy*/y est une quation de la forme q := /k*q+j*/q, pour laquelle lentre K est inverse.

8.3. Synthse du dtecteur de squence, version MEALY


On effectue ici la synthse du mme dtecteur de squence 1,0,1, cette fois en version

8. Synthse dun circuit squentiel synchrone

81

XY 00 00 11 11 01 01 10 10

E 0 1 0 1 0 1 0 1

avant DX 0 1 0 1 0 1 0 1

JY 0 1 * * * * 1 1

KY * * 0 0 1 1 * *

aprs XY 00 11 01 11 00 10 01 11

XY 00 11 01 10

S 0 0 0 1

Figure III.33. Table de transitions instancie avec les entres des bascules choisies.
module seq101(rst,h,e: s) x := e ; x.clk = h ; x.rst = rst ; y := x*y+jy*/y ; y.clk = h ; y.rst = rst ; jy = e+x ; s = x*/y ; end module

Figure III.34. Schma nal synthtis du dtecteur de squence 1,0,1 (type MOORE) et description SHDL associe. MEALY. Il permettra dobtenir la sortie un front dhorloge avant la version MOORE, et on peut esprer un circuit encore plus simple puisque son graphe simpli comporte un tat de moins que celui de MOORE. Graphe dtat, table de transitions, simplication Ces trois tapes ont t ralises en section 6, et ont abouties au graphe simpli et la table de transitions des gures III.35 et III.36.
0/0 1 1/0 0/0 1/1

0/0

Figure III.35. Graphe de MEALY simpli du dtecteur de squence 1,0,1. Dtermination du nombre de bascules Il y a trois tats coder, donc 2 bascules seront employes, dont on appellera les sorties X et Y.

82
avant tat a a b b c c

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE


aprs tat a b c b a b

E 0 1 0 1 0 1

S 0 0 0 0 0 1

Figure III.36. Table de transitions simplie du dtecteur de squence 1,0,1. Assignation des tats La phase dassignation consiste donc affecter un vecteur dtat chacun des tats du circuit ; ici un couple (X,Y) pour chacun des 3 tats. An dobtenir les rsultats les plus simples possibles, on essaie dappliquer au mieux les heuristiques dassignation dcrites la section prcdente. Applique notre circuit, la premire rgle prconise dassocier a et c ; la deuxime rgle prconise dassocier a et b. La gure III.37 propose une assignation qui respecte au mieux ces rgles.
X 0 Y 0 a 1 c

1 b

Figure III.37. Assignation des tats : chaque tat est associ une conguration binaire des bascules. Table de transitions instancie On recopie la table de transitions prcdente, en remplaant chaque symbole dtat par son vecteur dtat (gure III.38).
avant XY 00 00 10 10 01 01 aprs XY 00 10 01 10 00 10

E 0 1 0 1 0 1

S 0 0 0 0 0 1

Figure III.38. Table de transitions instancie. Choix des bascules En observant la table instancie, on constate que X ltat suivant reproduit lentre E : une bascule D simpose pour X. Dans le cas de Y, il ny a quune ligne o Y passe 1 ; on peut choisir galement une bascule D, dont on appellera lentre DY.

8. Synthse dun circuit squentiel synchrone Calcul des entres des bascules et de la sortie du circuit

83

Ici encore on va rcrire la table de transitions, laquelle on va rajouter les entres des bascules, ici DX pour la bascule X et DY pour la bascule Y (gure III.39).
avant DX DY 0 0 1 0 0 1 1 0 0 0 1 0

XY 00 00 01 01 10 10

E 0 1 0 1 0 1

XY 00 10 01 10 00 10

S 0 0 0 0 0 0

Figure III.39. Table de transitions instancie avec les entres des bascules choisies. En fait on connaissait dj le rsultat pour X : DX = E, qui est la raison pour laquelle on avait choisi une bascule D. Pour Y, on peut faire une table de Karnaugh qui va nous permettre dexploiter les combinaisons non spcies dues au fait que la table dassignation nest pas compltement remplie (gure III.40).
X,Y E 0 1 0,0 0,1 1,1 1,0 * * 1

Figure III.40. Table de Karnaugh pour le calcul de DX. Le vecteur XY=11 est non spci. On trouve donc DX = EX. Par ailleurs, on a S = EY. La synthse est termine, et notre squenceur se rduit au schma de la gure III.41. On voit que cette fois la sortie ne dpend plus seulement de ltat interne comme dans le circuit de MOORE ; elle dpend aussi de lentre E. Avec le simulateur SHDL, on pourra se convaincre que dans le circuit de MEALY on obtient bien la sortie S un front dhorloge avant le circuit de MOORE.
module seq101(rst,h,e: s) x := e ; x.clk = h ; x.rst = rst ; y := dy ; y.clk = h ; y.rst = rst ; dy = /e*x ; s = e*y ; end module

Figure III.41. Schma nal synthtis du dtecteur de squence 1,0,1 (type MEALY) et description SHDL associe. On voit que la sortie S dpend de ltat interne, mais aussi de lentre E.

84

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

9. Chronologie dun circuit squentiel synchrone


9.1. Temps de setup, de hold et de propagation des bascules
Parmi les caractristiques temporelles dune bascule gurent les temps de setup et de hold. Le temps de setup est la dure avant le front dhorloge durant laquelle les entres de la bascule doivent tre stables pour que le basculement se passe correctement. Le temps de hold est la dure analogue aprs le front dhorloge. Lunion des deux dnit une priode autour du front dhorloge durant laquelle les entres doivent tre stables, faute de quoi le basculement ne se produirait pas comme prvu. Le temps de propagation quant lui est le temps aprs lequel on est garanti davoir la nouvelle valeur de la bascule, aprs la priode dinstabilit de la transition. Toutes ces dures sont illustres sur la gure III.42.
front dhorloge

t setup hold temps de propagation priode o les entres de la bascule doivent tre stables valeurs stables de ltat suivant

Figure III.42. Temps de setup, de hold et de propagation dune bascule.

9.2. Chronologie dtaille dune transition.


La lecture de cette section nest pas ncessaire pour qui veut concevoir un circuit squentiel. Il lui suft dadmettre quaprs le front dhorloge, au moment o les bascules du circuit changent ventuellement dtat, on passe sans coup frir des valeurs de ltat prcdent aux valeurs de ltat suivant. On peut aussi chercher comprendre en dtail ce qui se passe lors dune transition, et mme craindre quelle ne se passe mal. Mme si le front dhorloge est le mme pour toutes les bascules, les valeurs des signaux de ltat prcdent ne peuvent-elles pas interfrer avec celles de ltat suivant ? Cest en effet possible dans certaines conditions. Considrons par exemple le schma de la gure III.43. Si la bascule a a une commutation beaucoup plus rapide que la bascule b, la valeur de a va changer durant la priode de hold de la bascule b, provoquant ainsi un fonctionnement incorrect. Le plus souvent, cest le temps de setup qui est viol, lorsquon augmente la vitesse dhorloge un rythme tel quun front dhorloge arrive alors que les entres des bascules, qui sont des fonctions combinatoires des entres et de ltat courant, nont pas eu un temps sufsant pour se stabiliser.

9. Chronologie dun circuit squentiel synchrone

85

Figure III.43. Si la bascule a est trop rapide, le temps de hold de b sera viol. En pratique, on emploie des bascules aux caractristiques temporelles analogues.

9.3. Bascules matre-esclave


Une faon de rsoudre le problme de timing prcdent consiste sparer clairement le moment de capture (dchantillonnage) des valeurs de ltat prcdent du moment o on libre les valeurs pour ltat suivant, plutt que de compter sur des dlais de propagation trop serrs. On utilise pour cela des bascules spciales appeles bascules matre-esclave, cbles selon le modle de la gure III.44.

Figure III.44. Bascule matre-esclave. On capture les valeurs de ltat prcdent au front montant de lhorloge, et on libre les valeurs pour ltat suivant au front descendant. Sur le front montant de lhorloge h, les valeurs issues de ltat prcdent sont prises en compte, sans tre libres encore vers les sorties, et donc sans risque de rtroaction nfaste. Plus tard, sur le front descendant de h, les nouvelles valeurs des bascules associes ltat suivant sont libres. Les bascules matre-esclave peuvent tre employes peu prs partout o sont employes des bascules ordinaires, mais il faut cette fois bien contrler les deux fronts de lhorloge, et non un seul.

10. Circuits squentiels rutilisables


On prsente dans cette section des circuits squentiels utiliss dans la conception des microprocesseurs ou des microcontrleurs. Nous continuons notre travail de modularit, en crant des briques rutilisables dans dautres constructions ; ici encore une interface adapt permettra une rcursivit ou une interconnexion aiss.

86

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

10.1. Compteur binaire


Compteur de base Un compteur binaire sur n bits incrmente chaque front dhorloge une valeur de n bits. On pourrait dabord penser crer un registre de n bits avec des bascules D, puis relier leurs entres un circuit dincrmentation, mais il y a une solution plus directe et efcace. On se rappelle en effet (section 4) lalgorithme de comptage : un bit est recopi avec inversion si tous les bits sa droite valent 1, et le bit de poids faible est toujours invers. Cette description en termes dinversion conduit une conception base de bascules T, dans laquelle lentre T dune bascule est relie au ET de tous les bits qui sont sa droite. La gure III.45 montre un exemple dun tel compteur sur 4 bits.

module cpt4(rst,h: a,b,c,d) d := /d ; d.clk = h ; d.rst = rst ; c := /d*c+d*/c ; c.clk = h ; c.rst = rst ; b := /tb*b+tb*/b ; b.clk = h ;

b.rst = rst ; tb = c*d ; a := /ta*a+ta*/a ; a.clk = h ; a.rst = rst ; ta = b*c*d ; end module

Figure III.45. Compteur binaire 4 bits. Un bit est invers lorsque tous les bits situs sa droite valent 1. Ce compteur compte bien sr modulo 2n : aprs la valeur 1111, suit la valeur 0000 sans quon puisse tre prvenu de ce dbordement. On notera laffectation squentielle SHDL utilise pour la bascule de poids faible d :
d := /d;, qui se traduit par une bascule T avec un 1sur lentre T. Pour le bit c, lcriture c := d*c+/d*/c; se traduit galement par une bascule T, mais avec une inversion avant

son entre. Les autres bascules T ont une criture directement tire de lquation dvolution standard dune bascule T. Dans la foule, on peut galement crer un circuit dcompteur selon la mme mthode : un bit est invers lorsque tous les bits qui sont sa droite valent 0 (gure III.46). Ajout dune entre de validation Ces circuits comptent ou dcomptent en permanence, et il ny a aucun moyen de suspendre et de reprendre leur comptage. On va maintenant ajouter une entre de validation en (pour enable) qui ne permettra au compteur de compter que si elle vaut 1. Lorsquelle vaudra 0, le compteur restera g sur la dernire valeur produite, malgr larrive de fronts

10. Circuits squentiels rutilisables

87

module dec4(rst,h: a,b,c,d) d := /d ; d.clk = h ; d.rst = rst ; c := d*c+/d*/c ; c.clk = h ; c.rst = rst ; b := /tb*b+tb*/b ;

b.clk = h ; b.rst = rst ; tb = /c*/d ; a := /ta*a+ta*/a ; a.clk = h ; a.rst = rst ; ta = /b*/c*/d ; end module

Figure III.46. Dcompteur binaire 4 bits.Un bit est invers lorsque tous les bits situs sa droite valent 0. dhorloge sur h. Il suft pour cela dajouter une entre de validation chaque bascule T. Le langage SHDL autorise lemploi de lcriture : q.ena = en; qui ralise exactement cela, et quil suft demployer pour chacune des bascules du compteur. Si on ne dispose que de bascules sans entre de validation, la transformation de la gure III.47 permet de lobtenir.

module bascten(rst,h,en,t:q) q := /tq*q+tq*/q ; q.clk = h ; q.rst = rst ; tq = en*t ; end module

Figure III.47. Bascule T avec entre de validation. Ajout dune remise zro synchrone On souhaite maintenant ajouter une entre sclr de remise zro synchrone, qui remet le compteur zro au prochain front dhorloge. Elle nest bien sr pas de mme nature que lentre de reset asynchrone, qui nest l que pour linitialisation. Par ailleurs il ne faut pas essayer dutiliser ce reset asynchrone pour implmenter notre remise zro synchrone. La rgle dor des circuits squentiels synchrones purs, cest de relier entre-elles toutes les horloges et de relier entre eux tous les signaux de reset asynchrone, sans chercher les modier. Nous sommes heureux de pouvoir rinitialiser tout coup notre ordinateur personnel en appuyant sur le bouton de reset, sans que cela ne dpende dune condition plus ou moins bien pense par un concepteur peu rigoureux. Comme pour lentre de validation, le langage SHDL a une criture q.sclr = sclr; qui fait exactement ce dont nous avons besoin. Si on ne dispose pas de bascules T avec remise zro synchrone, la gure III.48 remplira cette fonction.

88

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

module tclr(rst,h,sclr,t:q) q := /tq*q+tq*/q ; q.clk = h ; q.rst = rst ; tq = /sclr*t+sclr*q ; end module

Figure III.48. Bascule T avec remise zro synchrone. On notera lcriture SHDL tq = /sclr*t+sclr*q; qui conduit lutilisation dun multiplexeur 2 vers 1. Si sclr vaut 0, la bascule T reoit son entre t normalement ; si sclr vaut 1, la bascule T reoit q en entre, qui provoque la remise 0 au prochain front dhorloge. En effet, si la bascule avait ltat 0, en ayant 0 en entre elle reste ltat 0 ; si elle avait ltat 1, en recevant 1 en entre, elle sinverse et passe 0 : dans tous les cas elle passe zro. Chanage de modules de comptage Nous souhaitons maintenant chaner plusieurs modules de comptage de n bits an de former des compteurs de m n bits. Lalgorithmique de comptage par bloc est analogue celle par bits : un bloc incrmente sa valeur si tous les blocs qui sont sa droite sont leur valeur maximum. Il nous manque donc pour chaque bloc un signal qui indique quil a atteint la valeur maximum. Pour conomiser lusage de portes ET, on va plutt produire un signal ripl qui vaut 1 lorsque le compteur est la valeur maximum et que en = 1. Pour chaner les modules, il suft maintenant de relier le ripl de lun au en de lautre. La gure III.50 montre le chanage de 4 modules de 4 bits pour former un compteur 16 bits.

10.2. Diviseur de frquence


On souhaite construire un circuit qui fournisse des signaux dhorloge de frquences diffrentes et rglables, partir dune horloge de base. Dans beaucoup de systme rels, y compris nos ordinateurs de bureau, les signaux dhorloge sont bien souvent diviss avant dtre effectivement exploits. On utilisera aussi un diviseur de frquence dans le timer de notre processeur CRAPS, pour rgler la vitesse de la base de temps. Plus prcisment on souhaite que la frquence du signal de sortie soit divise par 2n, n tant une valeur fournie sur une entre du circuit. Linterface du diviseur est donn gure III.49.

Figure III.49. Interface du circuit diviseur de frquence.La sortie s est un signal de mme forme que h, avec une frquence divise par 2n

10. Circuits squentiels rutilisables

89

module cpt4(rst,h,en:a,b,c,d,ripl) d:=/en*d+en*/d ; d.clk=h ; d.rst=rst ; c:=/tc*c+tc*/c ; c.clk=h ; c.rst=rst ; tc=en*d ; b:=/tb*b+tb*/b ; b.clk=h ; b.rst=rst ; tb=en*c*d ; a:=/ta*a+ta*/a ; a.clk=h ; a.rst=rst ; ta=en*b*c*d ; ripl=en*a*b*c*d ; end module

module cpt16(rst,h,en:s15..s0) cpt4(rst,h,en:s3,s2,s1,s0,ripl1) cpt4(rst,h,ripl1:s7,s6,s5,s4,ripl2) cpt4(rst,h,ripl2:s11,s10,s9,s8,ripl3) cpt4(rst,h,ripl3:s15,s14,s13,s12,ripl) end module

Figure III.50. Compteur 16 bits form avec 4 compteurs 4 bits. La sortie ripl dun module indique quil est la valeur maximum et que tous ceux qui sont sa droite sont leur maximum. Le module qui est sa gauche a son entre en relie ce signal, et ne peut sincrmenter que lorsquil vaut 1. On va tirer parti du principe quune bascule T dont on relie lentre 1 produit sur sa sortie un signal rectangulaire dont la frquence est gale la frquence dhorloge divise par 2. On peut sen convaincre en examinant le chronogramme de la gure III.51.

CLK

Figure III.51. Chronogramme dvolution dune bascule T dont on a forc lentre T 1. La sortie Q a une frquence gale la frquence de lhorloge divise par 2. On voit en effet sur le chronogramme que la sortie de la bascule sinverse, donc change de demi-priode, chaque front montant de lhorloge, cest dire toutes les deux demi-priodes de lhorloge. Il y a bien un rapport de 1 sur 2 entre les deux signaux. On va ainsi crer une chane de trois de ces bascules T avec des entres forces 1, an dobtenir les 4 frquences dhorloge successives : f (la frquence de lhorloge gnrale clk), f / 2, f / 4 et f / 8. On utilisera un multiplexeur 2 vers 4 command par lentre n1..n0 pour

90

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

slectionner parmi elles celle qui est dsire. On trouvera gures III.52 et III.53 le schma associ et son codage en langage SHDL. Ce sera la seule fois dans tout louvrage o on aura fait une entorse au principe de base des circuits squentiels synchrones qui consiste relier entre-eux tous les signaux dhorloge pour toutes les bascules. Mais ici, cela est fait prcisment pour produire un signal dhorloge, qui sera possiblement exploit quant lui de faon strictement synchrone.

Figure III.52. Structure du circuit diviseur de frquence. Une suite de bascules T sont chanes, divisant par 2 la frquence chaque tage.
module divfreq(rst,clk,d1..d0: s) q0 := /q0 ; q0.clk = clk ; q0.rst = rst ; q1 := /q1 ; q1.clk = q0 ; q1.rst = rst ; q2 := /q2 ; q2.clk = q1 ; q2.rst = rst ; s = /d1*/d0*clk + /d1*d0*q0 + d1*/dO*q1 + d1*d0*q2 ; end module

Figure III.53. criture SHDL du module diviseur de frquence.

10.3. Registres
Un registre de n bits est un ensemble de n bascules D synchrones mises en parallle et partageant la mme horloge (gure III.54). On notera lcriture vectorielle de type d[31..d0]. Elle est strictement quivalente lcriture d31..d0 qui a t utilise jusquici ; elle est plus courte lorsque le nom du signal est long, car il nest mentionn quune fois. Registre avec ligne de slection Un registre peut tre quip dune ligne de slection qui doit tre active si lon veut faire une criture ; ce type de signal a souvent pour nom en (enable), ou cs (chip select) ou

10. Circuits squentiels rutilisables


// Description SHDL dun registre 32 bits module reg32(d[31..0],h,reset: q[31..0]) q[31..0] := d[31..0] ; q[31..0].clk = h ; q[31..0].rst = reset ; END MODULE

91

Figure III.54. Registre de 32 bits avec son criture SHDL. encore ce (chip enable). On a vu la section prcdente que le langage SHDL disposait de lcriture .ena pour prendre en compte directement un tel signal. La gure III.55 met en oeuvre cette criture pour notre registre de 32 bits.

// description SHDL directe module reg32_2(reset,h,en,d31..d0: q31..q0) q[31..0] := d[31..0] ; q[31..0].clk = clk ; q[31..0].rst = reset ; q[31..0].ena = en ; end module

Figure III.55. Registre avec entre de slection, criture SHDL directe. Pour mieux comprendre son fonctionnement, on peut le raliser avec un multiplexeur et par rebouclage de la sortie sur lentre. La gure III.56 montre cette construction, avec le code SHDL correspondant.

module reg32_3(reset,h,en,d31..d0: q31..q0) reg32(reset,h,in[31..0]: out[31..0]) ; in[31..0] = d[31..0]*en + q[31..0]*/en ; q[31..0] = out[31..0] ; end module

Figure III.56. Registre avec entre de slection construit avec un multiplexeur. Lorsque lentre en est 0, le multiplexeur reconduit la valeur du registre en entre : il ne change alors pas de valeur au prochain front dhorloge. Lorsque en vaut 1, cest la valeur prsente sur les entres d31..d0 qui est aiguille par le multiplexeur, puis mmorise.

92

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

Cette construction est bien sr moins performante quavec des bascules D dj quipes dune entre de validation ; en particulier elle demande un temps de setup plus long d la propagation au travers du multiplexeur.

11. Exercices corrigs


11.1. Exercice 1 : systme de scurit
nonc Raliser un systme de mise en marche de scurit de machine dangereuse.Il est quip de deux entres A et B et la mise en marche est contrle par la sortie M. Il faut pour cela que la procdure suivante soit respecte : 1 2 3 A et B doivent tre relchs initialement ; appuyer sur A, appuyer sur B : la machine se met en marche.

Toute autre manipulation arrte ou laisse la machine arrte ; il faut ensuite reprendre la procdure au point 1 pour la mettre en marche. Solution On va adopter une solution de type MOORE. On fera galement une conception synchrone, cest dire quon supposera prsente une horloge sufsamment rapide pour ne rater aucun vnement sur A et B. Le graphe dtat de ce problme est donn gure III.57.
00 M=0 10 11 b 00 01 10 e M=0 M=0 00 01 c M=1 11

10 01 11

00

Figure III.57. Graphe dtat du systme de scurit, type MOORE. En partant de ltat a, on progresse jusqu ltat c pour lequel M=1 si on respecte la squence de mise en marche. Sur ce chemin, on tombe dans ltat derreur e ds quon scarte de la procdure. Lorsquon est en e, on y reste tant que A et B ne sont pas relchs tous les deux, conformment la spcication de lnonc. On rcrit ce graphe sous une forme tabulaire pour chercher sil est simpliable (gure III.58).

11. Exercices corrigs

93

avant tat A a 0 a 0 a 1 a 1 b 0 b 0 b 1 b 1 c 0 c 0 c 1 c 1 e 0 e 0 e 1 e 1

B 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

aprs tat a e b e e e b c e e e c a e e e

tat a b c e

M 0 0 1 0

Figure III.58. Table de transitions du graphe de scurit. Aucune simplication nest possible ; le circuit possde donc un nombre minimal dtats de 4. Il faut donc 2 bascules pour coder cet tat, dont on appellera les sorties X et Y. Vient maintenant ltape dassignation, durant laquelle nous devons choisir une conguration des bascules X et Y pour chacun des tats. On assignera ltat a le vecteur XY=00, associer au reset des bascules. Pour les autres, il est souhaitable pour obtenir des calculs plus simples de respecter les heuristiques dassignation, qui recommandent de placer cte cte les tats fortement relis dans le graphe. On peut par exemple choisir lassignation de la gure III.59.
X 0 Y 0 a 1 e

1 b c

Figure III.59. Assignation des tats du systme de scurit. On peut maintenant rcrire la table de transition, en remplaant les tats symbolique par leur vecteur associ (gure III.60). Aucune bascule ne semble particulirement adapte ces changements dtat. titre dexemple, on va utiliser deux bascules T. On peut nouveau crire la table de transition instancie, en rajoutant 2 colonnes TX et TY qui sont les entres T des bascules X et Y (gure III.61). Il suft maintenant de trouver les formules algbriques pour TX et TY, en fonction de X, Y, A et B. On peut pour cela utiliser des tables de Karnaugh (gure III.62). On trouve : 1 2 TX = ABX Y + AX + BXY TY = ABXY + BY X + AX Y

94

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

avant XY 00 00 00 00 10 10 10 10 11 11 11 11 01 01 01 01

A 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1

B 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

aprs XY 00 01 10 01 01 01 10 11 01 01 01 11 00 01 01 01

XY 00 10 11 01

S 0 0 1 0

Figure III.60. Table de transitions instancie du graphe de scurit.

avant XY 00 00 00 00 10 10 10 10 11 11 11 11 01 01 01 01

A 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1

B 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

TX 0 0 1 0 1 1 0 0 1 1 1 0 0 0 0 0

TY 0 1 0 1 1 1 0 1 0 0 0 0 1 0 0 0

aprs XY 00 01 10 01 01 01 10 11 01 01 01 11 00 01 01 01

XY 00 10 11 01

S 0 0 1 0

Figure III.61. Table de transitions instancie du graphe de scurit, avec les entres des 2 bascules T.
TX X,Y A,B 0,0 0,1 1,1 1,0 1 1 0,0 0,1 1,1 1,0 1 1 1 1 A,B 0,0 0,1 1,1 1,0 1 1 X,Y 0,0 0,1 1,1 1,0 1 1 1 1 TY

Figure III.62. Simplication des quations du systme de scurit.

11. Exercices corrigs 3 M = XY

95

11.2. Exercice 2 : compteur/dcompteur


nonc Concevoir un circuit squentiel synchrone avec une entre e et 4 sorties a,b,c,d, qui compte en binaire sur a,b,c,d lorsque e=0 et qui dcompte lorsque e=1. Solution On pourrait concevoir ce circuit en construisant un graphe dtats, une table de transitions, etc. Mais cette mthode ne serait pas gnrique et avec 4 bits le graphe serait dj de grande taille avec 16 tats. Il est prfrable ici de combiner deux circuits que lon connat dj, le compteur et le dcompteur. On a dj prsent les compteurs et les algorithmes de comptage et de dcomptage en binaire (section 4). On ralise un compteur binaire 4 bits avec 4 bascules T ; la bascule de poids faible a pour entre 1 car elle change dtat chaque front dhorloge ; les autres bascules ont pour entre le ET des bits qui sont leur droite. Un dcompteur se fait galement avec 4 bascules T ; la bascule de poids faible change galement chaque front ; les autres bascules changent dtat lorsque tous les bits qui sont leur droite sont des 0. La synthse des deux est donc simple : la bascule de poids faible est commune, car elle change dtat chaque front dhorloge dans les deux cas. Pour les autres bits, il sagit galement de faire un ET dans les deux cas, mais des bits qui sont droite pour le comptage et de linverse de ces mmes bits pour le dcomptage. Il suft donc de mettre un inverseur command (un XOR, voir section 4) par le signal e devant chacun des bits prendre en compte dans le ET. Cela conduit au schma de la gure III.63, avec un code SHDL immdiat.

11.3. Exercice 3 : utilisation des bascules


nonc Construire une bascule D avec une bascule T, puis une bascule T avec une bascule D. On pourra utiliser des circuits combinatoires. Solution 1 Bascule D avec une bascule T. On peut se poser une question simple : comment mettre 0 une bascule T ? Il suft de mettre la valeur Q de la bascule sur son entre T. Si elle valait 0 elle y reste et si elle valait 1 elle sinverse et passe 0. Pour mettre 1 une bascule T, on voit aussi facilement quil suft dappliquer linverse de Q sur lentre T. Dans les deux cas, on a appliqu sur lentre T la valeur Q de la bascule, avec une inversion commande par la valeur D mmoriser : XOR(D,Q).

96

CHAPITRE III. LMENTS DE LOGIQUE SQUENTIELLE

module cptdec(rst, h, e : a, b, c, d) // bascule a a := /ta*a+ta*/a; a.clk = clk; a.rst = rst; ta = nb * nc * nd; // bascule b b := /tb*b+tb*/b; b.clk = clk; b.rst = rst; tb = nc * nd; // bascule c c := /tc*c+tc*/c; c.clk = clk; c.rst = rst; tc = nd; // bascule d d := /d; d.clk = clk; d.rst = rst; // inversion de a,b,c,d // commande par e na = a*/e + /a*e; nb = b*/e + /b*e; nc = c*/e + /c*e; nd = d*/e + /d*e; end module

Figure III.63. Compteur/dcompteur : schma et criture SHDL.

Bascule T avec une bascule D. La solution est ici plus directe : il suft dappliquer sur D lquation dvolution de la bascule T, qui est Q := T Q + T Q.

11. Exercices corrigs

97

Chapitre IV lments fonctionnels dun processeur


Le prsent chapitre dcrit les modules combinatoires et squentiels les plus communment utiliss dans les architectures dordinateurs, permettant ainsi la transition avec le chapitre suivant dcrivant en dtail larchitecture dun processeur 32 bits. Les circuits que nous allons tudier partir de maintenant sont trop complexes pour pouvoir tre analyss et synthtiss dans leur ensemble laide des mthodes tabulaires et algbriques vues aux chapitres prcdents. Comme en logiciel, le concept de module va tre utilis pour circonscrire et donc matriser cette complexit ; il prendra mme parfois une forme rcursive, lorsquun module sera dni par lassemblage de modules semblables, mais avec un nombre dentres et de sorties plus petit. Le dcoupage en modules de lensemble dun systme complexe va quant lui faire appel des mthodes plus intuitives, que nous allons tenter dintroduire au travers de nombreux exemples. Les microprocesseurs et microcontrleurs sont des circuits squentiels synchrones complexes, dans lesquels nous oprerons ce dcoupage en modules, chaque partie tant un circuit combinatoire ou squentiel standard qui a souvent une structure rcursive au sens dni prcdemment. Par exemple on va voir que lUnit Arithmtique et Logique (UAL), qui fait les calculs au sein dun processeur, a la mme structure quel que soit le nombre de bits des donnes quelle traite, et quon pourra associer des tranchesdUAL pour construire des UALs de plus grosse capacit. Les concepteurs de processeurs peuvent donc faire appel ce concept de modularit rcursive lors de laugmentation de la taille des donnes par exemple, en minimisant les temps de conception. On prsente galement dans cette partie une nouvelle notion lectrique, celle des sorties en haute impdance, qui facilite la gestion de bus de grande taille. On prsente aussi les circuits mmoire, qui sont au sens strict des circuits squentiels, mais qui ne se rduisent pas des assemblages de bascules ou de latchs. Une section entire leur est consacre, vu leur importance dans les systmes informatiques et la diversit croissante de leurs types. Une fois acheve la comprhension de ces modules de base, la conception dun processeur va ressembler un jeu de construction avec des blocs qui vont semboter harmonieusement.

1. Sorties haute-impdance
Certains circuits possdent des sorties dites trois tats (tri-state), cest dire quen plus de pouvoir tre dans ltat 0 ou ltat 1 (cest dire dans un tat lectrique de basse impdance), elles peuvent tre dans un troisime tat dit de haute-impdance, souvent not High-Z. Lorsquune sortie est en haute-impdance, tout se passe comme si elle ntait plus connecte, car elle ne produit plus ni ne consomme plus aucun courant. Cette proprit permettra de relier directement entre-elles plusieurs sorties de ce type, sous rserve de
98

1. Sorties haute-impdance

99

garantir quau plus une seule de ces sorties produise du courant un moment donn (sous peine de court-circuit !). Les circuits ayant des sorties trois tats possdent en interne des composants appels buffer trois-tats, qui se reprsentent tels que sur la gure IV.1.

// criture SHDL S = E:OE ;


VALIDE VALIDE

Figure IV.1. Buffer 3-tats - La sortie est en haute-impdance tant que VALIDE = 0. La ligne VALIDE qui arrive sur le ct du triangle, souvent note OE (pour Output Enable), commande ltat de la sortie. Tant que cette ligne est inactive, la sortie reste dans ltat High-Z. Du point de vue de lcriture SHDL, cette commande Output Enable sur un signal tel que S sindique par lajout aprs le nom du signal dune commande telle que :OE Si on considre cet tat High-Z comme un troisime tat logique (ce qui nest pas trs exact sur le plan mathmatique), on a la table de vrit de la gure IV.2. E * 0 1 OE 0 1 1 S High-Z 0 1

Figure IV.2. Table de vrit dun buffer 3-tats. On peut illustrer lutilisation de ces buffers lors de la ralisation dun multiplexeur (gure IV.3). Les sorties des deux buffers 3-tats sont relies entre-elles, car leurs lignes OE sactivent de faon mutuellement exclusive. Lide de ce schma est que, soit on doit laisser passer le courant qui vient de A (avec linterrupteur command que forme le buffer trois tats), soit on doit le laisser passer depuis B. Comme ces deux conditions sont mutuellement exclusives, on peut relier les sorties des deux buffers en toute scurit. On conomise ainsi le circuit OU du schma classique de droite, qui noprait jamais avec ses deux entres 1 simultanment. On notera lcriture SHDL telle que : S = A:/C;. Lquipotentielle sappelle S, mais deux sources de courant peuvent y imposer leur potentiel ; on les note alors A:/C et B:C. On voit sur la gure IV.4 une conguration lectrique particulire de ce circuit : la commande C tant 1, seul le buffer 3-tats du bas va tre dans un tat de basse impdance, et va imposer son tat lectrique la sortie S. Le buffer trois tats du haut a sa sortie en haute impdance et nentre pas en conit avec lautre pour ltablissement du potentiel de S ; tout se passe comme sil tait dconnect du circuit, ce qui a t gur par les deux lignes brises.

100

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR


C A B 0 S 1 C

A A C B
MODULE MUX_1(A,B,C :S) S = A:/C ; S = B:C ; END MODULE

S B

MODULE MUX_2(A,B,C :S) S1 = /C * A ; S2 = C * B ; S = S1 + S2 ; END MODULE

Figure IV.3. Multiplexeur ralis laide de buffers 3-tats, compar sa ralisation en logique combinatoire classique. On conomise le ou nal.

A=0 C=1 B=1

HighZ S=1 1

Figure IV.4. Fonctionnement du multiplexeur. Dans cette conguration, cest le buffer du bas qui impose son potentiel. Si on relie ensemble deux sorties de buffers trois tats, et qu un moment donn leurs lignes OE sont 1en mme temps, le court circuit est rel, et les circuits se mettent chauffer dangereusement, entranant parfois la destruction ou lendommagement du plus faible. Cela peut se produire dans des ralisations composes de plusieurs circuits intgrs, dont les sorties trois tats sont relies entre elles. Cela peut se produire galement lintrieur dun seul circuit comme un FPGA, dans lequel des lignes internes trois tats peuvent tre relies entre elles lors de la programmation - conguration. On vite parfois le pire avec un bon odorat, en dtectant lodeur de cuisson de la poussire prsente la surface des circuits des tempratures avoisinant parfois les 100 degrs Celcius, et en dbranchant en hte lalimentation ! Cest en fait la seule situation dangereuse pour les composants lorsque lon fait de la logique digitale. Tant quon nutilise pas de composants avec des sorties trois tats, rien ne peut tre endommag si on prend soin de ne relier chaque sortie qu des entres. Avec les

1. Sorties haute-impdance

101

composants ayant des sorties trois tats, il faudra imprativement connecter leurs lignes OE des circuits tels que des dcodeurs (voir section 3) qui vont garantir lexclusion mutuelle entre les sorties relies entre elles.

2. Les bus parallles


2.1. Vocabulaire et concepts
On appelle bus parallle un ensemble dquipotentielles lectriques qui interconnectent plusieurs modules lintrieur dun cblage. On voit gure IV.5 comment on reprsente graphiquement un bus parallle de largeur m. Le trait est paissi par rapport un signal simple, et une barre surmonte dun nombre indique la largeur du bus. On montre
m m

Figure IV.5. Les deux reprsentations graphiques dun bus parallle de largeur m. galement gure IV.6 les faons habituelles de reprsenter sur un schma les sous-bus dun bus donn.
16 16 data[15..0]

data[15..0]

5 data[15..11]

data[15..11] 5
data[15..0]

16

5 data[15..11]
data[10..0]

16

11 11

Figure IV.6. Exemples de scindements / regroupements de bus. On trouve des bus parallles tous les niveaux dune architecture dordinateur : dans les structures internes du processeur, entre le processeur et les autres composants prsents sur la carte mre, etc. Ils peuvent tre prsents partout o plusieurs composants doivent changer des donnes. Un bus large va permettre de transfrer en une transaction une donne de grande taille, mais va occuper beaucoup de place sur les circuits, et donc coter plus cher. La mme donne pourra tre copie en deux transactions successives, avec un bus deux fois moins large ; un compromis est donc trouver entre cot et vitesse de traitement. Pour que des modules puissent dialoguer sur un mme bus, sur le plan lectrique, il faut

102

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR

adopter bien sr les mmes tensions dalimentation, courants de sortie et dentre, etc. Mais il faut aussi empcher les courts-circuits sur les lignes de donnes, lorsque plusieurs modules ont la possibilit dy crire. Par ailleurs, un protocole de communication est indispensable, an de rgler la chronologie des changes sur le bus. Dans ce domaine, comme dans beaucoup dautres de larchitecture des ordinateurs, on peut classer ces protocoles en deux catgories : les synchrones et les asynchrones. Dans ces deux catgories, un grand nombre de protocoles diffrents existent, dont ltude sort du cadre de ce livre. Les protocoles synchrones sont les plus rpandus et les plus simples, car ils rglent tous les changes sur un signal dhorloge unique (qui fait partie du bus).

2.2. Exemple de bus synchrone simple


An dillustrer quelques aspects de la communication sur un bus synchrone, considrons le circuit de la gure IV.7. Le bus est compos de 11 lignes : 8 lignes de
esclaves maitre a[7..0] compteur 2 bits 8 b[7..0] 8 c[7..0] 8 d[7..0] 8

8 2 8

n1*n0

n1*/n0

/n1*n0

/n1*/n0

8 2

data[7..0] n[1..0] clk

bus

Figure IV.7. Exemple de bus synchrone, un matre et 4 esclaves. Les sorties des esclaves sont des buffers 3-tats, dont les lignes OE sexcluent mutuellement. donnes data[7..0] et 3 lignes de contrle n[1..0] et clk. Le bloc de gauche joue le rle de matre, cest dire quil dirige les changes sur le bus. Cest lui qui gnre les signaux de contrle, gouverns par lhorloge clk qui cadence tous les changes. chaque front de clk, le matre gnre laide dun compteur un nouveau numro sur les lignes n[1..0]. Les lignes OE de chaque esclave sont associes un numro spcique ; par exemple lesclave dont la ligne OE est relie n1*/n0 est associ au numro 2 (10 en binaire), et ne placera sa donne b[7..0] sur le bus que si ce numro est prsent sur les lignes n[1..0] du sous-bus de contrle. Dans ce protocole synchrone particulirement simple, les 4 esclaves placent tour de rle leur donne sur le sous-bus data[7..0], gouverns par le module matre. Ici le bus est monodirectionnel, les changes allant toujours dans le sens esclave vers matre ; certains protocoles pourront tre bidirectionnels. Il ny a ici quun seul matre, donc pas de possibilit de conit. Sil y avait plusieurs matres, une logique darbitrage serait ncessaire pour dcider quel matre peut prendre le contrle du bus en cas de requtes simultanes. Il sagit dun protocole une phase, puisquun change de donnes est effectu en un cycle dhorloge. Des protocoles complexes peuvent ncessiter de nombreuses phases pour raliser un change, plusieurs phases pouvant tre ncessaires pour que le matre dcrive les paramtres de sa demande lesclave, et plusieurs autres pouvant tre ncessaires pour que

2. Les bus parallles lesclave transmette la donne demande.

103

2.3. Exemple de bus parallle, externe et normalis : le bus PCI


Pour mieux comprendre la problmatique des bus, on peut penser au bus PCI parallle prsent sur la plupart des ordinateurs personnels et des stations de travail (mme sil est progressivement remplac maintenant par le bus PCI Express, plus rapide). Lorsquon ouvre une de ces machines, on voit sur la carte mre plusieurs connecteurs exactement identiques, comportant deux fois 94 broches, disposs paralllement quelques centimtres dintervalle.On peut parfois apercevoir sur le circuit imprim une partie des interconnexions entre ces connecteurs. Elles sont trs simples : les broches de mme position sont toutes relies entre elles pour tous les connecteurs. Il y a donc 188 pistes sur le circuit imprim qui relient entre elles les 188 broches de chaque connecteur (gure IV.8).

Figure IV.8. Bus PCI, avec 4 connecteurs 188 broches. Si on considre maintenant une carte place dans un de ces connecteurs, comme une carte dacquisition vido, ou une carte rseau, il faut comprendre que ces 188 signaux sont son unique moyen de communication avec le reste du systme, et quil faut donc trouver un moyen de dialoguer, rationnel la fois sur le plan lectrique et sur le plan logique. Pour le bus PCI comme pour tous les bus externes standardiss, ce protocole de communication doit tre trs gnral, utilisable par des cartes de types varis, en nombre non x lavance, qui peuvent tre par exemple principalement mettrices de donnes (cartes dacquisition vido), ou principalement rceptrices (cartes audio), ou les deux (cartes rseau).

3. Dcodeurs
Un dcodeur est un circuit possdant n entres et 2n sorties numrotes (gure IV.9). tout moment, une et une seule sortie est active : celle dont le numro correspond la valeur binaire prsente sur les n entres. Le dcodeur traduit donc la valeur dentre en une information de position spatiale.
S0 S1 S2 S3 S4 S5 S6 S7
MODULE DECODER3TO8(EN,E2..E0 :S7..S0) S7=EN*E2*E1*E0 ; S6=EN*E2*E1*/E0 ; S5=EN*E2*/E1*E0 ; S4=EN*E2*/E1*/E0 ; S3=EN*/E2*E1*E0 ; S2=EN*/E2*E1*/E0 ; S1=EN*/E2*/E1*E0 ; S0=EN*/E2*/E1*/E0 ; END MODULE

1 1 0 1

E2 E1 E0 EN

0 0 0 0 0 0 1 0

Figure IV.9. Dcodeur 3 vers 8.Avec la valeur 6 en entre (110 en binaire),la sortie numro 6 est active. Un dcodeur peut tre utilis pour nactiver quau plus un composant 3-tats la fois, puisquau plus une seule de ses sorties est active la fois.

104

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR

Les dcodeurs peuvent galement tre utiliss pour implmenter des fonctions logiques boolennes. Puisque chaque sortie reprsente un des minterms possibles, et que toute fonction combinatoire boolenne sexprime sous forme dune somme de minterms, on reliera avec un OU les sorties correspondants aux minterms dsirs. On peut voir gure IV.10 la ralisation dun OU exclusif (XOR) trois entres avec un dcodeur et un OU 4 entres.

E2 E1 E0

000 001 010 011 100 101 110 111

Figure IV.10. Un dcodeur 3 vers 8 utilis pour raliser un OU exclusif 3 entres.

4. Multiplexeurs
Ces sont des circuits daiguillage pour les signaux logiques. Un multiplexeur possde n 2 entres de donnes, n entres de commandes, et une seule sortie. On indique sur la commande le numro (en binaire) de lentre de donne qui va tre aiguille en sortie. On a en gure IV.11 un exemple de multiplexeur 8 vers 1 sur la commande duquel est crit 1102 = 610 ; la sortie rete alors ltat de la sixime entre : E6. On donne aussi gure IV.11 lcriture SHDL de ce multiplexeur, qui est celle dun circuit combinatoire simple.

0 0 0 1 0 1 1 1

E0 E1 E2 E3 E4 E5 E6 E7 C2..C0 S
MODULE MUX8TO1(E7..E0,C2..C0 :S) S=/C2*/C1*/C0*E0+ /C2*/C1*C0*E1+ /C2*C1*/C0*E2+ /C2*C1*C0*E3+ C2*/C1*/C0*E4+ C2*/C1*C0*E5+ C2*C1*/C0*E6+ C2*C1*C0*E7; END MODULE

110

Figure IV.11. Multiplexeur 8 vers 1. Lentre numro 6 est aiguille vers la sortie. Bien sr, les multiplexeurs peuvent tre mis en parallle pour aiguiller des bus entiers. On mettra alors en commun les lignes de commande, et en parallle les lignes de donnes.

4. Multiplexeurs

105

On peut voir gure IV.12 un multiplexeur 2 vers 1aiguillant des bus de 32 bits, avec lcriture SHDL correspondante.

32 A31..A0 32 S31..S0 B31..B0 C 32


MODULE MUX2TO1_32(A31..A0,B31..B0,C :S31..S0) S31..S0 = /C*A31..A0 + C*B31..B0 ; END MODULE

Figure IV.12. Multiplexeur 2 vers 1, aiguillant des bus de 32 bits. Un multiplexeur 2 vers 1 implmente matriellement une situation de type si-alors-sinon ; plus prcisment : si C alors S=A sinon S=B (gure IV.13). Cest une remarque qui peut sembler banale, mais qui en fait va permettre dorganiser le dcoupage en modules dun systme complexe, ds lors quun tel genre de situation aura t identi.
n A n B 0 1 S n

Figure IV.13. Un multiplexeur 2 vers 1implmente une situation si-alors-sinon : si C alors S = A sinon S = B. Un multiplexeur 2n vers 1 peut galement tre utilis directement pour implmenter des fonctions combinatoires n entres. Il suft de relier les entres de la fonction raliser aux entres de commande du multiplexeur : chaque combinaison va conduire un aiguillage spcique, et il ny a plus qu mettre la valeur 0 ou 1 attendue sur lentre de donne correspondante du multiplexeur. Il ny a cette fois aucun composant supplmentaire rajouter, et on peut voir gure IV.14 limplmentation dune fonction XOR 3 entres avec un dcodeur 8 vers 1. Bien sr, cette solution nest pas optimale en nombre de transistors utiliss, puisque toutes les entres forces 0 sont relies des portes ET inutilises.

5. Encodeurs de priorit
Un encodeur de priorit possde 2n entres et n sorties. Les entres sont numrotes, et correspondent des vnements de priorit croissante. On verra en particulier comment utiliser les encodeurs de priorit pour grer larrive dinterruptions simultanes dans un processeur, telles que les vnements rseau, les vnements disque, les vnements USB ou clavier ou souris, etc. La sortie NUM contient le numro de lentre active la plus prioritaire, cest dire de numro le plus lev. Une autre sortie (ACT sur la gure) peut aussi indiquer sil y a au moins

106

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR

0 1 1 0 1 0 0 1

0 1 2 3 4 5 6 7 XOR3(E2..E0)

E2..E0

Figure IV.14. Un multiplexeur 8 vers 1 utilis pour raliser un OU exclusif 3 entres. une entre active. Le schma de la gure IV.15 montre un tel encodeur pour 23 entres avec les entres 0, 3 et 6 actives, et la valeur binaire 6 place sur les sorties.
1 0 0 1 0 0 1 0

E0 NUM2..0 E1 E2 E3 encodeur de E4 priorit E5 E6 ACT E7

3 110 (6)
MODULE ENCODEUR(E[7..0]: NUM[2..0],ACT) NUM2=E7+E6+E5+E4 ; NUM1=E7+E6+/E5*/E4*E3+/E5*/E4*E2 ; NUM0=E7+/E6*E5+/E6*/E4*E3+/E6*/E4*/E2*E1 ; ACT=E7+E6+E5+E4+E3+E2+E1+E0 ; END MODULE

Figure IV.15. Encodeur de priorits 8 entres. Lentre active #6 est la plus prioritaire. La table de vrit dun tel circuit 8 entres possde 256 lignes ; on peut nanmoins la reprsenter de faon condense (gure IV.16). Lentre #0 est souvent non cble : labsence dentre active est alors dtecte lorsque NUM = 0, vitant ainsi davoir la sortie supplmentaire ACT. Une faon lgante dobtenir le rsultat consiste utiliser une criture vectorielle, qui permet davoir tous les bits la fois. On traduit le fait quon obtient la sortie 111 lorsquon a E7 ; quon obtient 110 lorsquon a E6 et pas E7, etc. : 1 NUM2 1 1 1 NUM1 = 1 E7 + 1 E7E6 + 0 E7E6E5 + 0 E7E6E5E4 0 1 0 NUM0 1 0 0 0 + 1 E7E6E5E4E3 + 1 E7E6E5E4E3E2 + 0 E7E6E5E4E3E2E1 1 0 1

5. Encodeurs de priorit E7 1 0 0 0 0 0 0 0 0 E6 * 1 0 0 0 0 0 0 0 E5 * * 1 0 0 0 0 0 0 E4 * * * 1 0 0 0 0 0 E3 * * * * 1 0 0 0 0 E2 * * * * * 1 0 0 0 E1 * * * * * * 1 0 0 E0 * * * * * * * 1 0 NUM2..0 111 110 101 100 011 010 001 000 000 ACT 1 1 1 1 1 1 1 1 0

107

Figure IV.16. Table de vrit condense dun encodeur de priorits 8 entres. NUM2 E7 E7E6 E7E6E5 E7E6E5E4 0 NUM1 = E7 + + 0 + E7E6 NUM0 E7 0 E7E6E5 0 0 0 0 0 + E7E6E5E4E3 + + E7E6E5E4E3E2 E7E6E5E4E3E2E1 0 E7E6E5E4E3 E7 + E7E6 + E7E6E5 + E7E6E5E4 NUM2 NUM1 = E7 + E7E6 + E7E6E5E4E3 + E7E6E5E4E3E2 NUM0 E7 + + + E7E6E5 E7E6E5E4E3 E7E6E5E4E3E2E1 Le thorme dabsorption sapplique plusieurs fois, et on obtient nalement : E7 + E6 + E5 + E4 NUM2 NUM1 = E7 + E6 + E5E4E3 + E5E4E2 NUM0 E7 + + + E6E5 E6E4E3 E6E4E2E1 Lcriture SHDL dun encodeur 8 entres est donne gure IV.15. On reprendra lexercice 11.3 le calcul des quations des signaux NUM2..0.

6. Circuit dextension de signe


Un circuit dextension de signe de p bits vers n bits, p < n est un circuit combinatoire qui transforme un nombre sign cod en complment 2 sur p bits en ce mme nombre cod en complment 2 sur un nombre de bits n plus grand. Considrons par exemple une extension de signe de 4 bits vers 8 bits, et quelques cas particuliers : 00112 (= 3) sera converti en 000000112 11112 (= -1) sera converti en 111111112 10002 (= -8) sera converti en 111110002

108

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR

On voit donc que le mot de n bits est form de la recopie du mot de p bits, complt gauche de n p bits tous gaux 0 ou 1 selon le signe du nombre. On recopie en fait n p fois le bit de signe du mot de dpart, cest dire le bit de rang p 1 (gure IV.17).
1010

1111 1010

Figure IV.17. Opration dextension de signe. On duplique les p bits dentre et on ajoute gauche n-p bits de signe. La gure IV.18 montre titre dexemple le code SHDL correspondant un circuit dextension de signe de 13 bits vers 32 bits.
module signext13(e12..e0: s31..s0) s12..s0 = e12..e0; s31..s13 = e12; end module

Figure IV.18. criture SHDL dun circuit dextension de signe 13 bits vers 32 bits. Les 13 bits de poids faibles sont recopis et on ajoute 19 bits de poids forts, tous gaux au bit de signe e12 du nombre de dpart.

7. Dcaleur barillet
Le dcaleur barillet (barrel shifter) dcale un mot binaire de n bits vers la gauche ou vers la droite, dun nombre variable de bits. Le sens du dcalage est dni par une commande R (pour right) et le nombre de bits du dcalage est donn dans une commande NB sur p bits (gure IV.19). Cest un circuit directement employ lexcution des instructions de dcalage et de rotation des processeurs, telles que les instructions sll et slr de CRAPS que p nous verrons au chapitre suivant. Gnralement, n = 2 : un dcaleur barillet sur 8 bits aura une valeur de dcalage code sur 3 bits ; un dcaleur sur 32 bits aura une valeur de dcalage sur 5 bits, etc. Sur 8 bits par exemple, la gure IV.20 prsente la table de vrit condense dun tel circuit, avec une valeur dcalage sur 3 bits qui permet tous les dcalages de 0 7 dans le sens droit (R = 1) comme dans le sens gauche (R = 0). Un tel circuit est difcile concevoir directement ; par ailleurs, si on voulait le raliser sous forme dun seul tage de propagation - ce qui est possible en thorie - les quations seraient complexes, et ce dautant plus que les valeurs de n et p seraient grandes. linverse, une conception modulaire et rcursive est possible de faon trs simple, si on procde par tage, avec des dcalages par puissances de 2 successives. Cette organisation gnrale est dite de dcalage barillet, et elle est montre gure IV.21 pour un dcaleur 8

7. Dcaleur barillet

109

Figure IV.19. Interface gnral dun dcaleur barillet.Le mot de n bits est dcal droite (resp. gauche) si R = 1 (resp. 0), dun nombre de bits NB. Les bits qui sortent sont perdus, et les bits entrants sont des 0.
R * 0 0 0 0 0 0 0 1 1 1 1 1 1 1 nb 000 001 0 10 0 11 10 0 10 1 110 111 001 0 10 0 11 10 0 10 1 110 111 entres e4 e3 e4 e3 e4 e3 e4 e3 e4 e3 e4 e3 e4 e3 e4 e3 e4 e3 e4 e3 e4 e3 e4 e3 e4 e3 e4 e3 e4 e3 sorties e4 e3 e3 e2 e2 e1 e1 e0 e0 0 0 0 0 0 0 0 e5 e4 e6 e5 e7 e6 0 e7 0 0 0 0 0 0

e7 e7 e7 e7 e7 e7 e7 e7 e7 e7 e7 e7 e7 e7 e7

e6 e6 e6 e6 e6 e6 e6 e6 e6 e6 e6 e6 e6 e6 e6

e5 e5 e5 e5 e5 e5 e5 e5 e5 e5 e5 e5 e5 e5 e5

e2 e2 e2 e2 e2 e2 e2 e2 e2 e2 e2 e2 e2 e2 e2

e1 e1 e1 e1 e1 e1 e1 e1 e1 e1 e1 e1 e1 e1 e1

e0 e0 e0 e0 e0 e0 e0 e0 e0 e0 e0 e0 e0 e0 e0

e7 e6 e5 e4 e3 e2 e1 e0 0 0 0 0 0 0 0

e6 e5 e4 e3 e2 e1 e0 0 e7 0 0 0 0 0 0

e5 e4 e3 e2 e1 e0 0 0 e6 e7 0 0 0 0 0

e2 e1 e0 0 0 0 0 0 e3 e4 e5 e6 e7 0 0

e1 e0 0 0 0 0 0 0 e2 e3 e4 e5 e6 e7 0

e0 0 0 0 0 0 0 0 e1 e2 e3 e4 e5 e6 e7

Figure IV.20. Table de vrit condense dun dcaleur barillet sur 8 bits. bits. Tous les dcaleurs ont leurs lignes R relies ensemble, et donc oprent dans le mme sens. Ils sont tous quips dune ligne CS, et un dcalage nest effectu que si CS = 1. Ils effectuent chacun un nombre de dcalages xe, 4, 2 ou 1. Leur organisation en barillet permet deffectuer toutes les valeurs de dcalage entre 0 et 7. Le premier niveau effectue un dcalage de 4 bits ou non, selon que nb[2] = 1 ou non. Le second niveau effectue ou non un dcalage de 2 bits, selon la valeur de nb[1]. Le dernier niveau effectue un dcalage de 1 bit, selon la valeur de nb[0]. Par exemple si nb = 101 et si R = 0, le premier niveau va dcaler de 4 bits vers la gauche (sa ligne CS est 1), transformant E = (e7, e6, e5, e4, e3, e2, e1, e0) en (e3, e2, e1, e0, 0, 0, 0, 0). Le second niveau va laisser passer ce vecteur sans le transformer. Le niveau du bas va effectuer un dcalage de 1, transformant le vecteur en (e2, e1, e0, 0, 0, 0, 0, 0). Au total, cest donc bien 4 + 1 = 5 dcalages gauche qui ont t effectus. Bien sr, une telle organisation est gnralisable un nombre quelconque de bits. Un

110

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR

Figure IV.21. Organisation en 3 niveaux (barillets) dun dcaleur 8 bits. Chaque niveau dcale dans un sens ou un autre dun nombre de positions gal une puissance de deux, si sa ligne CS est 1. Leurs combinaisons permettent toutes les valeurs de dcalage. dcaleur 32 bits serait constitu de 5 tages, forms de dcaleurs xes de 16, 8, 4, 2 et 1 bits. Laccroissement en complexit et en temps de propagation augmente donc en log(n), ce qui est trs satisfaisant. Il nous reste seulement rsoudre le problme de la fabrication des dcaleurs sur un nombre de positions xes. Ce sont des circuits combinatoires simples ; voici par exemple le code SHDL dun dcaleur 2 bits :
module shift2(r,cs,e7,e6,e5,e4,e3,e2,e1,e0 :s7,s6,s5,s4,s3,s2,s1,s0) s7=e7*/cs+cs*/r*e5 ; s6=e6*/cs+cs*/r*e4 ; s5=e5*/cs+cs*/r*e3+cs*r*e7 ; s4=e4*/cs+cs*/r*e2+cs*r*e6 ; s3=e3*/cs+cs*/r*e1+cs*r*e5 ; s2=e2*/cs+cs*/r*e0+cs*r*e4 ; s1=e1*/cs+cs*r*e3 ; s0=e0*/cs+cs*r*e2 ; end module

Les termes en /cs recopient lentre sur la sortie de mme rang, et il ny a donc pas de dcalage. Les termes en cs*/r grent le dcalage gauche de 2 positions, et les termes en cs*r grent le dcalage droite de 2 positions. Finalement, le code SHDL complet dun dcaleur barillet sur 8 bits est donn gure IV.22.

7. Dcaleur barillet
;; Dcaleur barillet 8 bits. ;; r = sens dcalage (1=droite); amplitude = nb2..0 module barrelshifter8(r,nb2,nb1,nb0,e7,e6,e5,e4,e2,e1,e0:s7,s6,s5,s4,s3,s2,s1,s0) shift4(r,nb2,e7,e6,e5,e4,e3,e2,e1,e0:s7,x6,x5,x4,x3,x2,x1,x0); shift2(r,nb1,x7,x6,x5,x4,x3,x2,x1,x0:y7,y6,y5,y4,y3,y2,y1,y0); shift1(r,nb0,y7,y6,y5,y4,y3,y2,y1,y0:s7,s6,s5,s4,s3,s2,s1,s0); end module ;; Dcale de 4 bits si cs=1, laisse inchang sinon. r = sens de dcalage (1=droite) module shift4(r,cs,e7,e6,e5,e4,e3,e2,e1,e0:s7,s6,s5,s4,s3,s2,s1,s0) s7=e7*/cs+cs*/r*e3 ; s6=e6*/cs+cs*/r*e2 ; s5=e5*/cs+cs*/r*e1 ; s4=e4*/cs+cs*/r*e0 ; s3=e3*/cs+cs*r*e7 ; s2=e2*/cs+cs*r*e6 ; s1=e1*/cs+cs*r*e5 ; s0=e0*/cs+cs*r*e4 ; end module ;; Dcale de 2 bits si cs=1, laisse inchang sinon. r = sens de dcalage (1=droite) module shift2(r,cs,e7,e6,e5,e4,e3,e2,e1,e0:s7,s6,s5,s4,s3,s2,s1,s0) s7=e7*/cs+cs*/r*e5 ; s6=e6*/cs+cs*/r*e4 ; s5=e5*/cs+cs*/r*e3+cs*r*e7 ; s4=e4*/cs+cs*/r*e2+cs*r*e6 ; s3=e3*/cs+cs*/r*e1+cs*r*e5 ; s2=e2*/cs+cs*/r*e0+cs*r*e4 ; s1=e1*/cs+cs*r*e3 ; s0=e0*/cs+cs*r*e2 ; end module ;; Dcale de 1 bit si cs=1, laisse inchang sinon. r = sens de dcalage (1=droite) module shift1(r,cs,e7,e6,e5,e4,e3,e2,e1,e0:s7,s6,s5,s4,s3,s2,s1,s0) s7=e7*/cs+cs*/r*e6 ; s6=e6*/cs+cs*/r*e5+cs*r*e7 ; s5=e5*/cs+cs*/r*e4+cs*r*e6 ; s4=e4*/cs+cs*/r*e3+cs*r*e5 ; s3=e3*/cs+cs*/r*e2+cs*r*e4 ; s2=e2*/cs+cs*/r*e1+cs*r*e3 ; s1=e1*/cs+cs*/r*e0+cs*r*e2 ; s0=e0*/cs+cs*r*e1 ; end module

111

Figure IV.22. Code SHDL complet dun dcaleur barillet sur 8 bits.Chaque dcaleur xe de 4, 2 et 1 bits est prsent sous forme de module spar.

8. Lunit arithmtique et logique


8.1. Fonction dune UAL
Dans un processeur, on regroupe souvent dans la mme unit fonctionnelle les diffrents oprateurs darithmtique entire (additionneurs,multiplieurs, etc.), les oprateurs de logique boolenne (AND, OR, etc.) et les oprations de dcalage et de rotation de bits. On appelle un tel module unit arithmtique et logique (UAL), et elle a la forme de la gure IV.23 suivante : Les oprations que ralise lUAL ont une arit de 2, et parfois 1. Les oprandes sont prsents sur deux bus A et B de mme largeur ; on indique sur F le code dune opration effectuer (par exemple, une addition), et le rsultat est disponible sur le bus de sortie F(A,B) aprs un certain temps de propagation des calculs. Les ags ou indicateurs, nots souvent

112
A

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR


B

N,Z,V,C

UAL

F(A,B)

Figure IV.23. Unit arithmtique et logique.F code lopration effectuer ; les oprandes sont A et B et le rsultat est S. Les indicateurs N,Z,V,C donnent des informations sur la nature du rsultat. N, Z, V, C donnent des informations sur le rsultat de lopration. N indique que le rsultat est ngatif, Z indique quil est nul, V indique un dbordement et C indique la prsence dune retenue. Il faut noter que lUAL est un oprateur combinatoire : il na pas dhorloge, et le rsultat dune opration nest disponible quaprs un temps variable (mais born).

8.2. UAL par tranches de 1 bit


Assez souvent, une UAL de n bits est forme de lassociation de n UAL de 1 bit, appeles tranches de bit (bit slice). Considrons par exemple les schmas des gures IV.24 et IV.25 dune UAL 1 bit qui effectue lune des 4 oprations : ET logique, OU logique, complment ou addition sur les deux entres A et B.

A 2 F1,F0

B F1 F0

UAL
1 bit
CIN S COUT

0 0 0 1 1 0 1 1

AND OR NOT A ADD

Figure IV.24. Unit arithmtique et logique de 1 bit. CIN et COUT ne sont utiliss que pour lopration daddition. CIN est une retenue entrante et COUT une retenue sortante : lorsque laddition est slectionne (F1F0=11), cest la somme A + B + CIN qui est effectue, et le rsultat est disponible sur S, avec une ventuelle retenue sortante place sur COUT. On voit que lquation du rsultat S est un

8. Lunit arithmtique et logique


F1,F0
// multiplexeur 4 vers 1 MODULE MUX4TO1(E[3..0],C[1..0] :S) S=/C1*/C0*E0+/C1*C0*E1+C1*/C0*E2*C1*C0*E3 ; END MODULE // majorit 3 entres MODULE MAJ3(X,Y,Z :MAJ) MAJ=X*Y+X*Z+Y*Z; END MODULE MODULE UAL1BIT(F1,F0,A,B,CIN :S, COUT) MUX4TO1(E3,E2,E1,E0,F1,F0 :S); E0=A*B ; E1=A+B ; E2=/A ; E3=/A*/B*CIN+/A*B*/CIN+A*/B*/CIN+A*B*CIN ; MAJ3(A,B,CIN :COUT) END MODULE

113

A B

0 1 S

CIN

2 3 COUT MAJ3

Figure IV.25. Structure interne et description SHDL de lUAL 1 bit. multiplexeur, command par les quatre combinaisons de F1et F0.Les quatre termes associs laddition reprsentent le ou exclusif entre A, B et CIN. Les termes correspondants aux autres oprations parlent deux-mmes ; on voit que seule lopration de complmentation est unaire. La gure IV.26 montre lassemblage de 4 tranches dUAL 1 bit, pour former une UAL de 4 bits. Le module traitant les bits dindice 0 a une retenue entrante force 0 ; ensuite la retenue sortante dun module devient la retenue entrante du module suivant, jusqu la retenue nale CARRY.
A0 B0 A1 B1 A2 B2 A3 B3

A 2 F1,F0 F1,F0

A F1,F0

A F1,F0

A F1,F0

UAL
1 bit
0 CIN S COUT CIN

UAL
1 bit
S COUT CIN

UAL
1 bit
S COUT CIN

UAL
1 bit
S COUT COUT

S0

S1

S2

S3

MODULE UAL4BIT(F1,F0,A3..A0,B3..B0 :S3..S0,CARRY) UAL1BIT(F1,F0,A0,B0,0:S0,C0); UAL1BIT(F1,F0,A1,B1,C0:S1,C1); UAL1BIT(F1,F0,A2,B2,C1:S2,C2); UAL1BIT(F1,F0,A3,B3,C2:S3,CARRY); END MODULE

Figure IV.26. Unit arithmtique de 4 bits forme par assemblage de 4 modules dUAL 1 bit. Bien sr, cette technique a ses limites. Elle ne peut pas implmenter des fonctions qui oprent globalement sur les n bits, telles que les dcalages ou les multiplications et divisions. Par ailleurs, laddition est particulirement inefcace cause de la propagation de la retenue, et en particulier si le nombre n de modules est grand. Pour n = 32 par exemple, le calcul

114

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR

dune addition prendra 32 p o p est le temps de calcul de laddition sur lUAL 1 bit. On peut tout de mme dans ce cas adopter la mme approche avec de meilleurs rsultats, avec des blocs lmentaires de 4 bits par exemple, dans lesquels on aura optimis le calcul de la retenue.

9. Circuit timer/PWM
Principe Un circuit timer/PWM gnre un signal cyclique rectangulaire dont les paramtres sont programmables. Ces paramtres sont : 1 2 la priode P, exprime en nombre de cycles de lhorloge gnrale. la dure D lintrieur de cette priode o la sortie vaut 0, exprime en nombre de cycles.

La gure IV.27 illustre la forme du signal recherch.

Figure IV.27. Signal priodique gnr par un circuit timer/PWM. Le terme PWM (Pulse Width Modulation : modulation en largeur dimpulsion) fait rfrence une technique utilise frquemment pour moduler lnergie fournie certains dispositifs tels que des lampes, des moteurs courant continu, etc. Plutt que de leur fournir une tension variable, difcile produire avec prcision, on leur fournit un signal priodique dont on fait varier le rapport cyclique entre les moments o la tension est maximale et ceux o la tension est nulle (P N sur la gure). La frquence 1 doit tre assez leve pour viter P P les accoups ou les clignotements, mais pas trop leve pour viter dventuels effets nfastes. Par exemple, les LEDs haute luminosit qui quipent les feux de stop et arrire des voitures ont leur luminosit commande de cette manire. Le circuit sera plutt appel timer si on nexploite que les fronts montants ou descendants du signal de sortie, pour gnrer une interruption par exemple. Organisation Pour raliser un timer/PWM sur n bits, on utilise un compteur n bits et deux comparateurs n bits, qui comparent en permanence la valeur du compteur aux deux paramtres P et N (gure IV.28). Le compteur dispose dune remise zro synchrone (voir section 10.1), qui est active ds que le compteur arrive la valeur P. Ainsi il va compter 0, 1, , P, cest dire avec une priode de P+1 cycles dhorloge.

9. Circuit timer/PWM

115

Figure IV.28. Organisation dun timer/PWM sur n bits. La valeur dun compteur n bits est compare aux valeurs de N et P ; quand il atteint P il est remis 0 ; quand il dpasse N la valeur de la sortie m change. La bascule D nale prvient dventuels glitchs. Durant cette priode P+1, la valeur du compteur est compare la valeur de N, et la sortie m est le reet de cette comparaison. La sortie m nest pas directement le rsultat combinatoire de la comparaison, mais on le fait passer au travers dune bascule D, pour deux raisons : 1 2 il pourrait tre affect de glitchs dans certaines situations ; en le faisant passer au travers dune bascule D on est certain davoir un signal parfaitement propre. son timing est exactement align avec les fronts dhorloge, ce qui amliore la prcision.

La gure IV.29 donne le code SHDL dun tel circuit timer/PWM sur 4 bits. On rutilise les circuits de comptage et de comparaison dj dcrits en SHDL aux sections 10.1 et 8.9. La priode p est gale p3p0 + 1 en nombre de cycles de lhorloge clk ; la valeur n3n0 dnit la valeur n. Le timing prcis de ce module est dni par le chronogramme gure IV.30.

10. RAMs et ROMs


10.1. Introduction
Cette section est consacre aux circuits utiliss dans la mmoire centrale des ordinateurs, qui contient les programmes et les donnes manipuls par les programmes. Linformation y est stocke sous forme de mots de taille xe, dont la largeur dpend de larchitecture utilise. Ces mots mmoire sont ordonns et possdent chacun une adresse, sous forme dun nombre. On peut donc voir une mmoire comme un ruban de cases numrotes :

116

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR

// priode = p3..p0, m 1 aprs n3..n0 module pwm(rst,clk,en,p3..p0,n3..n0: m) cpt4(rst,clk,eq,en :c3..c0); cmp4(c3..c0,p3..p0 :sup,eq); cmp4(c3..c0,n3..n0 :supn,eqn); m:=dm ; m.clk=clk ; m.rst=rst ; dm=supn+eqn ; end module // compteur 4 bits avec raz synchrone // utilise des bascules T avec raz sync. module cpt4(rst,clk,sclr,en :a,b,c,d) tclr(rst,clk,sclr,en :d); tclr(rst,clk,sclr,tc :c); tc=en*d ; tclr(rst,clk,sclr,tb :b); tb=en*c*d ; tclr(rst,clk,sclr,ta :a); ta=en*b*c*d ; end module

// comparateur 4 bits non sign module cmp4(a3..a0,b3..b0 :sup3,eq) eq=eq3*eq2*eq1*eq0 ; sup3=a3*/b3+eq3*sup2 ; eq3=a3*b3+/a3*/b3 ; sup2=a2*/b2+eq2*sup1 ; eq2=a2*b2+/a2*/b2 ; sup1=a1*/b1+eq1*a0*/b0 ; eq1=a1*b1+/a1*/b1 ; eq0=a0*b0+/a0*/b0 ; end module // bascule T avec raz synchrone module tclr(rst,clk,sclr,t :q) q:=/t1*q+t1*/q ; q.clk=clk ; q.rst=rst ; t1=/sclr*t+sclr*q ; end module

Figure IV.29. criture SHDL dun timer/PWM sur 4 bits.

cpt m

n3..n0 = 2 p = 6 (p3..p0 = 5)

Figure IV.30. Exemple de chronologie des signaux du timer/PWM sur 4 bits.


donnes adresses ... 0 1 2 3 4 5 6 7 8 n2 n1 n

ou comme un tableau : donne = mem[adresse], adresse [0, n].

De telles mmoires se classent en deux grands types, selon quelles sont en lecture seule ou en lecture-criture : les RAMs (Random Access Memory) peuvent tre lues et crites, et lattribut random indique que ces lectures-critures peuvent se faire des suites dadresses totalement quelconques, par opposition des mmoires de type squentiel (comme les disques durs) qui font des sries daccs des adresses conscutives. Les ROMs (Read Only

10. RAMs et ROMs

117

Memory) sont fonctionnellement identiques aux RAMs, mais ne permettent que la lecture et pas lcriture. Utilises dans la mmoire centrale dun ordinateur, les RAMs pourront stocker les programmes et les donnes, alors que les ROMs vont seulement stocker des programmes invariables, comme par exemple le programme excut au dmarrage de la machine, et stock dans la ROM dite de BIOS. Dans certains ordinateurs plus anciens, tout le systme dexploitation tait stock en ROM, ce qui permettait davoir un systme incorruptible et au dmarrage rapide. Une RAM peut tre statique ou dynamique. Chaque bit mmoire dune RAM statique (SRAM) est constitu dune bascule, et conserve son tat tant quelle est alimente. A linverse, chaque bit dune RAM dynamique (DRAM) est compos dune capacit, qui doit tre rafrachie priodiquement par une lectronique spare. Les RAMs statiques ont un taux dintgration plus faible que les RAM dynamiques, puisquun bit mmoire ncessite 6 transistors dans un cas, et une capacit plus un transistor dans lautre. Une RAM peut tre synchrone ou asynchrone, une RAM synchrone tant en fait une RAM asynchrone laquelle on a ajout une machine tats nis synchrone qui place les commandes de lecture et dcriture dans un pipeline, an de permettre daccepter une nouvelle commande avant que la prcdente nait t complte. Les barrettes de RAM de nos ordinateurs personnels sont des SDRAM, cest dire des RAM dynamiques synchrones, fonctionnant des frquences de 200MHz et plus. Elles sont souvent de type DDR (double data rate), quand les fronts montants et descendants de lhorloge sont exploits pour les changements dtat. Dans beaucoup dautres appareils (assistants personnels, consoles de jeux, etc.), la RAM est de type statique asynchrone (SRAM), sous la forme de circuits intgrs. Les ROMs existent galement dans un grand nombre de types diffrents, principalement selon la faon dont on peut programmer leur contenu (invariable, par dnition). Il y a dabord les ROMs programmes par masque lusine ; elles sont produites en grand nombre avec un faible cot lunit, mais leur contenu ne peut jamais tre mis jour ultrieurement. Les PROMs (Programmable Rom) sont programmables par un appareil spcial, qui gnralement dtruit par un courant fort une liaison interne correspondant un bit. Les EPROMs (Erasable PROM) fonctionnent de la mme faon, mais possdent une fentre transparente et peuvent tre effaces par une exposition dune vingtaine de minutes aux rayons ultraviolets. Elles sont maintenant souvent remplaces par des EEPROMs (Electrically EPROM), reprogrammables lectriquement. Les mmoires Flash sont galement une forme de mmoires effaables lectriquement, mais on rserve gnralement le terme EEPROM aux mmoires capables deffacer lchelle du mot, et le terme mmoires Flash celles qui effacent lchelle de blocs. Dans les deux cas, le temps deffacement est long par rapport au temps de lecture, et elles ne peuvent pas tre considres comme une forme spciale de RAM. On trouve de la mmoire EEPROM et ash dans les assistants personnels, dans les sticks mmoire sur ports USB, pour le stockage du rmware de nombreux appareils (BIOS dordinateurs, lecteurs de DVD, tuners satellites, etc.)

10.2. Mode demploi des mmoires statiques asynchrones


Les mmoires statiques ont gnralement une organisation et un mode demploi

118

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR

spcique. On a vu la section prcdente que chaque bit dune telle mmoire tait stock dans une bascule, ce qui conduit pour les formes les plus simples sparer les donnes crire des donnes lues, de la mme faon que sont spares lentre et la sortie dune bascule. La gure IV.31 montre linterface dun tel circuit.
n m DIN ADR W CE DOUT n

Figure IV.31. Interface dun botier de RAM statique asynchrone de 2m mots de n bits,avec sparation des donnes lues et des donnes crire. Le mode demploi de ce circuit est le suivant : Lecture dun mot mmoire 1. 2. activer la ligne CE (Chip Enable), placer ladresse du mot sur les m lignes dadresse ADR et garder inactive la ligne W (write). aprs un certain temps appel temps daccs en lecture, le mot mmoire (de largeur n) plac cette adresse est disponible sur les lignes DOUT (Data Out).

criture dun mot mmoire 1. activer la ligne CE (Chip Enable), placer ladresse du mot sur les m lignes dadresse ADR, placer la donne crire sur les n lignes DIN (DataIn) et activer la ligne W (write). aprs un certain temps appel temps dcriture, le mot (de largeur n) est crit en mmoire, et pourra tre lu ultrieurement.

2.

Le temps dcriture est gnralement voisin du temps daccs en lecture ; ces temps varient dune dizaine de nanosecondes pour les mmoires statiques les plus rapides une centaine de nanosecondes. En pratique, les botiers disponibles mettent en commun les lignes DIN et DOUT, de faon minimiser le nombre de broches, et faciliter linterconnexion de plusieurs botiers. De tels circuits ont linterface et la structure suivante : Une entre supplmentaire OE (Output Enable) est ncessaire, qui fonctionne de la faon dcrite page 98. Lors de lcriture dun mot mmoire, la ligne OE doit tre inactive, et la donne crire peut tre place sur DATA sans risque de court-circuit. Lors dune lecture en mmoire, la ligne OE doit tre active aprs le temps daccs en lecture pour que la donne lue soit disponible sur DATA. On verra plus loin comment interconnecter ces circuits ; les prcautions dj voques doivent tre respectes ici, et en particulier le risque

10. RAMs et ROMs

119

ADR W CE OE

DATA

n ADR W CE OE

n m

DIN ADR W CE

DOUT

DATA

Figure IV.32. Interface dun botier de RAM statique asynchrone de 2m mots de n bits,avec donnes lues et crites communes. quil y a davoir la fois OE active et une donne prsente en entre de DATA, qui peut conduire la destruction du circuit.

10.3. Structure interne dune mmoire statique asynchrone


Une mmoire statique de 2m mots de n bits est ralise sous forme dune matrice de 2 colonnes et n lignes de bascules D. Pour montrer un exemple facilement descriptible en langage SHDL, on peut la voir galement comme une ligne de 2m registres de n bits, tels quil ont t dcrits au chapitre prcdent. La gure IV.33 montre limplmentation dune RAM de 4 mots de 8 bits.
m
A1 A0 W mot #0 A1 A0 W mot #1 A1 A0 W mot #2 A1 A0 W mot #3

CLK CE OE CE W 8 OE

CLK CE

CLK CE

CLK CE

OE

OE

OE

DATA

MODULE RAM4X8(A[1..0],DIN[7..0],CE,W,OE: DOUT[7..0]) SEL0 = /A0*/A1 ; SEL1 = /A0*A1 ; SEL2 = A0*/A1 ; SEL3 = A0*A1 ; CLK[3..0] = SEL[3..0] * W ; OEG = OE * CE * /W ; OE_R[3..0] = OEG * SEL[3..0] ; REG8(DIN[7..0],CLK0,SEL0,OE_R0:DOUT[7..0]); REG8(DIN[7..0],CLK1,SEL1,OE_R1:DOUT[7..0]); REG8(DIN[7..0],CLK2,SEL2,OE_R2:DOUT[7..0]); REG8(DIN[7..0],CLK3,SEL3,OE_R3:DOUT[7..0]); END MODULE

Figure IV.33. Implmentation en SHDL dune RAM statique asynchrone de 4 mots de 8 bits.

120

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR

Les sorties des registres sont relies entre elles, mais il ny a pas de risque de court-circuit car leurs lignes OE sont indirectement relies quatre termes SEL3..SEL0 mutuellement exclusifs. Lorsquune adresse i est prsente sur A1,A0, seul le registre dindice i va avoir sa ligne CE active, cest dire que lui seul va tre slectionn. Sil sagit dune lecture (W = 0), il va fournir son contenu sur sa sortie si OE = 1. Sil sagit dune criture, le front montant sur W va crer un front montant sur lentre CLK de la bascule, et donc crire la donne place sur DATA dans le registre. En fait, chacun de ces registres doit tre vu comme une colonne de plusieurs bascules D, ce qui donne en ralit lorganisation matricielle voque en dbut de section, qui dans lexemple comporterait 8 lignes et 4 colonnes. Ce type dorganisation est idal pour une ralisation industrielle ; ajouter une ligne dadresse revient multiplier par deux le nombre de colonnes, tout en gardant la mme structure gnrale. Cest ainsi que, la technologie samliorant, la taille des puces mmoire continue de crotre peut prs dun facteur 2 tous les 18 mois, cest dire la vitesse prvue par la loi de Moore.

10.4. Mode demploi des mmoires dynamiques asynchrones


Les mmoires dynamiques ont gnralement une organisation lgrement diffrente des mmoires statiques, mme si cette diffrence nest pas attribuer leur nature statique ou dynamique. Leur interface est celui de la gure IV.34.
n m n

DIN ADR RAS CAS W

DOUT

Figure IV.34. Interface dun botier de RAM dynamique asynchrone de 22m mots de n bits. On remarque dabord quil ny a pas de ligne de validation (CE ou CS), et que deux nouvelles lignes RAS et CAS sont prsentes. La lgende de la gure parle de 22m mots de n bits, alors quon ne voit que m lignes dadresses. On va voir quen fait, ces m lignes sont multiplexes, et quon y prsente successivement un numro de ligne sur m bits, puis un numro de colonne sur m bits, pour accder une cellule mmoire dans une matrice de m m 2 x 2 = 22m cellules mmoire. La prsentation des numros de ligne et de colonne est synchronise par les signaux RAS et CAS. RAS signie slection de ligne dadresse (Row Address Select); CAS signie slection de colonne dadresse (Column Address Selection).Le botier est inactif tant que RAS et CAS sont inactifs. Les chronologies de lecture et dcriture sont montres gures IV.35 et IV.36. Pour une lecture ou une criture, on place dabord un numro de ligne sur ADR, qui est obtenu en prenant la moiti de ladresse complte, gnralement les poids forts et on active ensuite la ligne RAS (front descendant). On place ensuite sur ADR lautre moiti de ladresse complte, gnralement les poids faibles, et on active ensuite la ligne CAS (front descendant). En cas de lecture (W = 1) la donne sera disponible sur DOUT ; en cas

10. RAMs et ROMs


ADR

121

RAS CAS W

11111 00000 11111 00000

numro ligne

numro colonne

111111 000000 111111 000000

DOUT

11111111111111111111 00000000000000000000 11111111111111111111 00000000000000000000


donne lue

Figure IV.35. Chronogramme de lecture dans une mmoire dynamique.


ADR

RAS CAS W

11111 00000 11111 00000

numro ligne

numro colonne

111111 000000 111111 000000

DIN

11111111111111111111 00000000000000000000 11111111111111111111 00000000000000000000


donne crire

Figure IV.36. Chronogramme dcriture dans une mmoire dynamique. dcriture il faudra placer la donne sur DIN. Un cycle spcique de rafrachissement existe galement, qui opre sur des lignes entires de cellules. Chaque ligne doit tre rafrachie typiquement toutes les 5ms, et cela nest pas fait automatiquement par le circuit : cest la logique de commande qui est autour qui doit sen charger. Un tel mode de fonctionnement correspond la structure interne de la gure IV.37. On voit que, lorsque le numro de ligne est prsent sur ADR et quun front descendant est appliqu sur RAS, ce numro de ligne est stock dans le registre de ligne. Sa valeur est dcode et slectionne une des 2m lignes de la matrice. De la mme faon, lorsque le numro de colonne est prsent sur ADR et quun front descendant est appliqu sur CAS, ce numro est stock dans le registre de colonne, dont la valeur est galement dcode et slectionne une des colonnes. Une des cellules mmoire est ainsi slectionne. En cas de lecture (W = 1) la donne sera disponible sur DOUT ; en cas dcriture il faudra placer la donne sur DIN. La mise en oeuvre de ces circuits est plus complexe que celle des mmoires asynchrones, puisquon ne peut plus prsenter ladresse entire directement. On est oblig de la prsenter en deux fois, gnralement poids forts dabord (numro de ligne) et poids faibles ensuite (numro de colonne), ce qui peut tre fait laide dun multiplexeur.

122
m ADR

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR

m registre + dcodeur colonne CAS

registre + dcodeur ligne

amplificateurs n RAS W DIN n DOUT

Figure IV.37. Structure interne dune mmoire dynamique de 22m mots de n bits.

11. Exercices corrigs


11.1. Exercice 1 : association de dcodeurs
nonc Associer deux dcodeurs 2 vers 4 avec entre de validation, pour former un dcodeur 3 vers 8 avec entre de validation. On pourra ajouter quelques composants combinatoires simples si ncessaire. Solution Posons le problme en termes plus visibles. On cherche en fait complter la gure suivante :

11. Exercices corrigs

123

E2 E1 E0

E1 E0 EN

S3 S2 S1 S0

S7 S6 S5 S4

#1
E1 E0 EN EN S3 S2 S1 S0 S3 S2 S1 S0

#2

Il est clair que les sorties du dcodeur nal seront lunion des sorties des deux dcodeurs #1et #2. Par ailleurs, lorsque EN = 0, aucun des deux dcodeurs ne doit tre actif, ce qui peut tre garanti avec une porte ET sur leur entre EN. Cela donne le schma partiel suivant :
E2 E1 E0 EN E1 E0 S3 S2 S1 S0 S7 S6 S5 S4

#1
E1 E0 EN EN S3 S2 S1 S0 S3 S2 S1 S0

#2

Considrons maintenant le statut de E2 : lorsquil vaut 0, cest que la valeur prsente sur le vecteur E2..E0 est comprise entre 0 et 3, et cest une sortie du dcodeur #2 qui doit tre active ; lorsquil vaut 1, cest que la valeur de E2..E0 est comprise entre 4 et 7, et cest une sortie du dcodeur #1qui doit tre active.Par ailleurs, que ce soit pour le dcodeur #1ou #2, il est facile de voir que le numro de la sortie activer a pour indice la valeur de E1,E0. Finalement, la solution est visible sur le schma suivant :

124

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR

E2 E1 E0

E1 E0 EN

S3 S2 S1 S0

S7 S6 S5 S4

#1
E1 E0 EN EN S3 S2 S1 S0 S3 S2 S1 S0

#2

Bien sr, puisque le module construit a lui mme une entre de validation, il peut tre associ un autre pour former un dcodeur 4 vers 16, etc. On a ici un bel exemple de cascadabilit (ou rcursivit matrielle).

11.2. Exercice 2 : fonctions combinatoires boolennes ralises avec des dcodeurs, multiplexeurs ou mmoires
nonc Raliser la fonction majorit trois entres avec : un dcodeur 3 vers 8, ou un multiplexeur 8 vers 1, ou une ROM 8 1. Solution Le circuit quon cherche implmenter possde trois entres et une sortie. On rappelle que la fonction majorit trois entres vaut 1 si et seulement si au moins deux de ses entres (sur trois) sont 1 ; elle est utilise notamment pour le calcul de la retenue dans les additionneurs. Dun point de vue algbrique, si on appelle E2,E1,E0 les entres, les 4 minterms souhaits dans le rsultat sont : E2 E1 E0, E2 E1 E0, E2 E1 E0, E2 E1 E0. Avec un dcodeur 3 vers 8, il suft de relier les trois entres aux entres du dcodeur. Chacune des 8 sorties est associe chacun des 8 minterms possibles pour une fonction combinatoire 3 entres. On relie ensuite par un OU les 4 sorties correspondant aux 4 minterms dsirs.
000 001 010 011 100 101 110 111

E2 E1 E0

Figure IV.38. Fonction majorit 3 entres ralise avec un dcodeur 3 vers 8.

11. Exercices corrigs

125

Avec un multiplexeur 8 vers 1 (gure IV.39), on sait que les entres doivent tre relies aux lignes de commande, qui sont bien au nombre de 3 pour un multiplexeur 8 vers 1. Chacune des 8 entres du multiplexeur correspond un des 8 minterms possibles, et on force un 1 sur chaque entre associe un minterm quon souhaite inclure.

0 0 0 1 0 1 1 1

0 1 2 3 4 5 6 7 MAJ3(E2..E0)

E2..E0

Figure IV.39. Fonction majorit 3 entres ralise avec un multiplexeur 8 vers 1.On force un 1 sur chaque entre associe un minterm quon souhaite inclure dans la fonction. Le vecteur E2..E0 sert slectionner cette entre. Avec une ROM, on relie les trois entres aux 3 lignes dadresse de la mmoire (gure IV.40). Elle en a bien trois, puisque lnonc nous parle dune mmoire de 8 mots, soit 23. On sait qualors la ROM peut implmenter nimporte quelle fonction combinatoire 3 entres, pourvu que les mots mmoire quelle contient aient les bonnes valeurs. En loccurrence, chaque vecteur dentre est vu comme une adresse, et son contenu (ici un seul bit) doit tre la valeur attendue pour la fonction. On a indiqu sur le schma le contenu de la ROM pour chacune des adresses.
E2 E1 E0 000 : 0 ADR 001 : 0 DATA 010 : 0 011 : 1 100 : 0 101 : 1 EN 110 : 1 111 : 1 OE

1 1

Figure IV.40. Fonction majorit 3 entres ralise avec une ROM 8 x 1. Chaque adresse correspond un minterm, et le contenu de la ROM cette adresse est la valeur attendue pour le fonction reprsente. On notera que les entres de validation EN et de sortie OE sont forces 1, pour que la mmoire soit active en permanence.

126

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR

11.3. Exercice 3 : quations dun encodeur de priorit 8 entres


nonc crire sous forme dune somme de termes les plus simples possible les quations des sorties dun encodeur de priorit 8 entres. Solution On se reportera la page 106 pour lusage dun encodeur de priorit. On rappelle la table de vrit dun tel encodeur :

E7 1 0 0 0 0 0 0 0 0

E6 * 1 0 0 0 0 0 0 0

E5 * * 1 0 0 0 0 0 0

E4 * * * 1 0 0 0 0 0

E3 * * * * 1 0 0 0 0

E2 * * * * * 1 0 0 0

E1 * * * * * * 1 0 0

E0 * * * * * * * 1 0

NUM2..0 111 110 101 100 011 010 001 000 000

ACT 1 1 1 1 1 1 1 1 0

NUM2 vaut 1 ds lors quune des entres E4, E5, E6 ou E7 est active : NUM2=E7+E6+E5+E4. NUM1 vaut 1 pour deux groupes de lignes dans la table de vrit. On a : NUM1 = E7 + /E7*E6 + /E7*/E6*/E5*/E4*E3 + /E7*/E6*/E5*/E4*/E3*E2 Daprs la loi dabsorption, la variable E7 disparat de plusieurs termes : NUM1 = E7 + E6 + /E6*/E5*/E4*E3 + /E6*/E5*/E4*/E3*E2 E7 ayant disparu, la loi dabsorption sapplique pour E6, puis sur E3 : NUM1 = E7 + E6 + /E5*/E4*E3 + /E5*/E4*/E3*E2 NUM1 = E7 + E6 + /E5*/E4*E3 + /E5*/E4*E2 On procde de faon analogue pour la simplication de NUM0 : NUM0 = E7 + /E7*/E6*E5 + /E7*/E6*/E5*/E4*E3 + /E7*/E6*/E5*/E4*/E3*/E2*E1 NUM0 = E7 + /E6*E5 + /E6*/E5*/E4*E3 + /E6*/E5*/E4*/E3*/E2*E1 NUM0 = E7 + /E6*E5 + /E6*/E4*E3 + /E6*/E4*/E3*/E2*E1 NUM0 = E7 + /E6*E5 + /E6*/E4*E3 + /E6*/E4*/E2*E1 On retrouve ainsi les quations vues plus haut la gure IV.15.

11. Exercices corrigs

127

11.4. Exercice 4 : association de mmoires statiques asynchrones


nonc Associer deux mmoires asynchrones de 2n mots de m bits pour former une mmoire de 2n mots de 2m bits, puis une mmoire de 2n + 1 mots de m bits. Solution premire association Il faut dabord remarquer que dans les deux cas, la mmoire obtenue a bien un nombre total de bits mmoire gal la somme des bits mmoire des deux parties. Chaque botier initial possde m 2n bits mmoire, et leur somme fait donc m 2n + 1. Dans la premire association, on aura 2n mots de 2m bits soit 2 m 2n = m 2n + 1 ; dans la deuxime on aura aussi les m 2n + 1 bits. Pour former une mmoire de 2n mots de 2m bits, il faut mettre essentiellement toutes les lignes des deux botiers en commun, lexception des lignes de donnes quil faut mettre en parallle. Cela donne le circuit de la gure IV.41.

m Data n ADR ADR


n

2xm Data

RAM
2 mots

CS OE W

CS OE W

de m bits

m Data n

RAM
ADR
n

2 mots CS OE R/W de m bits

Figure IV.41. Association de mmoires asynchrones, avec doublement de la largeur des donnes. Lorsquun accs mmoire (lecture ou criture) est effectu, les deux botiers sont slectionns en mme temps la mme adresse, et fournissent ou acceptent simultanment les deux moitis de largeur m de la donne globale de largeur 2m. deuxime association Pour former une mmoire de 2n + 1 mots de m bits, il va falloir mettre en commun les m lignes de donnes, et donc il ne va plus tre possible de slectionner les deux botiers en mme temps, sous peine de court-circuit.Pour une moiti des adresses, il faudra slectionner

128

CHAPITRE IV. LMENTS FONCTIONNELS DUN PROCESSEUR

le premier botier, et lautre pour lautre moiti des adresses. La manire la plus simple est ici dutiliser un des bits de ladresse de n + 1 bits, par exemple adr[n], pour faire cette slection (gure IV.42).
m Data n+1 addr[n1..0] addr[n] 0 1:2 1 CS CS OE CS OE W W Data n ADR m CS OE W n ADR m Data

ADR

RAM
2 mots de m bits
n

RAM
2 mots de m bits
n

Figure IV.42. Association de mmoires asynchrones, avec doublement du nombre dadresses. Ce bit est mis en entre dun dcodeur 1 vers 2 : sil vaut 0, cest le botier mmoire du haut qui est slectionn ; sil vaut 1 cest le botier du bas. Tout cela suppose que le signal CS global soit actif, car sil ne lest pas, le dcodeur ne slectionne aucun botier Le signal OE suit un traitement particulier : pour chaque botier, il ne doit tre actif que si le OE global est actif, et si le botier est slectionn (CS = 1). On est alors assur quaucun court-circuit nest possible, puisque les OE des deux botiers sont alors mutuellement exclusifs. Dans cette conguration, lespace des adresses de lensemble est [ 0 , 2n + 1 1] ; n, la premire moiti [0 , 2n 1] correspond au premier botier ; la seconde [2 2n + 1 1] correspond au second. Si on avait utilis le bit de poids faible de ladresse globale comme entre du dcodeur, la distribution des adresses entre les botiers aurait t diffrente : lun aurait contenu les adresses paires, et lautre les adresses impaires.

Chapitre V Programmation du processeur 32 bits CRAPS/SPARC


Le langage machine (et sa forme quivalente symbolique dite assembleur) est excut directement par le processeur, et il est ce titre lintermdiaire oblig de tous les composants logiciels dun ordinateur. Mme sil est vrai que peu de gens programment directement en assembleur, son tude est clairante pour la comprhension de la relation entre logiciel et matriel. Le but de ce prsent chapitre est dinitier la programmation en assembleur du processeur CRAPS au travers de programmes de diffrentes natures, de faon ensuite mieux comprendre son architecture et son fonctionnement.

1. Le langage machine, la frontire entre logiciel et matriel


Langage machine et ISA Les instructions quexcute un processeur sont crites dans un langage appel langage machine, et sont formes de codes crits dans des mots mmoires conscutifs ; on appelle ISA (Instruction Set Architecture) ce langage et son organisation. Linformatique utilise un grand nombre de langages diffrents : des langages de programmation tels que C ou Java pour les programmeurs, des langages interprts tels que les langages de macro des suites bureautiques, des langages de gestion de bases de donnes, etc. Mais la particularit du langage machine, cest dtre le langage intermdiaire en lequel tous les autres langages vont tre traduits, en une ou plusieurs tapes. Il est situ la frontire entre le processeur et les logiciels, entre hardware et software, et le processeur est linterprteur de ce langage (gure V.1), celui qui met en action ses instructions. ISA gnrale ou spcialise ? Bien sr, il serait plus efcace davoir un processeur qui excute directement un langage volu, tout au moins pour les programmes crits dans ce langage. De tels processeurs existent ou ont exist, notamment pour le langage Lisp, et plus rcemment pour le langage intermdiaire (bytecode) utilis en Java. Ces deux langages sont gnralistes et peuvent tre utiliss dans toutes les situations concrtes de linformatique, et lespoir des concepteurs de ces processeurs tait dlever au niveau de ces langages la frontire entre matriel et logiciel. Mais le bytecode Java exploite une machine base de pile, peu adapte la compilation dautres langages de programmation tels que C. Finalement, le compromis gnralement adopt lors de la conception dun nouveau processeur est le dveloppement dune ISA adapte la compilation de la plupart des langages de programmation courants .

129

130

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

gestionnaire de bases de donnes (langage SQL)

programme en Javascript programme en langage C

interprtation interprtation

compilation logiciel langage machine matriel interprtation

processeur

Figure V.1. Tous les programmes produisent du langage machine, qui est excut directement par le processeur. volution des ISA Comme toute structure situe une frontire, lISA est un quilibre entre des forces opposes. Les concepteurs de compilateurs souhaitent une ISA rgulire et possdant le plus de possibilits en termes dadressage mmoire, doprations arithmtiques, etc., alors que les architectes des processeurs veulent une ISA simple implmenter efcacement. Une force importante qui limite lapparition de nouvelles ISAs (de nouveaux langages machine) est la demande des clients dune compatibilit ascendante dun processeur dune gnration lautre, de faon pouvoir faire fonctionner sans changement leurs anciens programmes. Cette force se manifeste de faon trs puissante avec les processeurs de PC (dont lISA est souvent dsigne par x86, parce que les noms des processeurs se terminent par 86 : 8086, 80286, etc.), pour laquelle tout changement conduisant une non compatibilit est exclu. Ainsi, les processeurs x86 les plus rcents continuent manifester la bizarrerie dcriture en mmoire inverse de type little-endian, parce quelle tait prsente lorigine sur le processeur 8 bits Intel 8080 pour des motifs de simplicit de conception, et quelle sest transmise pour raison de compatibilit tout le long de la chane 8080, 8085, 8086, 80286, 80386, Pentium, Pentium 2, etc. jusquaux processeurs des PCs actuels. Dautres processeurs moins connus ont galement une ligne trs longue et respectable. On peut citer le processeur ARM, un des premiers processeurs 32 bits commercialiss, qui fait voluer son ISA de faon ascendante depuis les annes 80 jusqu maintenant, et qui quipe un grand nombre de tlphones portables, les consoles de jeux portables Nintendo et un grand nombre dappareils mobiles. Processeurs CISC et RISC Une nouvelle gnration de processeurs est apparue dans les annes 80, caractrise par un jeu dinstruction limit lessentiel, do leur nom de processeurs RISC (Reduced Instruction Set Computer). Par ailleurs, leur ISA est gnralement trs rgulire, contient beaucoup de registres utilisateurs, et les instructions sont codes sous forme dun mot mmoire unique. Tout cela rend heureux les architectes du processeur, qui peuvent concevoir des architectures trs efcaces pour cette ISA, et ne rend pas trop malheureux les

1. Le langage machine, la frontire entre logiciel et matriel

131

concepteurs de compilateurs, qui ont un peu plus de difcult traduire les programmes, mais qui apprcient le gain en vitesse dexcution. Par opposition, les anciens processeurs tels que les x86 ont t rebaptiss processeurs CISC (Complex Instruction Set Computer), et si ce ntait lnorme investissement d au succs du PC avec lISA x86, les processeurs RISC auraient connus un dveloppement plus immdiat et plus large. On les trouve nanmoins dans la plupart des stations de travail, dans les processeurs de Macintosh, et dans les consoles de jeux Sony PS[123], avec les performances que lon sait.

2. Ressources du programmeur CRAPS/SPARC


Le langage machine de CRAPS est un sous ensemble du langage machine du SPARC de SUN (au cas o vous ne lauriez pas encore remarqu, CRAPS = SPARC lenvers !), avec un certain nombre de limitations. Cest donc un langage de type RISC, qui sera compatible avec le SPARC au niveau binaire. Nanmoins il nexploite pas la notion SPARC de fentre de registres et il na pas dinstruction darithmtique ottante.

Figure V.2. Le simulateur du processeur CRAPS. Il permet de dvelopper des programmes et dobserver leur fonctionnement logiciel et matriel jusqu lchelle du bit. Une fois au point, ils peuvent tre transfrs en mmoire et excuts par le processeur rel. An de rendre plus concrtes les descriptions qui sont suivre, on va progressivement programmer le petit algorithme suivant qui fait la somme des 10 lments dun tableau :
rsultat <- 0 ; pour i de 0 9 faire rsultat <- rsultat + TAB[i] ; fin pour

2.1. Types de donnes de CRAPS


CRAPS est un processeur 32 bits : cela signie que les mots mmoire quil manipule le plus directement ont 32 bits de large, et que tous ses registres sont de 32 bits. Il peut nanmoins lire et crire en mmoire des mots de 8 bits (octets) avec des instructions daccs mmoire spciques. Les entiers signs sont cods en complment 2 et les oprations arithmtiques disponibles sont laddition et la soustraction sur 32 bits, la multiplication 16 bits X 16 bits vers 32 bits et la division 32 bits / 16 bits vers 32 bits. Il ne dispose pas de registres pour les nombres ottants, ni dinstruction darithmtique ottante. Si des calculs sur des rels doivent tre effectus, ils doivent tre excuts par des librairies logicielles spcialises. Aucun autre type de donnes nest explicitement support. Les chanes de caractres, les listes etc. devront tre assembles et manipules en combinant les oprations sur les octets et les mots de 32 bits.

132

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

2.2. Les registres de CRAPS


Les registres banaliss CRAPS possde 32 registres directement accessibles au programmeur (gure V.3). On
toujours 0 %r0 %r1 %r2 registres banaliss

... pointeur de pile utilis par call %r29 %r30 %r31

Figure V.3. Les registres du processeur CRAPS. Certains ont dj des fonctions assignes. les note %r0, %r31. Ils sont tous accessibles librement en lecture et en criture, mais %r0 a un statut spcial : il vaut toujours 0 en lecture, quelles que soient les critures quon fasse dedans. Cette bizarrerie est en fait trs commode et on verra par la suite comment elle est exploite. %r30 sera gnralement utilis comme pointeur de pile (mais cest une convention qui nest pas impose par le matriel), et %r31 sert stocker ladresse de retour des instructions call. On utilisera souvent un troisime registre tel que %r29 comme pointeur de stack frame (voir plus loin). Si on excepte donc ces 4 registres spciaux, le programmeur dispose de 28 registres quil peut utiliser sa guise dans ses oprations locales, ce qui est un grand confort et permet de limiter grandement le nombre daccs la mmoire centrale. Notre algorithme se transforme de la faon suivante :
%r1 <- 0; pour %r2 de 0 9 faire %r3 <- TAB[%r2] ; %r1 <- %r1 + %r3 ; fin pour

Trois registres utilisateurs sont dj mobiliss, et ce nest quun dbut ! On voit lintrt quoffre au programmeur une ISA fournissant beaucoup de registres utilisateurs. Les registres spciaux Les autres registres ne sont gnralement pas accessibles directement par le programmeur et sont utiliss pour la gestion du fonctionnement interne du processeur. On trouve : %pc (Program Counter), qui contient ladresse de linstruction en cours dexcution. %ir (Instruction Register), qui contient linstruction en cours dexcution.

2. Ressources du programmeur CRAPS/SPARC

133

%psr (Program Status Register) qui contient des informations sur ltat de lexcution. Son format est donn gure V.4, et son rle dtaill sera dcrit dans des sections ultrieures.
icc N Z V C 31 23 20 PIL 11 S 8 7 ET 5 0

icc = codes conditions (N, Z, V, C) PIL = niveau dexcution courant S = bit superviseur ET = enable trap = exceptions autorises

Figure V.4. %psr. (Program Status Register)

%tbr (Trap Base Register), qui contient ladresse de la table des exceptions. Son rle dtaill sera dcrit dans les sections ultrieures.

2.3. Le modle mmoire de CRAPS


Comme la plupart des processeurs actuels, lISA de CRAPS voit la mmoire sous forme dun ruban doctets situs des adresses conscutives (gure V.5).
octets adresse 0 1 2 3 4 ... 2 3 2 2 2 1
32 32 32

Figure V.5. La mmoire de CRAPS est un ruban doctets,numrots par des adresses allant de 0 232 1. Les adresses seront prsentes dans CRAPS sous forme de mots de 32 bits, dnissant ainsi une mmoire centrale pouvant compter jusqu 232 cases, soit 4 giga-octets, les adresses allant de 0 232 1. Le fait davoir 32 lignes dadresses sera commode dans CRAPS pour manipuler les adresses lintrieur des registres. Ce choix ntait pas obligatoire, et on aurait pu imaginer un nombre de lignes dadresses infrieur ou suprieur la taille du mot mmoire du processeur, ici 32. En pratique, lensemble de cet espace dadressage nest souvent pas entirement occup par de la mmoire physique. Un mcanisme de dcodage des adresses que lon tudiera au chapitre suivant permettra dassocier un bloc dadresses particulier un botier mmoire particulier ; par ailleurs la lecture et lcriture certaines adresses ne conduira pas un simple stockage, mais dclenchera la commande de certains circuits, tels que le timer ou le circuit dentres-sorties,selon un mcanisme appel entres/sortiesmappes en mmoire, dont on tudiera limplmentation au chapitre suivant, mais que lon apprendra utiliser en tant que programmeur un peu plus loin dans ce chapitre. Reprenons notre petit algorithme de somme des nombres dun tableau. On va dsigner par mem[adr] loctet en mmoire situ ladresse adr. Notre tableau TAB en mmoire centrale est form de mots de 32 bits situs conscutivement. Comme chaque nombre de

134

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

32 bits occupe ncessairement 4 octets, les valeurs du tableau sont espaces de 4 octets en 4 octets en mmoire centrale, des adresses croissantes partir de ladresse TAB de dbut du tableau. Les 4 octets qui forment le nombre TAB[i] pour un indice i quelconque sont ainsi situs de ladresse TAB + 4i ladresse TAB + 4i + 3 (gure V.6).
lment i octets adresses ... TAB ... TAB+4i TAB+4i+3 lment i+1 ...

Figure V.6. Implantation mmoire dun tableau de nombres de 32 bits. Notre algorithme devient :
%r1 <- 0 ; %r4 <- adresse de TAB ; pour %r2 de 0 9 faire %r3 <- mem[%r4+4*%r2,...,%r4+4*%r2+3] ; %r1 <- %r1 + %r3 ; fin pour

Pour viter davoir effectuer la multiplication par 4, on peut incrmenter %r4 de 4 chaque tour de boucle :
%r1 <- 0 ; %r4 <- adresse de TAB ; pour %r2 de 0 9 faire %r3 <- mem[%r4,...,%r4+3] ; %r1 <- %r1 + %r3 ; %r4 <- %r4 + 4 ; fin pour

criture en mmoire big-endian et little-endian Un dtail dimplmentation na pas t prcis. On a dit quun mot de 32 bits tait stock en mmoire centrale sous forme de 4 octets conscutifs des adresses i, i + 1, i + 2, i + 3, mais on na pas prcis exactement dans quel ordre. Bien sr, par des oprations nes dcriture au niveau de loctet, notre programme pourrait les stocker dans nimporte lequel des 24 = 16 ordres possibles. Mais un processeur 32 bits est l pour manipuler directement des mots de 32 bits, et en particulier pour lire et crire en mmoire des mots de 32 bits, et il fait cela selon un ordre qui lui est propre. En pratique, seuls deux tels ordres de stockage sont utiliss. Lordre dit big-endian, le plus naturel, est utilis par la grande majorit des processeurs, lexception (trs notable) des processeurs x86. Il consiste stocker les octets de telle faon que le mot mmoire se lise dans lordre naturel, si on visualise le ruban mmoire de gauche droite. Ainsi pour stocker en mmoire le mot de 32 bits 0x11223344, on stockera des adresses croissantes les octets 0x11, 0x22, 0x33, 0x44. Lordre dit little-endian, utilis par les processeurs x86, stockera ce mme mot dans lordre inverse 0x44, 0x33, 0x22, 0x11 (gure V.7).

2. Ressources du programmeur CRAPS/SPARC


octets adresse 0 ... ... 0x11 0x22 0x33 0x44 i i+1 i+2 i+3 ... littleendian ... bigendian

135

octets adresse 0

... ...

0x44 0x33 0x22 0x11 i i+1 i+2 i+3

Figure V.7. Un mme mot de 32 bits 0x11223344 stock en mmoire centrale dans lordre big-endian et little-endian. Cet ordre de stockage peu naturel des processeurs x86 prend son origine dans le processeur Intel 8080, qui stockait dj un mot de 16 bits en inversant les deux octets, par commodit de conception. Pour des raison de compatibilit ascendante de leur ISA, Intel a t oblig de conserver cet tat de fait dans les successeurs 8 bits du 8080, et mme de ltendre de faon logique au stockage des mots de 32 bits, puis de 64 bits dans leurs dernires versions de Pentium. Les termes tranges big-endian et little-endian proviennent des Voyages de Gulliver dOliver Swift, lorsque Gulliver est au pays des politiciens. Une bataille politique fait rage sur la faon de casser son oeuf la coque, entre le parti des big-endians, partisans de le casser par le gros bout, et celui des little-endians partisans du petit bout ! Cette diffrence dordre de stockage est une source dincompatibilit majeure entre les processeurs x86 et les autres. On peut noter que le SPARC peut modier son ordre de stockage la vole, par le positionnement dun bit de contrle spcial.

2.4. Les instructions de CRAPS


Toutes les instructions de CRAPS sont constitues dun seul mot de 32 bits. Cette caractristique des instructions davoir une taille xe dun mot est typique des processeurs RISC, et elle facilite grandement certains aspects de leur conception. Les instructions de CRAPS sont formes de plusieurs groupes, chacun ayant une certaine structure de codage (gure V.8). La valeur du champ op permet didentier immdiatement le groupe de linstruction. lintrieur des groupes 2 et 3, ce sont les champs op2 et op3 qui permettent de distinguer les sous-groupes. Ces champs op, op2, op3 sont appels opcodes et sont un moyen de classer les instructions. Le tableau de la gure V.9 donne la signication de leurs valeurs pour le processeur CRAPS. Toutes les instructions du SPARC nont pas t reprises, mais on a conserv les mmes valeurs dopcodes pour celles qui lont t. Les diffrentes combinaisons possibles entre ces valeurs dopcodes sur les formats dinstructions conduisent au tableau dinstructions de la gure V.10. Ce tableau est remarquablement rduit ; SPARC/CRAPS mrite vritablement son qualicatif de processeur RISC. Les versions suivantes du SPARC, notamment lUltraSparc II sur 64 bits, vont ajouter cet ensemble beaucoup de formats dinstructions supplmentaires, et perdre de cette lgante simplicit.

136

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

op 0 1

Format 1 : call disp30 Format 2 : sethi et branchements rd cond op2 op2 imm22 disp22 2a 2b

op 0 0 op 0 0 0

op 1t 1t rd rd

Format 3 : accs mmoire, instructions arithmtiques op3 op3 rs1 rs1 0 1 simm13 rs2 3a 3b

t = 1 : accs mmoire, t = 0 : instruction arithmtique

Figure V.8. Structure binaire des diffrents groupes dinstructions de CRAPS.

op2 010 100

Instr. branch sethi

op3 (t = 0) 000000 010000 000100 010100 011010 010001 010010 010011 010111 110101 110110 111000

Instr. add addcc sub subcc umulcc andcc orcc xorcc xnorcc sll srl jmpl

op3 (t = 1) 000000 000001 000100 000101

Instr. ld ldub st stb

cond 1000 0001 1001 0101 1101 1110 0110 0111 1111 1010 0010 1011 0011 1100 0100

Branchement ba be bne bcs bcc bpos bneg bvs bvc bg ble bge bl bgu bleu

Figure V.9. Signications des valeurs dopcodes. Langage assembleur Dans ce tableau V.10, les instructions ont t crites, non pas en langage machine qui aurait t peu comprhensible, mais dans une criture symbolique quivalente dite criture assembleur. Pour chaque processeur, le constructeur fournit le descriptif complet

2. Ressources du programmeur CRAPS/SPARC

137

load/store
ld [%ri+reg/cst],%rj ldub [%ri+reg/cst],%rk st %ri,[%rj+reg/cst] stb %ri,[%rj+reg/cst]

lecture mmoire 32 bits lecture mmoire 8 bits criture mmoire 32 bits lecture mmoire 8 bits

contrle
call addr jmpl addr, %ri ba addr bcc addr

appel de sous-programme jump and link branchement inconditionnel branchement si condition cc vraie systme
rdpsr wrpsr wrtbr

lecture de %psr criture dans %psr criture dans %tbr

arithmtiques et logiques
addcc %ri,reg/cst,%rj subcc %ri,reg/cst,%rj umulcc %ri,reg/cst,%rj udivcc %ri,reg/cst,%rj andcc %ri,reg/cst,%rj orcc %ri,reg/cst,%rj xorcc %ri,reg/cst,%rj xnorcc %ri,reg/cst,%rj sll %ri,reg/cst,%rj srl %ri,reg/cst,%rj sethi val22, %ri

addition %rj%ri+reg/cst soustraction %rj%ri-reg/cst multiplication %rj%ri*reg/cst division %rj%ri/reg/cst AND %rj%ri and reg/cst OR %rj%ri or reg/cst XOR %rj%ri xor reg/cst XNOR %rj%ri xnor reg/cst dcalage gauche %rj%ri << reg/cst dcalage droite %rj%ri >> reg/cst %ri21..0 val22

reg/cst : registre ou constante signe sur 13 bits val22 : constante non signe sur 22 bits

Figure V.10. Les groupes dinstructions du processeur CRAPS. du jeu dinstruction en langage machine, mais aussi une criture assembleur conseille quivalente. Les dveloppeurs peuvent alors crire des programmes assembleurs, dits encore assembleurs, dont le rle est de traduire un texte source crit en langage assembleur, en la suite des codes machine correspondants. Le terme assembleur dsigne donc la fois le langage du processeur (sous sa forme symbolique) et le programme qui traduit un texte source du langage assembleur vers le langage machine. La gure V.11 montre une

138

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

instruction crite en assembleur, et son code machine quivalent.


addcc %r2, 10, %r3

10.00011.010000.00010.1.0000000001010

Figure V.11. Une instruction en assembleur CRAPS/SPARC et le code machine correspondant. Instructions synthtiques Certaines instructions semblent manquer. Par exemple, il ny a pas dinstruction de copie dun registre vers un autre, ou dinstruction qui compare 2 registres, ou encore dinstruction qui mette zro un registre. En fait, il nest pas ncessaire que ces instructions existent, car elles sont des cas particuliers dinstructions plus gnrales. Par exemple la mise 0 dun registre %ri peut se faire par linstruction orcc %r0, %r0, %ri. On exploite ici le fait que %r0 vaut toujours 0 ; le OR de 0 avec %r0 (qui vaut 0) est ainsi stock dans %ri, ce qui est le rsultat souhait. Dans la syntaxe du processeur CRAPS/SPARC gurent ainsi des instructions dites synthtiques, qui sont en fait remplaces au moment de lassemblage par la ou les instructions quivalentes. Le tableau V.12 montre lensemble des instructions synthtiques disponibles pour CRAPS. Initialisation dun registre par une constante Linstruction synthtique set val,%ri sert initialiser un registre %ri avec une constante dite immdiate, cest dire fournie directement dans le programme. Cette instruction synthtique est remplace par deux instructions sethi val31..10,%ri et orcc %ri,val9..0,%ri qui vont effectivement bien faire cette affectation, en positionnant dabord les 22 bits de poids fort avec sethi, puis les 10 bits de poids faibles avec orcc. Le fait davoir excuter deux instructions pour initialiser un registre une valeur immdiate est typique des processeurs RISC. Ceux-ci ayant des instructions de la taille de leur mot mmoire, ils ne peuvent pas dans une seule instruction fournir une donne immdiate de cette taille. On notera la prsence de linstruction synthtique setq (rajoute par rapport au SPARC) qui permet de faire une telle initialisation en une seule instruction lorsque la constante est petite (13 bits signe, cest dire entre -4096 et +4095). Elle est quivalente orcc %r0, val, %ri qui tire encore parti du fait que %r0 vaut 0. On notera galement la trs classique instruction mov %r1,%rj qui en ralit est : orcc %ri,%r0,%rj,ralisant bien la copie du contenu de %ri dans %rj. Nous pouvons maintenant mettre un certain nombre dinstructions CRAPS en face des lignes de notre petit algorithme :
clr set %r1 TAB, %r4 ; %r1 <- 0 ; ; %r4 <- adresse de TAB ;

pour %r2 de 0 9 faire ld addcc addcc [%r4], %r3 %r1, %r3, %r1 %r4, 4, %r4 ; %r3 <- mem[%r4,...,%r4+3]; ; %r1 <- %r1 + %r3 ; ; %r5 <- %r5 + 4 ;

2. Ressources du programmeur CRAPS/SPARC

139

Instruction clr %ri mov %ri,%rj inccc %ri deccc %ri notcc %ri,%rj set val31..0, %ri

Effet met zro %ri copie %ri dans %rj incrmente %ri dcrmente %ri %rj <- complment de %ri copie val dans %ri

Implmentation orcc %r0, %r0, %ri orcc %ri, %r0, %rj addcc %ri, 1, %ri subcc %ri, 1, %ri xnorcc %ri, %ri, %rj sethi val31..10, %ri orcc %ri, val9..0, %ri

setq val, %ri

copie val dans %ri ( 4096 val 4095)

orcc %r0, val, %ri

cmp %ri, %rj tst %ri negcc %ri notcc %ri,%rj nop jmp %ri ret push %ri

compare %ri et %rj teste nullit et signe de %ri inverse %ri complmente %ri en %rj no operation branchement ladresse absolue %ri retour de procdure terminale empile %ri

subcc %ri, %rj, %r0 orcc %ri, %r0, %r0 subcc %r0, %ri, %ri xnorcc %ri, %r0, %rj sethi 0,%r0 jmpl %ri, %r0 jmpl %r31+4, %r0 sub %r30, 4, %r30 st %ri, [%r30]

pop %ri

dpile %ri

ld [%r30], %ri add %r30, 4, %r30

Figure V.12. Les instructions synthtiques de CRAPS. Elles sont traduites en une criture quivalente.

fin pour

On peut remarquer la syntaxe des commentaires : un caractre ;et tout ce qui le suit jusqu la n de la ligne est ignor, de faon analogue la squence // du C/C++. Dans ce programme, ne manquent que les instructions qui vont permettre dimplmenter la structure de contrle pour fin pour. Toutes les autres instructions sont de nature squentielle, cest dire quelles sexcutent dans lordre o elles sont prsentes en mmoire, disposes des adresses croissantes de 4 en 4.

140

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

2.5. Ruptures de squence en CRAPS


Bien sr, si un processeur ntait dot que dinstructions squentielles, il serait incapable dexcuter la moindre tche un peu complexe, puisquincapable dimplmenter des boucles ou des structures de contrle de type tant que. Il faut donc absolument quil soit dot dinstructions dites de rupture de squence, qui permettent, non seulement de sauter une instruction qui nest pas la suivante, mais aussi de faire ce saut de faon conditionnelle, en fonction des rsultats des oprations prcdentes. Un registre spcial de CRAPS/SPARC appel %pc (program counter), non directement accessible au programmeur, contient en permanence ladresse de linstruction en cours dexcution. la n de lexcution dune instruction squentielle, %pc est systmatiquement incrment de 4, de sorte quau cycle dexcution suivant, le contrle est pass linstruction suivante en mmoire, place 4 octets plus loin. Branchements inconditionnels Pour effectuer un saut inconditionnel tel que ba addr, il suft que cette instruction neffectue pas lincrmentation de %pc de 4, mais au contraire force la valeur de ladresse addr dans %pc. Ainsi au cycle dexcution suivant, le processeur chargera linstruction situe cette nouvelle adresse, et le contrle sera dont transfr ce point dans le programme. Branchements conditionnels Ce saut peut galement tre fait de faon conditionnelle avec les instruction bcc telles que bne, beq, bpos, etc. A chacune de ces instructions est associ un test boolen ; si ce test est vri, le saut est effectu (%pc est alors affect avec ladresse de saut) ; sinon %pc est incrment de 4, cest dire que le saut nest pas fait et que le contrle continue en squence dans le programme, linstruction qui suit ce branchement. Le test en question est fait sur la valeur de 4 bits N, Z, V, C appels indicateurs ou ags, qui sont positionns aprs certaines instructions arithmtiques et logiques. Ils ont les signications suivantes : N indique que le rsultat de lopration est ngatif, cest dire que son poids fort est 1. Z indique que le rsultat de lopration est nul. V indique quil y a eu dbordement dune addition ou dune soustraction signe. C indique quil y a eu une retenue lors dune addition ou emprunt lors dune soustraction.

Les instructions qui affectent les ags ont un nom qui se termine gnralement par cc : addcc, xorcc, etc. Pour tre sr des ags qui sont affects ou non par une instruction, il faut se reporter sa description dtaille, prsente la n de louvrage. Par exemple les instructions ld et ldub de lecture en mmoire affectent les ags Z et N selon que la valeur lue est (ou non) nulle ou ngative (respectivement). Ce choix est contraire celui du SPARC, pour lequel les instructions de lecture en mmoire naffectent pas les ags. Nous avons jug quant nous quune lecture en mmoire est souvent suivie dun test sur la nullit ou le signe de la valeur, et donc quil tait intressant davoir les ags positionns.

2. Ressources du programmeur CRAPS/SPARC

141

Les instructions de branchement conditionnel bcc effectuent le saut pour certaines combinaisons de valeurs des ags. Les tableaux des 3 gures V.13 V.15 les dcrivent, le premier tableau prsentant les branchements conditionnels les plus simples qui ne font intervenir quun seul ag, le second prsentant les branchements associs une arithmtique signe et le troisime les branchements associs une arithmtique non signe. instruction ba beq (synonyme : bz) bne (synonyme : bnz) bneg (synonyme : bn) bpos (synonyme : bnn) bcs bcc bvs bvc opration Branch Always Branch on Equal Branch on Not Equal Branch on Negative Branch on Positive Branch on Carry Set Branch on Carry Clear Branch on Overow Set Branch on Overow Clear test 1 Z not Z N not N C not C V not V

Figure V.13. Branchements conditionnels associs un seul ag. instruction bg bge bl ble opration Branch on Greater Branch on Greater or Equal Branch on Less Branch on Less or Equal test not (Z or (N xor V)) not (N xor V) (N xor V) Z or (N xor V)

Figure V.14. Branchements conditionnels associs une arithmtique signe. instruction bgu bcc bcs bleu opration Branch on Greater Unsigned Branch on greater than, or equal, unsigned Branch on less than, unsigned Branch on Less or Equal Unsigned test not (Z or C) not C C Z or C

Figure V.15. Branchements conditionnels associs une arithmtique non signe. Les branchements du premier tableau qui ne font intervenir quun seul ag peuvent tre utiliss dans la plupart des situations simples, et on peut en les combinant nutiliser queux dans des situations plus complexes. Les branchements associs larithmtique signe et non signe des deux tableaux suivants ne se comprennent que si on suppose quune comparaison entre deux valeurs vient

142

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

dtre faite, cest dire dans un programme de la forme :


cmp bxx %ri, reg/val saut

bxx reprsente une des instructions de branchement conditionnel, et reg/val reprsente un registre ou une constante. Linstruction synthtique cmp %ri,reg/val est quivalente subcc %ri,reg/val,%r0 cest dire quelle effectue la soustraction %ri - reg/val dans le but dobtenir, non pas la valeur du rsultat en tant que telle (qui est limine dans %r0), mais plutt la valeur des ags aprs cette soustraction. Ceux-ci permettent en effet de tout savoir sur les positions respectives de %ri et de reg/val :

%ri = reg/val %ri reg/val = 0, soit Z. %ri > reg/val %ri reg/val > 0, soit N = 0 et Z = 0, soit N + Z. %ri reg/val %ri reg/val 0, soit N. %ri < reg/val %ri reg/val < 0, soit N. %ri reg/val %ri reg/val 0, soit N = 1 ou Z = 1, soit Z + N.

En arithmtique signe, on doit remplacer N par (N + V) dans ces quations pour tenir compte des situations o on compare des grands nombres en valeur absolue, et o la soustraction provoque un dbordement mais qui permet tout de mme de conclure. Cela conduit alors aux quations du tableau V.14. En arithmtique non signe, on doit remplacer N par C, car C va avoir la mme valeur que N lors de la soustraction de petites valeurs, mais va galement permettre de conclure dans des situations o la soustraction a une grande amplitude et change le signe du rsultat, telles que la comparaison de 0x00000001 et 0xFFFFFFFF : leur soustraction donne 0x00000002, avec N=0 et C=1. Seul C indique dans tous les cas quil a fallu emprunter pour soustraire les deux arguments. Cela conduit aux quations du tableau V.15. Maintenant, nous sommes prts terminer la programmation de notre algorithme :
;;;;;;;;;; somme des lments clr %r1 set TAB, %r4 clr %r2 loop: ld [%r4], %r3 addcc %r1, %r3, %r1 addcc %r4, 4, %r4 inccc %r2 cmp %r2, 9 bleu loop dun tableau ;;;;;;;;; ; %r1 <- 0 ; ; %r4 <- adresse de TAB ; ; pour i de 0 9 ; %r3 <- mem[%r4,...,%r4+3]; ; %r1 <- %r1 + %r3 ; ; %r5 <- %r5 + 4 ;

; fin pour

%r2 est initialis 0 au dbut de la boucle pour fin pour. En n de boucle, %r2 est incrment (incc %r2), puis compar 9. En toute rigueur il faut utiliser bleu puisquon fait un test non sign, mais bpos aurait fonctionn galement car les valeurs des indices restent petites.

2. Ressources du programmeur CRAPS/SPARC

143

Ici lindice i na t utilis que comme un compteur. On peut raccourcir le programme en initialisant %r2 10, et en le dcrmentant chaque tour de boucle jusqu 0 :
;;;;;;;; somme des lments dun tableau ;;;;;;;; clr %r1 ; %r1 <- 0 ; set TAB, %r4 ; %r4 <- adresse de TAB ; set 10, %r2 ; compteur 10 ld [%r4], %r3 ; %r3 <- mem[%r4,...,%r4+3]; addcc %r1, %r3, %r1 ; %r1 <- %r1 + %r3 ; addcc %r4, 4, %r4 ; %r5 <- %r5 + 4 ; deccc %r2 ; dcrmente compteur bne loop ; reboucle tq compteur <> 0

loop:

On na rien gagn en nombre dinstructions brut, car linstruction synthtique set 10,%r2 occupe en ralit 2 instructions. Mais on a fait passer le corps de la boucle de 5 4 instructions, soit un gain en vitesse de 20%. Loptimisation est ngligeable sur ce programme, mais elle peut devenir signicative quand les boucles sont parcourues un grand nombre de fois. Branchements relatifs Pour tous les branchements que nous venons de voir, ba et bcc, ce nest pas ladresse absolue du saut qui est code, mais un dplacement relatif cette adresse. Si on reprend le codage binaire de ces instructions (gure V.8), on voit que le branchement est cod dans le champ disp22 qui code un dplacement sign, en nombre de mots. Le dplacement est sign, ce qui signie quune valeur ngative conduira un saut en arrire dans le programme, et un dplacement positif un saut en avant. Le dplacement est cod en nombre de mots, cest dire quil faut le multiplier par 4 pour obtenir le dplacement en nombre doctets. Ainsi, puisque linstruction en cours dexcution a son adresse stocke dans le registre %pc, le saut conduira faire laffectation : %pc %pc + 4 * disp22 Par exemple, linstruction de notre programme bne loop dcrit un saut (conditionnel) de 4 instructions en arrire, soit un saut une adresse plus petite de 16. Cest la valeur -4 qui est code, soit :
00.0.1001.010.1111111111111111111100 bne loop

Coder le saut sous forme dun dplacement prsente deux avantages : 1 2 cest plus conomique en mmoire, puisque tout le saut est cod en une instruction dun mot. linstruction obtenue est translatable, cest dire quun programme qui ne comprend que de telles instructions peut tre plac nimporte o en mmoire. Cest une caractristique importante des programmes lorsquils doivent tre chargs par le systme dexploitation une place libre en mmoire.

Le saut effectu par ces instructions ne peut pas tre fait dune extrmit de la mmoire lautre. On peut voir sur le format binaire des instructions gure V.8 que le dplacement est cod sur 22 bits, et donc on ne peut pas faire un saut de plus de 221 instructions en avant ou

144

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

en arrire. En pratique cest une valeur trs sufsante tant que le saut est fait lintrieur dun mme programme. Branchements absolus Dans certaines situations, on peut avoir le besoin de se brancher une adresse absolue, et non une adresse locale et relative au bloc de code courant. Le systme dexploitation a ce besoin, lorsque son scheduler de tches va enlever le contrle une tche pour le donner une autre par exemple, ou lorsquil va excuter un sous-programme dinterruption. Nous en verrons des exemples plus loin dans ce chapitre. Linstruction jmpl (jump and link) remplit cette fonction. Elle a la forme :
jmpl %ri+%rj/cst, %rk

Ladresse de saut est %ri+%rj/cst ; dans %rk est stocke ladresse de linstruction jmpl, cest dire ladresse do lon part. Si on dsire faire un saut simple ladresse contenue dans %ri, on crira :
jmpl %ri, %r0

Comme dhabitude dans cette criture, le terme %rj/cst a disparu car il a t choisi gal %r0 ou la constante 0, au choix. Cette expression peut scrire de faon plus simple avec linstruction synthtique jmp %ri.

2.6. Les modes dadressage de CRAPS


Un mode dadressage est un type daccs aux donnes pour le processeur. Pour CRAPS, ils sont au nombre de 4 : 1 ladressage registre : la donne est dans un registre, spci par son numro. Par exemple :
addcc %r1, %r2, %r3

Ici les 3 donnes manipules sont dans des registres. 2 ladressage immdiat : linstruction elle-mme, dans son codage en langage machine, contient la donne. Par exemple :
addcc %r1, 2, %r3

Ici la deuxime donne (2) est code dans le champ simm13 de linstruction. 3 ladressage direct (ou absolu) : linstruction contient ladresse de la donne. Par exemple :
ld [600], %r1

%r1 est charg avec la donne situe en mmoire ladresse 600. Cette adresse 600 est code dans linstruction elle-mme (un peu comme dans un adressage immdiat), dans son champ simm13. Comme cette valeur ne peut pas dpasser 4095, ce mode dadressage est quasiment inutilisable dans CRAPS.

2. Ressources du programmeur CRAPS/SPARC 4

145

ladressage indirect : linstruction contient ladresse de ladresse de la donne. Par exemple :


ld [%r1], %r2

%r2 est charg avec la donne situe ladresse contenue dans %r1. Ladresse de ladresseest ici le numro du registre (1) qui contient ladresse de la donne. Ce mode dadressage est indispensable pour accder aux lments dun tableau de taille non connue a priori. Cest par exemple celui quon a utilis dans notre programme de calcul de la somme des lments dun tableau, pour accder aux nombres en mmoire. 5 ladressage indirect avec dplacement. Par exemple :
ld [%r1-2], %r2

Ce cas est similaire au prcdent, mais on ajoute au contenu du registre une constante (ici -2) pour obtenir ladresse de la donne.

3. Directives dun programme assembleur


Si on cherche assembler effectivement, laide de CRAPSEMU par exemple, le programme de somme des lments dun tableau tudi la section prcdente, le symbole TAB sera dclar comme indtermin. Il est en effet cens reprsenter ladresse de dbut du tableau, mais rien na t spci pour linitialiser. Une directive dans un programme assembleur est une ligne qui ne correspond pas une instruction, mais qui spcie : 1 2 la localisation en mmoire dun bloc dinstructions ou de donnes. la rservation et/ou linitialisation dun bloc de donnes.

Pour notre tableau TAB, nous avons besoin de spcier la fois son adresse, et son contenu initial, si on suppose quil est donn et non quil est le rsultat dun calcul antrieur. Le programme suivant contient les directives ncessaires :
;;;;;;;;;; zone de programme .org 0 clr set clr ld addcc addcc inccc cmp bleu ba %r1 TAB, %r4 %r2 [%r4], %r3 %r1, %r3, %r1 %r4, 4, %r4 %r2 %r2, 9 loop * ; ; ; ; ; ; ;;;;;;;;;

loop:

%r1 <%r4 <pour i %r3 <%r1 <%r5 <-

0 ; adresse de TAB ; de 0 9 mem[%r4,...,%r4+3]; %r1 + %r3 ; %r5 + 4 ;

; fin pour

;;;;;;;;;;

zone de donnes

;;;;;;;;;

146
.org .word

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC


0x1000 12, -4, 5, 8, 3, 10, 4, -1, 1, 9

TAB

Adresse dassemblage La directive .org change ladresse dassemblage courante. Avec .org 0, le programme sera assembl partir de ladresse 0. Le tableau TAB sera situ plus loin en mmoire, partir de ladresse 0x1000, grce la directive .org 0x1000. Allocation et initialisation de mots en mmoire La directive .word fournit une liste de nombres, crits en dcimal, hexadcimal ou binaire, qui seront placs en mmoire partir de ladresse dassemblage courante. Dans notre programme exemple, cela nous permet de crer un tableau et de linitialiser statiquement (cest dire avant le lancement du programme) avec 10 mots de 32 bits. Il occupera 40 octets, de 0x1000 0x1027 inclus. Voici ce que donne le listing dassemblage complet, qui imprime toutes les adresses mmoire (colonne de gauche) et leur contenu :
00000000 00000000 00000004 00000008 00000008 0000000C 00000010 00000014 00000018 0000001C 00000020 00000024 00001000 00001000 00001004 00001008 0000100C 00001010 00001014 00001018 0000101C 00001020 00001024 82900000 12000002 88912000 84900000 C6010000 82804003 88812004 8480A001 80A0A009 08BFFFFB 10800000 .org clr set clr ld addcc addcc inccc cmp bleu ba .org .word 0 %r1 TAB, %r4 %r2 [%r4], %r3 %r1, %r3, %r1 %r4, 4, %r4 %r2 %r2, 9 loop * 0x1000 12,-4,5,8,3,10,4,-1,1,9

loop:

0000000C FFFFFFFC 00000005 00000008 00000003 0000000A 00000004 FFFFFFFF 00000001 00000009

TAB

Par exemple ladresse 0x1000 on trouve 0x0000000C, cest dire 12 ; ladresse 0x1004 on trouve 0xFFFFFFFC, cest dire -4, etc.

3. Directives dun programme assembleur Allocation dune chane de caractres

147

Si on souhaite allouer une chane de caractres ou nimporte quelle squence doctets en mmoire, on utilisera la directive .byte. Un exemple fera mieux quun long discours :
MESSAGE .byte Tapez un nombre : , 10, 13, 0

.byte est suivi dun nombre quelconque darguments spars par des virgules. Ces arguments peuvent tre, soit des nombres entre 0 et 255 (comme 10, 13 et 0), soit des chanes de caractres qui seront remplaces par la suite de leurs codes ASCII. Dans lexemple, les octets suivants seront placs en mmoire partir de ladresse TEXT : 00001000 00001000 00001004 00001008 0000100C 00001010 .org .byte 0x1000 Tapez un nombre :,10,13,0

54977065 7A20756E 206E6F6D 62726520 3A0A0D00

TEXT

10 et 13 sont les codes ASCII des caractres retour chariotet line feed, qui provoquent un retour la ligne lors dun afchage sur un terminal. Utilisation de symboles On peut utiliser des symboles pour reprsenter des valeurs constantes de faon plus lisible dans un programme. On utilise pour cela une criture du type :
N = 1000

Dans cet exemple, partout o N apparatra, il sera remplac par 1000. Par exemple si on crit : set N, %r1, tout se passe comme si on avait crit set N, %r1. Par ailleurs, une arithmtique est utilisable sur de tels symboles. Si on voulait initialiser un tableau avec les 3 premiers multiples de 15, on crirait :
N TAB = .word 15 N, 2*N, 3*N

De telles expressions arithmtiques peuvent comporter des signes -, +, *, / et des parenthses avec la syntaxe et la smantique habituelle. Bien sr, on aura compris que les calculs sur ces expressions sont effectus au moment de la phase dassemblage et quils ne conduisent aucun de ces calculs par le processeur au moment de lexcution du programme. Si par exemple on crit :
N = set 15 2*N+4, %r1

,tout se passe comme si on avait crit :


set 34, %r1

148

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

Rservation dun zone non initialise en mmoire La directive .malloc <n> rserve sans les initialiser <n> octets en mmoire. Elle correspond en fait un simple dplacement de ladresse dassemblage <n> octets plus loin. Elle permet de rserver la place pour un tableau, ou nimporte quelle autre structure de donnes, qui sera initialise dynamiquement par programme, au lieu dtre dnie statiquement avec des directives .word et .byte.

4. Exemple de programme : crible dratosthne


An dillustrer de faon plus parlante les lments de programmation en assembleur qui viennent dtre prsents, on va crire un programme qui recherche tous les nombres premiers infrieurs une certaine limite N, par la mthode du crible dEratosthne. Algorithme Cette mthode consiste construire un tableau TAB[i], 0 i n dans lequel TAB[i] = 0 signie que i est premier, et TAB[i] = 1 signie que i nest pas premier. Pour cela on remplit dabord tout le tableau de zros. Ensuite, partir de i = 2, on met 1 TAB[2 i], TAB[3 i], jusqu la n du tableau, puisque 2 i, 3 i, ne sont pas premiers. On cherche ensuite, aprs 2, le premier indice i du tableau pour lequel TAB[i] = 0. En loccurrence cest 3, qui est ncessairement premier car sinon il aurait t coch prcdemment. On met alors 1 TAB[2i], TAB[3i], jusqu la n du tableau, puisque 2i, 3i, ne sont pas premiers. On recommence ensuite avec la prochaine valeur de i pour laquelle TAB [i ] = 0, qui est ncessairement premire, etc. On peut arrter ce processus ds que i atteint N, car on peut facilement montrer qualors tous les nombres non premiers ont dj ncessairement t marqus 1 dans le tableau. On peut traduire cette mthode par lalgorithme suivant :
pour i de 0 N-1 TAB[i] <- 0 ; fin pour pour i de 2 racine(N) si TAB[i] = 0 alors j <- 2*i ; tant que (j < N) TAB[j] <- 1 ; j <- j + i ; fin tq fin si fin pour

Programmation Daprs lalgorithme, les lments du tableau TAB sont seulement les valeurs 0 ou 1. Un tableau de bits aurait fourni le codage le plus compact, mais aurait t difcile manipuler. Un tableau de mots de 32 bits aurait t le plus facile daccs, mais cela aurait t un gaspillage de mmoire un peu inutile. On va donc utiliser un tableau doctets, facile

4. Exemple de programme : crible dratosthne

149

accder, et qui occupera quatre fois moins despace en mmoire quun tableau de mots de 32 bits. On va dabord mettre en place les directives de dclaration, notamment lallocation des N octets du tableau :
N RAM = = 1000 0x1000000 ; adresse en RAM ; allocation de N octets

TAB

.org RAM .malloc N

La valeur de N est dnie de faon symbolique (ici avec 1000) ; il suft de changer cette ligne pour changer toutes les rfrences ce maximum. De mme, le symbole RAM dnit le dbut de la zone de mmoire RAM sur la machine ; on va supposer ici que cest ladresse 0x1000000. La directive .org RAM dplace ladresse dassemblage au dbut de la zone de RAM, de sorte que le tableau TAB sera situ au dbut de cette zone. La directive .malloc N rserve un espace de N octets, sans linitialiser, de sorte que ladresse dassemblage suivant cette directive est RAM+N. Ainsi le programme dispose de N octets partir de TAB, dans lesquels il va stocker les lments du tableau. Passons maintenant la mise zro des lments du tableau :
N RAM = = .org set clr stb inccc set cmp bcs ... 1000 0x1000000 0 TAB,%r1 %r2 %r0,[%r1+%r2] %r2 N,%r5 %r2,%r5 loop

erato loop

; pour i de 0 N-1 ; TAB[i] <- 0 ; lment suivant

; fin pour

TAB

.org RAM .malloc N

; adresse en RAM ; allocation de N octets

On a implment strictement lalgorithme, avec %r2 comme indice dans le tableau et %r1 comme pointeur sur le dbut du tableau. Pour crire dans le tableau, on ne peut employer quune des deux instructions dcriture en mmoire, st ou stb. Puisquon crit seulement un octet, cest stb quil faut employer. La forme gnrale de cette instruction tant : stb %ri, [%rj+cst/%rk], le registre crire sera ncessairement %r0 (qui vaut 0) et ladresse de loctet crire sera %r1+%r2 (adresse de dbut du tableau + indice dans le tableau). Avec les choix qui ont t faits avant sur le type du tableau, on est ncessairement conduits linstruction :
stb %r0,[%r1+%r2] ; TAB[i] <- 0

150

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

Les trois instructions suivantes sont relatives la recherche de lindice suivant. On commence dabord par incrmenter lindice :
inccc %r2 ; lment suivant

Il faut ensuite vrier quil est infrieur la limite N 1 :


set cmp N,%r5 %r2,%r5

Linstruction synthtique cmp %r2,N nest pas possible ici. Elle quivaut en effet linstruction subcc %r2, N, %r0 et la valeur de N est trop grande pour la constante possible cette place dans le cas gnral, car elle est limite 13 bits, cest dire lintervalle [ 4096, 4095]. On doit donc passer par un registre intermdiaire %r5, avec lequel on fait la comparaison. Les ags sont alors positionns en fonction de la valeur de %r 2 %r5, cest dire de i N. Puisque lalgorithme mentionne une relation dingalit, cest la valeur du ag N qui nous intresse. On a : N = 1 iN < 0 i < N i N 1 On doit donc utiliser linstruction bneg, qui effectue le branchement vers le dbut de la boucle si N = 1 :
bneg loop ; fin pour

En fait, puisquil sagit dune comparaison non signe, il est mme prfrable dutiliser le branchement bcs, qui fait une comparaison de type infrieur strict, non signe. Elle permettra en effet dtendre lalgorithme des valeurs de N trs grandes, jusquau maximum possible sur 32 bits. On crira :
bcs loop ; fin pour

On vient de traduire littralement lalgorithme qui tait donn, la faon dun compilateur. On peut nanmoins remarquer que lindice %r2 na pas besoin dtre utilis de faon croissante dans cette partie du programme. On peut optimiser ce code en initialisant %r2 N 1 et en le dcrmentant chaque tour de boucle avant de tester sil est positif ou nul. Cela donne :
. loop set set stb deccc bpos TAB, %r1 N-1, %r2 %r0,[%r1+%r2] %r2 loop ; ; ; ; pour i de N-1 0 TAB[i] <- 0 lment suivant fin pour

On ajoute une instruction dans la partie initialisation (set occupe 2 instructions), mais le corps de la boucle passe de 5 3 instructions. Le code global est plus petit dune instruction, et on a un gain en vitesse de 40% dans lexcution de la boucle. On remarquera que linstruction cmp nest plus ncessaire dans cette deuxime version, car le ag N est directement utilisable aprs linstruction deccc. Dans le reste de lalgorithme, la structure de contrle de plus haut niveau est de la forme pour i de 2 racine(N) ... fin pour. Cette fois lindice i est utilis de faon croissante. On va le traduire comme dans la premire version de linitialisation du tableau :

4. Exemple de programme : crible dratosthne


. loopi setq 2,%r2 ... <corps de la boucle> ... inccc %r2 set RN,%r5 cmp %r2,%r5 bleu loopi

151
; pour i de 2 a racine(N)

nexti

; fin pour

On remarquera lusage du setq pour initialiser une petite constante, plus conomique que set qui utilise deux instructions. Dans le corps de la boucle, on doit ensuite lire llment TAB[i] du tableau, et choisir une autre valeur de i si cet lment de tableau vaut 1 :
. loopi setq ldub bne ... 2,%r2 ; pour i de 2 a racine(N) [%r1+%r2], %r6 nexti ; si TAB[i] = 0

Llment de tableau est lu en mmoire, cest donc une instruction ld ou ldub qui doit tre utilise, ici ldub puisque cest une lecture doctet. Le tableau commence ladresse %r1 et on lit llment dindice %r2 : il se trouve donc ladresse %r1+%r2. Il est lu dans %r6 et cette lecture modie les ags (voir dtail de linstruction ldub annexe B). Linstruction bne nexti provoque la recherche dun nouvel indice i si Z = 0, cest dire si %r6 est diffrent de 0, donc gal 1 ici. Linstruction j <- 2*i~; simplmente trs simplement sous forme dune addition :
addcc %r2, %r2, %r3 ; j <- 2*i

On a ensuite une structure de contrle tant que (j < N), quon va traduire :
loopj set N,%r5 cmp %r3,%r5 bpos nexti ; tant que (j < N) ... <corps de la boucle> ... ba loopj ; fin tq

Elle est analogue limplmentation de la structure pour fin pour, mais le test est fait en tte de boucle. %r5 est, ici encore, utilis trs temporairement pour stocker N, trop grand pour tre manipul a priori comme une petite constante sur 13 bits. Le corps de la boucle se traduit ensuite directement :
check setq stb addcc 1, %r4 %r4, [%r1+%r3] ; TAB[i] <- 1 %r3, %r2, %r3 ; j <- j + i

152

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

Finalement, le programme complet est donn gure V.16. On notera linstruction darrt sous forme de boucle innie (* reprsente ladresse de linstruction courante).
N RN RAM = = = .org set set stb deccc bpos setq ldub bne addcc set cmp bpos setq stb addcc ba inccc set cmp bleu ba 1000 32 0x1000000 0 TAB, %r1 N-1, %r2 %r0, [%r1+%r2] %r2 loop 2, %r2 [%r1+%r2], %r6 nexti %r2, %r2, %r3 N, %r5 %r3, %r5 nexti 1, %r4 %r4, [%r1+%r3] %r3, %r2, %r3 loopj %r2 RN, %r5 %r2, %r5 loopi *

erato loop

; ; ; ;

pour i de N-1 0 TAB[i] <- 0 lment suivant fin pour

; pour i de 2 a rac(N) ; si TAB[i] = 0 ; j <- 2*i

loopi

loopj

; tant que (j < N) ; TAB[i] <- 1 ; j <- j + i

check

nexti

; fin pour ; boucle infinie (arrt) ; adresse en RAM ; allocation de N octets

TAB

.org RAM .malloc N

Figure V.16. Programme complet du crible dratosthne en CRAPS/SPARC. Il construit un tableau doctets tel quun lment dindice i valant 0 indique que i est premier.

5. Appels de sous-programmes terminaux


Pour le moment, nous navons crit que des programmes monolithiques, utilisables une seule fois. Pourtant, il serait utile quun programme tel que la somme des lments dun tableau puisse tre utilis plusieurs fois sur diffrents tableau durant lexcution dun programme, sans pour autant avoir dupliquer son code. CRAPS fournit un tel mcanisme sous la forme des deux instructions call et ret : 1
call <adresse> sauvegarde ladresse courante dexcution dans le registre %r31,

puis provoque un branchement ladresse spcie, o est situ le sous-programme quon souhaite appeler. 2
ret provoque le branchement ladresse %r31+4. Si le contenu de %r31 na pas t modi depuis lappel call, lexcution reprend ladresse qui suit celle de linstruction call.

5. Appels de sous-programmes terminaux

153

Tout se passe comme si call <adresse> tait une instruction de somme de tableaux. On montre sur le programme suivant comment notre programme de somme des lments dun tableau a t transform en sous-programme, et invoqu sur deux tableaux diffrents :
;;;;;;;;;; programme principal set TAB1, %r4 ; call tabsum ; set TAB2, %r4 ; call tabsum ; ba * ; ;;;;;;;;;; tabsum clr clr loop: ld addcc addcc inccc cmp bleu ret ;;;;;;;;;; .org TAB1 .word TAB2 .word sous-programme %r1 %r2 [%r4], %r3 %r1, %r3, %r1 %r4, 4, %r4 %r2 %r2, 9 loop ;;;;;;;;; arg. 1er appel 1er appel arg. 2eme appel 2eme appel arrt ;;;;;;;;; %r1 <- 0 ; pour i de 0 9 %r3 <- mem[%r4,...,%r4+3]; %r1 <- %r1 + %r3 ; %r5 <- %r5 + 4 ;

; ; ; ; ;

; fin pour

zone de donnes ~;;;;;;;;; 0x1000 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 2, 4, 6, 8, 10, 12, 14, 16, 18, 20

Ce mcanisme call ret est appel appel de sous-programmes terminaux, cest dire de sous-programmes situs au dernier niveau dappel. On laura sans doute dj compris, il nest pas possible avec ce mcanisme dappeler un autre sous-programme partir du corps dun sous-programme appel, puisque la premire adresse de retour serait crase par la seconde dans %r31. Il nous manque maintenant un mcanisme qui permette de sauvegarder cette valeur ; il est prsent la section suivante.

6. Utilisation de la pile
Principe Une pile est une structure de donnes qui se manipule uniquement avec les deux oprations suivantes : 1 2 PUSH data : sauvegarde (empile) data dans la pile. POP : enlve le sommet de la pile, et le renvoie.

On peut sauvegarder a priori autant de donnes quon le souhaite ; linconvnient est quon ne peut pas rcuprer nimporte quand une donne sauvegarde : on doit avant avoir rcupr toutes celles qui ont t empiles aprs elle. Une telle pile pourrait tre implmente de plusieurs faons, commencer par une pile

154

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

matrielle base dun grand tableau de registres. La mthode la plus simple (mais aussi la plus lente) est de stocker la pile sous forme de mots conscutifs dans la mmoire centrale, et dutiliser un registre qui pointe sur la dernire valeur empile, appel pointeur de pile. Dans le cas de CRAPS, on utilisera le registre %r30, et les oprations push et pop existent dj sous forme dinstructions synthtiques :
push %ri : sub %r30, 4, %r30 st %ri, [%r30] ld [%r30], %ri add %r30, 4, %r30

pop %ri

La gure V.17 montre ce quon observe en mmoire, aprs quatre oprations successives dempilement et de dpilement.
(a) (b) (c)

fond de pile %r30 %r30 4 5

%r30 7 8 5

initialement (d)

set 5, %r1 push %r1 (e)

set 7, %r1 push %r1

%r30 %r30 7 5 %r2 9 5

pop %r2

set 9, %r1 push %r1

Figure V.17. Oprations successives dempilement et de dpilement. En disposant le ruban mmoire de haut en bas, on observe que les oprations dempilement se traduisent visuellement par un empilement des valeurs les unes sur les autres : le 7 par dessus le 5, etc. Rciproquement un dpilement se traduit par la saisie de la valeur au sommet, cest dire celle qui est pointe par %r30. On notera cependant que la valeur dpile nest pas efface de la mmoire, mais quelle est laisse telle quelle. Cela na aucune importance, car elle nest plus accessible par des opration pop, et elle peut tre crase par une opration push ultrieure. Cest ce qui se passe lors du push de la valeur 9 (situation (e)).

6. Utilisation de la pile

155

La pile de CRAPS, comme celle de la plupart des processeurs, a les deux proprits suivantes : 1 2 lors dun empilement, le sommet de la pile remonte, cest dire que la valeur du pointeur de pile diminue. le pointeur de pile pointe toujours sur la dernire valeur empile.

Ces indications sont utiles notamment lorsquon dbogue un programme et quon souhaite savoir prcisment ce que la pile contient. Allocation de lespace de pile La pile tant en mmoire centrale, doit tre dans une zone de RAM. Par ailleurs, il faut prvoir quavec les empilements successifs elle va grignoter de la place en mmoire, en progressant vers les adresses basses (gure V.18).
RAM adresse 0

programme, donnes

pile fond de pile

Figure V.18. La pile grandit en mmoire en progressant vers les adresses basses. Elle peut dborder sur des zones de programme ou de donnes. Il y a donc un danger potentiel dcrasement dune zone de programmes ou de donnes par la pile, si celle-ci grandit trop. Lorsquon utilise une pile dans un programme, il faut donc initialiser le pointeur de pile en prenant en compte la position des autres donnes en mmoire, et la taille maximale que la pile peut prendre au cours de lexcution des programmes. Sauvegarde de ladresse de retour de sous-programme Un premier usage que lon peut faire dune pile est de rsoudre notre problme de sauvegarde de ladresse de retour lors dun appel de sous-programme de type call ret. La solution est trs simple : 1 juste avant lappel call, il faut empiler ladresse de retour %r31.

156 2

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC juste aprs le retour du call, on dpile dans %r31 cette adresse.

Ainsi, mme si %r31 est modi dans lappel du sous-programme, on est sr de retrouver la valeur de %r31 que lon avait avant le call, cest dire ladresse de retour (sous rserve que la pile soit au mme niveau au retour quau dpart). On peut illustrer cette mthode par le petit programme suivant :
RAM STACK ;;;; ;;;; = = 0x1000000 RAM+100 ; 100 octets rservs successifs ;;;; ;;;;; initialisation %r30 init. arguments dappel appel ss programme arrt (boucle infinie)

calcul de 2*5+4 par appels de ssprog1 et ssprog2 set STACK, %r30 ; main: set 5, %r1 ; set 4, %r2 adr1: call ssprog1 ; ba * ;

;;;;;; calcule 2*%r1+%r2, rsultat dans %r3 ;;;;;; ssprog1: push %r31 ; empile adresse retour adr2: call ssprog2 ; calcul de 2*%r1 pop %r31 ; restaure adresse retour addcc %r1, %r2, %r3 ; ajoute %r2 ret ; retour main ;;;;;; calcule 2*%r1, rsultat dans %r1 ssprog2: addcc %r1, %r1, %r1 ret ;;;;;;

Avant toute chose, il faut initialiser le pointeur de pile. Ici il est plac 100 octets aprs le dbut de la zone de RAM, laissant la possibilit de 100/4 empilements. main appelle ssprog1, qui va faire le calcul 2x + y. Ce nest pas la peine ici de sauvegarder %r31, car on ne vient de nulle part et donc on na pas dadresse de retour prserver. %r31 prend pour valeur adr1, quil va falloir prserver si on veut revenir dans main la n. ssprog1 appelle ssprog2 pour faire le calcul du double. Avant de partir, il sauvegarde son adresse adr1 de retour main, qui sera crase sinon. En effet lexcution de call ssprog2, la valeur de %r31 qui tait adr1 est crase, et remplace par adr2. Au ret de ssprog2 le contrle reprend ladresse adr2+4, aprs lappel call ssprog2. Lexcution de pop %r31 redonne %r31 la valeur adr1 quil avait avant lappel, et le retour main redevient possible. Appels de fonctions rcursives Cette mthode ouvre dun seul coup la possibilit de raliser des programmes rcursifs et mutuellement rcursifs, puisque les sauvegardes/restaurations des adresses de retour peuvent tre faites en nombre quelconque dans la pile. On va lillustrer par un calcul de plus grand commun diviseur (PGCD), qui sobtient par lalgorithme rcursif suivant :
fonction int pgcd(int x, int y)

6. Utilisation de la pile
si (x = y) alors val <- x ; sinon si (x > y) alors val <- pgcd(x-y, y) ; sinon val <- pgcd(x, y-x) ; return val ; fin fonction

157

Par exemple, PGCD(78,143) = PGCD(78,65) = PGCD(13,65) = PGCD(13,52) = PGCD(13,39) = PGCD(13,26) = PGCD(13,13) = 13. Comme par ailleurs 78 = 2313 et 143 = 1113, on vrie bien que 13 est leur plus grand commun diviseur. Pour le programmer rcursivement en CRAPS, il nous suft lintrieur du sous-programme pgcd de rappeler par call le sous-programme pgcd, en prenant soin de sauvegarder dans la pile tout lenvironnement local ncessaire au calcul, cest dire : 1 2 les valeurs de registres que lon souhaite conserver au travers de cet appel. ladresse de retour %r31.

La gure V.19 donne le listing complet du programme. Le programme est tout fait simple et lisible, traduction littrale de lalgorithme rcursif. Seule ladresse de retour est sauvegarde avant lappel rcursif, car il ny a pas de registre particulier sauvegarder ce moment. Si le calcul ncessite n appels rcursifs, la pile va grossir progressivement jusqu occuper n mots en mmoire, adresses de retour sauvegardes chaque appel. Ensuite, n excutions de linstruction ret vont remettre la pile son niveau initial. Lutilisation de la rcursivit dans le cas de ce programme est maladroite, car elle est assez inefcace lexcution, vu le grand nombre daccs mmoire effectus. Lalgorithme peut trs simplement tre traduit de faon itrative :
fonction int pgcd(int x, int y) tant que (x <> y) faire si (x > y) alors x <- x - y ; sinon y <- y -x ; fin si fin tq ; return x ; fin fonction

Cet algorithme se traduit directement par le programme de la gure V.20. La leon tirer de cet exemple est quil ne faut pas abuser de la rcursivit dans les

158

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

RAM STACK

= = .org set set set call ba

0x1000000 0x1000100 0 STACK, %r6 78, %r1 143, %r2 pgcd *

main

; ; ; ; ;

init pointeur pile valeur de x valeur de y appel pgcd arrt

pgcd:

skip:

sup:

retour

;; calcule pgcd(x,y) ;; in : x = %r1, y = %r2 ;; out : rsultat dans %r3 cmp %r2, %r1 bne skip ; x=y ? ; x = y : return x mov %r1, %r3 ; val <- x ba retour ; retour bneg sup ; x>y ? ; x < y : prparation de pgcd(x, y-x) subcc %r2, %r1, %r2 ; y <- y - x push %r31 ; sauvegarde @ retour call pgcd ; appel rcursif pop %r31 ; restaur. @ retour ba retour ; x > y : prparation de pgcd(x-y, y) subcc %r1, %r2, %r1 ; x <- x - y push %r31 ; sauvegarde @ retour call pgcd ; appel rcursif pop %r31 ; restaur. @ retour ret

Figure V.19. Programme rcursif de calcul du PGCD.Le programme est trs lisible,au prix dune excution plus lente. fonctions de bas niveau, si un algorithme itratif est disponible. Elle est en effet gourmande en temps et en espace occup en mmoire. La rcursivit est par contre indispensable dans les fonctions de haut niveau, pour des raisons de clart et de modularit dont la discussion sort du cadre de cet ouvrage. Enn on peut noter que lorsquon paramtre la compilation dun programme pour quil produise un code plus efcace, il cherche entre autres techniques drcursiver les rcursions terminales comme celles de notre fonction PGCD, an de les rendre itratives.

7. Techniques de programmation diverses


Multiplication entire par une puissance de 2 Sur notre machine CRAPS, lopration de multiplication entire occupera un nombre de cycles relativement important. Dans le cas assez frquent o lon souhaite multiplier par une puissance de 2, on peut utiliser plus efcacement une opration de dcalage gauche sll. chaque dcalage dun cran gauche (avec introduction dun 0 droite), la valeur dcale est multiplie par 2, quelle soit code en binaire pur (non signe) ou en complment deux (signe).

7. Techniques de programmation diverses

159

RAM STACK

= = .org set set call ba

0x1000000 0x1000100 0 78, %r1 143, %r2 pgcd *

main

; ; ; ;

valeur de x valeur de y appel pgcd arrt

pgcd:

skip:

sup:

;; calcule pgcd(x,y) ;; in : x = %r1, y = %r2 ;; out : rsultat dans %r3 cmp %r2, %r1 ; tant que x <> y bne skip ; x=y ? ; x = y : return x mov %r1, %r3 ; val <- x ret ; retour bneg sup ; x>y ? ; x < y subcc %r2, %r1, %r2 ; y <- y - x ba pgcd ; x > y subcc %r1, %r2, %r1 ; x <- x - y ba pgcd

Figure V.20. Programme itratif de calcul du PGCD. Il est plus efcace que la version rcursive car il ny a plus daccs en mmoire. Division entire par une puissance de 2 De la mme faon, on peut vouloir calculer le quotient de la division entire dun nombre N entier sign par un diviseur entier positif gal une puissance de 2, de faon plus rapide que linstruction de division udivcc. On utilise pour cela linstruction de dcalage droite srl : chaque dcalage droite est quivalent une division par 2. Par exemple, si %r1 est positif, srl %r1, 4, %r2 le divise par 16 et place le rsultat dans %r2. Cette technique ne fonctionne pas si %r1 est ngatif, car srl va introduire des 0 par la gauche, et de ngatif il va devenir positif, ce qui est absurde. Linstruction sra (shift right arithmetic) est l pour cela : au lieu de faire rentrer systmatiquement un 0 par la gauche, elle fait entrer le bit de poids fort du registre en cours de dcalage, en prservant ainsi son signe. La gure V.21 illustre cette opration. Ainsi donc sra %r1, 4, %r2 divise %r1 par 16 dans tous les cas, mme sil est ngatif.

8. Langages structure de blocs et stack-frames


On sintresse dans cette section aux problmes que posent aux compilateurs les langages structure de blocs tels que C, Java, etc. lors de la phase de gnration de code. Un compilateur est en effet essentiellement un traducteur du langage source vers un langage cible qui est gnralement le langage assembleur du processeur vis. On cherche dans cette section quelles mthodes ces compilateurs mettent en oeuvre de faon systmatique pour

160

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

sra : dcalage arithmtique

0 srl : dcalage logique

Figure V.21. Dcalage droite logique et arithmtique. Dans le dcalage arithmtique, le signe de loprande est prserv. implmenter la notion de bloc, ainsi que lors des appels de fonctions. Implmentation des blocs sous forme de stack-frames Les programmes crits dans des langages tels que C et Java sont organiss en blocs, encadrs par des symboles tels que {... } ou begin end. lintrieur de chaque bloc on peut dclarer de nouvelles variables, dont la porte est limite au bloc. Gnralement un bloc est associ une structure de contrle (boucle for ou while) ou au corps dune fonction. On peut nanmoins crer un bloc tout moment dans un programme, et y dclarer les variables locales de son choix : leur porte sera limite ce bloc. Ainsi en langage C, on peut crire le petit programme (inutile) suivant :
int main(int argn,char** args) { int x = 1 ; int y = 10 ; printf("x=%d\n", x) ; { int x = 2 ; int z = x + y ; printf("x=%d\n", x) ; } printf("x=%d\n", x) ; }

lexcution, il va produire lafchage :


x=1 x=2 x=1

Il y a deux blocs dans ce programme : celui associ au corps de la procdure main, et un bloc interne situ au beau milieu, et qui nest l que pour illustrer notre propos. La porte de la variable x situe dans le bloc interne est limite ce bloc, et elle a temporairement pris la place de la variable x du bloc plus externe. La variable z nest visible que dans le bloc interne, et la variable y est visible dans les deux blocs. La pile est utilise pour mettre en place cette visibilit temporaire des variables. Lors de lentre dans un bloc, le compilateur cre un stack-frame dans la pile, cest dire une zone

8. Langages structure de blocs et stack-frames

161

de mmoire dans laquelle seront places les valeurs des variables dclares dans le bloc. Les stack-frames associs aux deux blocs de notre programme pourraient tre implants comme sur la gure V.22.
pile

z = 12 x=2 pied frame 2 prec. y = 10 x=1 pied frame 1 prec.

stack frame 2

stack frame 1

Figure V.22. Stack-frames associs aux deux blocs de code du programme.Chaque variable locale a sa place dans le stack-frame associ au bloc. On remarquera le pointeur vers le stack-frame prcdent. Un registre est gnralement affect au pointage au pied du stack-frame courant, et les accs aux diffrents lments du stack-frame se font trs simplement par adressage indirect avec dplacement. Par exemple, si on utilise %r29 comme pointeur de stack-frame, on aura le mcanisme dadressage de la gure V.23.
pile %r298 %r294 %r29

z = 12 x=2 %r29 prec. y = 10 x=1 prec.

stack frame 2

stack frame 1

Figure V.23. Utilisation du registre %r29 comme pointeur la base du stack-frame courant. Les accs aux variables locales se font par adressage indirect avec dplacement. Le code assembleur traduisant ce programme pourrait tre :

162
STACK main: =

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC


0x1000100

;; initialisation pointeur de pile set STACK, %sp ;; cration du stack-frame push %r29 ; mov %sp, %r29 ; add %sp, 2*4, %sp ; setq st setq st 1, %r1 %r1, [%r29-4] 10, %r1 %r1, [%r29-8] 1 empile val. prec.de %r29 %r29 reste fixe au pied du stack frame rserve 2 mots dans la pile

; x <- 1 ; y <- 10 2 empile val. prec.de %r29 %r29 reste fixe au pied du stack frame rserve 2 mots dans la pile

;; cration du stack-frame push %r29 ; mov %sp, %r29 ; add %sp, 2*4, %sp ;

setq 2, %r1 st %r1, [%r29-4] ; x <- 2 ;; recherche de la valeur de y par double indirection ld [%r29], %r2 ; %r2 <- "@stack-frame 1" ld [%r2-8], %r1 ; %r1 <- y ld [%r29-4], %r3 ; %r3 <- x addcc %r1, %r3, %r4 ; %r4 <- x + y st %r4, [%r29-8] ; stockage de z ...

La cration dun stack frame consiste essentiellement rserver la place ncessaire aux variables locales ; il sagit dune simple soustraction sur la valeur de %sp. chaque cration dun stack-frame, la valeur courante de %r29 est empile, et %r29 est positionn au pied du stack-frame.Laccs une variable locale ce bloc se fait directement par rfrence %r29 ; par exemple laccs x dans le stack-frame 2 se fait par [%r29-4]. Plus dlicat est laccs la variable y dans lexpression z = x + y ; en effet y nappartient pas au bloc courant, mais au bloc de rang infrieur. La rfrence la variable y est correcte, mais le compilateur doit dans ce cas accder y par une double indirection, en allant chercher dabord ladresse du stack-frame de rang infrieur, puis en faisant partir de l un accs indirect avec dplacement. Selon les cas, plusieurs de ces indirections peuvent tre ncessaires. Appel de fonction rcursive Appeler une fonction, cest crer dynamiquement un stack-frame qui contiendra toutes les donnes manipules par elle, savoir : 1 2 3 4 les paramtres dappel, la valeur de retour, les variables locales au bloc principal de la fonction, ladresse de retour linstruction dappel.

Ainsi, chaque nouvel appel aura son propre contexte de travail sous forme dun stack-frame, et les appels successifs ne mlangeront pas leurs variables locales et les paramtres dappel. la sortie dun appel de fonction, la valeur renvoye par la fonction sera rcupre avant que lespace du stack-frame ne soit dsallou de la pile (gure V.24). On rcuprera

8. Langages structure de blocs et stack-frames galement ladresse de retour, valeur de %r31 dans le cas de CRAPS.
pile

163

var. locale #m ... var. locale #1 val. renvoyee param #n ... param #1 @ retour @ prec. stack frame

Figure V.24. Stack-frame cr lors dun appel de fonction. On y trouve les paramtres dappel, lemplacement de la valeur renvoyer, les variables locales et ladresse de retour.

9. Programmation des entres/sorties


Jusquici nous navons crit que des programmes autistes : ils nont effectu aucun change avec lextrieur. Les donnes sur lesquelles ils travaillaient leurs taient fournies directement sous forme de zones de mmoire prremplies avec les valeurs du problme et ils produisaient des rsultats sous forme de donnes crites en RAM. On va considrer que linterface dun ordinateur avec lextrieur est fait au travers dun ensemble de lignes digitales, chacune delle tant un moment donn une entre ou une sortie. Si cest une entre, le processeur doit tre capable de lire son tat 0 ou 1 ; si cest une sortie il doit pouvoir forcer son tat 0 ou 1. Des amplicateurs ou des attnuateurs en entre ou en sortie peuvent permettre la lecture ou la commande de courants trs forts ou trs faibles ; mme la commande ou lacquisition de signaux analogiques rentre dans ce cadre, puisquon peut utiliser des convertisseurs numrique/analogique qui vont faire la conversion dun monde vers lautre. Certaines de ces lignes sont des entres ou des sorties sans pouvoir changer de nature : ce sera par exemple le cas des sorties des circuits appels timer/PWM chargs de produire des signaux paramtrables de forme rectangulaire. Certaines lignes dusage plus souple seront des lignes dentre/sortie gnrales, qui pourront tre congures individuellement et par programme en entre ou en sortie. Instructions spciales dentres/sorties Sur certains processeurs existent des instructions spciales dentres/sorties. Le x86 par exemple possde une instruction IN AL,PORT qui lit un octet de PORT vers AL et une instruction OUT PORT,AL qui crit un octet de AL vers PORT. PORT dsigne un numro de port, lment parmi un espace dadressage spcial, propre aux entres/sorties. Les critures

164

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

sur des numros de port particuliers mettent en activit les priphriques associs tels que contrleurs USB, contrleurs de bus PCI Express, etc. Entres/sorties mappes en mmoire Sur dautres processeurs tels que CRAPS/SPARC, il nexiste pas de telles instructions spcialises. Comment alors peuvent-ils faire pour interagir avec lextrieur ? Ils utilisent en fait un mcanisme appel entres/sorties mappes en mmoire : cest en lisant et en crivant certains emplacements mmoire particuliers, que le processeur va dialoguer avec les priphriques. Lavantage de cette mthode, cest quil ny a pas dinstructions spciales utiliser et que, en CRAPS par exemple, de simples ld et st sufront. Son inconvnient, cest de gaspiller certains emplacements de lespace dadressage mmoire, qui ne peuvent plus tre utiliss pour de la vritable RAM ou ROM. La machine CRAPS, telle quelle sera dcrite en dtail au chapitre suivant, et telle quelle est utilisable au travers du simulateur CrapsEmu et de son implantation dans un FPGA, est quipe dun timer/PWM et de 32 lignes dentre/sortie gnrales. Ces deux priphriques sont donc mapps en mmoire et on va dcrire maintenant la faon de les programmer.

9.1. Programmation des lignes dentres/sorties gnrales


CRAPS est quip de 32 lignes dentres/sorties gnrales, quon nommera IOi, 0 i 31. Par gnrales, il faut comprendre que chaque ligne peut tre congure individuellement en entre ou en sortie, et ensuite lue ou crite volont. On pourra par exemple les utiliser de la faon dcrite gure V.25.

IO[3]

1K

Vcc

CRAPS

IO[2]

1K

Vcc

IO[1] IO[0]

220 220

Figure V.25. Exemple dutilisation des lignes dentres/sorties gnrales de CRAPS. Les lignes IO[0] et IO[1] doivent tre congures en sorties, et elles servent ici commander lallumage de diodes lectroluminescentes : si une de ces lignes est 0, la diode correspondante est teinte ; si elle est 1, un courant denviron 20mA traverse la diode et lallume. Les lignes IO[2] et IO[3] doivent tre congures en entres, et servent lacquisition de ltat de deux interrupteurs. Lorsquun des interrupteurs est ouvert, la ligne correspondante lit 1(car la rsistance de 1K induit un courant entrant de 5mA si Vcc=5v) ; sil est ferm elle lit 0.

9. Programmation des entres/sorties Adresses mmoire utilises

165

Dans la conguration que nous allons dcrire, les lignes dentres/sorties de CRAPS sont mappes aux adresses de 0x600000 0x60000C selon le tableau de la gure V.26. adresse 0x600000 0x600000 0x600004 0x600004 0x600008 0x600008 0x60000C 0x60000C W 0 1 0 1 0 1 0 1 lire ltat des entres crire sur les sorties lire conguration lignes congurer les lignes lire interruptions mmorises raz des interruptions mmorises lire sens du front dinterruption (0 = front montant) crire sens du front dinterruption opration

Figure V.26. Tableau de conguration et dutilisation des entres/sorties de CRAPS. W=1 indique une criture.La conguration des lignes se fait par criture en 0x600004 ; la lecture et lcriture des lignes se fait par lecture et criture ladresse 0x600000. La lecture et lcriture en 0x600008 et 0x60000C concernent la gestion des interruptions (section 10). Les valeurs 0x600000, 0x600004 etc. ne dpendent pas du processeur CRAPS, mais de la faon dont il est interfac avec les circuits mmoire et dentres/sorties. On dtaillera compltement cet aspect de ce quon appelle le dcodage des adresses au chapitre suivant. Par contre, on reportera la section 10 lutilisation des lignes dentres/sorties comme lignes dinterruption, au travers de la lecture et de lcriture aux adresses 0x600008 et 0x60000C. Conguration des lignes Daprs le tableau V.26, la conguration se fait en crivant ladresse 0x600002 un mot de 32 bits val[31..0]. La rgle de conguration est simple : si val[i] vaut 0, la ligne IO[i] sera congure en entre ; sil vaut 1 la ligne sera congure en sortie. Ainsi pour congurer les lignes IO[0] et IO[1] en sorties et toutes les autres en entres, on crira le mot mmoire 000..00001132 en 0x600004, par exemple avec le code suivant :
BASEIO = set set st 0x600000 ; adresse de base des IO

BASEIO, %r1 0b11, %r2 ; IO[0..1] sorties, les autres en entres %r2, [%r1+4] ; criture configuration

Lecture/criture sur les lignes Pour lire ltat des entres, il suft de lire en 0x600000, et de tester dans le mot lu les bits des rangs correspondants aux entres. Pour positionner ltat des sorties, il suft dcrire en 0x600000 un mot dont les bits correspondent aux valeurs que lon souhaite placer sur les lignes.

166

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

Par exemple sur le schma de la gure V.25, pour lire ltat de linterrupteur situ sur la ligne IO[2] et allumer la diode situe sur IO[0] si cet interrupteur est ouvert (IO[2]=1) on crira le code suivant :
BASEIO = set set st ld andcc srl st 0x600000 BASEIO, %r1 0b0011, %r2 %r2, [%r1+4] [%r1], %r3 %r3, 0b100, %r3 %r3, 2, %r3 %r3, [%r1] ; adresse de base des IO

; IO[0..1] sorties, IO[2..3] entres ; criture configuration ; ; ; ; lecture des IO en entres isolation du bit 2 dplacement de ce bit au rang 0 criture sur les IO en sorties

Exemple : programmation dun jeu de pile ou face Le programme de la gure V.27 exploite le cblage des entres/sorties de la gure V.25, et fait allumer en alternance lune des deux LEDs situes sur IO[0] et IO[1]. Lorsque le joueur appuie sur linterrupteur situ sur IO[2], ltat des LEDs se ge, faisant apparatre une des deux combinaisons.

BASEIO

= set set st

0x600000 BASEIO, %r1 0b011, %r2 %r2, [%r1+4]

; adresse de base des IO

; IO[0..1] sorties, IO[2] entre ; criture configuration

loop

setq 0b10, %r4 ; tat des LEDs st %r4, [%r1] ; criture tat des LEDs ld [%r1], %r3 ; lecture des IO en entres andcc %r3, 0b100, %r3 ; isolation du bit 2 bne loop ; attend quil vaille 1 ;; interrupteur ouvert : on inverse ltat des LEDs xorcc %r4, 0b11, %r4 ; inversion par xor st %r4, [%r1] ; criture tat des LEDs ba loop ; reboucle ternellement

Figure V.27. Programme dun jeu de pile ou face. Les LEDs #0 et #1 sallument en alternance, et un appui sur linterrupteur #2 ge la conguration. Les commentaires du programme parlent deux-mmes. On notera linversion par le
xor des deux bits de poids faibles de ltat des LEDs dans %r4.

9.2. Programmation du timer/PWM


Principe gnral CRAPS possde un timer/PWM qui lui permet de gnrer sur une ligne de sortie ddie, des signaux rectangulaires dont la priode et le rapport cyclique sont programmables. La forme du signal est donne gure V.28.

9. Programmation des entres/sorties

167

t DT = periode horloge timer

Figure V.28. Forme et paramtres du signal de sortie du timer/PWM de CRAPS. Les usages dun timer/PWM sont nombreux. Dans un systme multi-tches, la sortie dun timer sert dclencher une interruption qui effectue la commutation entre les diffrentes tches. Il fonctionne une frquence denviron 50 hertz, ce qui donne lutilisateur lillusion que ses diffrents programmes fonctionnent en parallle. On sen sert galement pour contrler avec prcision lnergie communique un appareil de type lampe ou moteur courant continu (aprs amplication), celle-ci tant proportionnelle au rapport cyclique P N . P Registres de commande Il sagit dun timer 16 bits, cest dire que les paramtres P et N sont cods sur 16 bits, et reprsentent un nombre de cycles de lhorloge du timer. Lhorloge du timer est obtenue partir de lhorloge gnrale, dont la frquence peut ventuellement tre prdivise par un facteur prediv cod sur 4 bits, do 16 valeurs de prdivision. Si f est la frquence de lhorloge gnrale, la frquence du timer sera programmable parmi les 16 valeurs : f , f /2, , f /32768. Cest elle qui dnit le pas minimal de fonctionnement du timer. Le timer possde en interne deux registres qui stockent ces valeurs ncessaires son fonctionnement. Ils sont appels commande #1 et commande #2 (gure V.29).
31 registre commande #1 N 16 15 P 0

31 registre commande #2 prediv

16

1 0

start

Figure V.29. Structure des registres de commande du timer de CRAPS. Du point de vue du programmeur, le timer/PWM de CRAPS est mapp aux adresses 0x400000 0x400008 selon le tableau de la gure V.30. La conguration du timer se fait par criture dans le registre de commande #1 pour les valeurs de P et de N, et dans le registre de commande #2 pour la valeur de prediv. Le lancement du timer se fait par criture dun 1 dans le bit 0 du registre de commande #2. tout moment du fonctionnement du timer, il peut tre arrt par criture dun 0 dans

168 adresse 0x400000 0x400000 0x400004 0x400004 0x400008 0x400008

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC W 0 1 0 1 0 1 opration lire le registre de commande #1 (P + N) crire le registre de commande #1 (P + N) lire le registre de commande #2 (prediv + start) crire le registre de commande #2 (prediv + start) lire bit dinterruption timer raz bit dinterruption timer

Figure V.30. Tableau de conguration et dutilisation du timer/PWM de CRAPS. W=1 indique une criture.La conguration des valeurs de P et N se fait par criture en 0x400000 ; le lancement du timer et la valeur de prdivision de lhorloge se font par criture en 0x400004.La lecture et lcriture en 0x400008 concerne lutilisation du timer comme source dinterruption (voir section 10). ce bit. Si par exemple on souhaite gnrer un signal carr de priode 100 cycles dhorloge, on crira le code suivant :
BASETIMER = set set st 0x400000 BASETIMER, %r1 0x00320064, %r2 %r2, [%r1] ; adresse de base du timer ; %r1 = base timer ; N=50 & P=100 ; criture commande #1 prediv=0 & start=1 criture commande #2

set 0x00000001, %r2 ; st %r2, [%r1+4] ; ;; ----> lancement du timer ;; ... st %r0, [%r1+4] ; ld [%r1], %r3 ;

arrt du timer lecture du compteur

%r1 pointe au dbut de la zone mmoire [0x400000,400008[ et toutes les rfrences mmoire sont faites par rapport lui : [%r1] pour commande #1, [%r1+4] pour commande #2. La valeur crite dans commande #1 est 0x00320064, soit N=50 et P=100. On va voir que le facteur de prdivision est ici de 1, donc la priode sera bien de 100 cycles dhorloge, et le timer sera 0 durant les 50 premiers cycles, puis 1 les 50 cycles suivants. La valeur crite dans commande #2 est 0x00000001, soit prediv=0 et start=1 : le facteur de prdivision est 1, et la mise 1 du bit start provoque le dmarrage du timer. Plus loin dans le programme, le timer est arrt par mise 0 de ce bit, et la valeur courante du compteur est lue et stocke dans %r4. Exemple dutilisation : commande dun servo-moteur Un servo-moteur est compos dun moteur courant continu avec un ensemble dengrenages dmultiplicateurs qui lui donnent un couple trs lev. Il est muni dune lectronique de commande qui permet de contrler avec prcision, non pas la vitesse de rotation, mais la position angulaire de son axe, qui na un dbattement que de 180 (gure V.31).

9. Programmation des entres/sorties

169

180 degrs

0 degrs

Figure V.31. Servo-moteur. La rotation de laxe est trs dmultiplie et a un couple lev. La commande ajuste la position angulaire de laxe, qui peut varier de 0 180. La commande se fait sur un seul l, la norme TTL (0 ou 5v), et consiste en une impulsion priodique dont la largeur code la position angulaire de laxe (gure V.32).
1 ms = 0 degrs 2 ms = 180 degrs

1 ms < d < 2 ms

priode 20ms

Figure V.32. Forme du signal de commande dun servo-moteur.Il est priodique de priode 20ms ; limpulsion a une largeur comprise entre 1ms et 2ms, qui code la position angulaire de laxe entre 0 et 180. La priode du signal reste constante 20ms (valeur non critique) ; ce qui varie, cest la largeur de limpulsion, entre 1ms et 2ms. Dans cet intervalle il y a proportionnalit entre la largeur de limpulsion et la position angulaire, de 0 pour une largeur de 1ms 180 pour une largeur de 2ms. Dtermination de la frquence de lhorloge du timer On souhaite avoir environ 1000 pas de prcision sur la commande, cest dire quon souhaite faire varier la largeur de limpulsion de 1 ms 2 ms par pas de 1/1000 ms. Cest donc cette valeur de 1/1000 ms qui doit tre la priode de base du timer : DT 10 6s. On suppose que lhorloge gnrale est de 50 MHz, soit une priode de DH = 210 8s. Le rapport de prdivision de DH doit donc tre DT / DH = 50. La puissance de 2 la plus proche est 64, soit une valeur de prediv de 6. Finalement la vritable frquence de lhorloge sera : DT = 64DH = 1, 2810 6s P restera constant gal 20 ms / 1, 2810 6 s = 15625 pour assurer la priode gnrale de 20 ms du signal transmis au servo-moteur, et N variera entre 12501et 14063 pour faire varier la largeur de limpulsion entre 1 ms et 2 ms, par 1562 pas. La gure V.33 donne un sous-programme de positionnement du servo-moteur, auquel on donne comme paramtre langle de positionnement dans %r1 en diximes de degrs (de 0 1800).

170

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

;; commande de servo-moteur BASETIMER = 0x400000

; adresse de base du timer

main

.org 0 ;; main : exemple dutilisation set 900, %r1 ; %r1 <- 90 degrs call cmdservo ba * ;; sous-programme de commande du servo ;; in : %r1=angle en diximes de degrs umulcc %r1, 1561, %r3 ; %r3 = 1561 * angle udivcc %r3, 1800, %r3 ; %r3 = 1561*angle/1800 set 12501, %r1 add %r3, %r1, %r3 ; %r3 = 12501+1561*angle/1800 sll %r3, 16, %r3 ; dcalage de 16 positions gauche set 15625, %r1 ; valeur de P or %r1, %r3, %r3 ; fusion de N et P dans %r3 set BASETIMER, %r2 ; %r2 = base timer st %r3, [%r2] ; criture commande #1 set 0b1101, %r3 ; prediv=6, start=1 st %r3, [%r2+4] ; criture commande #2 ret

cmdservo

Figure V.33. Sous-programme de commande de servo-moteur. Le sous-programme cmdservo effectue dabord une mise lchelle de la valeur de %r1 (de 0 1800) : une transformation afne remplace %r1 par une valeur entre 12501 et 14063, qui est la valeur qui doit tre place dans le registre N du timer/PWM. On notera que les constantes 1561et 1800 ont t utilises directement comme constantes immdiates dans les instructions umulcc %r1, 1561, %r3 et udivcc %r3, 1800, %r3 car elles sont codables sur 13 bits (voir format des instructions en section 2.4). Cela nest pas le cas par contre pour la constante 15625, qui ne tient pas sur 13 bits et qui doit dabord tre mise dans un registre par une instruction synthtique set. On comprend tout lintrt de commander un servo-moteur par un tel circuit timer/PWM : le signal priodique est gnr de faon autonome et le processeur na besoin dintervenir que lors dun changement de position ou dune demande darrt ou de lancement, qui se traduisent par une simple criture en mmoire.

10. Programmation des exceptions


10.1. Dnitions
Une exception est un vnement exceptionnel qui intervient au cours du fonctionnement du processeur.La prise en compte dune exception se traduit par lexcution dun sous-programme qui lui est associ, appel gestionnaire dexception. On pourrait dire quune exception est un appel de sous-programme inattendu. On classe les exceptions en deux groupes, selon que leur cause est interne ou externe.

10. Programmation des exceptions Les traps

171

Les traps sont des exceptions cause interne, provoqus par lexcution dune instruction par le processeur. Mieux quun long discours, la liste des traps du processeur CRAPS fera comprendre leur nature : instruction illgale. Le processeur tente dexcuter une instruction dont le code machine ne correspond aucune instruction connue. bus error. Le processeur tente deffectuer un accs mmoire une adresse o aucune mmoire nest implante. division par 0. Le processeur excute une instruction de division et le diviseur est nul. erreur dalignement. Le processeur tente deffectuer un accs mmoire une adresse qui nest pas un multiple de 4 si par exemple il sagit dun processeur 32 bits. La plupart des processeurs exigent en effet que la lecture ou lcriture des mots respectent de telles contraintes dalignement. instruction privilgie. Le processeur tente dexcuter une instruction privilgie (rserve aux programmes en mode superviseur) mais il nest pas en mode superviseur.

On dit de telles exceptions quelles sont synchrones, car elles surviennent un endroit prvisible du programme. Elles correspondent gnralement un fonctionnement incorrect de celui-ci et conduisent souvent larrt de la tche associe. Les traps sont ainsi lquivalent matriel des exceptions logicielles, qui elles aussi se dclenchent en cas dexcution incorrecte dinstructions, et qui ont un gestionnaire associ. Les interruptions Une interruption est une exception cause externe, gnralement lie un vnement dentre/sortie. Par exemple : la lecture de donnes par un disque est termine et le contrleur de disques envoie au processeur une interruption pour len informer. un paquet de rseau vient darriver. un vnement clavier ou souris vient de se produire. un changement est intervenu sur une des lignes dentres/sorties. un vnement est intervenu sur la chane USB.

Les interruptions sont dites asynchrones, car elles surviennent des moments totalement imprvisibles du fonctionnement du processeur, et non en rapport avec des instructions prcises. Le processeur est prvenu de loccurrence de linterruption par lactivation dune ligne externe spcique, souvent commune plusieurs ou toutes les interruptions. Cest seulement ensuite que le type de linterruption sera identi, et quun sous-programme

172

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

associ sera excut, et ce dune faon qui devra rester transparente pour le programme principal qui tait en cours dexcution ce moment. Par exemple lorsque vous appuyez sur une touche de votre clavier dordinateur, aucun programme nattend spciquement et activement cette frappe. Lors de la frappe, une interruption est gnre par le contrleur de clavier vers le processeur, et celui-ci suspend le programme en cours dexcution, et appelle un sous-programme gestionnaire de cette interruption, dont le rle va tre dobtenir du contrleur de clavier le code de la touche frappe et de le placer dans un buffer situ au niveau du systme dexploitation. Lexcution de ce sous-programme sera trs rapide et on verra quelle sera faite de faon transparente pour le programme qui a t interrompu. Dans CRAPS, il ny a que deux sources dinterruption : le timer et les lignes dentres/sorties. On pourra programmer le timer pour quil dclenche une interruption chaque front montant de sa sortie, et cela permettra par exemple dimplanter un scheduler de tches ou une horloge temps rel. On pourra galement programmer les lignes dentres/sorties pour dclencher une interruption larrive dun front montant ou descendant (sens programmable au choix) sur une ligne congure en entre. Une interruption = un coup de sonnette Pour mieux faire comprendre les traps et les interruptions, on peut employer une analogie domestique. Supposons que nous soyons en train de faire un gteau, en suivant les instructions dune recette : ce sera lquivalent du programme principal en cours dexcution. La plupart des instructions de la recette sont sans problme : remuer la pte, etc. Un petit nombre dentre-elles peuvent mal se passer : si on doit casser un oeuf mais quil nest pas frais ; si on doit mettre une pince de sel mais quon na plus de sel, etc. Ces problmes spciques sont associs des instructions spciques, ce sont lquivalent des traps. Le plus souvent, leur prise en compte consistera abandonner la tche en cours. Supposons maintenant que pendant que nous faisons cette recette nous attendions la visite du facteur, mais que notre sonnette soit en panne. Comme le moment prcis de cette visite nest pas dni, cela va nous obliger interrompre sans cesse notre recette pour aller regarder par la fentre. Cela sera pnalisant pour la recette, mais aussi pas trs efcace : le facteur peut trs bien tre venu et reparti en pensant quil ny avait personne, si on laisse passer trop de temps entre deux coups doeil. Avec une sonnette, qui joue le rle dune ligne dinterruption, on peut raliser la recette sans penser sans cesse au facteur. Si un coup de sonnette survient, on terminera linstruction en cours, (par exemple, il faut terminer de casser un oeuf si on a dj commenc) et on cochera sur la recette lendroit o on sest arrt. On ragira ensuite linterruption par une procdure adapte : aller la porte, ouvrir, saluer, rcuprer ventuellement des donnes, etc. De retour de cette procdure, dont le traitement aura t court, on reprendra la recette linstruction qui suit celle quon avait coche. Cette analogie permet mme de prsenter le problme des niveaux de priorit entre exceptions. Comment doit-on faire si par exemple le tlphone sonne alors quon est en train de rpondre au visiteur la porte ? Si on juge que le tlphone est plus prioritaire que la porte dentre, alors on interrompra le dialogue en cours avec le visiteur pour effectuer la procdure associe au tlphone. Une fois quon aura ni de rpondre, on reprendra le dialogue avec le visiteur l o on lavait arrt, pour nalement revenir au programme principal (la recette), dont lexcution naura pas t perturbe.

10. Programmation des exceptions Niveaux de priorit

173

Ainsi, chaque exception (trap ou interruption) est associ un niveau de priorit, cod gnralement sous forme dun nombre entier. Par ailleurs le processeur entretient dans un registre dtat une valeur de niveau courant dexcution. Lorsque le processeur excute un programme un niveau p, il ne peut tre interrompu que par une exception de niveau q suprieur p. Lorsque cette interruption est prise en compte et que son gestionnaire est excut, le processeur lve son niveau dexcution q de faon ne plus pouvoir tre interrompu que par des exceptions de niveau suprieur q. Lorsque le processeur sort du gestionnaire de cette exception, il reprend le niveau dexcution quil avait avant lappel. Le programme principal sexcute au niveau 0, et il est par consquent interruptible par toutes les exceptions. La gure V.34 montre un exemple de scnario dexcution du programme principal et de deux gestionnaires dexception de niveaux de priorit diffrents.
priorit

gestionnaire excep.#13

gestionnaire excep.#25

programme principal

Figure V.34. Niveaux de priorits et gestionnaires dexceptions. Le programme principal est interrompu par lexception #25,qui lui mme est interrompu par lexception #13; chaque interruption est transparente pour celui qui est interrompu. Dans CRAPS, il y a 16 niveaux de priorit, cods sous forme dun entier de 4 bits. Le niveau dexcution courant du processeur est stock dans le champ PIL du registre %psr (voir section 2.2). Au reset, le niveau dexcution PIL est 0. Numro de lexception chaque exception est galement associ un numro de type, unique par type dexception, qui va servir localiser ladresse de son gestionnaire dexception.Ce numro na en principe pas de rapport direct avec le niveau de priorit de lexception. Dans CRAPS, comme dans le SPARC, le numro de type dexception est cod sur 8 bits, et il y a donc 256 sortes dexceptions diffrentes. Seul un sous-ensemble des exceptions du SPARC a t implment, donn gure V.35. Le cas de reset est particulier : il est list dans le tableau comme lexception la plus prioritaire, mais elle na pas de numro. En fait, loccurrence dun reset matriel va provoquer la remise zro de tous les registres, y compris %pc, et le contrle va reprendre en mode non superviseur ladresse 0, avec un niveau dexcution de 0, ce qui

174

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC


exception reset bus error instruction privilgie instruction illgale division par zro erreur dalignement interruption timer interruption entres/sorties priorit 15 14 13 12 11 10 8 7 numro de type (tt) voir texte 14 13 12 11 10 8 7

Figure V.35. Tableau des exceptions, de leurs priorits et de leurs numros de type. est le comportement souhait. Le reset est considr comme une exception sur un plan thorique, mais il est gr dune faon diffrente en pratique. Par ailleurs, an de simplier la structure du sous-sytme dexceptions, les numros de type dexception et le niveau de priorit ont t rendus gaux. Gestionnaires dexceptions Lorsquune exception est prise en compte, un sous-programme appel gestionnaire dexception ou handler dexception est appel, associ au numro de type tt de lexception. Il existe gnralement une table de vecteurs dexception qui contient les adresses de tous les gestionnaires dexception, classe par numro de type tt. Cette table est initialise lors du chargement du systme dexploitation, ou elle peut tre en ROM. Dans CRAPS, lorsquune exception est prise en compte, son numro tt est copi dans le champ tt du registre %tbr. On rappelle gure V.36 sa structure, dj prsente section 2.2. Ladresse ainsi forme est unique par numro tt, et les adresses possibles sont espaces
TBA (trap base address) 31 12 11 TBA = poids forts adresse table des exceptions tt = trap type = numero de lexception tt 4 zros 0

Figure V.36. %tbr (Trap Base Register). de 16 en 16, puisque les 4 bits de poids faibles valent 0. cette adresse sont placs, non pas ladresse du gestionnaire comme cest le cas dans beaucoup de processeurs, mais les premires instructions elles-mmes du gestionnaire associ lexception. Comme il ny a a-priori la place que pour 4 instructions (16 octets), celui-ci doit trs vite effectuer un saut vers un autre emplacement en mmoire pour continuer son excution.

10.2. Prise en compte dune exception en CRAPS


On va maintenant dcrire exactement comment les exceptions sont prises en compte pour le processeur CRAPS, sachant que la procdure est globalement la mme pour les autres processeurs, mais que de nombreux dtails peuvent varier. Celle du CRAPS est une

10. Programmation des exceptions simplication de celle du SPARC, mais en conserve les traits les plus importants. Conditions de prise en compte dune exception Une exception est prise en compte si : ET = 1 (trap enable = 1) et

175

le niveau de priorit de lexception est strictement suprieur au niveau courant dexcution. (champ PIL du registre %psr)

Si une exception se produit pendant que ET = 0, elle est ignore et non mmorise ; tout se passe comme si elle navait jamais eu lieu. Si une exception se produit pendant que ET = 1 mais que son niveau est infrieur ou gal au niveau dexcution courant, elle est mmorise et sera prise en compte lorsque le niveau dexcution redescendra au niveau ou au dessous du niveau de lexception. Par contre si durant cette priode une exception de mme numro se produit, elle sera perdue car celle qui est mmorise en attente empchera la mmorisation de la nouvelle. Procdure matrielle de prise en compte de lexception Une fois les conditions de prise en compte runies, la procdure suivant, ininterruptible, est excute automatiquement par le processeur (hardware) : 1 2 3 4 5 6 le processeur termine linstruction en cours. le processeur passe en mode superviseur : S 1. Le gestionnaire dinterruption aura ainsi accs toutes les instructions. %pc et %psr sont sauvegards dans la pile. le niveau de priorit de lexception est copi dans le champ PIL du registre %psr, levant ainsi le niveau dexcution du processeur. ladresse du gestionnaire dexception est calcule par la formule : %tbr + 16 * numro de type. le contrle est pass ladresse du gestionnaire de lexception : %pc adresse gestionnaire. On notera qu cet endroit, il ny a la place que pour 4 instructions et quun saut vers un autre emplacement est ncessaire.

Contenu du gestionnaire dexception Lcriture dun gestionnaire dexception est une tche dlicate ; elle est gnralement rserve aux concepteurs des systmes dexploitation. Sur certaines plates-formes comme Linux, il est possible un programmeur averti de le faire ; cest bien sr possible aussi sur la machine CRAPS. Sil sagit dun gestionnaire de trap, cest dire dune exception provoque par lexcution incorrecte dune instruction dun programme, le code associ va gnralement consister en labandon de la tche en cours. Lcriture de ce code sort du cadre de cette discussion.

176

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

Sil sagit du gestionnaire dune interruption, il faut faire en sorte que son excution soit transparente pour le programme en cours de fonctionnement. Cela ncessite plusieurs conditions : tous les registres que ce gestionnaire va utiliser doivent tre sauvegards (dans la pile) ds lentre dans le gestionnaire et doivent tre restaurs juste avant den sortir. le gestionnaire doit tre termin par linstruction RETE.

Linstruction RETE dpile les valeurs de %pc et %psr qui avaient t empiles automatiquement par le processeur lors de la prise en compte de linterruption, puis incrmente %pc de 4. Les deux aspects cruciaux comprendre sont, dune part que la restauration de %pc permet le retour linstruction qui suit celle qui a t interrompue, dautre part que la restauration de %psr permet de retrouver les valeurs de dpart du niveau dexcution et du bit superviseur. Au retour du gestionnaire dexception, le programme principal na aucun moyen de savoir quil a t interrompu, car rien na chang pour lui entre le moment de linterruption et celui du retour.

10.3. Exemple 1 : horloge temps rel


titre dexemple, on va mettre en place une horloge qui permettra un programme dobtenir une heure dune prcision parfaite, sous forme dune fonction getTimeMillis. chaque appel de cette fonction, on obtiendra dans %r1 le nombre de millisecondes coules depuis la mise en route de la machine ; cette valeur sincrmentera de faon exacte entre chaque appel, sans que le programme principal en cours dexcution ne sen occupe explicitement. On va pour cela programmer le timer pour quil fournisse des impulsions toutes les millisecondes, et le dclarer comme source dinterruption. Cest en effet possible dans CRAPS comme on peut le voir dans le tableau de la gure V.35 et cette interruption a le numro 8 et la valeur de priorit 8.

10.4. Exemple 2 : programmation dun scheduler de tches en CRAPS


La gure V.38 montre un programme complet de scheduler de tches pour CRAPS, qui utilise le timer pour fournir une source dinterruption rgulire pour effectuer la commutation dune tche la suivante. Le programme est initialis avec 4 tches prog0, prog3 qui effectuent inniment linversion et la dsinversion dune chane de caractres ; chacune delles possde son propre espace de pile. Le scheduler entretient le numro de la tche en cours dexcution, qui sert dindex dans une table de pointeurs de pile, TABSP. Lors de larrive dune interruption timer, le gestionnaire de cette exception sauvegarde le contexte dexcution de la tche qui va tre suspendue dans la propre pile de la tche. %pc et %psr ont dj t sauvegards par le traitement de lexception ; il sauvegarde ensuite tous les registres.Le pointeur de pile de cette tche en cours de suspension est sauvegard dans TABSP, le numro de la tche courante est incrment (modulo 4) et le pointeur de pile de la tche qui est rveill est lu. Son contexte est relu partir de sa propre pile et linstruction nale rete va restaurer dans %pc ladresse courante dexcution de cette tche.

10. Programmation des exceptions


RAM STACK TIMER_BASE TT_TIMER = = = = 0x1000000 0x1000100 0x400000 8

177
; dbut de la RAM ; sommet de la pile ; adresse de base du timer ; numro de type de linterruption timer

loop

getTimeMillis

TABEXCEP

HDL_TIMER:

TIME

set STACK, %sp ; initialise sommet de pile ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; installe la table des exceptions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set TABEXCEP, %r1 wrtbr %r1 ; initialisation champ TBA de %tbr ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; initialisation timer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set BASETIMER, %r1 ; %r1 = base timer set 0x00320064, %r2 ; N=50 & P=100 st %r2, [%r1] ; criture commande #1 set 0x00000001, %r2 ; prediv=0 & start=1 st %r2, [%r1+4] ; criture commande #2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; boucle infinie ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; call getTimeMillis ba loop ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; fonction getTimeTicks : renvoie dans %r1 le nombre ; de millisecondes coules depuis reset ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set TIME, %r1 ld [%r1], %r1 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; table des exceptions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .org TABEXCEP + 2*TT_TIMER ; adresse handler timer .word HDL_TIMER ; branchement un endroit plus spacieux ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; timer handler : incrementation du mot mmoire TIME ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; sauvegarde de %r1 et %r2 subcc %sp, 2, %sp st %r1, [%sp] subcc %sp, 2, %sp st %r2, [%sp] set BASETIMER, %r1 setq 1, %r2 st %r2, [%r1+8] ; raz int. timer set TIME, %r1 ld [%r1], %r2 ; lecture de TIME inc %r2 ; incrmentation st %r2, [%r1] ; stockage de la valeur incrmente ;; restauration de %r2 et %r1 ld [%sp], %r2 addcc %sp, 2, %sp ld [%sp], %r1 addcc %sp, 2, %sp rete .org RAM .word 0

Figure V.37. Programme dhorloge temps rel par interruptions.

178
RAM STACK0 STACK1 STACK2

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC


; incrmentation numro tche courante modulo 3 inc %r2 subcc %r2, 3, %r0 bneg sav clr %r2 sav st %r2, [%r1] ; restauration depuis TABSP du %sp de ; la tche suivante addcc %r2, %r2, %r3 ld [%r4+%r3], %sp ; restauration des registres %r1..%r5,%r7 ; depuis la nouvelle pile ld [%sp],%r7 addcc %sp, 2, %sp ld [%sp],%r5 addcc %sp, 2, %sp ld [%sp],%r4 addcc %sp, 2, %sp ld [%sp],%r3 addcc %sp, 2, %sp ld [%sp],%r2 addcc %sp, 2, %sp ld [%sp],%r1 addcc %sp, 2, %sp ; restauration des anciens %psr et %pc ; donc retour de la dou on etait parti rete ;;;;;;;;;;; TACHES UTILISATEURS ;;;;;;;;;;

= 0x1000000 = 0x1000100 = 0x1000200 = 0x1000300 ;; installe la table des vecteurs dexceptions set 0xF000, %sp set TABEXCEP, %r1 wrtbr %r1 ;; installe les tches excuter set prog1, %r1 setq 1, %r2 call creer_tache set prog2, %r1 setq 2, %r2 call creer_tache ;; lancement du timer qui cadence le scheduling set 0x4000, %r2 ; %r2 = timer base address set 1000, %r1 ; periode = 1000 st %r1, [%r2+2] set 0b11, %r1 ; start + cyclic st %r1, [%r2] ; -> lance le scheduler ; lancement de la premire tche set TABSP, %r1 ld [%r1], %sp ; lecture de son %sp ba prog0 ;;; cree une nouvelle tche de numro %r2 et ;;; dadresse de depart %r1 creer_tache set TABSP, %r3 addcc %r2, %r2, %r4 ld [%r3+%r4], %sp ; lecture du %sp subcc %sp, 2, %sp st %r1, [%sp] ; empilement %pc setq 7, %r5 ; empile 7 x 0 loop subcc %sp, 2, %sp st %r0, [%sp] dec %r5 bne loop st %sp, [%r3+%r4] ; sauve %sp dans TABSP ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; exception table ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .org TABEXCEP + 2*3 ; handler timer jmp HDL_TIMER ; %pc et %psr deja empiles dans la pile ; du process en cours ; sauvegarde dans cette pile ; les registres %r1..%r5,%r7 addcc %sp, -2, %sp st %r1, [%sp] addcc %sp, -2, %sp st %r2, [%sp] addcc %sp, -2, %sp st %r3, [%sp] addcc %sp, -2, %sp st %r4, [%sp] addcc %sp, -2, %sp st %r5, [%sp] addcc %sp, -2, %sp st %r7, [%sp] ; raz int.timer set BASETIMER, %r1 setq 1, %r2 st %r2, [%r1+8] ; sauvegarde du %sp de la tche courante ; dans TABSP set NUMPROC, %r1 ld [%r1], %r2 addcc %r2, %r2, %r3 set TABSP, %r4 st %sp, [%r4+%r3]

;;;;; tche #0 : inversion et desinversion de STR0 prog0: set STR0, %r1 l0: call inverse ba l0 ;;;;; tche #1 : inversion et desinversion de STR1 prog1: set STR1, %r1 l1: call inverse ba l1 ;;;;; tche #2 : inversion et desinversion de STR2 prog2: set STR2, %r1 l2: call inverse ba l2 inverse: rev1 clr sethi ldub tst be inc ba clr dec cmp bpos ldub ldub stb stb dec inc ba ret %r3 0,%r4 [%r1+%r3], %r4 %r4 rev2 %r3 rev1 %r5 %r3 %r5, %r3 outrev [%r1+%r3], %r4 [%r1+%r5], %r2 %r4, [%r1+%r5] %r2, [%r1+%r3] %r3 %r5 rev3 ; i <- 0

TABEXCEP

HDL_TIMER:

; tq (str[i]<>0) ; ; ; ; ; ; ; ; ; ; ; ; i <- i + 1 fin tq j <- 0 i <- i - 1 tq (i>j) x <- str[i] y <- str[j] str[i] <- y str[j] <- x i <- i - 1 j <- j + 1 fin tq

rev2 rev3

outrev

NUMPROC TABSP

.org RAM ; numero de la tche courante .word 0 ; table des tches .word STACK0, STACK1, STACK2 ; chanes pour inversion en RAM .byte abcdefg,0 .byte 123456789,0 .byte xyz,0

STR0 STR1 STR2

Figure V.38. Programme complet du scheduler de tches.

11. Exercices corrigs

11. Exercices corrigs

179

11.1. Exercice 1 : multiplication programme


nonc crire un sous-programme qui effectue la multiplication de deux nombres non signs de 16 bits placs dans les poids faibles de %r1 et %r2 respectivement, avec un rsultat sur 32 bits dans %r3. Solution On pourrait mettre en place une boucle quon effectuerait %r1 fois, et dans laquelle on cumulerait %r2 dans %r3. Cette mthode serait simple, mais particulirement inefcace pour de grandes valeurs de %r1. On va plutt utiliser une mthode inspire de la gure II.46, dans laquelle on prend les bits de %r2 un par un en commenant par le poids faible, et on cumule dans %r3 (initialis 0) la valeur de %r1, que lon dcale vers la gauche chaque tape. Cela correspond lalgorithme suivant :
; calcul du produit A x B rsultat <- 0 ; tant que (B <> 0) faire b0 <- poids_faible(B) ; dcaler B dun bit vers la droite ; si b0 = 1 faire rsultat <- rsultat + A ; fin si dcaler A dun bit vers la gauche ; fin tq

Le programme donn gure V.39 est une traduction littrale de lalgorithme. On notera le test bne noadd qui nest pas fait immdiatement aprs linstruction andcc %r2, 1, %r0 qui positionne le ag Z ; cela est possible car linstruction qui la suit srl %r2, 1, %r2 ne modie pas les ags.

11.2. Exercice 2 : systme de scurit


nonc On souhaite utiliser les lignes dentres/sorties de CRAPS pour raliser un systme de mise en marche de machine dangereuse. Les lignes IO[0] et IO[1] seront congures en entres ; on supposera quelles sont relies des boutons poussoirs appels A et B respectivement, quips dun dispositif anti-rebond. La ligne IO[2] sera congure en sortie, et commandera la mise en marche de la machine. On demande dcrire un programme qui fonctionne en permanence, et qui dclenche la mise en marche de la machine lorsque la procdure suivante est respecte : 1 2 3 A et B doivent tre relchs initialement ; appuyer sur A, appuyer sur B : la machine se met en marche.

180

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

main

;; programme principal de test set 17, %r1 ; A <- 17 set 14, %r2 ; B <- 14 call mulu16 ; calcul de A x B ba * ; arrt ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; multiplication non sign ;; calcule %r1.L x %r2.L, rsultat dans %r3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; clr %r3 ; rsultat <- 0 tst %r2 ; tant que B <> 0 be fin ; andcc %r2, 1, %r0 ; b0 (Z) <- poids faible de B srl %r2, 1, %r2 ; dcale B vers la droite bne noadd ; si b0 = 1 faire addcc %r1, %r3, %r3 ; rsultat <- rsultat + A sll %r1, 1, %r1 ; dcale A gauche ba loop ; fin tq ret

mulu16 loop

noadd fin

Figure V.39. Sous-programme de multiplication non signe 16 bits x 16 bits vers 32 bits. Toute autre manipulation arrte ou laisse la machine arrte ; il faut ensuite reprendre la procdure au point 1 pour la mettre en marche. Solution On a dj ralis une telle commande laide de circuits squentiels. On demande maintenant de le raliser par programme, comme on pourrait le faire avec un microcontrleur. On rappelle le graphe dtats de ce systme gure V.40.
00 M=0 10 11 b 00 01 10 e M=0 M=0 00 01 c M=1 11

10 01 11

00

Figure V.40. Graphe dtats du systme de scurit. chaque tat dans le graphe correspondra une position dans le programme. Cela conduit lalgorithme suivant :
configurer IO[1] (A) et IO[0] (B) en entres, IO[2] (M) en sortie ; label a: crire 0 sur M ;

11. Exercices corrigs


label a1: lire tat de A et B ; cas (A,B) (0,0): aller en a1 ; (1,0): aller en b ; autre: aller en e ; fin cas label b: crire 0 sur M ; label b1: lire tat de A et B ; cas (A,B) (1,0): aller en b1 ; (1,1): aller en c ; autre: aller en e ; fin cas label c: crire 1 sur M ; label c1: lire tat de A et B ; cas (A,B) (1,1): aller en c1 ; autre: aller en e ; fin cas

181

Cet algorithme se traduit de faon littrale par le programme donn gure V.41.

11.3. Exercice 3 : inversion dune chane de caractres


nonc crire un sous-programme qui inverse sur place une chane de caractres ASCII situe en RAM et pointe par %r1. Solution Les caractres sont ici stocks sous forme de codes ASCII dans des octets conscutifs. On emploiera donc les instruction ldub et stb pour les lire et les crire en mmoire. Lide de lalgorithme implmenter est de conserver un pointeur en dbut de chane et den placer un autre en n de chane. On intervertit alors les caractres quils pointent, et on les dplace dun cran lun vers lautre. On recommence ensuite lchange et le dplacement jusqu ce quils se rencontrent. Cela donne plus prcisment lalgorithme suivant :
i <- 0 ; tant que (str[i] <> 0) faire i <- i + 1 ; fin tq ; i <- i - 1 ; j <- 0 ;

182

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC

IOBASE main

= set setq st setq st ld andcc subcc be subcc bne setq st ld andcc subcc be subcc bne setq st ld andcc subcc be setq st ld andcc subcc bne ba

0x600000 IOBASE, %r1 0b100, %r2 %r2, [%r1+2] 0b000, %r2 %r2, [%r1] [%r1], %r2 %r2, 0b11, %r2, 0b00, a1 %r2, 0b10, e 0b000, %r2 %r2, [%r1] [%r1], %r2 %r2, 0b11, %r2, 0b10, b1 %r2, 0b11, e 0b100, %r2 %r2, [%r1] [%r1], %r2 %r2, 0b11, %r2, 0b11, c1 0b000, %r2 %r2, [%r1] [%r1], %r2 %r2, 0b11, %r2, 0b00, e1 a

; adresse de base entres/sorties ; adresse de base I/O dans %r1 ; configuration IO[1..0] entres ; IO[2] sortie ; M <- 0 ; lecture tat de A et B ; isolation des bits 0 et 1 ; (A,B) = (0,0) : aller en a1 ; (A,B) = (1,0) : aller en b ; sinon aller en e ; ; M <- 0 ; lecture tat de A et B ; isolation des bits 0 et 1 ; (A,B) = (1,0) : aller en b1 ; (A,B) = (1,1) : aller en c ; sinon aller en e ; ; ; ; ; ; ; ; ; M <- 1 lecture tat de A et B isolation des bits 0 et 1 (A,B) = (1,1) : aller en c1 sinon aller en e M <- 0 lecture tat de A et B isolation des bits 0 et 1 (A,B) <> (0,0) : aller en e1

a: a1:

%r2 %r0 %r0

b: b1:

%r2 %r0 %r0

c: c1:

%r2 %r0

e: e1:

%r2 %r0

; sinon aller en a

Figure V.41. Programme de mise en marche de scurit pour machine dangereuse.


tant que (i > j) faire x <- str[i]; y <- str[j]; str[i] <- y ; str[j] <- x ; i <- i - 1 ; j <- j + 1 ; fin tq ;

La traduction littrale de cet algorithme est donne gure V.42.

11. Exercices corrigs

183

RAM STACK main

= =

0x10000000 RAM + 0x1000

; adresse dbut de RAM ; adresse sommet pile

;; programme de test set STACK, %sp set STR, %r1 call reverse ba * clr sethi ldub tst be inc ba clr dec cmp bpos ldub ldub stb stb dec inc ba ret .org .byte %r3 0,%r4 [%r1+%r3], %r4 %r4 rev2 %r3 rev1 %r5 %r3 %r5, %r3 outrev [%r1+%r3], %r4 [%r1+%r5], %r2 %r4, [%r1+%r5] %r2, [%r1+%r3] %r3 %r5 rev3 ; i <- 0

reverse rev1

; tq (str[i]<>0) ; ; ; ; ; ; ; ; ; ; ; ; i <- i + 1 fin tq j <- 0 i <- i - 1 tq (i>j) x <- str[i] y <- str[j] str[i] <- y str[j] <- x i <- i - 1 j <- j + 1 fin tq

rev2 rev3

STR

RAM azertyuiop,0

; chane de test

Figure V.42. Sous-programme dinversion sur place dune chane de caractres.

11.4. Exercice 4 : conversion binaire / ASCII


nonc crire un sous-programme qui convertit un nombre entier plac dans %r1, cod en binaire non sign, en une chane de caractres ASCII qui en est sa reprsentation dcimale, partir de ladresse mmoire contenue dans %r2. Solution On applique un algorithme connu sous le nom de schma de Horner, qui consiste diviser le nombre par 10, conserver le reste, puis diviser nouveau le quotient par 10 et garder le reste, et ainsi de suite jusqu ce que le nombre soit plus petit que 10 ; la suite des restes obtenus forme la suite inverse des chiffres dcimaux cherchs. Plus prcisment, lalgorithme est :

184

CHAPITRE V. PROGRAMMATION DU PROCESSEUR 32 BITS CRAPS/SPARC


i <- 0 ; tant que (n >= 10) faire (q,r) <- n / 10 ; n <- q ; str[i] <- r + 0; i <- i + 1 ; fin tq str[i] <- n + 0; i <- i + 1 ; str[i] <- 0 ; inverser sur place str ;

La traduction littrale de cet algorithme est donne gure V.43.


RAM STACK main = = 0x10000000 RAM + 0x1000 ; adresse dbut de RAM ; adresse sommet pile

;; programme de test set STACK, %sp set 1234, %r1 set STR, %r2 call bin2ascii ba * clr cmp bneg udivcc sll srl srl addcc stb inc ba addcc stb inc stb mov call ret .org .byte %r5 %r1, 10 b2 %r5, %r5, %r3, %r5, %r3, %r3, %r5 b1 %r1, %r1, %r5 %r0, 10, 16, 16, 16, %r5 %r3 %r3 %r5 ; i <- 0 ; tq (n>=10)

bin2ascii b1

; r dans %r3 ; n <- q

0, %r3 [%r2+%r5]

; str[i] <- r + 0 ; i <- i + 1 ; fin tq ; str[i] <- n + 0 ; i <- i + 1 ; str[i] <- 0

b2

0, %r1 [%r2+%r5] [%r2+%r5]

%r2, %r1 reverse

STR

RAM azertyuiop,0

; chane de test

Figure V.43. Programme de conversion binaire vers dcimal.

185

Chapitre VI Construction du processeur 32 bits CRAPS


Nous avons appris programmer le processeur CRAPS dans le chapitre prcdent, an davoir une ide plus prcise de la nature des oprations quil va devoir effectuer. On va maintenant raliser effectivement CRAPS, uniquement par lassemblage de modules qui ont t prsents au chapitre 4 ; les principes de modularit qui ont t mis en avant dans cet ouvrage sont donc effectivement mis en oeuvre dun bout lautre de la conception du processeur. Au del de la construction de ce processeur particulier, ce sont les principes de base de la conception de tous les processeurs et microcontrleurs qui seront abords.

1. Les registres
CRAPS possde 32 registres banaliss pour le programmeur : %r0, , %r31, ainsi que des registres utiliss pour son fonctionnement : %pc : program counter, qui contient ladresse de linstruction en cours dexcution. %ir : instruction register, qui contient linstruction en cours dexcution. %psr : program status register, qui contient les ags et des informations relatives aux exceptions. %tbr : trap base register, qui contient ladresse de la table des exceptions.

cette liste on ajoutera deux registres quon appellera %tmp1 et %tmp2, inaccessibles au programmeur, qui seront utiliss par le processeur lors de lexcution de certaines instructions. Pour uniformiser les accs, on a donn galement des numros ces derniers registres, dans lintervalle [32, 63]. Ainsi, tous les registres sont dsigns par un numro codable sur 6 bits. Les numros des registres non banaliss de CRAPS sont : %tmp1 & %tmp2 : %r32 & %r33 %tbr : %r60 %psr : %r61 %pc : %r62 %ir : %r63

186

1. Les registres Le sous-ensemble des registres a la structure gnrale montre la gure VI.1.

187

0
64

%r0 %r1 %r2


64

dcodeur 1 bus D
63 6

1 2

0 1 dcodeur

dsel[63..0] CLK

bsel[63..0]
63

bus B

breg[5..0]

...
30 31 32 33 %r14 %r15 %tmp1 %tmp2
64 0 1 dcodeur 6

dreg[5..0] asel[63..0]

bus A
63

areg[5..0]

32

60 61 %psr 62 63 %ir Bus D dbus[31..0]


op rd

%tbr
NZVC PIL

setNZ,setVC

32

32

%pc
rs1 rs2 4 4

Bus A Bus B abus[31..0] bbus[31..0] N,Z,V,C (UAL) N,Z,V,C

Figure VI.1. Le sous-ensemble des registres du processeur CRAPS. Le programmeur na un accs banalis quaux 32 premiers dentre-eux. On voit trois bus de 32 bits sur cette gure, qui sont les trois grands bus du processeur sur lesquels circuleront toutes les donnes manipules. Les bus A et B Sur les bus A et B on peut faire venir les valeurs de deux registres simultanment : il suft de mettre leurs numros sur areg et breg, respectivement.Par exemple, si on souhaite avoir %tbr sur le bus A et %r1 sur le bus B, on place 60 sur areg et 1 sur breg. Les valeurs des deux registres apparaissent alors sur les bus A et B respectivement, de faon asynchrone. Les deux bus fonctionnent indpendamment et en parallle. Le bus D Sur le bus D (qui sera souvent un bus de donnes, do son nom) on place une valeur quon souhaite crire dans un registre. On doit placer le numro de ce registre dans dreg, et envoyer un front montant sur lhorloge clk : la valeur sur le bus D est alors crite dans le registre de numro dreg. Le registre %psr et lcriture des ags On la vu au chapitre prcdent, les ags N, Z, V, C sont les valeurs des bits 23 20 du registre %psr, cest dire du registre %r61. Pourtant ils seront positionns, tantt par la procdure normale dcriture en %r61 (par exemple lors de la restauration de %psr un retour de gestionnaire dexception), mais aussi galement lors de lactivation de signaux

188

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS

ddis setN, setZ et setVC. On dsire par exemple que, lorsque setVC vaut 1 au front dhorloge, les bits V et C mmorisent les valeurs V_UAL et C_UAL qui proviennent de lUAL, et cela concurremment lcriture standard dans un autre registre (dont le numro est sur dreg). V et C sont groups, car ils sont toujours positionns ensemble par des instructions telles que addcc. N et Z ne sont pas groups, car une opration comme umulcc ne positionne que Z. Les cas particuliers des registres %r0 et %r34 %r38 Du chapitre prcdent sur la programmation de CRAPS on connat dj le registre %r0 et son usage trs pratique. Il doit ncessairement tre trait de faon particulire : il sera par exemple inutile de prvoir des bascules de mmorisation pour lui, et on devra faire en sorte que sa lecture donne toujours 0. De la mme faon, il sera ncessaire de disposer des constantes 2, 4, 8, 16 et 24 lors du squencement des instructions. La constante 4 sera utilise par exemple lors de lincrmentation de %pc de 4 pour le passage linstruction suivante. Les autres constantes ont des usages encore plus spciques, qui seront dcrits plus loin. On a choisi de faire en sorte que ces constantes soient les valeurs des registres %r34 (= 2), %r35 (= 4), %r36 (= 8), %r37 (= 16) et %r38 (= 24) ; de mme que pour %r0, lcriture dans ces registres spciaux sera sans effet, et leur lecture renverra toujours ces valeurs constantes. Structure dun registre ordinaire On voit gure VI.2 comment est construit un registre ordinaire, cest dire avec un indice i qui nest, ni 0 (pour %r0), ni 34 38 (pour les constantes), ni 61 (pour %psr).

Figure VI.2. Structure dun registre ordinaire. Un registre est bien compos de 32 bascules D. Une valeur de 1pour le signal dsel[i] indique quune criture est souhaite dans le registre dindice i. Comme dsel[i] est

1. Les registres

189

branch sur lentre de validation des bascules, les bascules vont se charger avec les valeurs prsentes sur les lignes dbus[31..0], cest dire le bus D. En ce qui concerne la lecture sur les bus A et B, elle seffectue bien de faon asynchrone par lintermdiaire des buffers 3-tats du bas de la gure. Quand par exemple asel[i] est active (cest dire que areg[5..0] = i), les registres vont placer leurs valeurs sur les lignes abus[31..0], cest dire le bus A. Il ny aura pas de conit avec les autres registres, car les lignes qui activent les buffers 3-tats sont les sorties dun mme dcodeur, et donc toutes mutuellement exclusives. Cela conduit lcriture SHDL suivante, pour %r1 par exemple :
// %r1 r1[31..0] := dbus[31..0]; r1[31..0].clk = clk; r1[31..0].rst = rst; r1[31..0].ena = dsel1; abus[31..0] = r1[31..0]:asel1; bbus[31..0] = r1[31..0]:bsel1;

Structure de %psr Pour le registre %r61 (%psr), seuls les bits 23..20 (N,Z,V,C), 11..7 (PIL), 7 (S) et 5 (ET) sont mmoriss. Les bits N,Z,V,C peuvent tre crits de deux faons : 1 2 directement par criture dans %r61 (dsel61 = 1). par activation de setN, setZ ou setVC.

La gure VI.3 montre sur le bit 23 (ag N) comment cela peut tre implment.

Figure VI.3. Structure du bit N du registre %psr. Si on a, ni dsel23 = 1, ni setN = 1, le registre ne peut pas changer de valeur au front dhorloge (entre en 0). Si setN = 1, on voit que le registre va se charger avec la valeur N_UAL en provenance de lUAL. Cette criture, qui aura lieu au front dhorloge, pourra avoir lieu en mme temps quune criture normale dans un autre registre. Si setN = 0 et dsel23

190

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS

= 1, on retombe dans le cas de lcriture normale dans %r61, avec mmorisation du bit dbus23 en provenance du bus D. Les sorties sur les bus A et B sont identiques aux autres registres ; on notera que le bit N (mmoris) sort par ailleurs directement vers lextrieur. Cette gestion du bit N scrit en SHDL :
// %r61 = %psr, bit N (bit #23) dr[23] = dsel61*dbus23+setN*N_UAL; // N ena23 = dsel61 + setN; r61[23] = dr[23]; r61[23].ena = ena23; r61[23].clk = clk; r61[23].rst = rst; abus[23] = r61[23]:asel61; bbus[23] = r61[23]:bsel61;

Lecture et criture dans %r0 et %r34 %r38. On rappelle que lcriture dans les registres %r0 et %r34 %r38 doit tre sans effet et que la lecture doit renvoyer les valeurs constantes 0, 2, 4, 8, 16 et 24 respectivement. Aucune bascule ne doit leur tre associe, puisquil ny a rien stocker. Lorsque leurs lignes de slection sont actives, les valeurs constantes doivent tre places directement sur le bus par lintermdiaire dun buffer 3-tats (gure VI.4).

Figure VI.4. Structure des registres %r0 et %r34 %r38. Lcriture dans ces registres est sans effet, et la lecture renvoie des valeurs constantes. Finalement on peut crire les quations SHDL de tout le sous-systme de registres (gure VI.5). Il est ncessaire de dupliquer le mme bloc de lignes autant de fois quil y a de registres, car le langage ne permet pas dautre raccourci que lcriture vectorielle simple une dimension.

2. Lunit arithmtique et logique


Lunit arithmtique et logique (UAL) est le sous-systme du processeur CRAPS qui va effectuer, non seulement les calculs explicitement associs aux instructions arithmtiques et logiques du programme en cours dexcution, mais aussi tous les calculs implicitement demands par leur mise en oeuvre, comme par exemple lincrmentation de %pc de 4 aprs lexcution dune instruction squentielle, ou le calcul du dplacement lors dun saut relatif (type ba), etc.

2. Lunit arithmtique et logique

191

module registres(rst,clk, areg5..areg0,breg5..breg0, dreg5..dreg0, dbus31..dbus0,setN,setZ,setVC, N_UAL,Z_UAL,V_UAL,C_UAL : abus31..abus0, bbus31..bbus0, N,Z,V,C) // dcodeurs 6 vers 64 decodeur6to64(areg5..areg0:asel63..asel0); decodeur6to64(breg5..breg0:bsel63..bsel0); decodeur6to64(dreg5..dreg0:dsel63..dsel0); // %r1 r1[31..0] := dbus[31..0]; r1[31..0].clk = clk; r1[31..0].rst = rst; r1[31..0].ena = dsel1; abus[31..0] = r1[31..0]:asel1; bbus[31..0] = r1[31..0]:bsel1; ... // idem pour %r2..r33; %r60,%r62..%r63 ... // %r0 = 0 abus[31..0] = 0:asel0; bbus[31..0] = 0:bsel0; // %r34 = 2 abus[31..0] = 2:asel34; bbus[31..0] = 2:bsel34; ... // idem pour %r35 = 4,.., %r38 = 24 ...

// %r61 = %psr D_N = dsel61*dbus23+setN*N_UAL; // N EN_N = dsel61 + setN; r61[23] := D_N; r61[23].ena = EN_N; D_Z = dsel61*dbus22+setZ*Z_UAL; // Z EN_Z = dsel61 + setZ; r61[22] := D_Z; r61[22].ena = EN_Z; EN_VC = dsel61 + setVC; D_V = dsel61*dbus21+setVC*V_UAL; // V D_C = dsel61*dbus20+setVC*C_UAL; // C r61[21] := D_V; r61[20] := D_C; r61[21..20].ena = EN_VC; r61[11..7,5] := dbus[11..7,5]; // PIL & S & ET r61[11..7,5].ena = dsel[11..7,5]; r61[23..22,11..7,5].clk = clk; r61[23..22,11..7,5].rst = rst; abus[23..22,11..7,5] = r61[23..22,11..7,5]:asel61; bbus[23..22,11..7,5] = r61[23..22,11..7,5]:bsel61; end module

Figure VI.5. criture SHDL du sous-systme des registres. La gure VI.6 montre linterface de ce sous-systme. Cest un circuit asynchrone pur, sans horloge. Les bus dentre et le bus de sortie ont une largeur de 32 bits ; la commande cmd_ual qui indique lopration effectuer est code sur 6 bits. Les signaux N,Z,V,C sortants donnent des indications sur le rsultat de lopration qui vient dtre effectue ; les signaux setN, setZ et setVC indiquent si ces ags doivent tre copis dans les bits N,Z,V,C du registre %psr au prochain front dhorloge. Un dernier signal div0 indique une tentative de division par 0.

Figure VI.6. Interface de lUAL.

2.1. Fonctions de lUAL


On peut numrer dans un tableau toutes les oprations de lUAL, avec leurs codes

192

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS

associs (gure VI.7). Ces codes sont sur 6 bits alors que 5 bits sufraient ; cela est d au fait que lon a rendus gaux les codes du champ op3 des instructions arithmtiques et logiques (voir gure V.8 du chapitre prcdent) avec les codes de lopration correspondante de lUAL, ce qui introduira une simplication de conception. Par exemple la valeur 010000 du champ op3 dune instruction addcc est galement le code de lopration daddition dans lUAL.
cmd_ual 010000 010100 011010 001110 010001 010010 010011 010111 110101 110110 000000 000100 100000 100001 100010 101000 111000 111001 111010 111011 opration ADDCC, addition SUBCC, soustraction UMULCC, multiplication non-signe UDIVCC, division non-signe ANDCC, et logique ORCC, ou logique XORCC, xor logique XNORCC, xnor logique SLL, shift gauche logique SRL, shift droit logique ADD, addition SUB, soustraction SIGNEXT13, extension de signe bus A, 13 bits 32 bits SIGNEXT22, extension de signe bus A, 22 bits 32 bits SIGNEXT30, extension de signe bus A, 30 bits 32 bits NOPB, no operation bus B INSBYTE0, insertion dun octet dans un mot INSBYTE1, insertion dun octet dans un mot INSBYTE2, insertion dun octet dans un mot INSBYTE3, insertion dun octet dans un mot setN 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 setZ 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 setVC 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Figure VI.7. Table des oprations de lUAL. Les codes des oprations arithmtiques et logiques sont identiques aux valeurs du champ op3 dans les instructions de calcul. La premire partie du tableau concerne des oprations directement associes aux fonctions des instructions, bien que certaines seront aussi utilises pour dautres tches internes lexcution. La deuxime partie ne concerne que ces oprations internes : laddition et la soustraction sans positionnement des ags sont utilises pour modier la valeur du compteur ordinal par exemple ; lextension de signe bus A, 13 32 bits, consiste prendre lentre A, conserver les 13 bits de poids faibles et remplacer tous les autres bits de poids forts par des zros ou des uns, selon que le nombre sur 13 bits tait positif ou ngatif (respectivement),ralisant ainsi une extension de signe. Cette opration sera ncessaire pour extraire la constante de 13 bits qui est incluse dans une instruction arithmtique ou logique avec constante immdiate, telle que addcc %r1, 5, %r2. Les deux autres oprations dextension de signe fonctionnent de manire analogue sur 22 et 30 bits, et servent extraire

2. Lunit arithmtique et logique

193

les valeurs de dplacement dans les instructions de branchement et dans linstruction call. La commande NOPB consiste laisser passer la valeur prsente sur le bus B vers la sortie, sans changement. Enn les commandes INSBYTE0,,INSBYTE3, qui seront utilises lors des instructions stb, insrent loctet prsent sur le bus B dans le mot prsent sur le bus A, en position 0, 1, 2 ou 3 respectivement.

2.2. Structure de lUAL


On pourrait concevoir une UAL en associant 32 tranches dUAL de 1 bits, comme cela a t prsent la section 8, mais ce serait trop inefcace. On va plutt chercher associer des modules efcaces tels que ladditionneur carry-lookahead, le multiplicateur systolique, etc. dont on a tudi la conception au chapitre 2. On suppose donc quon dispose de : un additionneur/soustracteur 32 bits dinterface SHDL : addsub32(a31..a0,b31..b0,op:s31..s0,N,Z,V,C) On pourra utiliser la technique vue en section 8.6 pour mettre en commun un additionneur 32 bits pour les deux oprations. op=0 indique quon fait une addition ; op=1 une soustraction. Les signaux N, Z, V, C ont la signication habituelle. un multiplicateur 16 bits x 16 bits 32 bits non sign, dinterface SHDL : mul32(a15..a0,b15..b0:s31..s0,Z) Seul un indicateur de nullit Z a un sens dans le contexte dune multiplication non signe, pour laquelle aucun dbordement nest possible. un diviseur 16 bits / 16 bits, avec calcul du quotient sur 16 bits et calcul du reste sur 16 bits, dinterface SHDL : div32(a31..a0,b15..b0:q15..q0,r15..r0,Z,DIV0) Cette fois, on a une indication supplmentaire qui dtecte une division par 0. un dcaleur barillet 32 bits, dinterface SHDL : shift32(a31..a0,sens,nb4..nb0:s31..s0) Lamplitude du dcalage est code dans nb4..nb0, de 0 31 bits ; le sens du dcalage est cod dans sens (0=gauche, 1=droite). un circuit dextension de signe, dinterface SHDL : signext(a12..a0,b1,b0:s31..s0) On a dj tudi ces circuits auparavant; ils effectuent le transcodage dun nombre sign cod en complment 2, dune certaine largeur de bits une largeur de bits plus grande, en recopiant autant de fois que ncessaire le bit de signe sur la gauche. Le prsent module est paramtrable : si b1,b0 = 00 (respectivement 01, 10) il effectue lextension de 13 (respectivement 22, 30) vers 32 bits.

194

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS un circuit dinsertion doctet, dinterface SHDL : insbyte(a31..a0,b7..b0,n1,n0:s31..s0) Ce circuit recopie a31..a0 vers s31..s0, sauf un groupe de 8 bits dont la position est donne par n1,n0 (de 0 3), qui est le numro de loctet dans le mot (0 reprsentant les rangs de 31 24 et 3 reprsentant les rangs de 7 0), les bits copis tant alors ceux de b7..b0. Lcriture dun tel module est trs simple et peut tre faite titre dexercice.

La gure VI.8 montre comment associer tous ces modules en une seule UAL. Un dcodeur (en haut droite du schma) produit les signaux addsub, etc. qui indiquent le type dopration effectuer. Chaque module de calcul est suivi de buffers trois-tats qui sont activs par la sortie correspondante du dcodeur ; il est donc garanti que ces buffers nentreront pas en conit. Par ailleurs le dcodeur a une entre de slection CS qui est relie au signal OE : si OE=0, aucune sortie du dcodeur nest active et donc tout le bus S est en haute impdance. Enn le dcodeur produit les signaux setN, setZ, setVC qui indiquent, selon le code de lopration, si les ags correspondants ont un sens. Les sorties des buffers trois-tats sont toutes relies la sortie S, qui est donc la synthse entre tous ces signaux. Si par exemple le code de lopration est cmd_ual=010011 (xor) et si OE=1, alors seule la sortie xor du dcodeur sera active ; le buffer trois-tats associ lopration xor laissera alors passer sur la sortie S le rsultat de lopration. Comme le module addsub excute la fois laddition et la soustraction, la sortie est contrle par le signal addsub qui regroupe les 4 codes associs des oprations daddition et de soustraction dans la table VI.7. Le choix entre addition et soustraction sur lentre op du module addsub est reli au signal cmd_ual[2] : en effet, si on examine les 4 codes en question, le bit 2 vaut 0 pour les 2 oprations daddition, et 1 pour les 2 oprations de soustraction. De faon analogue le dcaleur barillet shifter a sa sortie contrle par le signal shift qui regroupe les oprations sll et srl ; cest le signal cmd_ual[1] qui va faire la distinction et tre reli lentre sens du dcaleur, car entre les deux oprations de dcalage, cest le bit 1 du code qui indique le sens. On notera que lentre nb (le nombre de bits dcaler) est relie aux 5 bits de poids faibles de lentre B31..B0, pour une valeur de dcalage entre 0 et 31. En ce qui concerne le ag N, il na de sens que pour les oprations add/sub, and, or, xor, xnor ; il na pas de sens pour la multiplication et la division, qui sont non signes ici. Les modules associs produisent ainsi les signaux N1,,N5 respectivement, qui sont en fait constitus du bit de poids fort du rsultat. Ces signaux sont ensuite synthtiss en un seul signal N en fonction de lopration effectivement demande sur cmd_ual. Un traitement identique est ralis pour produire le bit Z, qui a un sens pour les mmes oprations que N, mais aussi pour la multiplication et la division. Chaque module gnre ainsi un signal Z1,,Z7 ; le module ZERO sert produire ce signal pour les oprations logiques. Les ags V et C quant eux ne peuvent tre produits que par le module addsub, qui les exporte donc directement. La gure VI.9 donne lcriture complte du module dUAL en langage SHDL.

2. Lunit arithmtique et logique

195

Figure VI.8. Structure de lUAL.

3. Les bus du processeur CRAPS


Il nous faut maintenant examiner comment les grands sous-systmes de CRAPS

196

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS


module ual(rst,clk, A31..A0, B31..B0, cmd_ual5...cmd_ual0, OE: S31..S0, setN,setZ,setVC, N,Z,V,C, div0) // decodage de lopration addsub=/cmd_ual5*cmd_ual4*/cmd_ual3*/cmd_ual1*/cmd_ual0 + /cmd_ual5*/cmd_ual4*/cmd_ual3*/cmd_ual1*/cmd_ual0; mul=/cmd_ual5*cmd_ual4*cmd_ual3*/cmd_ual2*cmd_ual1*/cmd_ual0; div=/cmd_ual5*/cmd_ual4*cmd_ual3*cmd_ual2*cmd_ual1*/cmd_ual0; and=/cmd_ual5*cmd_ual4*/cmd_ual3*/cmd_ual2*/cmd_ual1*cmd_ual0; or=/cmd_ual5*cmd_ual4*/cmd_ual3*/cmd_ual2*cmd_ual1*/cmd_ual0; xor=/cmd_ual5*cmd_ual4*/cmd_ual3*/cmd_ual2*cmd_ual1*cmd_ual0; xnor=/cmd_ual5*cmd_ual4*/cmd_ual3*cmd_ual2*cmd_ual1*cmd_ual0; shift=cmd_ual5*cmd_ual4*/cmd_ual3*cmd_ual2*cmd_ual0; sext=cmd_ual5*/cmd_ual4*/cmd_ual3*/cmd_ual2; // oprations addsub32(A31..A0,B31..B0,op:S1_31..S1_0,N1,Z1,V,C); mul32(A15..A0,B15..B0:S2_31..S2_0,Z2); div32(A31..A0,B15..B0:S3_31..S3_16,S3_15..S3_0,Z3,div0); shift32(A31..A0,cmd_ual0,A4..A0:S4_31..S4_0); S5_31..S5_0=A31..A0*B31..B0; // and ZERO(S5_31..S5_0:Z4); S6_31..S6_0=A31..A0+B31..B0; // or ZERO(S6_31..S6_0:Z5); S7_31..S7_0=A31..A0+/B31..B0+/A31..A0+B31..B0; // xor ZERO(S7_31..S7_0:Z6); S8_31..S8_0=A31..A0+/B31..B0+/A31..A0+B31..B0; // xnor ZERO(S8_31..S8_0:Z7); signext(A29..A0,B1,B0:S9_31..S9_0); // gestion du bus trois tats S31..S0 S31..S0 = S1_31..S1_0:addsub; S31..S0 = S2_31..S2_0:mul; S31..S0 = S3_31..S3_0:div; S31..S0 = S4_31..S4_0:shift; S31..S0 = S5_31..S5_0:and; S31..S0 = S6_31..S6_0:or; S31..S0 = S7_31..S7_0:xor; S31..S0 = S8_31..S8_0:xnor; S31..S0 = S9_31..S9_0:sext; // gestion des flags setN=addsub+and+or+xor+xnor; setZ=addsub+mul+div+and+or+xor+xnor; setVC=addsub; N=addsub*N1+and*N2+or*N3+xor*N4+xnor*N5; Z=addsub*Z1+mul*Z2+div*Z3+and*Z4+or*Z5+xor*Z6+xnor*Z7; end module

Figure VI.9. criture SHDL de lUAL du processeur CRAPS. communiquent entre eux. CRAPS utilise trois bus de 32 bits (gure VI.10) : Le bus A, monodirectionnel : seul le bloc des registres peut y dposer une valeur. Il est reli une des entres de lUAL, mais une drivation part galement vers le sous-systme mmoire, o il servira de bus dadresses. Il porte bien son nom : bus A comme bus dadresses.

3. Les bus du processeur CRAPS

197

clk

registres
32

32

32

Bus A

Bus B

Bus D

vers soussystme dexceptions


(OE = excep_mode)

cmd_ual[5..0]

UAL

6 OE = /read * /excep_mode

Bus D bus de donnes

Bus A bus dadresses

vers mmoire centrale


(OE = read * /excep_mode)

Figure VI.10. Les bus du processeur CRAPS. Le bus B, monodirectionnel. Il sert uniquement fournir un second argument pour lUAL. Le bus D, bi-directionnel. Cest sur lui que circulent toutes les donnes : bus D pour bus de donnes. Sa valeur est lue par le bloc des registres pour stockage dans un registre au front dhorloge, et/ou par le sous-systme mmoire pour criture en mmoire.

Le bus D est celui dont la gestion est la plus dlicate. En effet, trois sources diffrentes peuvent y dposer une valeur : 1 2 3 lUAL, pour communiquer le rsultat de ses calculs. Son criture sur le bus est commande par : OE=/read*/excep_mode. le sous-systme mmoire, qui y dposera la valeur des donnes lues en mmoire. Ce dpt sera command par OE=read*/excep_mode. le sous-systme des exceptions, qui pourra y dposer le numro de lexception dans certaines circonstances. Ce dpt est command par OE=excep_mode.

Mme si nous ne connaissons pas encore le rle exact des signaux excep_mode et read, il est clair que les trois quations des signaux OE de dpt de valeurs sur le bus D sont mutuellement exclusives ; aucun court-circuit nest donc possible.

198

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS

4. Structure du sous-systme mmoire


Le sous-systme mmoire ne fait pas partie du processeur proprement parler. Sur nos ordinateurs de bureau, il est extrieur au processeur, plac sur la carte-mre, sous forme de barrettes mmoire et de circuits de dcodages. Mais cest un lment central dont limportance est telle que nous allons tudier en dtail celui qui est associ la cartographie mmoire que nous avons vue au chapitre consacr la programmation de CRAPS. On expliquera notamment les phnomnes suivants, visibles du point de vue du programmeur : les adresses sont des numros doctets (alors quon manipule des mots de 32 bits, de 4 octets de large), la ROM commence ladresse 0x0, la RAM ladresse 0x1000000, etc. certaines adresses semblent des miroirs dautres : par exemple 0x400000 et 0x400010, laccs des adresses non implantes provoque lexception bus_error.

La cartographie mmoire exacte quon souhaite mettre en oeuvre est donne gure VI.11. On y retrouve les adresses vues dans les exemples de programmation : RAM en 0x1000000, timer en 0x400000, entres/sorties en 0x600000.
ROM (64K) commande #1 commande #2 IT timer

[0000 0000 0000 FFFF]

0040 0000 0040 0004 0040 0008

[0040 0000 0040 000B] [0060 0000 0060 000F]

timer entres / sorties donnes direction ITs memorisees sens front ITs
0060 0000 0060 0004 0060 0008 0060 000C

[0100 0000 01FF FFFF]

RAM (16 Mo)

Figure VI.11. Cartographie mmoire de CRAPS. La structure du sous-systme mmoire qui met en oeuvre cette cartographie est donne gure VI.12. Dcodage des adresses Le dcodeur situ sur la gauche du schma prend en entre les 16 bits de poids faibles du bus dadresse et produit les signaux de dcodage ROM, RAM, etc. Chacun de ces signaux correspond au dcodage de la plage mmoire associe au botier correspondant. Prcisment :

4. Structure du sous-systme mmoire

199

Figure VI.12. Structure du sous-systme mmoire. 1 la ROM de 64Ko occupe le segment [0x00000000,0x00010000[. Le signal ROM qui indique son dcodage vaut 1 lorsque les 16 bits de poids forts de ladresse sont tous 0:
ROM = /abus31*/abus30*...*/abus16

la RAM de 16Mo occupe le segment [0x01000000,0x02000000[. Le signal RAM qui dcode ces adresses vaut 1 lorsque les 8 bits de poids forts de ladresse sont gaux 000000012 :
RAM = /abus31*/abus30*...*/abus25*abus24

200 3

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS le timer occupe le segment [0x00400000,0x0040000C[. Par souci de simplication, on ne va effectuer quun dcodage partiel de ces adresses en ne dtectant que le fait que les 12 bits de poids forts valent 0x004. Cela conduit lquation du signal timer suivante :
timer = /abus31*/abus30*...*/abus23*abus22*/abus21*/abus20

le circuit dentres/sorties occupe le segment [0x00600000,0x00600010[. De faon analogue au timer, on ne dtectera que le fait que les 16 bits de poids forts sont gaux 0x0060. Cela conduit lquation du signal io suivante :
io = /abus31*/abus30*...*/abus23*abus22*abus21*/abus20

toutes les autres valeurs des 12 bits de poids forts activeront la ligne bus_error, qui indiquera donc que ladresse prsente sur le bus ne correspond aucun circuit implant dans lespace dadressage. Ce signal devra dclencher une exception de niveau 14.

Lecture en mmoire Les sorties du dcodeur sont relies aux botiers qui leurs correspondent, expliquant ainsi pourquoi chacun deux est activ par les adresses indiques sur la cartographie mmoire gure VI.11. On notera que lentre de slection CS du dcodeur est relie au OU des signaux read et write, cest dire quaucun des quatre circuits ne sera activ si aucune lecture ni criture nest demande par le processeur. Si une lecture est demande (read = 1) et que le processeur nest pas en train de grer une exception, alors : 1
OE=1 (en bas gauche du schma). On avait dj tudi lquation de OE : OE = /excep_mode*read, qui indique quun des circuits mmoire va dposer une

valeur sur le bus. 2


CS=1 et OE=1 pour le botier mmoire activ par ladresse prsente, en vertu du ET situ devant lentre OE de chaque circuit.

Ainsi, le circuit mmoire slectionn par ladresse va dposer une valeur sur le bus D. criture en mmoire Si une lecture est demande (write = 1) alors on voit que, pour le circuit activ par ladresse prsente, CS = 1, OE = 0 et W = 1 : le circuit va dclencher une criture ladresse prsente sur ses entres ADR. Oublis, les deux bits de poids faibles de ladresse ! On va tudier enn la faon dont les lignes dadresses arrivent sur les circuits mmoire. On constate dabord que, nulle part sur le schma, napparaissent les 2 bits de poids faibles de ladresse, abus1..abus0 ! Par exemple, pour le circuit de ROM, il y a bien 14 lignes dadresses puisquil contient 16K mots, mais ce ne sont pas les bits abus[13..0] qui sont utiliss, mais abus[15..2]. Si par exemple une lecture ladresse 0x00000008

4. Structure du sous-systme mmoire

201

est effectue, la ROM verra quant elle ladresse 0x0002. En fait, toute adresse entre 0x00000008 et 0x0000000B sera vue de la mme faon par le circuit de ROM : accs au mot mmoire numro 2. Mais il faut se souvenir quil est interdit de faire des lectures et des critures en mmoire des adresses qui ne sont pas des multiples de 4, sous peine de dclencher lexception erreur dalignement (numro de type = 10, voir gure V.35). Par contre, cest autoris dans le cas des instructions ldub et stb dont on verra plus loin comment elles sont gres. De la mme faon, ladresse qui est envoye la RAM est obtenue par la formule : adr_ram[21..0] = (abus[31..0] 0x01000000)/ 4 Ladresse avec laquelle la RAM est adresse sobtient dabord par une translation par rapport ladresse de base 0x01000000, et cette valeur est divise par 4. Par exemple, un programmeur qui effectue une lecture ou une criture ladresse 0x01000010 va en ralit adresser la RAM au mot mmoire (de 32 bits) dindice 5 (0x01000010 - 0x01000000) / 4). La RAM na jamais entendu parler de ladresse 0x01000000 et ne pensait sans doute pas quil existait des adresses aussi grandes (!) : elle ne connat que des adresses de 0 0xFFFFFF. De mme la RAM croit que tous les mots mmoire ont 32 bits de large ; elle serait tonne dapprendre que les adresses manipules par les programmeurs sont des numros doctets. Cest encore plus frappant pour les circuits timer et dentres/sorties, qui ne possdent que 2 lignes dadresse. De leur point de vue il nexiste que 4 mots mmoire, dindices 0 3. Cest le systme de dcodage qui fait apparatre ces mots aux adresses 0x00400000 0x0040000F pour le timer, et 0x00600000 0x0060000F pour les entres/sorties. Finalement, lcriture SHDL de lensemble est donne gure VI.14. On y fait rfrence des modules mmoire ROM et RAM prdnis.

5. Structure du circuit dentres/sorties


On va dtailler dans cette partie la structure du circuit dentres/sorties et on va montrer comment il peut avoir le mode de fonctionnement quon a dj dcrit dans le chapitre consacr la programmation. Ils sont rsums dans le tableau VI.13. On rappelle que le circuit a linterface de la gure VI.15. ADR 00 00 01 01 W 0 1 0 1 opration lire ltat des entres crire sur les sorties lire conguration lignes congurer les lignes

Figure VI.13. Spcication de fonctionnement du circuit dentres/sorties. Il peut tre considr comme la juxtaposition de 32 circuits de 1 bits ; la structure pour un bit i est montre en gure VI.16.

202

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS


module memoire(rst,clk,abus[31..0],dbus[31..0],read,write,excep_mode, timer_out, io[31..0], bus_error) decode_mem(abus[31..16],cs_mem:cs_rom,cs_timer,cs_io,cs_ram,bus_error); cs_mem=read+write; rom16Kx32(abus[15..2],cs_rom,oe_rom,dbus[31..0]); oe_rom=cs_rom*OE; ram4Mx32(abus[23..2],cs_ram,oe_ram,write,dbus[31..0]); oe_ram=cs_ram*OE; timer_pwm(abus[3..2],cs_timer,oe_timer,write,dbus[31..0],timer_out); oe_timer=cs_timer*OE; io(abus[3..2],cs_io,oe_io,write,dbus[31..0],io[31..0]); oe_io=cs_io*OE; OE=/excep_mode*read; end module module decode_mem(adr[15..0],CS:ROM,timer,io,RAM,bus_error) commun=/adr15*/adr14*/adr13*/adr12*/adr11*/adr10*/adr9; ROM=CS*commun*/adr8*/adr7*/adr6*/adr5*/adr4*/adr3*/adr2*/adr1*/adr0; RAM=CS*commun*adr8; timer=CS*commun*/adr8*/adr7*adr6*/adr5*/adr4; io=CS*commun*/adr8*/adr7*adr6*adr5*/adr4; bus_error=CS*/ROM*/RAM*/timer*/io; end module

Figure VI.14. criture SHDL du sous-systme mmoire.

Figure VI.15. Interface du circuit dentres/sorties. La bascule D du haut mmorise le bit dir[i] qui vaut 1 lorsquon souhaite que la ligne io[i] soit congure en sortie et 0 lorsquon souhaite quelle soit une entre. La bascule ayant comme entre de slection le signal CS*W*/ADR[1]*ADR[0], mmorisera le bit data[i] si et seulement si lcriture est demande pour ADR = 01. Du point de vue du programmeur, cela correspond une criture ladresse 0x600004 comme on la expliqu la section 4. De la mme faon, la bascule D du bas mmorise le bit DATA[i], lorsquune criture est demande pour ADR = 00 ; du point de vue du programmeur cela correspond une criture ladresse 0x600000. Maintenant, dir[i] gouverne bien le fait que la ligne io[i] est une entre ou une sortie : si dir[i] = 1, le buffer trois-tats de droite fait de io[i] une sortie, dont la valeur est justement le signal out[i], ce qui est le comportement spci tableau VI.13. Si dir[i] = 0, le buffer trois-tats de droite isole io[i] de out[i] ; si maintenant une lecture est demande pour ADR = 00, la condition CS*/W*OE*/ADR[1]*/ADR[0] vaut 1

5. Structure du circuit dentres/sorties

203

Figure VI.16. Structure du circuit dentres/sorties,pour un bit i. et io[i] passe sur la ligne DATA[i]. Du point de vue du programmeur, cela quivaut une lecture ladresse 0x600000 et elle lui retourne ltat des 32 lignes dentres/sorties. Enn, si une lecture est demande pour ADR[1..0] = 01, le buffer trois-tats du bas laisse passer sur DATA[i] la valeur dir[i] : du point de vue du programmeur, une lecture ladresse 0x600004 lui renvoie ltat de conguration des entres/sorties. On a ainsi expliqu tous les aspects du fonctionnement du circuit dentres/sorties du tableau VI.13. Les autres aspects relatifs aux exceptions seront dcrits section 7. Finalement, lcriture SHDL de lensemble est donne gure VI.17.

6. Structure du circuit timer/PWM


Le circuit timer/PWM est un bel exemple de construction modulaire, par assemblage du module timer/PWM tudi la section 9 et du module diviseur de frquence tudi section 10.2. On la dj utilis du point de vue du programmeur ; sa spcication est redonne tableau VI.18 et on rappelle son interface gure VI.19. Sur la gure VI.20, les registres de 32 bits situs gauche fonctionnent de la manire habituelle : celui du haut mmorise le mot de commande #1 lorsquune criture pour ADR = 00 est demande, ce qui correspond une criture en 0x400000 du point de vue du programmeur. Le registre 16 bits en dessous et la bascule D tout en bas mmorisent prediv et start respectivement, lorsquune criture pour ADR = 01 est demande, soit

204

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS


module io(rst,clk,ADR[1..0],CS,OE,W,DATA[31..0],io[31..0]) ENA_IO = CS*W*/ADR1*/ADR0; ENA_DIR = CS*W*/ADR1*ADR0; // criture dans dir[i] dir[31..0] := DATA[31..0]; dir[31..0].ena = ENA_DIR dir[31..0].clk = clk; dir[31..0].rst = rst; // criture dans out[i] out[31..0] := DATA[31..0]; out[31..0].ena = ENA_IO; out[31..0].clk = clk; out[31..0].rst = rst; // sortie sur io[i] io[31..0] = out[31..0]:dir[31..0]; // lecture de io[i] OE_IO = CS*/W*OE*/ADR1*/ADR0; DATA[31..0] = io[31..0]:OE_IO; // lecture de dir[i] OE_DIR = CS*/W*OE*/ADR1*ADR0; DATA[31..0] = dir[31..0]:OE_DIR; end module

Figure VI.17. criture SHDL du circuit dentres/sorties. ADR 00 00 01 01 W 0 1 0 1 opration lire le registre de commande #1 (P + N) crire le registre de commande #1 (P + N) lire le registre de commande #2 (prediv + start) crire le registre de commande #2 (prediv + start)

Figure VI.18. Spcications du circuit timer/PWM.

Figure VI.19. Interface du circuit timer/PWM. une criture en 0x400004 pour le programmeur. La valeur de prediv est mise en entre dun circuit diviseur de frquence, qui divise la frquence de lhorloge gnrale clk. La sortie du diviseur de frquence devient lhorloge de comptage dun module timer identique celui tudi section 9. On lui transmet galement les parties N et P du mot de commande #1 ; par ailleurs son entre de slection est relie au signal start et il ne fonctionne donc que si ce bit est 1.

6. Structure du circuit timer/PWM

205

Figure VI.20. Structure du circuit timer/PWM. Enn, une lecture demande pour ADR = 00 active le premier buffer trois-tats du bas et laisse passer la valeur de la commande #1 sur DATA (lecture en 0x400000 pour le programmeur). Une lecture pour ADR = 01 (0x400004 pour le programmeur) donne la valeur de la commande #2. Ainsi, tous les aspects du fonctionnement du circuit timer/PWM spcis tableau VI.18 sont expliqus par cette construction. Finalement, lcriture SHDL de lensemble est donne gure VI.21.

7. Structure du sous-systme dexceptions


On va dcrire dans cette section la structure complte du sous-ensemble effectuant la gestion des exceptions. On a dj dcrit en dtails (section 10) dans quelles cironstances une exception (trap ou interruption) tait dclenche, puis prise en compte. Plusieurs aspects de cette prise en compte sont effectus par le matriel : 1 2 3 4 la dtermination de lexception qui a le niveau de priorit le plus lev. la mmorisation des interruptions timer et entres/sorties, le temps quelles soient prises en compte. la possibilit de remettre zro par programme les interruptions timer et entres/sorties mmorises. la possibilit de lire par programme les interruptions mmorises.

La gure VI.22 montre le schma complet qui prend en compte tous ces aspects.

206

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS


module timer_pwm(rst,clk,ADR[1..0],CS,OE,W,DATA[31..0],out) ENA_CMD1 = CS*W*/ADR1*/ADR0; ENA_CMD2 = CS*W*/ADR1*ADR0; // criture dans P[i] P[15..0] := DATA[31..16]; P[15..0].ena = ENA_CMD1; P[15..0].clk = clk; P[15..0].rst = rst; // criture dans N[i] N[15..0] := DATA[15..0]; N[15..0].ena = ENA_CMD1; N[15..0].clk = clk; N[15..0].rst = rst; // criture dans prediv[i] prediv[3..0] := DATA[19..16]; prediv[3..0].ena = ENA_CMD2; prediv[3..0].clk = clk; prediv[3..0].rst = rst; // criture dans start start := DATA[0]; start.ena = ENA_CMD2; start.clk = clk; start.rst = rst; //diviseur de frquence divfreq(rst,clk,prediv[3..0]: h); // timer/PWM pwm(rst,h,start,P[15..0],N[15..0]: out); // lecture du mot de commande #1 OE_CMD1 = CS*/W*OE*/ADR1*/ADR0; DATA[31..16] = P[15..0]:OE_CMD1; DATA[15..0] = N[15..0]:OE_CMD1; // lecture du mot de commande #2 OE_CMD2 = CS*/W*OE*/ADR1*ADR0; DATA[19..16] = prediv[3..0]:OE_CMD2; DATA[0] = start:OE_CMD2; end module

Figure VI.21. criture SHDL du circuit timer/PWM. Dtermination de lexception la plus prioritaire Cette dtermination est faite dans la partie droite du schma de la gure VI.22. On y trouve le circuit encodeur de priorit, qui reoit les signaux de dtection des diffrentes exceptions. On retrouve les numros de priorit de chacune delles : 14 pour bus_error, 13 pour instr_priv (viol de privilge instruction), etc. Loccurrence dune interruption timer est signale par timer_int et a la priorit 8 ; les interruptions dentres/sorties sont signales par le vecteur io_int[31..0] ; elles sont toutes relies un OR pour en faire la synthse au niveau 7. La sortie de lencodeur de priorit donne le numro de lexception la plus prioritaire et cette valeur est ensuite compare au niveau courant dexcution PIL, valeur issue dun champ du registre dtat %psr. Une demande de prise en compte dexception excep_req nest faite que si le numro de lexception la plus prioritaire est plus lev que le numro dexcution courant.

7. Structure du sous-systme dexceptions

207

Figure VI.22. Structure du sous-systme dexceptions. Masquage des interruptions On se souvient (section 10) que les interruptions sont ignores lorsque le bit ET du registre %psr est 0. Cest bien le cas sur le schma : les deux sources dinterruption timer_out (en provenance du circuit timer) et io[31..0] (en provenance du circuit dentres/sorties) passent dabord par un AND avec le signal ET ; si ET = 0 loccurrence de linterruption est purement et simplement ignore. Mmorisation des interruptions Les interruptions timer et entres/sorties ont besoin dtre mmorises, car ce sont des occurrences fugitives de fronts montants ou descendants. Des latchs RS asynchrones sont alors le moyen le plus adapt : le vecteur de 32 latchs du haut mmorise les interruptions sur les entres/sorties et le latch du bas mmorise une interruption timer. Le signal timer_out, aprs passage au travers du AND avec ET, va sur lentre S du latch : larrive dun front montant sur timer_out va se traduire par la mmorisation

208

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS

dun 1 dans le latch. De la mme faon, chaque signal io[i] passe dabord au travers du AND, puis au travers dun XOR qui va ventuellement linverser, selon la valeur du signal dir_ioint[i] qui permet de rgler le sens du front (montant ou descendant) qui va dclencher linterruption. Commandes de gestion des interruptions mmorises Le tableau de la gure VI.23 rsume toutes les oprations qui doivent tre rendues possibles par programme pour grer les interruptions timer et entres/sorties.Chacune delle est mise en place par un lment du schma gnral. adresse 0x600008 0x600008 0x60000C 0x60000C 0x400008 0x400008 read 1 0 1 0 1 0 write 0 1 0 1 0 1 opration lire interruptions entres/sorties mmorises raz des interruptions entres/sorties mmorises lire sens du front dinterruption (0 = front montant) crire sens du front dinterruption lire bit dinterruption timer raz bit dinterruption timer

Figure VI.23. Commandes de gestion des interruptions timer et entres/sorties. La lecture des interruptions dentres/sorties mmorises est faite par le buffer trois-tats du bas du schma qui a pour entre io_int[31..0]. Cette lecture a lieu lorsque cs_io*read*/excep_mode*abus[3]*/abus[2], cest dire pour une adresse qui active cs_io (le segment [0x600000,0x600010[) et qui se termine par 10XX : 0x600008. La remise zro des interruptions dentres/sorties mmorises est ralise par le registre dont les sorties se nomment reset_ioint[31..0] ; elles vont en effet sur les entres R des latchs de mmorisation des interruptions dentres/sorties. Cette criture a lieu lorsque cs_io*write*/excep_mode*abus[3]*/abus[2], cest dire la mme adresse que la lecture prcdente : 0x600008. Les sens des fronts des interruptions dentres/sorties sont congurables individuellement par criture dans le registre dont les sorties se nomment dir_ioint[31..0] ; elles commandent linversion ventuelle des signaux en provenance du circuit dentres/sorties io[31..0]. Cette criture a lieu pour cs_io*write*/excep_mode*abus[3]*abus[2], cest dire 0x60000C. Le bit dinterruption timer timer_int arrive sur un des buffers trois-tats du bas ; il est lu pour cs_timer*write*/excep_mode*abus[3]*/abus[2], cest dire 0x400008. La remise zro du latch de mmorisation de cette interruption se fait par criture dans la bascule dont la sortie se nomme reset_tint, ladresse 0x400008. Enn, la valeur du niveau dexception le plus lev est place automatiquement sur le bus ds que excep_mode = 1 ; on se souvient (gure VI.10) quil sagit de la troisime source dcriture sur le bus de donnes dbus, qui se produira lorsquune exception sera effectivement prise en compte et quil sagira dobtenir son niveau pour lever le niveau dexcution du processeur.

8. Squencement des instructions

209

8. Squencement des instructions


8.1. Problmatique du squencement
Nous avons jusquici dcrit ce qui sappelle la micromachine, cest dire la runion des diffrents sous-systmes registres, mmoire, UAL et exceptions. Cette micromachine se manoeuvre avec des microcommandes, dont on peut donner la liste complte pour la machine CRAPS :
read et write pour laccs la mmoire. areg, breg et dreg pour laccs aux registres. cmd_ual pour la commande de lopration UAL. excep_mode pour obtenir le niveau de priorit de lexception en cours de traitement.

Cest tout ! Tous les autres signaux, abus, bbus, dbus, etc. ne sont pas des commandes ; ce sont des lments de la micromachine, qui sont indirectement modis par les microcommandes listes ci-dessus. On appelle squenceur le sous-systme du processeur charg de gnrer les bonnes squences de microcommandes en fonction de linstruction en cours dexcution. Il fonctionne avec le reste du processeur selon lorganisation de la gure VI.24.

microcommandes

squenceur

%ir N,Z,V,C excep_req

micromachine

CLK

Figure VI.24. Le squenceur envoie des microcommandes en fonction de linstruction en cours, de la valeur des ags et de lventuelle prsence dune interruption. Le squenceur est lme du processeur : sans lui la micromachine reste inerte. chaque cycle dhorloge, le squenceur prsente une nouvelle combinaison de microcommandes, an de poursuivre lexcution de linstruction en cours. On peut le comparer un pianiste et les microcommandes des touches de piano : chaque tempo il effectue un accord, cest dire quil actionne plusieurs microcommandes en parallle. Il effectue le squencement des instructions lune aprs lautre, le registre %pc lui servant connatre lemplacement de la prochaine instruction squencer.

210

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS

Le dbut du squencement dune instruction sappelle la phase FETCH ; il consiste aller charger dans le registre %ir linstruction en mmoire centrale situe ladresse %pc. Cette partie initiale du squencement est xe, car le squenceur ne sait pas encore quelle instruction il va avoir faire. lissue de cette phase, linstruction est disponible dans %ir et le squenceur y a accs. Il peut ainsi catgoriser linstruction parmi des groupes dont le squencement va tre commun. Pour les instructions de branchement conditionnel, le squencement correct ncessite quil dispose de la valeur des ags. Il ne faut pas oublier les exceptions : lorsque lune delle se produit (excep_req = 1), elle affecte le squencement dune manire qui sera dcrite plus loin.

8.2. Squenceurs cbls et microprogramms


Le squenceur est un circuit squentiel synchrone parfaitement classique et on pourra le raliser en utilisant les mthodes prsentes au chapitre 3, une fois quon aura spci exactement son graphe dtats. On utilisera alors des portes et des bascules pour raliser la machine de changements dtats dont les entres seront les signaux %ir, excep_req et les ags ; un transcodeur gnrera les microcommandes qui seront les sorties du circuit. On parle dans ce cas de squenceur cbl ; cest bien sr la mthode qui assure le squencement le plus rapide et qui occupe le moins de surface sur la puce. Pour les processeurs complexes et en particulier pour les processeurs CISC, le graphe peut devenir tellement complexe quil est prfrable dutiliser une autre approche dite de squenceur microprogramm dont ltude dtaille sort du cadre de cet ouvrage. On peut tout de mme dire qualors, le squenceur est lui mme un petit processeur qui excute des sortes de routines associes chaque instruction, contenues dans une mmoire interne appele mmoire de microprogramme.Cette approche est plus souple que lapproche cble car on peut facilement modier le squenceur en modiant les microprogrammes, mais elle ajoute bien sr un surcot en temps et en espace. Dans le cas de CRAPS, le graphe dtats est sufsamment simple pour permettre sans difcult un squenceur cbl ; cela est essentiellement d au fait que son jeu dinstructions de type RISC est particulirement rduit et rgulier. Le graphe dtats complet est trop grand pour tre prsent dun seul morceau et il sera donn par parties, dabord pour la phase FETCH commune toutes les instructions, puis pour chacun des groupes dinstructions. Il sagit dun graphe de MEALY, qui est plus adapt quun graphe de MOORE car, en fournissant au plus tt les valeurs des sorties, les parties asynchrones comme lUAL et la mmoire peuvent commencer leur travail plus tt.

8.3. Squencement de la phase FETCH


La phase FETCH forme le dbut commun au squencement de toutes les instructions. Elle consiste lire en mmoire ladresse contenue dans %pc, puis stocker la valeur lue dans le registre %ir (gure VI.25). Ltat de dpart sappelle fetch ; cest galement ltat vers lequel on retourne la n de lexcution de toute instruction. On va de fetch vers decode seulement si excep_req=0, cest dire si aucune exception nest en attente de traitement. Sinon il faut aller vers le sous-graphe de gestion des exceptions qui sera dcrit plus loin. Si donc le processeur na pas dexception en attente, il doit aller lire le mot mmoire

8. Squencement des instructions


excep_req = 0 / read=1, write=0, ual=000000 (ADD), excep_mode=0 areg=62, breg=0, creg=63 vers sousgraphe de squencement de SETHI et des instructions de branchement vers sousgraphe de squencement de CALL vers sousgraphe de squencement des instructions de calcul vers sousgraphe de squencement des instructions daccs memoire

211

op = 00 op = 01

fetch
except_req = 1

decode
op = 10 op = 11

vers sousgraphe de squencement des exceptions

Figure VI.25. Sous-graphe de squencement de la phase FETCH. situ ladresse contenue dans le registre %pc (= %r62). Pour cela, il faut se dbrouiller pour placer la valeur de %pc sur le bus A : cest ce qui est fait en plaant 62 sur areg. On place galement une valeur quelconque sur breg et on commande une opration quelconque sur lUAL, qui toutefois ne modie pas les ags (ici ADD). read est galement forc 1, ce qui dclenche immdiatement (avant le prochain front dhorloge) la lecture en mmoire ladresse pc. larrive du prochain front dhorloge, si la priode a t assez longue, la mmoire aura plac son rsultat sur le bus D, et il sera crit dans le registre %ir (= %r63), puisquon a plac 63 sur la commande dreg. Si la mmoire est un peu lente par rapport la frquence de lhorloge, on peut rajouter un tat dattente intermdiaire entre les tats fetch et decode. Cest technique pourra tre utilise galement avec lUAL lors des calculs de multiplication et de division qui prennent un temps important. Arriv ltat decode, le squencement va tre orient vers des sous-graphes diffrents selon le groupe auquel appartient linstruction courante, maintenant contenue dans %ir. Si on se rfre la structure des instructions vue la section 2.4, ce groupe est trs simplement identi par le champ op constitu des deux bits de poids forts de %ir.

8.4. Squencement dune instruction de calcul


Les instructions dont le squencement est le plus simple sont les instructions de calcul arithmtique et logique. Elles sont repre partir de ltat decode par le fait que le champ op de %ir vaut 102. (gure VI.26). Il y a nanmoins deux cas, selon que le deuxime argument de linstruction est une valeur immdiate (comme dans addcc %r1, 5, %r2) ou un registre (comme dans addcc %r1, %r2, %r3). Ces deux cas sont distingus par le bit 13 de %psr, comme on le voit sur le graphe. Instruction de calcul avec une constante comme deuxime argument Si %ir[13]=1, le deuxime argument est une constante immdiate sur 13 bits, qui est loge lintrieur mme de linstruction %ir. On va alors lextraire de %ir et la copier dans le registre temporaire %tmp1, puis faire ensuite lopration entre le registre de numro rs1 et tmp1, pour enn mettre le rsultat dans le registre de numro rd. rs1 et rd sont

212

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS


op = 10, %ir[13]=1 / read=0, write=0, excep_mode=0 cmd_ual=SIGNEXT13 areg=63, breg=0, dreg=32

...

fetch
null / read=0, write=0, oe_num=01 cmd_ual=ADD areg=62, breg=35, dreg=62

decode
op = 10, %ir[13]=0 / read=0, write=0, oe_num=01 cmd_ual=op3 areg=rs1, breg=rs2, dreg=rd

calc_imm

pc+4

null / read=0, write=0, oe_num=01 cmd_ual=op3 areg=rs1, breg=32, dreg=rd

Figure VI.26. Sous-graphe de squencement dune instruction de calcul. des champs de 5 bits du registre %ir qui contiennent les numros des registres traits par linstruction (voir gure 2.4). Lextraction de la constante de 13 bits est effectue entre ltat decode et ltat calc_imm, par envoi du registre %ir sur le bus A (areg = 63) et par application de la commande cmd_ual = SIGNEXT13 sur lUAL. On a dj vu (section 2.2) que cette opration avait pour effet de ne garder que les 13 bits de poids faibles de la valeur (ici %ir) et deffectuer une extension du signe. La constante ainsi nettoye, est copie dans %tmp1 (dreg = 32) au prochain front dhorloge. Avant de revenir ltat fetch pour excuter linstruction suivante, il faut incrmenter le registre %pc de 4, pour quil pointe sur linstruction suivante. Cest ce qui est fait partir de ltat pc+4, qui effectue une addition sans modication des ags (cmd_ual = ADD) entre la valeur de %pc (areg = 62) et la valeur du registre %r35 (breg = 35) dont on se rappelle quil vaut toujours 4 (voir section 1). Le rsultat est stock dans %pc (dreg = 32) avant de retourner ltat fetch, prt pour lexcution de linstruction suivante qui se trouve en squence. Instruction de calcul avec un registre comme deuxime argument Lorsque le deuxime argument de linstruction de calcul est un registre (%ir[13] = 0), il nest pas ncessaire davoir cet tat intermdiaire calc_imm ; on peut directement demander lopration entre les registres, ce qui est fait dans la transition entre decode et pc+4 : cmd_ual = op3, areg = rs1, breg = rs2, dreg = rd. On incrmente ensuite %pc de 4 pour passer linstruction suivante.

8.5. Squencement des instructions daccs mmoire


Les instructions daccs mmoire ont des arguments similaires ceux des instructions de calcul ; ils partagent dailleurs le mme format dinstruction (format 3, gure V.8). Squencement des instructions ld et ldub La gure VI.27 montre le sous-graphe de squencement de ces deux instructions. Le squencement de ld est simple; le squencement de ldub lest moins et occupe lessentiel du bas de la gure. Le dbut du squencement est le mme que pour une instruction de calcul. Ladresse

8. Squencement des instructions


op = 11, op3 = ld+ldub, %ir[13] = 1 / read=0, write=0, excep_mode=0 cmd_ual=SIGNEXT13 areg=63, breg=0, dreg=32

213

excep_req = 0 / ...

fetch
null / read=0, write=0, excep_mode=0 cmd_ual=ADD areg=62, breg=35, dreg=62

decode
op = 11, op3 = ld+ldub, %ir[13] = 0 / read=0, write=0, excep_mode=0 cmd_ual=ADD areg=rs1, breg=rs2, dreg=32

ld_imm
null / read=0, write=0, excep_mode=0 cmd_ual=ADD areg=rs1, breg=32, dreg=32

pc+4

op3 = ld / read=1, write=0, excep_mode=0 cmd_ual=ADD areg=32, breg=0, dreg=rd

read

op3 = ldub, op3 = ldub, op3 = ldub, op3 = ldub, %tmp1[1,0]=11 / %tmp1[1,0]=10 / %tmp1[1,0]=01 / %tmp1[1,0]=00 / null / read=1, write=0 read=1, write=0 read=1, write=0 read=1, write=0 read=0, write=0 excep_mode = 0, excep_mode = 0, excep_mode = 0, excep_mode = 0, excep_mode = 0, cmd_ual=ADD cmd_ual=ADD cmd_ual=ADD cmd_ual=ADD cmd_ual=SRL areg=32, breg=0 areg=32, breg=0 areg=32, breg=0 areg=32, breg=38 areg=32, breg=0 dreg=32 dreg=32 dreg=32 dreg=32 dreg=rd

byte0
null / read=0, write=0 excep_mode = 0, cmd_ual=SRL areg=32, breg=38 dreg=rd

byte1
null / read=0, write=0 excep_mode = 0, cmd_ual=SLL areg=32, breg=36 dreg=32

byte2
null / read=0, write=0 excep_mode = 0, cmd_ual=SLL areg=32, breg=37 dreg=32

byte3

null / read=0, write=0 excep_mode = 0, cmd_ual=SLL areg=32, breg=38 dreg=32

ldshift

Figure VI.27. Sous-graphe de squencement des instructions ld et ldub. de la donne lire est le rsultat dune addition, dont le deuxime terme peut tre un registre (comme dans ld [%r1+%r2], %r3) ou une constante immdiate (comme dans ldub [%r1-5], %r2). Cette diffrence est galement distingue par le bit %ir[13], ce qui conduit aux deux branches partir de decode. Une fois en read, ladresse de la donne lire en mmoire est dans le registre %tmp1 (numro 32). partir de read, si linstruction est ld et non ldub, les choses sont simples : lire le mot en mmoire et le stocker dans le registre de numro rd, ce qui est fait entre read et pc+4 ; il ne reste plus qu incrmenter %pc de 4. Si linstruction est ldub, il va falloir lire le mot mmoire de 32 bits situ ladresse contenue dans %tmp1 et isoler parmi les 4 octets qui composent ce mot, celui qui est dsign par linstruction ldub. On rappelle (voir annexe B) que ldub place dans les 8 bits de poids faibles du registre destination loctet dadresse dsigne et force 0 les 24 bits de poids forts. On rappelle galement que lors dun accs mmoire, les circuits mmoire ne reoivent pas les 2 bits de poids faibles de ladresse (voir section 4) et par consquent lisent 4 octets la fois. Si on considre par exemple la situation de la gure VI.28 et quon souhaite lire loctet E6 situ ladresse 0x1000005, la demande de lecture cette adresse va lire tout le mot mmoire de 32 bits 0x7AE6329F qui entoure cet octet, partir de ladresse 0x1000004 qui est le multiple de 4 le plus petit avant 0x1000005. Cest cette lecture de 32 bits qui est faite entre ltat read et les tats byte0, byte1, etc. Le choix de passer vers byte0, byte1, etc. est fait partir de la valeur des deux bits de

214

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS

7A 1000004

E6

32

9F 1000008

Figure VI.28. Situation de lecture pour linstruction ldub. Ladresse lue tant 0x1000005, on souhaite isoler loctet E6 du reste du mot. poids faibles de ladresse contenue dans %tmp1. Cela implique dailleurs que le schma de la gure VI.24 a t lgrement simpli et quil y a en ralit les deux signaux %tmp[1,0] qui vont galement de la micromachine vers le squenceur, ncessaires dans les instructions ldub et stb pour reprer loctet isoler. Dans le cas de ldub, cette isolation de loctet sur les 8 bits de poids faibles du registre destination, avec remplissage gauche de 24 zros, est ralise laide des commandes SRL et SLL de lUAL. Pour notre exemple, si on veut extraire E6 du mot 7AE6329F, il suft de le dcaler gauche de 8 positions : E6329F00 (8 zros entrent par la droite), puis de le dcaler droite de 24 position : 000000E6 (24 zros entrent par la gauche). Pour faire ces diffrents dcalages, il est ncessaire de disposer des constantes 8, 16 et 24. Cest dans ce but quon a fait en sorte que ces constantes soient les valeurs des registres %r36, %r37 et %r38 respectivement (voir section 1). partir de byte0, seul un dcalage droite de 24 positions est ncessaire. partir de byte1, byte2 et byte3, un dcalage gauche pralable de 8, 16 et 24 positions (respectivement) est ncessaire. Squencement des instructions st et stb La gure VI.29 montre le sous-graphe de squencement de ces deux instructions. Aprs ltat decode, il y a nouveau la bifurcation entre les instructions avec une valeur immdiate (telle que st %r1, [%r2+12]) et celles sans constante immdiate (telle que stb %r1, [%r2+%r4]). Comme pour ld/ldub, on arrive ltat w_read aprs avoir calcul dans %tmp1 (= %r32) la somme de ces deux arguments, qui forme ladresse o doit tre effectue lcriture. Dans le cas dune criture standard stb, on va directement de ltat w_read ltat pc+4 en effectuant la commande dcriture write=1. On place ladresse dcriture sur le bus A avec areg=32 (=%tmp1); on place la valeur crire sur le bus D en la faisant venir sur le bus B (breg=rd) puis en lui faisant traverser lUAL sans changement avec la commande NOPB. Aprs lcriture en mmoire, qui est suppose durer ici un seul cycle dhorloge, on passe ltat pc+4 pour le passage linstruction suivante. Le cas dune criture dans un octet (stb) est beaucoup plus complexe et inefcace, car on a pris le parti dans larchitecture de CRAPS de ne pas faciliter cette instruction par des connexions spcialises entre la mmoire et le bus D. On se rappelle que cette criture doit se traduire par la modication dun seul octet en mmoire, cest dire la modication de 8 bits lintrieur dun mot mmoire de 32 bits, tous les autres bits restants inchangs. La seule faon de faire consiste : 1. 2. lire ladresse %tmp1 le mot de 32 bits dans lequel se situe loctet modier et le placer dans le registre temporaire %tmp2. remplacer au sein de %tmp2 les 8 bits concerns par les 8 bits de poids faibles du registre crire.On utilisera pour cela les commandes INSBYTE0, etc. de lUAL, spcialement

8. Squencement des instructions


op = 11, op3 = st+stb, %ir[13] = 1 / read=0, write=0, excep_mode=0 cmd_ual=SIGNEXT13 areg=63, breg=0, dreg=32

215

excep_req = 0 / ...

fetch
null / read=0, write=0, excep_mode=0 cmd_ual=ADD areg=62, breg=33, dreg=62

decode
op = 11, op3 = st+stb, %ir[13] = 0 / read=0, write=0, excep_mode=0 cmd_ual=ADD areg=rs1, breg=rs2, dreg=32

st_imm
null / read=0, write=0, excep_mode=0 cmd_ual=ADD areg=rs1, breg=32, dreg=32

pc+4

op3 = st / read=0, write=1, excep_mode=0 w_read cmd_ual=NOPB areg=32, breg=rd, dreg=0 op3 = stb / read=1, write=0, excep_mode=0 cmd_ual=ADD areg=32, breg=0, dreg=33

null / read=0, write=1 excep_mode=0 cmd_ual=NOPB areg=32, breg=33, dreg=0

insbyte
op3 = stb, tmp1[1..0]=00 / read=0, write=0 excep_mode=0 cmd_ual=INSBYTE0 areg=rs2, breg=33, dreg=33 op3 = stb, tmp1[1..0]=10 / read=0, write=0 excep_mode=0 cmd_ual=INSBYTE2 areg=rs2, breg=33, dreg=33 op3 = stb, tmp1[1..0]=01 / read=0, write=0 op3 = stb, tmp1[1..0]=11 / excep_mode=0 read=0, write=0 cmd_ual=INSBYTE1 excep_mode=0 areg=rs2, breg=33, dreg=33 cmd_ual=INSBYTE3 areg=rs2, breg=33, dreg=33

write

Figure VI.29. Sous-graphe de squencement des instructions st et stb. conues cet effet. 3. rcrire tout le mot de 32 bits %tmp2 ladresse dorigine, toujours contenue dans %tmp1.

Ltape 1est ralise entre les tats w_read et insbyte, par lancement dune commande de lecture ladresse %tmp1 (areg=32 et read=1) et stockage du rsultat dans le registre %tmp2 (=%r33). On laura compris, cest tout un mot de 32 bits qui est lu, cest dire 4 octets. Ltape 2 est ralise entre insbyte et write, avec 4 chemins possibles selon le numro de loctet modier ; ce numro est constitu des deux bits de poids faibles de ladresse %tmp1. Ltape 3 de rcriture est faite entre write et pc+4 : placement de ladresse %tmp1 sur le bus A (areg=32) et placement de la donne crire %tmp2 sur le bus D en la plaant sur le bus B (breg=33) et en appliquant la commande NOPB pour lui faire traverser lUAL.

8.6. Squencement des instructions de branchement


Avec les instructions de branchement il ny a que deux cas possibles : soit le branchement doit tre fait, auquel cas il faut ajouter la valeur de %pc le dplacement, pralablement multipli par 4 ; soit le branchement ne doit pas tre fait auquel cas il faut passer linstruction suivante en ajoutant 4 %pc. Ces deux cas correspondent aux deux ches qui partent de ltat decode ; le

216

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS

squenceur dispose de linstruction et des valeurs des ags et a donc tous les moyens de savoir si le branchement doit tre effectu. Il doit ltre si linstruction est ba, ou si linstruction est be et que Z=1, etc. Il ne doit pas ltre dans toutes les autres situations. En cas de non branchement, on revient simplement ltat fetch en ajoutant 4 %pc. En cas de branchement, il faut dabord extraire la constante de dplacement relatif code sur 22 bits qui est stocke au sein mme de linstruction ; on utilise pour cela la commande SIGNEXT22 de lUAL, qui stocke son rsultat dans %tmp1 (dreg=32). Ce dplacement tant cod en nombre de mots mmoire, il faut maintenant le multiplier par 4 en le dcalant de 2 bits vers la gauche, en plaant %tmp1 sur le bus A (areg=32) et en plaant la constante 2 sur le bus B (breg=34) avec la commande SLL. Le rsultat est nouveau stock dans %tmp1 (dreg=32), et il est nalement ajout %pc (areg=62, breg=32, dreg=62, cmd_ual=ADD) avant le retour ltat fetch.
excep_req = 0 / ...

fetch

decode

op=00, op2=010, (op3=be et Z=0) ou (op3=bneg et N=0) ou etc. / read=0, write=0 op=00, op2=010, op3 = ba null / excep_mode=0 ou (op3=be et Z=1) ou etc. / read=0, write=0 cmd_ual=ADD read=0, write=0 excep_mode=0 areg=62, breg=35, dreg=62 excep_mode=0 cmd_ual=ADD cmd_ual=SIGNEXT22 areg=62, breg=32, dreg=62 areg=63, breg=0, dreg=32 null / read=0, write=0 excep_mode=0 cmd_ual=SLL areg=32, breg=34, dreg=32

branch

dispx4

Figure VI.30. Sous-graphe de squencement des instructions de branchement.

8.7. Ralisation du squenceur


Tous les sous-graphes de squencement nont pas t prsents ; ils utilisent tous les techniques qui viennent dtre prsentes. Le lecteur est encourag les raliser titre dexercice. On pourrait galement concevoir sans difcults le circuit squentiel synchrone, de type MEALY, qui implmente le squenceur de CRAPS. On utiliserait pour cela les techniques prsentes au chapitre 3 ; il est dune complexit modeste, avec moins de 50 tats et ses quelques signaux dentres et de sorties. Son tude dtaille serait lourde et dun intrt limit ; il a t effectivement mis en oeuvre sur une carte base de FPGA XILINX Spartan 3. Il fonctionne une frquence dhorloge de 25 MHz ce qui lui donne une puissance de calcul raisonnable, mais elle pourrait tre grandement augmente par lutilisation de techniques avances qui sortent du cadre de cet ouvrage.

9. Exercices corrigs

9. Exercices corrigs

217

9.1. Exercice 1 : dcodage dadresse


nonc Modier le cblage du sous-systme mmoire de CRAPS pour que la RAM soit vue par le programmeur partir de ladresse 0x02000000. Solution Il ne sagit ici que de modier le signal de dcodage RAM produit par le sous-module
decod_mem.

On imposait que les 8 bits de poids forts de ladresse soient : 000000012, cest dire une adresse de la forme 0000 0001 xxxx xxxx xxxx xxxx xxxx xxxx, cest dire encore en hexadcimal une adresse de lintervalle [0x01000000,0x01FFFFFF].En notation SHDL, on a lcriture suivante, o adr[15..0] reprsentent les 16 bits de poids forts de ladresse :
RAM=CS*/adr15*/adr14*/adr13*/adr12*/adr11*/adr10*/adr9*adr8;

On dsire maintenant que les adresses dimplantation de la RAM soient celles du segment [0x02000000,0x02FFFFFF], cest dire que les 8 bits de poids forts de ladresse soient 000000102. Il suft donc de modier la n de lquation de dcodage de la RAM :
RAM=CS*/adr15*/adr14*/adr13*/adr12*/adr11*/adr10*adr9*/adr8;

9.2. Exercice 2 : construction dun circuit dentres/sorties simpli


nonc Concevoir un circuit dentres/sorties au fonctionnement simpli : 1 2 3 4 il possde 32 lignes dentres ins[31..0] et 32 lignes de sorties outs[31..0], lcriture ladresse 0x600000 (pour le programmeur) projte la valeur crite sur outs, la lecture ladresse 0x600000 fournit les valeurs chantillonnes sur ins, les changements de valeurs sur les entres ne dclenchent aucune interruption.

Solution Ladresse 0x00600000 laquelle ragit le circuit est celle qui est vue par le programmeur; son utilisation en lecture ou en criture conduit lactivation de la ligne CS par la logique de dcodage. Comme le circuit ne ragit qu cette seule adresse, il na plus besoin daucune ligne dadresse (alors quil en utilisait 2 dans sa version initiale), ce qui conduit linterface de la gure VI.31 et au mode dutilisation de la gure VI.32. Finalement, le schma qui ralise ces fonctions sobtient par simplication du schma du circuit initial (gure VI.33).

218

CHAPITRE VI. CONSTRUCTION DU PROCESSEUR 32 BITS CRAPS

Figure VI.31. Interface du circuit dentres/sorties. W 0 1 opration lire ltat des entres crire sur les sorties

Figure VI.32. Spcication de fonctionnement du circuit dentres/sorties.

Figure VI.33. Structure du circuit dentres/sorties,pour un bit i. Lcriture en 0x00600000 provoque CS*W = 1, soit un stockage de DATA[i] dans la bascule, avec sortie de la valeur sur outs[i]. La lecture en 0x00600000 provoque CS*/W = 1, soit le passage de la valeur prsente sur ins[i] sur le bus de donnes DATA[i].

Rfrences
[1] A. Cezes et J. Delacroix. Architecture des Machines et des Systmes Informatiques. Dunod. 2nd dition, 2005. [2] Hennessy and Patterson. Computer Organisation and Design. Morgan Kaufman. Second Edition, 1998. [3] J.-J. Schwarz. Architecture des Ordinateurs. Eyrolles. 2nd Edition, 2005. [4] R. Strandh et I. Durand. Architecture de lordinateur. Dunod, 2005. [5] Andrew S. Tanenbaum. Architecture de lordinateur. Pearson Education, 2005. [6] John F. Wakely. Digital Design. Prentice Hall. 5th Edition, 2000. [7] P. Zanela et Y. Ligier. Architecture et Technologie des Ordinateurs. Dunod, 2005.

219

Annexe A Tables diverses


Puissances de 2 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 2 10 2 11 2 12 2 13 2 14 2 15 2 16 0,5 0,25 0,125 0,0625 0,03125 0,015625 0,0078125 0,00390625 0,001953125 0,0009765625 0,00048828125 0,000244140625 0,0001220703125 0,00006103515625 0,000030517578125 0,0000152587890625 21 22 23 24 25 26 27 28 29 210 211 212 213 214 215 216 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536

units milliseconde (ms) microseconde (s) nanoseconde (ns) picoseconde (ps) 10 3 s 10 6 s 10 9 s 10 12 s Kilo (K) Mega (M) Giga (G) Tera (T) 210 103 220 106 230 109 240 1012

220

Annexe B CRAPS : guide du programmeur


Le langage assembleur du processeur CRAPS est largement inspir de celui du SPARC version 8. Il nimplmente pas la notion de fentre de registres et les instructions qui suivent les branchements nont pas de statut spcial. Il ne possde pas dunit de calcul ottant. B.1. Instructions synthtiques Les instructions du tableau suivant sont appeles instructions synthtiques; ce sont des cas particuliers dinstructions plus gnrales. Plusieurs dentre-elles sappuient sur le fait que %r0 vaut toujours 0. Instruction clr %ri mov %ri,%rj inccc %ri deccc %ri notcc %ri,%rj set val31..0, %ri Effet met zro %ri copie %ri dans %rj incrmente %ri dcrmente %ri %rj <- complment de %ri copie val dans %ri Implmentation orcc %r0, %r0, %ri orcc %ri, %r0, %rj addcc %ri, 1, %ri subcc %ri, 1, %ri xnorcc %ri, %ri, %rj sethi val31..10, %ri orcc %ri, val9..0, %ri setq val, %ri copie val dans %ri ( 4096 val 4095) cmp %ri, %rj tst %ri negcc %ri notcc %ri,%rj nop compare %ri et %rj teste nullit et signe de %ri inverse %ri complmente %ri en %rj no operation subcc %ri, %rj, %r0 orcc %ri, %r0, %r0 subcc %r0, %ri, %ri xnorcc %ri, %r0, %rj sethi 0,%r0 orcc %r0, val, %ri

221

222

ANNEXE B. CRAPS : GUIDE DU PROGRAMMEUR

jmp %ri ret push %ri

branchement ladresse absolue %ri retour de procdure terminale empile %ri

jmpl %ri, %r0 jmpl %r31+4, %r0 sub %r30, 4, %r30 st %ri, [%r30]

pop %ri

dpile %ri

ld [%r30], %ri add %r30, 4, %r30

B.1. Instructions synthtiques

223

B.2. Jeu dinstructions du processeur CRAPS Les instructions marques dun sont privilgies, et ne peuvent tre excutes que si le bit superviseur dans %psr est 1. Instruction : add Description : Effectue laddition en complment deux des deux oprandes, et place le rsultat dans loprande rsultat. La retenue C nest pas ajoute aux arguments. Les ags (condition codes, cc) ne sont pas modis par cette opration, contrairement addcc. Flags affects : aucun Exemple : add %r1, 5, %r1 Ajoute 5 au contenu de %r1; ne modie pas les ags. Instruction : addcc Description : Effectue laddition en complment deux des deux oprandes, et place le rsultat dans loprande rsultat. La retenue C nest pas ajoute aux arguments. Les ags (condition codes, cc) sont positionns conformment au rsultat (voir add). Flags affects : N, Z, V, C Exemple : addcc %r1, 5, %r1 Ajoute 5 au contenu de %r1, et positionne les ags. Instruction : andcc Description : Effectue un ET logique bit bit entre les oprandes sources, et place le rsultat dans loprande rsultat. Les ags (condition codes, cc) sont positionns conformment au rsultat. Flags affects : N, Z Exemple : andcc %r1, %r2, %r3 Effectue le ET logique bit bit entre les contenus de %r1 et %r2, et place le rsultat dans %r3 Instruction : ba Description : Se branche ladresse obtenue en ajoutant 4 x disp22 ladresse de linstruction courante (ba elle-mme). disp22 peut tre ngatif, ce qui correspond un branchement un point antrieur du programme. Flags affects : aucun Exemple : ba label Se branche label. Le dplacement disp22 cod dans linstruction est gal la distance (en mots) qui spare linstruction courante de ladresse label. Instruction : bcc Description : Si la condition cc est vrie, se branche ladresse obtenue en ajoutant 4 x disp22 ladresse de linstruction courante. Si la condition nest pas vrie, passe linstruction suivante en squence. disp22 peut tre ngatif, ce qui correspond un branchement un point antrieur du programme. On trouvera en annexe B.3 les tables compltes des conditions de test possibles. Flags affects : aucun Exemple : bcs label

224

ANNEXE B. CRAPS : GUIDE DU PROGRAMMEUR

Se branche label si C vaut 1. Cest le dplacement relatif entre label et ladresse courante de linstruction, en nombre de mots, qui est cod dans le champ disp22 de linstruction. Instruction : call Description : Appelle un sous-programme et stocke ladresse de linstruction courante (celle du call lui-mme) dans %r31. Le champ disp30 du code machine contient une valeur de dplacement par rapport ladresse de linstruction courante, compte en mots. Autrement dit, ladresse de la prochaine instruction excuter est calcule en ajoutant 4 x disp30 ladresse de linstruction courante (dans %pc). disp30 peut bien sr tre ngatif. Flags affects : aucun Exemple : call ssprog Sauvegarde %pc dans %r31, puis se branche au sous-programme qui commence ladresse ssprog. Instruction : jmpl Description : Jump and Link: retour dun sous-programme. Effectue un saut ladresse dnie par loprande source, et sauve ladresse de linstruction courante (le jmpl) dans loprande rsultat. Flags affects : aucun Exemple : jmpl %r31 + 4, %r0 Retour dun sous-programme, quivalent linstruction synthtique ret. La valeur du PC ayant t sauvegarde dans %r31 lors du call prcdent, ladresse de retour doit effectivement tre %r31 + 4. Ladresse courante est limine dans %r0. Instruction : ld Description : Load word. Charge un registre partir dun mot de 32 bits de la mmoire centrale, soit 4 octets conscutifs. Ladresse doit tre aligne en mmoire sur un mot, cest dire quelle doit tre un multiple de 4, sinon une exception align_error est gnre. Ladresse est calcule en ajoutant le contenu du registre du champ rs1 au contenu du champ rs2 ou de la valeur immdiate contenue dans le champ simm13, selon le cas. Flags affects : N et Z. Exemple : ld [%r2+%r3], %r1 Copie dans le registre %r1 les 4 octets en mmoire commenant ladresse obtenue en additionnant les valeurs des registres %r2 et %r3. Le premier octet (celui dadresse %r2 + %r3) sera copi dans les poids forts de %r1, le quatrime octet (dadresse %r2 + %r3 + 3) sera copi dans les poids faibles de %r1. Instruction : ldub Description : Load unsigned byte. Charge les 8 bits de poids faibles dun registre depuis la mmoire centrale. Ladresse peut tre quelconque. Elle est calcule en ajoutant le contenu du registre du champ rs1 au contenu du champ rs2 ou valeur immdiate contenue dans le champ simm13, selon le cas. Les 24 bits de poids forts du registre sont forcs 0. Flags affects : N et Z. Exemple : ldub [%r2+6], %r1 Copie loctet situ ladresse %r2 + 6 dans les 8 bits de poids faibles du registre %r1, et force 0 les 24 bits de poids forts.

B.2. Jeu dinstructions du processeur CRAPS

225

Instruction : orcc Description : Effectue un OU logique bit bit entre les oprandes sources, et place le rsultat dans loprande rsultat. Les ags (condition codes, cc) sont positionns conformment au rsultat. Flags affects : N, Z Exemple : orcc %r1, 1, %r1 Positionne 1 le bit de poids le plus faible de %r1 et laisse tous les autres inchangs. Instruction : rdpsr Description : Lit le registre dtat %psr et le copie dans un registre %ri. Flags affects : aucun Exemple : rdpsr %r1 Lit %psr et le copie dans %r1 Instruction : rete Description : Dfait les empilements de %pc et de %psr qui sont raliss lors de la prise en compte dune exception. %psr reprend donc sa valeur initiale (et en particulier le niveau dexcution pil), et %pc reprend la valeur quil avait au moment du dpart. Cette instruction doit tre place la n de chaque handler dexception. Flags affects : potentiellement tous, lors du dpilement de %psr Exemple : rete Instruction : sethi Description : Positionne les 22 bits de poids forts dun registre, et force zro les 10 bits de poids faibles. Flags affects : aucun Exemple : sethi 0xE2F1, %r1 Positionne les 22 bits de poids forts de %r1 E2F116 et force 0 les 10 bits de poids faibles. Instruction : sll Description : Dcale le contenu dun registre vers la gauche dun nombre de positions dsign par le deuxime argument, compris entre 0 et 31. Si ce nombre est fourni sous forme dune valeur de registre, seuls les 5 bits de poids faibles sont utiliss. Flags affects : aucun Exemple : sll %r1, 7, %r2 Dcale le contenu de %r1 vers la gauche de 7 bits, avec insertion de 7 zros par la droite, et stocke le rsultat dans %r2. Aucun ag nest affect. Instruction : srl Description : Dcale le contenu dun registre vers la droite dun nombre de positions dsign par le deuxime argument, compris entre 0 et 31. Si ce nombre est fourni sous forme dune valeur de registre, seuls les 5 bits de poids faibles sont utiliss. Flags affects : aucun Exemple : srl %r1, 7, %r2 Dcale le contenu de %r1 vers la droite de 7 bits, avec insertion de 7 zros par la gauche, et stocke le rsultat dans %r2. Aucun ag nest affect.

226

ANNEXE B. CRAPS : GUIDE DU PROGRAMMEUR

Instruction : st Description : Stocke le contenu dun registre en mmoire centrale. Ladresse doit tre aligne en mmoire sur un mot, cest dire quelle doit tre un multiple de 4. Ladresse est calcule en ajoutant le contenu du registre du champ rs1 au contenu du champ rs2 ou de la valeur contenue dans le champ simm13, selon le cas. Le champ rd est utilis pour dsigner le registre source. Flags affects : aucun Exemple : st %r1, [%r2] Copie le contenu du registre %r1 dans la case mmoire dont ladresse est la valeur de %r2. Dans ce cas particulier, rs2 = 0, et linstruction pourrait tre crite : st %r1, [%r2+%r0] Instruction : stb Description : Stocke les 8 bits de poids faibles dun registre, une adresse quelconque en mmoire centrale. Seul un octet de la mmoire est affect. Ladresse est calcule en ajoutant le contenu du registre du champ rs1 au contenu du champ rs2 ou de la valeur contenue dans le champ simm13, selon le cas. Le champ rd est utilis pour dsigner le registre source. Flags affects : aucun Exemple : stb %r1, [%r2+5] Copie les 8 bits de poids faibles de %r1 dans la case mmoire dont ladresse est la valeur de %r2+5. Seul cet octet est affect en mmoire. Instruction : sub Description : Effectue la soustraction en complment deux des deux oprandes, et place le rsultat dans loprande rsultat. les ags (condition codes, cc) ne sont pas affects. Flags affects : aucun Exemple : sub %r1, 5, %r1 Soustrait 5 au contenu de %r1, et ne modie pas les ags. Instruction : subcc Description : Effectue la soustraction en complment deux des deux oprandes, et place le rsultat dans loprande rsultat. Les ags (condition codes, cc) sont positionns conformment au rsultat. Flags affects : N, Z, V, C Exemple : subcc %r1, 5, %r1 Soustrait 5 au contenu de %r1, et positionne les ags. Instruction : udivcc Description : Unsigned divide. Effectue une division non signe 32 bits / 16 bits avec calcul du quotient et du reste. Le quotient est plac dans les 16 bits de poids forts du registre destination, le reste dans les 16 bits de poids faibles. Flags affects : Z Exemple : udiv %r7, %r1, %r6 Effectue la division entire non signe entre les 16 bits de poids faibles de %r7 et les 16 bits de poids faible de %r1, et place le quotient dans les 16 bits de poids forts de %r6 et le reste dans les 16 bits de poids faibles de %r6. Instruction : umulcc Description : Unsigned multiply. Effectue une multiplication non signe 16 bits x 16 bits vers 32 bits. Seuls les 16 bits de poids faibles des deux oprandes source sont pris en compte

B.2. Jeu dinstructions du processeur CRAPS

227

dans le calcul. Flags affects : Z Exemple : umul %r7, %r1, %r6 Copie dans %r6 le rsultat de la multiplication non signe entre les 16 bits de poids faibles de %r7 et les 16 bits de poids faibles de %r1. Instruction : wrpsr Description : Copie dans %psr (Processor Status Register) le contenu dun registre %ri. Flags affects : aucun Exemple : wrpsr %r1 Copie dans %psr le contenu de %r1. Instruction : wrtbr Description : Copie dans %tbr (Trap Base Register) le contenu dun registre %ri. Flags affects : aucun Exemple : wrtbr %r1 Copie dans %tbr le contenu de %r1. Instruction : xnorcc Description : Effectue un XNOR logique (inverse du XOR, encore appel concidence) bit bit entre les oprandes sources et place le rsultat dans loprande rsultat. Les ags (condition codes, cc) sont positionns conformment au rsultat. Flags affects : N, Z Exemple : xnorcc %r7, %r1, %r6 Copie dans %r6 le xnor calcul bit bit entre %r7 et %r1 et positionne les ags N et Z en consquence. Instruction : xorcc Description : Effectue un XOR logique bit bit entre les oprandes sources et place le rsultat dans loprande rsultat. Les ags (condition codes, cc) sont positionns conformment au rsultat. Flags affects : N, Z Exemple : xorcc %r7, %r1, %r6 Copie dans %r6 le xor calcul bit bit entre %r7 et %r1, et positionne les ags N et Z en consquence.

228

ANNEXE B. CRAPS : GUIDE DU PROGRAMMEUR

B.3. Tables des branchements conditionnels

instruction ba beq (synonyme : bz) bne (synonyme : bnz) bneg (synonyme : bn) bpos (synonyme : bnn) bcs bcc bvs bvc

opration Branch Always Branch on Equal Branch on Not Equal Branch on Negative Branch on Positive Branch on Carry Set Branch on Carry Clear Branch on Overow Set Branch on Overow Clear

test 1 Z not Z N not N C not C V not V

Figure B.1. Branchements conditionnels associs un seul ag. instruction bg bge bl ble opration Branch on Greater Branch on Greater or Equal Branch on Less Branch on Less or Equal test not (Z or (N xor V)) not (N xor V) (N xor V) Z or (N xor V)

Figure B.2. Branchements conditionnels associs une arithmtique signe. instruction bgu bcc bcs bleu opration Branch on Greater Unsigned Branch on greater than, or equal, unsigned Branch on less than, unsigned Branch on Less or Equal Unsigned test not (Z or C) not C C Z or C

Figure B.3. Branchements conditionnels associs une arithmtique non signe.

B.4. Format binaire des instructions de CRAPS

B.4. Format binaire des instructions de CRAPS


op 0 1 Format 1 : call disp30 Format 2 : sethi et branchements rd cond op2 op2 imm22 disp22 2a 2b

229

op 0 0 op 0 0 0

op 1t 1t rd rd

Format 3 : accs mmoire, instructions arithmtiques op3 op3 rs1 rs1 0 1 simm13 rs2 3a 3b

t = 1 : accs mmoire, t = 0 : instruction arithmtique

op2 010 100

Instr. branch sethi

op3 (t = 0) 000000 010000 000100 010100 011010 010001 010010 010011 010111 110101 110110 111000

Instr. add addcc sub subcc umulcc andcc orcc xorcc xnorcc sll srl jmpl

op3 (t = 1) 000000 000001 000100 000101

Instr. ld ldub st stb

cond 1000 0001 1001 0101 1101 1110 0110 0111 1111 1010 0010 1011 0011 1100 0100

Branchement ba be bne bcs bcc bpos bneg bvs bvc bg ble bge bl bgu bleu

230

ANNEXE B. CRAPS : GUIDE DU PROGRAMMEUR

B.5. Directives de lassembleur CRAPS Syntaxe


.org

Rle force val dassemblage la nouvelle adresse

val32

ex : data .org 0x8000 label label


.eq

val32 val32 val32(, val32)

associe val 3 2 label dans la table des symboles idem ex : NB


.eq 5

.word

alloue et initialise des mots mmoire de 32 bits conscutifs .word 2,3,5,7 ex : list alloue et initialise en mmoire des octets conscutifs ex text .byte 10,13,"erreur",0 alloue sans initialiser n octets conscutifs ex : buffer .malloc 100

.byte

vbyte(, vbyte)

.malloc

.global

sym

Fait de sym un symbole global, visible par les autres modules ex : .global strout

val32 reprsente un nombre de lintervalle [0, 232 1], ou de lintervalle [ 232 , 232 1]. vbyte reprsente une ou plusieurs descriptions doctets : un nombre de [0, 255] ou une suite de caractres entre apostrophes.

B.5. Directives de lassembleur CRAPS

231

B.6. Cartographie mmoire de CRAPS


[0000 0000 0000 FFFF]

ROM (64K)

commande #1 commande #2 IT timer

0040 0000 0040 0004 0040 0008

[0040 0000 0040 000B] [0060 0000 0060 000F]

timer entres / sorties donnes direction ITs memorisees sens front ITs
0060 0000 0060 0004 0060 0008 0060 000C

[0100 0000 01FF FFFF]

RAM (16 Mo)

B.7. Programmation des entres/sorties adresse 0x600000 0x600000 0x600004 0x600004 0x600008 0x600008 0x60000C 0x60000C W 0 1 0 1 0 1 0 1 lire ltat des entres crire sur les sorties lire conguration lignes congurer les lignes lire interruptions mmorises raz des interruptions mmorises lire sens du front dinterruption (0 = front montant) crire sens du front dinterruption opration

B.8. Programmation du timer adresse 0x400000 0x400000 0x400004 0x400004 0x400008 0x400008 W 0 1 0 1 0 1 opration lire le registre de commande #1 (P + N) crire le registre de commande #1 (P + N) lire le registre de commande #2 (prediv + start) crire le registre de commande #2 (prediv + start) lire bit dinterruption timer raz bit dinterruption timer

232 B.9. Liste des exceptions exception reset bus error instruction privilgie instruction illgale division par zro erreur dalignement interruption timer interruption entres/sorties priorit 15 14 13 12 11 10 8 7

ANNEXE B. CRAPS : GUIDE DU PROGRAMMEUR

numro de type (tt) voir texte 14 13 12 11 10 8 7

Glossaire
accs alatoire
Pour une mmoire, indique la possibilit de faire des oprations successives de lecture et-ou dcriture des adresses quelconques, dans nimporte quel ordre. Pour un chier, indique la possibilit deffectuer une suite daccs en lecture ou en criture des enregistrements situs des positions quelconques.Voir aussi accs squentiel.

algbre de Boole
Voir Boole.

ASCII
American Standard Code for International Interchange. Codage des caractres anglo-saxons sur 7 bits. La plupart des codages de caractres (par exemple ISO-Latin 1) sont des extensions sur 8 bits de lencodage ASCII.

accs direct mmoire


Voir DMA.

ASIC
Un ASIC (Application Specic Integrated Circuit) est un circuit intgr ralis pour une application spcique, contrairement aux PLDs et FPGAs qui sont reprogrammables et peuvent raliser un ensemble vari de fonctions. Un ASIC est un peu plus rapide que son quivalent PLD ou FPGA, mais il doit tre produit en grandes quantits pour que son cot lunit soit raisonnable.

accs squentiel
Serial access. Mode de lecture ou dcriture de donnes qui suit un ordre de rangement prtabli.

adressage absolu
Voir adressage direct.

adressage direct
Utilis en langage dassemblage et en langage machine. Mode dadressage dans lequel ladresse (xe) de la donne en mmoire est fournie dans linstruction. Est aussi appel adressage absolu.

assembleur (langage)
Language symbolique de programmation associ un processeur, qui est en fait une expression directe plus lisible dun programme crit en langage machine.

adressage immdiat
Utilis en langage dassemblage et en langage machine. Mode dadressage dans lequel la donne est fournie dans linstruction elle mme. Aucun autre accs en mmoire nest ncessaire.

assembleur (programme)
Programme de traduction qui convertit en langage machine un programme crit en langage assembleur.

asynchrone
Se dit dun circuit ou dun composant qui nest pas synchrone, cest dire dont les sorties changent peu de temps aprs que les entres aient changes, et non aprs un front dhorloge.

AGP
Advanced Graphics Port. Port de communication spcialis entre le processeur graphique et la carte mre, oprant un dbit de 522 MBs.
233

234

GLOSSAIRE processeur, la mmoire centrale et les contrleurs des principaux priphriques et bus dun ordinateur. Des cartes additionnelles (carte graphique, carte son, etc.) viennent sencher sur les connecteurs qui y sont prsents (PCI, AGP, USB, etc.)

big-endian
Voir little-endian.

bistable
Voir latch.

bit
Forme abrge de binary digit. Information reprsente par un symbole deux valeurs, gnralement notes 0 et 1, associes aux deux tats dun dispositif.

chargeur
Module du systme dexploitation responsable du placement en mmoire centrale dun programme excuter.

bogue
Traduction ofcielle franaise de bug. Voir bug.

CISC
Complex Instruction Set Computer. Ce terme a t cr en mme temps et pour sopposer au terme RISC. Dsigne les processeurs aux jeux dinstructions complexes et de longueurs variables, qui utilisent gnralement un squenceur microprogramm pour sexcuter. LIntel Pentium, le Motorola 68000 sont des exemples de processeurs CISC.

Boole
Georges Boole (1815-1864), mathmaticien anglais, publie en 1954 ses travaux sur une algbre permettant de reprsenter des informations factuelles binaires telles que La porte est ferme ou La porte nest pas ferme. Lalgbre de Boole a t ensuite dveloppe par Shannon sous la forme que nous connaissons aujourdhui.

CMOS
Complementary Metal Oxyde Semiconductor. Technologie de fabrication de circuits intgrs utilise pour les processeurs, les microcontrleurs et les mmoires statiques. Ils se distinguent par leur fort taux dintgration, leur faible dissipation thermique, et le fait quils ne consomment du courant signicativement que lors des changements dtat.

buffer
Se dit dun lment logiciel ou matriel. Mmoire ou partie de mmoire permettant le stockage temporaire de donnes entre deux organes.

bug
Dfaut dun programme se manifestant par des anomalies de fonctionnement.

codage par champs


Faon de coder les instructions dun langage machine, dans laquelle une succession hirarchique de champs de bits dans linstruction permet de la dcoder et de lexcuter.

bus
Ensemble de lignes lectriques vhiculant un groupe de signaux particuliers.

byte
Forme anglaise du mot octet. Groupe de 8 bits.

compilateur
Traducteur dun langage vers un autre, gnralement dun langage volu vers un code objet proche du langage machine.

carte mre
Circuit imprim sur lequel est situ le

CPLD

Glossaire Complex Programmable Logic Device. Un CPLD est un PLD de grande capacit.

235

diteur de texte
Programme permettant ldition de chiers contenant uniquement des lignes de texte, sans aucune indication de formatage. Lencodage des caractres peut tre ASCII, un encodage ISO sur 8 bits ou Unicode.

CPU
Central Processing Unit. Souvent utilis comme synonyme de processeur. Voir unit centrale.

debugger
Outil logiciel permettant dexcuter un programme sous contrle, en y plaant des points darrt et en permettant linspection de ltat des variables et de la mmoire.

dition de lien
Opration de fusion de plusieurs chiers de code objet pour produire un chier de code excutable.

EEPROM
Electrically Erasable PROM. Mmoire morte reprogrammable, effaable lectriquement par octet.

dcodage
Voir dcodeur.

dcodeur
Circuit traduisant une adresse en une information dappartenance un sous-espace dadresse.

enregistrement
Dans un chier, se dit dun lment logique de celui-ci. Dans un programme, synonyme de structure de donnes.

DMA
Direct Memory Acces = accs direct mmoire. Dispositif li la mmoire qui permet dy faire des lectures et-ou des critures sans passer par lunit centrale. Les disques durs, les cartes graphiques, les cartes son fonctionnent le plus souvent en DMA.

entrance
Voir fan-in.

EPROM
Erasable PROM. Est parfois appel REPROM (REprogramable PROM). Mmoire morte reprogrammable munie dune petite fentre de quartz, et effaable par une exposition aux ultra-violets.

DRAM
Voir mmoire dynamique.

exception
vnement exceptionnel qui intervient pendant le droulement dun programme. Les exceptions cause interne sont appeles traps (division par 0, dbordement arithmtique, bus error, etc.) et les exception cause externe sont appeles (n interruptions dentre/sortie disque, rseau ; vnement clavier, USB ; etc.). La prise en compte de lexception provoque lexcution dun sous-programme associ appel gestionnaire dexception.

EBCDIC
Ancien codage de caractres tomb en dsutude, qui tait employ dans les machines de gestion.

chantillonnage
Mmorisation de la valeur dun signal (0 ou 1 en logique digitale) un moment prcis, gnralement dtermin par le front montant ou descendant dun autre signal.

diteur de lien
Voir dition de lien.

fan-in

236 Caractrise le courant quabsorbe lentre dune porte logique, mesur en nombre de telles entres qui peuvent tre relies une sortie de mme technologie.

GLOSSAIRE diffrence de temps de propagation sur des sous-termes dun terme complexe. Les tables de Karnaugh permettent de dtecter et dliminer les glitchs des expressions combinatoires.

fan-out
Caractrise le courant maximum que peut gnrer la sortie dune porte logique, mesur en nombre dentres de mme technologie qui peuvent lui tre connectes.

handler dexception
Voir gestionnaire dexception.

Harvard (modle de)


Organisation gnrale dun ordinateur caractrise par la prsence de deux mmoires spares pour le stockage du programme et des donnes. Voir Von Neumann (modle de).

ag
Voir indicateur.

ash
Voir mmoire ash.

harware
Partie matrielle dun ordinateur.

FPGA
Field Programmable Gate Array. Type de circuit logique recongurable bas sur la technologie des gate arrays (matrices de portes). Ils sont gnralement de plus grande capacit que les PLDs ; leur conguration est stocke dans une RAM qui doit tre recharge chaque mise sous tension.

haute impdance
Se dit dune sortie dun circuit logique. Lorsquelle est dans cet tat, tout se passe comme si elle tait dconnecte du circuit, car elle ne produit ni ne consomme plus aucun courant. Des sorties qui peuvent se mettre en tat haute impdance peuvent tre relies entre elles directement (sur un bus par exemple), pourvu quune logique de dcodage garantisse quau plus une seule de ces sorties est source de courant un moment donn (sous peine de court-circuit).

gnration de code
Phase nale lors de la compilation dun programme, durant laquelle le code assembleur associ au programme source est effectivement gnr.

HDL
Harware Description Language. Langage de description de circuits, logique ou analogiques. Certains sont structurels, drivant en dtails la composition et la structure de tous leurs composants, tandis que dautres sont fonctionnels, dcrivant les relations fonctionnelles entre les ux dentres/sorties.

gestionnaire dexception
Sous-programme associ une exception, qui est excut chaque occurrence de lexception, de faon transparente pour le programme en cours.

glitch
Un glitch est une erreur fugitive dans un systme informatique. Dans les circuits combinatoires ou squentiels, cest un tat fugitif 0 ou 1 qui apparat sur un signal, un moment o il devrait tre stable, et qui est d un problme de

hexadcimal
Systme de comptage en base 16. Les chiffres sont : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. On lutilise comme criture plus lisible du binaire, en regroupant les bits par

Glossaire paquets de 4.

237 circuits recongurables tels que FPGAs et PLDs.

hold (temps de)


Dure aprs le front dhorloge durant laquelle les entres dune bascule doivent tre stables pour que le basculement se passe correctement. Voir setup.

langage machine
Language quexcute un microprocesseur, form dune suite dinstructions binaires.

latch
Cellule de mmorisation de 1 bit.

indicateur
Bit mmoris par un processeur, fournissant une indication sur un calcul qui vient dtre effectu par lunit arithmtique et logique. Ils sappellent le plus souvent N (negative), Z (zero), V (overow), C (Carry).

link
Voir dition de lien.

little-endian, big-endian
Ces termes sont issus des Voyages de Gulliver de Swift, lorsque Gulliver est au pays des politiciens. Une guerre dopinion fait rage propos de la manire de manger son oeuf la coque, entre le parti des big-endian qui pense quon doit le casser par le gros bout, et le parti des little-endian qui veut commencer par le petit. En informatique, dsigne deux conventions dcriture dun nombre binaire sur plusieurs octets successifs. Dans lcriture big-endian, les octets sont copis en terminant par les 8 bits de poids les plus faibles ; dans lcriture little-endian on termine par les 8 bits de poids fort. Lcriture little-endian (la moins naturelle) nest actuellement utilise que dans les processeurs x86 dIntel, et elle est une des principales sources dincompatibilit entre structures et chiers de donnes issues de machines diffrentes.

interprteur
Programme ou dispositif matriel fonctionnant cycliquement, en dcodant et excutant chaque cycle une nouvelle instruction dun programme. Un processeur est toujours un interprteur (matriel) de son langage machine.

interruption
Evnement asynchrone, dclench par lenvironnement matriel dun ordinateur (disque, rseau, souris, etc.), destin prvenir le processeur dune condition particulire qui doit tre traite rapidement en suspendant le programme en cours dexcution de manire transparente. Les interruptions sont des exceptions cause interne.

ISA (bus)
Industry Standard Architecture. Nom dun bus de communication pour compatible PC, maintenant obsolte.

load-store
Se dit dune architecture dordinateur qui possde un petit nombre dinstructions de transfert entre la mmoire et les registres de type load et store, et dont toutes les autres instructions oprent sur les registres internes au processeur. Cest souvent une caractristique des processeurs RISC.

ISA (instructions)
Instruction Set Architecture. Jeu dinstructions dun microprocesseur.

JTAG
Norme internationale permettant linterconnexion et la conguration de

loader
Voir chargeur.

238

GLOSSAIRE ncessite plusieurs autres composants autour de lui pour fonctionner.

logiciel
Voir software.

mappe en mmoire
Se dit des entres/sorties dun processeur, lorsque celui-ci ne peut agir sur elles que par des oprations de lecture ou dcriture en mmoire, des adresses ddies. Un tel type de programmation des entres/sorties soppose lutilisation dinstructions spciales dentres/sorties comme sur les x86 par exemple.

microprogramme
Ensemble dinstructions places dans une mmoire interne au processeur, non accessible au programmeur, qui permet lexcution des instructions non cbles du langage machine.

modes dadressage
Mthodes daccs aux donnes pour un microprocesseur. Voir par exemple adressage direct.

mmoire dynamique
Mmoire accs alatoire dont les cellules de mmorisation sont des capacits mmoire. Les mmoires dynamiques ont un taux dintgration plus lev que les mmoires statiques, mais elles ncessitent une lectronique de rafrachissement du contenu des cellules.

module
En software, bloc de code rutilisable. En hardware, circuit rutilisable. Dans les deux cas, cest un outil fondamental de matrise de la complexit.

Moore (loi de)


Gordon Moore est un des fondateurs dIntel Corporation. Il a remarqu que tous les 18 mois environ, la puissance de calcul et la capacit mmoire des ordinateurs sont multiplies par deux. Cette progression a t appele loi de Moore, et elle est encore valable actuellement.

mmoire ash
Mmoire morte reprogrammable, effaable lectriquement par blocs.

mmoire statique
Mmoire accs alatoire dont les cellules de mmorisation sont des bistables.

mmoire tampon
Voir buffer.

multiprocesseur
Se dit dun ordinateur qui possde plusieurs processeurs centraux.

microcontrleur
Cest un circuit intgr unique, qui contient la fois le microprocesseur, sa mmoire centrale et des circuits dentres/sorties. Il fonctionne donc de faon autonome avec un minimum de composants extrieurs, et ce sont ces circuits qui quipent nos voitures, jouets, appareils lectromnagers, etc.

octet
Byte en anglais. Groupe de 8 bits.

PCI
Bus de communication entre un processeur et des cartes additionnelles, fonctionnant une frquence typique de 33 MHz. Il a t conu par Intel, qui en a plac tous les brevets dans le domaine publique.

microprocesseur
Processeur dont tous les lments sont rassembls en un seul circuit intgr. Il nest gnralement pas autonome et

PLD
Programmable Logic Device. Circuit logique dont les fonctions combinatoire

Glossaire ou squentielles sont programmables. On appelle souvent PLD uniquement les circuits dont la conguration est stocke dans une EEPROM ou une mmoire ash, et qui sont oprationnels ds la mise sous tension, contrairement aux FPGAs.

239 Se dit dune partie de code machine qui peut sexcuter o quelle soit place en mmoire ; qui peut donc tre reloge. Tous les compilateurs produisent un code relogeable, pour que le chargeur puisse le placer en mmoire lendroit le plus favorable.

processeur
Organe principal dun ordinateur, qui permet dinterprter les instructions de son langage machine.

REPROM
Voir EPROM.

RISC
Reduced Instruction Set Computer. Se dit de processeurs possdant des instructions en nombre limit, de taille xe, et qui les excutent gnralement en un cycle dhorloge.

progiciel
Ensemble de programmes professionnels, documents et livrs sous forme dun package.

PROM
Programable ROM. Mmoire morte programmable dont les bits sont analogues des fusibles que lon fait fondre par application dun courant lev lors de la programmation.

ROM
Read Only Memory. Mmoire morte, accessible en lecture seulement.

routine
Voir sous-programme.

RAM
Random Acces Memory. Mmoire vive, accessible en lecture et en criture.

SDRAM
Synchronous Dynamic RAM : RAM dynamique synchrone.

random access
Voir accs alatoire.

setup (temps de)


Dure avant le front dhorloge durant laquelle les entres dune bascule doivent tre stables pour que le basculement se passe correctement. Voir hold.

record
Voir enregistrement.

rentrant
Se dit dun programme dont une seule copie en mmoire peut tre exploite par plusieurs processus dans un systme multitches, sans que leur donnes ne se confondent. Tous les compilateurs produisent automatiquement du code rentrant.

software
Logiciel. Tout ce qui concerne la programmation dun ordinateur, par opposition hardware.

sortance
Voir fan-out.

registre
Circuit synchrone de mmorisation de plusieurs bits.

sous-programme
Partie de programme rutilisable. On linvoque par une instruction spcialise, et on lui communique en gnral des arguments par la pile ou dans des registres.

relogeable

240 Lorsque son excution est termine, une instructions spciale reprend le contrle dans le programme appelant aprs linstruction dappel.

GLOSSAIRE

translatable
Voir relogeable.

trap
xception cause interne, provoque par lexcution dune instruction, telle que division par 0, dbordement arithmtique, bus error, etc.

stack frame
Portion de la pile dun programme en cours dexcution, dans laquelle sont stockes les valeurs associes au bloc en cours (gnralement les paramtres dappel et les variables locales dun sous-programme).

tri-state
Voir haute-impdance.

statique
Voir mmoire statique.

trois-tats
Voir haute-impdance.

synchrone
Se dit dun circuit qui possde une entre dhorloge qui synchronise toutes ses oprations.

TTL
Transistor Transistor Logic. Technologie de ralisation de circuits logiques, dont la caractristique principale est sa vitesse dexcution. On lui prfre actuellement la technologie CMOS pour les circuits forte intgration.

tampon
Voir buffer.

temps daccs
Se dit dun dispositif de mmorisation, disque ou mmoire centrale. Temps maximum de ralisation dune opration de lecture ou dcriture.

Unicode
Nom dun systme de codage de caractres et didogrammes dont lambition est de permettre de prendre en compte de faon unie la plupart des langues crites du monde. Ce systme fait la diffrence entre les codes-points, nombres entiers associs de faon unique chaque caractre ou idogramme, et lencodage de ces codes-points, suite doctets qui les reprsentent en mmoire. UTF-8 est le nom de lencodage le plus rpandu.

temps de propagation
Dure qui scoule entre le moment o les entres dun circuit changent et le moment o ses sorties prennent une nouvelle valeur stable.

timer
Circuit priphrique un microprocesseur, qui lui fournit des impulsions intervalles rguliers pour lui donner une unit de temps.

unit centrale
Partie de lordinateur qui effectue linterprtation et le traitement des instructions.

transistor
lment actif de base des portes logiques. Il est dans ce cas employ en mode commutation, cest dire en tout ou rien. LIntel 8088 comportait 29000 transistors ; le Pentium II 7,5 millions.

USB
Universal Serial Bus. Bus de connexion de priphriques srie. Cest un bus en toile, qui ncessite des hubs de connexion. Les priphriques peuvent tre branchs chaud. Dans son mode lent, il permet des

Glossaire changes 1.5 MBs

241

VLSI
Very Large Scale Integration. Technique de ralisation de circuits intgrs qui permet de mettre sur la mme puce des millions de transistors, en utilisant des mthodes lithographiques.

Von Neumann (modle de)


Organisation gnrale dun ordinateur caractrise par la prsence dune unit de calcul, une unit de contrle et dune unique mmoire centrale qui contient la fois les instructions du programme et les donnes manipules. Voir Harvard (modle de).

x86
Terme gnrique dsignant un membre de la famille Intel dans la descendance 8080, 8085, 8086, 80186, 80286, , 80x86 (x tant maintenant suprieur 7). partir du 80586, Intel a commenc utiliser galement le terme commercial de Pentium.

Index
ABEL, 27 addition, 37 additionneur carry-lookahead, 39 complet, 37, 47 group carry-lookahead, 41 ripple-carry, 38 adressage direct, 145 immdiat, 145 indirect, 145 registre, 144 adresse, 115 algbre de Boole, 3, 18, 22 allocation, 146 and, 21 ASCII, 10 ASIC, 26 asynchrone, 63 barrel shifter, 108 bascule D, 71 JK, 74 matre-esclave, 85 synchrone, 69 T, 73 big-endian, 130, 134 binaire pur, 11 bistable, 62 bit, 3 bloc, 160 Boole, 3, 18 boolen, 18 branchement absolu, 144 conditionnel, 140 inconditionnel, 140 relatif, 143 buffer 3-tats, 99 bus, 2, 101, 187, 195 dadresses, 195
242

bus (suite) de donnes, 195 synchrone, 102 systme, 2 carte mre, 2 cartographie, 198 cercle des nombres, 13 circuit combinatoire, 18 squentiel, 61 CISC, 130 CMOS, 3, 6 code code point, 10 de Gray de Gray, 14, 30 combinaison interdite, 31 comparaison, 14 comparateur, 50 compatibilit ascendante, 130 complment 2, 12 compteur, 86 contrleur de priphrique, 2 CPLD, 29 CRAPS, 129 dbordement, 14 dcaleur barillet, 108 dcodage, 198 dcodeur, 103 dcompteur, 86 dcrmentation, 8 demi-additionneur, 37 dtecteur de squence, 64 directive, 145 diviseur de frquence, 88 division, 48 ECL, 5 EEPROM, 29, 117 emprunt, 43 encodeur de priorit, 105 entres-sorties, 163, 201 EPROM, 117

Index quation dvolution, 73 Eratosthne, 184 et, 21 tat quivalent, 67 exception, 170, 205 extension de signe, 107 FETCH, 210 ag, 111 fonctionnel, 27 FPGA, 26, 29 front dhorloge, 63 descendant, 63 montant, 63 GAL, 29 gnration de code, 159 gestionnaire dexception, 170, 174 giga, 7 glitch, 32 graphe graphe dtat, 62 graphe de Mealy, 65 graphe de Moore, 64 Gray, 30 handler dexception, 174 hardware, 129 haute-impdance, 98 HDL, 26 hexadcimal, 9 high-Z, 98 hold, 84 horloge, 63 IEEE 754, 6 implicant premier, 36 essentiel, 36 imprimeur, 11 incrmentation, 8 indicateur, 111 instruction, 2 de rupture de squence, 140 synthtique, 138 interprteur, 129 interruption, 171, 207 inverseur command, 25 ISA, 129 ISO_8859, 10 JTAG, 29 Karnaugh, 30 kilo, 7 langage langage machine, 2 assembleur assembleur, 129, 135 machine, 129 latch, 62, 70 lecteur, 11 little-endian, 130, 134 LSB, 7 matre-esclave, 85 majorit, 22 mapp en mmoire, 133, 164 masquage, 207 MDL, 27 Mealy, 65, 77 mga, 7 mmoire, 62, 198 centrale, 1 dynamique, 117, 120 ash, 29, 117 statique, 6, 117 microcommande, 209 micromachine, 209 minterm, 21, 30 MLI, 114 mode dadressage, 144 Moore, 64, 77 mot, 6 MSB, 7 multiplexeur, 26, 99, 104 multiplicateur systolique, 47 multiplication, 47 NAND, 23 niveau, 63 niveau de priorit, 172 non, 20 NOR, 23 not, 20 octet, 6 oprateur boolen, 20 complet, 24 logique, 20 OR, 21 ou, 21

243

244 PALASM, 27 parit, 24 PCI, 103 priphrique, 2 pile, 153 PLD, 26, 29 poids faible, 7 fort, 7 pointeur de pile, 153 porte et, 21 logique, 20 non, 20 ou, 21 processeur, 2 PROM, 117 PWM, 114, 166, 203 Quine-Mc Cluskey, 34 RAM, 116 rcursif, 156, 162 rchi, 14 registre, 2, 90, 132, 186 regroupement, 31 RISC, 130 ROM, 116 scheduler de tches, 176 SDRAM, 117 squenceur squenceur.cabl squenceur.microprogramm squenceur, 209 servo-moteur, 168 setup, 84 Shannon, 18 SHDL, 26, 27 simplication, 31, 35 software, 129 sous-programme, 152 terminal, 153 soustracteur complet, 44 ripple borrow, 45 soustraction, 43 SPARC, 131 stack-frame, 159 structurel, 27

I NDEX symbole, 147 synchrone, 63 table de Huffman, 66 de Karnaugh, 30 de transitions, 66 de vrit, 20 temps temps daccs, 118 de hold, 84 de propagation, 4 de setup, 84 thorme dabsorption, 22 de De Morgan, 22 timer, 114, 166, 203 tranche de bits, 112 transistor, 5 trap, 170 trois tats, 98 TTL, 3, 5 UAL, 111, 190 UNICODE, 10 unit arithmtique et logique arithmtique et logique, 111, 190 de calcul, 2 de contrle, 2 UTF-8, 10 vecteur dexception, 174 VHDL, 27 VLSI, 5 Von-Neumann, 1 XOR, 24, 38, 44

Vous aimerez peut-être aussi