Académique Documents
Professionnel Documents
Culture Documents
Buisson Concevoir Son Microprocesseur Structure Des Systemes Logiques Ellipses
Buisson Concevoir Son Microprocesseur Structure Des Systemes Logiques Ellipses
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
. . . . . . . . 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
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
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
instruction
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
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.
cache niveau 2
64/256 bits
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.
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.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.
5v 2.4v 0.4v
tp HL
Figure I.5. Remise en forme dun signal aprs traverse dune porte non.
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
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
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
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
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
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
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
0 1 1 0
3 22 163 21 + 2 20
1 0 0 0
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
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.
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.
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.
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).
010 2
101 3
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
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
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
copie en miroir
1 0 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
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
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.
17
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.
20
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.
A 0 1
A 1 0
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
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
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
= 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
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
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.
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
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).
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
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.
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.
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
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
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
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
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
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
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
37
1 0 1
0 0 1
0 1 0
1 1 0
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.
38
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.
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.
40 ci = ai bi + ai ci + bi ci
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
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
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
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
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
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
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
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
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.
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
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.
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
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
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.
b2 = a2 (a1a0 )
b0 = a0 b = a + a a a
1 1 0
1 0
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
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)
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.
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.
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
e
...100
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
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
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.
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
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
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.
(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).
(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
avant T 0 1 Q x x
aprs Q x x
Figure III.22. Bascule T synchrone. Lorsque lentre T est 0 elle ne change pas dtat ; lorsque lentre T vaut 1 son tat sinverse.
(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.
76
(a)
(b)
(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
transcodeur
sorties
Figure III.27. Schma gnral dun circuit squentiel synchrone de type MOORE.
78
entres CLK m
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
79
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
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.
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
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
t setup hold temps de propagation priode o les entres de la bascule doivent tre stables valeurs stables de ltat suivant
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.
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.
86
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
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.
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
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.
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
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
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
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
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
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
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.
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).
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
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
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
95
96
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
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.
97
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.
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
A A C B
MODULE MUX_1(A,B,C :S) S = A:/C ; S = B:C ; END MODULE
S B
Figure IV.3. Multiplexeur ralis laide de buffers 3-tats, compar sa ralisation en logique combinatoire classique. On conomise le ou nal.
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.
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
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).
8 2 8
n1*n0
n1*/n0
/n1*n0
/n1*/n0
8 2
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
103
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
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
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.
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
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
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.
108
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
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.
112
A
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).
A 2 F1,F0
B F1 F0
UAL
1 bit
CIN S COUT
0 0 0 1 1 0 1 1
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
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
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
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.
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.
116
// 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
cpt m
n3..n0 = 2 p = 6 (p3..p0 = 5)
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
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.)
118
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
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.
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
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.
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
121
RAS CAS W
numro ligne
numro colonne
DOUT
RAS CAS W
numro ligne
numro colonne
DIN
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
Figure IV.37. Structure interne dune mmoire dynamique de 22m mots de n bits.
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
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
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
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.
127
2xm Data
RAM
2 mots
CS OE W
CS OE W
de m bits
m Data n
RAM
ADR
n
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
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.
129
130
interprtation 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
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.
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
132
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.
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
%tbr (Trap Base Register), qui contient ladresse de la table des exceptions. Son rle dtaill sera dcrit dans les sections ultrieures.
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
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).
135
octets adresse 0
... ...
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.
136
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
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
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
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
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
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 ;
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
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
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
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.
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
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.
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
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.
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.
145
%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.
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:
; fin pour
;;;;;;;;;;
zone de donnes
;;;;;;;;;
146
.org .word
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.
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
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
148
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.
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
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
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
; fin pour
TAB
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
Les trois instructions suivantes sont relatives la recherche de lindice suivant. On commence dabord par incrmenter lindice :
inccc %r2 ; lment suivant
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 :
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
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
; ; ; ;
loopi
loopj
check
nexti
TAB
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.
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.
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
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
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)
%r30 7 8 5
initialement (d)
pop %r2
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
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
RAM STACK
main
; ; ; ; ;
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.
159
RAM STACK
main
; ; ; ;
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.
160
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) ; }
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
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
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
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: =
;; 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.
164
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.
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.
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
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
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.
167
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
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
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 ;
%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).
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
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.
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
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.
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
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. 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
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.
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
178
RAM STACK0 STACK1 STACK2
= 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
179
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.
180
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 ;
181
Cet algorithme se traduit de faon littrale par le programme donn gure V.41.
182
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:
b: b1:
c: c1:
%r2 %r0
e: e1:
%r2 %r0
; sinon aller en a
183
= =
;; 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
184
;; 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
0, %r3 [%r2+%r5]
b2
STR
RAM azertyuiop,0
; chane de test
185
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
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
%tbr
NZVC PIL
setNZ,setVC
32
32
%pc
rs1 rs2 4 4
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
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
= 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.
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.
192
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
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.
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.
195
196
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.
197
clk
registres
32
32
32
Bus A
Bus B
Bus D
cmd_ual[5..0]
UAL
6 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
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
timer entres / sorties donnes direction ITs memorisees sens front ITs
0060 0000 0060 0004 0060 0008 0060 000C
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 :
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
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
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.
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
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
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.
204
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.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.
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.
La gure VI.22 montre le schma complet qui prend en compte tous ces aspects.
206
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.
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
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.
209
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
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
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.
211
op = 00 op = 01
fetch
except_req = 1
decode
op = 10 op = 11
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.
212
...
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
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.
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
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
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
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
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
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.
216
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
9. Exercices corrigs
9. Exercices corrigs
217
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;
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
Figure VI.31. Interface du circuit dentres/sorties. W 0 1 opration lire ltat des entres crire sur les 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
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
221
222
jmpl %ri, %r0 jmpl %r31+4, %r0 sub %r30, 4, %r30 st %ri, [%r30]
pop %ri
dpile %ri
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
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.
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
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
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
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
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
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
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
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
val32
.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.
231
ROM (64K)
timer entres / sorties donnes direction ITs memorisees sens front ITs
0060 0000 0060 0004 0060 0008 0060 000C
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
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.
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.
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.
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.
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
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.
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.
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
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.
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