Cours
Cours
Cours
15 juillet 2002
2
Table des matières
1 Introduction à l’architecture 7
1.1 Qu’appelle t-on architecture des ordinateurs ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2 Vers l’ordinateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.1 Les inventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.2 Les théories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3 Naissance de l’ordinateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4 Chronologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.5 Structure générale d’un ordinateur mono-processeur actuel . . . . . . . . . . . . . . . . . . . . . . . 9
1.6 Langage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3
4 TABLE DES MATIÈRES
4 Mémoires 35
4.1 Hiérarchie de mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2 Organisation des informations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.1 Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.2 Caractéristiques des mémoires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.3 Types d’accès . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.3 Mémoires caches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.3.1 Principes généraux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.3.2 Mode d’accès des caches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.3.3 Remplacement des données dans le cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.3.4 Interaction avec la mémoire centrale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.4 Mémoire centrale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
5 Le langage de la machine 41
5.1 Instructions machine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.1.1 Le processeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.1.2 Types d’instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.1.3 Format d’instruction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.1.4 Modes d’adressage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2 Appel de fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.3 Exemples d’assembleur (montrés sur transparents) . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.4 Du programme C vers le processus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6 Pipeline 49
6.1 Étages d’un pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.2 Registres de pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.3 Performances d’un pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.4 Problèmes liés au pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5
6 TABLE DES FIGURES
Introduction à l’architecture
7
8 CHAPITRE 1. INTRODUCTION À L’ARCHITECTURE
1.4 Chronologie
Première génération (1945-1955) : tubes à vide (pannes fréquentes, difficiles à déceler, ordinateurs demandant beau-
coup de place), et tores de ferrite pour les mémoires.
Deuxième génération (1955-1965) : remplacement des tubes par des transistors ; organisation de la machine autour
d’un bus ; stockage sur bande magnétique ; écrans ; etc.
Troisième génération (1965-1980) : apparition des circuits intégrés (puces) et des processeurs ⇒ éloignement du
schéma de VON N EUMANN car processeurs d’E/S pour traitement direct avec la mémoire ; miniaturisation
(ordinateurs plus petits, plus rapides et moins chers) ; gammes de machines (même langage d’assemblage pour
des machines différentes, d’où réutilisabilité des programmes) ; multiprogrammation (plusieurs programmes en
1.5. STRUCTURE GÉNÉRALE D’UN ORDINATEUR MONO-PROCESSEUR ACTUEL 9
Mémoire
Entrée
Accumulateur
mémoire, lorsqu’un programme entre en phase d’entrées-sorties, l’UC passe à l’exécution d’une partie d’un
autre programme).
Quatrième génération (1980- ??) : ordinateurs personnels et VLSI (Very Large Scale Integration) : augmentation du
nombres de transistors ; réseau ; terminaux.
Périphériques E/S
– CPU : Central Processing Unit : élément de l’ordinateur qui interprète et exécute les instructions d’un pro-
gramme. CPU n bits ⇒ les informations sont codées sur n bits.
– ROM : Read Only Memory : mémoire « morte » que l’on ne peut que lire.
– RAM : Random Access Memory : mémoire vive (lecture et écriture) et volatile (se vide quand il n’y a plus de
courant) ; c’est (généralement) une suite de cases contenant 8 bits (soit un octet), chaque case ayant sa propre
adresse.
– Périphériques : disque dur (E/S), lecteur disquette (E/S), clavier (E), souris (E), écran (S), imprimante (S), lecteur
cdrom (E), graveur (S), accès réseau (E/S).
CPU
Exemple d’évolution de processeurs : Intel, voir la figure 1.3.
10 CHAPITRE 1. INTRODUCTION À L’ARCHITECTURE
1.6 Langage
– L’activité d’une machine est rythmée par le CPU qui exécute le cycle suivant : chercher une instruction en
mémoire (RAM), l’exécuter, chercher l’instruction suivante en mémoire, etc.
– Une instruction est une suite de bits contenant le code de l’opération (addition, soustraction, recherche d’un mot
en mémoire, etc.) et ses opérandes (arguments de l’opération).
– Pour éviter d’avoir à connaître ce langage difficilement manipulable par l’homme, on définit des langages de
plus haut niveau d’où une architecture en couches de machines virtuelles (cf. figure 1.4).
Machine virtuelle Mn
Langage Ln Le passage d´une machine
(ou langage) à une autre se
Machine virtuelle Mn−1 fait par interprétation
ou compilation
Langage Ln−1
Machine virtuelle M0
Langage machine L0
Interprétation : chaque instruction du langage Ln est traduite en la séquence adéquate du langage Ln−1 exécutable,
donc, par la machine virtuelle Mn−1 . À chaque exécution il y a ré-interprétation.
1.6. LANGAGE 11
Compilation : un programme de la machine Mn , en entier est traduit une fois pour toute en un programme en langage
Ln−1 exécutable directement par la machine virtuelle Mn−1 .
Les machines actuelles présentes généralement l’architecture en couche de la figure 1.5.
↓ interprétation
23 22 21 20
1 0 0 12 = 1 × 8 + 0 × 4 + 0 × 2 + 1 × 1 = 910
52 51 50
1 4 35 = 1 × 25 + 4 × 5 + 3 = 4810
– Bases usuelles : base 10 et base 60.
– Représentation des nombres dans une base b :
1. Si b <= 10, on utilise simplement les chiffres de 0 à b − 1 (exemple : base 2).
2. Si b > 10, on a deux possibilités :
(a) Soit on utilise les chiffres de 0 à 9 et des lettres.
Ainsi, en base 16 (numération hexadécimale) on utilise les chiffres de 0 à 9 et les lettres de A (=10) à
F (=15).
E2A116 = 14 × 163 + 2 × 162 + 10 × 16 + 1 = 5801710
Exemple : l’adresse mémoire « Ox0090602f ».
(b) Soit on se contente d’utiliser les chiffres, et on introduit des symboles séparateurs.
Ainsi, la longitude de Paris est : 2◦ 200 1400 E (système sexagésimal).
13
14 CHAPITRE 2. CODAGE DES INFORMATIONS
+ 0 1 × 0 1
0 0 1 0 0 0
1 1 10 1 0 1
1 0 1
× 1 0 1
1 0 1 0 1 1 0 0
1 0 1
+ 1 1 0 0 1 0 1
0 0 0
1 0 0 0 1 0 0 0 1
1 0 1
1 1 0 0 1
2.1.3 Conversion
Binaire → décimal : trivial voir ci-dessus
Décimal → binaire : on procède par division entière successive par 2. Exemple : 2910 :
29 : 2 = 14 reste 1
14 : 2 = 7 reste 0
7 : 2 = 3 reste 1 ⇒ 2910 = 111012 .
3 : 2 = 1 reste 1
1 : 2 = 0 reste 1
Y = ym ...y0 = ym × bm 0
2 + ... + y0 b2 avec ym , ..., y0 < b2 .
× 07 17 27 37 47 57 67 107
57 07 57 137 217 267 347 427 507
127 : 57 = 1 reste 4
17 : 57 = 0 reste 1
Le codage de 127 est donc 145 .
2.2. REPRÉSENTATION DES ENTIERS 15
3 27 57
1 4 5 27 57 2
2 37 57 − 2 6 4
− 1 3 223 − 12 32 3
1 5 1 3
− 1 3 − 1 3
2 2 0
− 2 1
1
D’où 14527 = 43015 . Les sceptiques peuvent vérifier que 14527 = 1 × 73 + 4 × 72 + 5 × 7 + 2 = 576 et 43015 =
4 × 53 + 3 × 52 + 0 × 5 + 1 = 576...
En pratique, si b1 6= 10, on évite d’effectuer la division en base b1 en convertissant X en base 10 puis en procédant
par division sur le nombre obtenu pour effectuer la conversion de la base 10 vers la base b2 .
Certaines conversions sont très faciles à réaliser comme la conversion binaire vers octal (base 8) ou binaire vers
hexadécimal (base 16).
Exemple : 10100111012
– base 8 découpage par blocs de 3 chiffres :
001 010 011 101
1 2 3 5 = 12358
– base 16 découpage par blocs de 4 chiffres :
0010 1001 1101
2 9 D = 29D16
De manière générale, les conversions sont faciles lorsque b2 est une puissance de b1 . Les conversions en base 8
ou 16 sont très fréquentes pour l’affichage des nombres binaires qui, par leurs longueurs, sont rapidement illisibles.
Exemple : octal pour les codes de caractères, hexadécimal pour les adresses mémoires.
Pour simplifier l’addition, une solution consiste à représenter les entiers binaires en compléments à deux. Pour
mieux appréhender cette technique, examinons son principe sur les nombres en base 10.
123 9672
Complément à 9 876 0327
Complément à 10 877 0328
2 3
+
8 8
=
1 1 1
Comme B > A, 99 + (B − A) + 1 > 100, ainsi en éliminant simplement le 1 en tête, on trouve B − A. Notons
qu’avec une représentation machine sur deux bits, le 1 de tête est perdu automatiquement.
– A < B. Exemple : B = 12 et A = 23. C10 (A) = 77.
1 2
+
7 7
=
0 8 9
Comme B < A, 99 + (B − A) + 1 < 100, si on fait la soustraction par 100, on retrouve le résultat (89 − 100 =
−11), mais le résultat tel quel est le complément à 10 de la valeur absolue du résultat (complément de 11 ;
C10 (11) = 89).
Conclusion : en codant les entiers avec un nombre fixe de chiffres, coder les entiers négatifs en complément à 10
permet de ramener les soustractions en addition.
Il faut toutefois faire attention à séparer les nombres négatifs des autres nombres. Ainsi, dans l’exemple précédent,
les nombres [0 ; 49] sont positifs et [50 ; 99] négatifs.
n−1
C1 (A) = ∑ (1 − ai )2i .
i=0
D’où :
B +C2 (A) = B − A + 2n
– Le premier bit d’un nombre indique son signe, s’il est négatif son complément permet de retrouver sa valeur
absolue.
Exemple pour des entiers codés sur 3 bits :
I1 I2 I3 I4 I5 I6
-
Remarque. Au niveau logiciel on trouve des librairies qui permettent le calcul (sur les entiers, les rationnels et les
réels) en précision infinie, comme la librairie gmp de GNU (GNU Multi Precision).
p ¬p p q p∨q p q p∧q
V F V V V V V V
F V V F V V F F
F V V F V F
F F F F F F
– La logique des propositions comporte d’autres connecteurs comme « si a alors b » et quelques lois comme
a ∨ a = a, ¬(a ∨ b) = ¬a ∧ ¬b (voir la démonstration sur la table 3.2). G EORGE B OOLE a exprimé la logique
des propositions en termes algébriques.
a b ¬a ¬b ¬a ∧ ¬b a∨b ¬(a ∨ b)
V V F F F V F
V F F V F V F
F V V F F V F
F F V V V F V
21
22 CHAPITRE 3. ALGÈBRE DE BOOLE ET CIRCUITS LOGIQUES
Seule une fonction est intéressante du point de vue logique, c’est la fonction f3 qui est le non logique f3 (a) = a
(les autres fonctions sont f1 (a) = 0, f2 (a) = a,et f4 (a) = 1).
– Tables de vérités des fonctions à deux variables : voir la table 3.3.
Fonctions remarquables :
f1 (a, b) = 0
f16 (a, b) = 1
f9 (a, b) = ab : et
f15 (a, b) = a + b : ou
f7 (a, b) = a ⊕ b : ou exclusif ou xor
f2 : nor (non ou)
f8 : nand (non et)
On peut montrer que toutes ces fonctions peuvent s’exprimer en fonction des trois opérations logiques et, ou
et non :
f1 (a, b) = 0
f2 (a, b) = a + b
f3 (a, b) = ab
...
f7 (a, b) = ab + ab
n
– Ainsi avec n variables, on construit 22 fonctions (il y a 2n configurations possibles des entrées, et pour
chacune de ces configurations on a deux choix possibles).
– Une fonction à trois variables peut se décomposer en deux : f (a, b, c) = f (0, b, c) si a = 0 (où f (0, b, c) est
une des fonctions du tableau 3.3) et f (a, b, c) = f (1, b, c) si a = 1. Ainsi f (a, b, c) = a. f (1, b, c) + a. f (0, b, c).
On montre ainsi par récurrence que toute fonction à n variables se ramène à une expression contenant des
fonctions à deux variables.
– On appelle groupe logique complet un ensemble de fonctions logiques à partir desquelles il est possible de
réaliser toutes les fonctions logiques. Ex : {et, ou, non}, {et, non}, {ou, non}, {nand}, {nor}, {xor, et}, etc.
Comme on peut ramener toute fonction à n variables à une expression formée exclusivement de fonctions à deux
variables et des connecteurs et, ou et non, et vu que toutes les fonctions à deux variables peuvent être exprimées
à l’aide de ces connecteurs, il nous suffit de montrer que l’on peut traduire ces trois connecteurs dans n’importe
lequel des groupes logiques complets. Prenons par exemple le groupe réduit au connecteur nand :
non : nand(a, b) = a ∧ b, d’où nand(a, a) = a ∧ a = a.
et : nand(a, b) = a ∧ b, et il nous suffit de prendre la négation du résultat, en utilisant ce que nous venons juste
de montrer. nand (nand(a, b), nand(a, b)) = nand(a, b) = a ∧ b = a ∧ b.
ou : nand(c, d) = c ∧ d = c∨d. D’où, en prenant c = a = nand(a, a) et d = b = nand(b, b), nand (nand(a, a), nand(b, b)) =
(a) ∨ b = a ∨ b.
– L’algèbre de Boole se construit sur les booléens à partir de trois opérations internes : +, × et . Le tableau 3.4
présente les théorèmes et axiomes fondamentaux de l’algèbre de Boole.
3.3. PORTES ET CIRCUITS LOGIQUES 23
f (a, b, c) = 1 si : f (a, b, c) = 0 si :
a b c f(a, b, c) a = 1 et b = 1 et c = 0
0 0 0 1 a = 0 et b = 0 et c = 0
a = 1 et b = 0 et c = 0 ou a = 0 et b = 0 et c = 1 ou
1 0 0 1 a = 0 et b = 1 et c = 1
a = 0 et b = 1 et c = 0 ou
0 1 0 1
a = 1 et b = 0 et c = 1 ou
1 1 0 0
a = 1 et b = 1 et c = 1 ou
0 0 1 0
1 0 1 1 D’où f (a, b, c) = abc×abc×abc =
D’où f (a, b, c) = abc+abc+abc+
0 1 1 0 abc + abc = bc + ac + ac = (a + (a + b + c) × (a + b + c) × (a + b +
1 1 1 1 b)c + ac. c).
Concrètement chaque porte logique est réalisée électroniquement par un ou deux transistors.
– Plusieurs portes logiques forment un circuit logique (cf. figure 3.3 pour une exemple simple). On distingue deux
types de circuits logiques :
– les circuits combinatoires qui ne font que combiner selon une table de vérité les variables d’entrée ;
24 CHAPITRE 3. ALGÈBRE DE BOOLE ET CIRCUITS LOGIQUES
– les circuits séquentiels construits à partir de circuits combinatoires et qui se caractérisent par une capacité de
mémorisation.
– La réalisation d’un circuit passe d’abord par la recherche des expressions booléennes, ensuite par leur simplifi-
cation basée sur l’algèbre de Boole (exemple : les diagrammes de Karnaugh, cf. TD).
x x
S x
y y S S
y HA
R R R
F IG . 3.4 – Deux réalisations du demi-additionneur dont x et y sont les entrées, S est le bit de somme et R celui de
retenue ; et représentation schématique.
– Dans une addition de deux nombres, on additionne bit à bit en considérant la retenue du rang précédent ⇒
somme de 3 bits = additionneur complet. La table de vérité de l’additionneur et son schéma sont présentés
figure 3.5.
Formules : la somme s vaut un si entre les bits x, y et la retenue d’entrée re le nombre de bits à un est impair ;
la retenue de sortie rs vaut un si les bits x et y valent un, ou si l’un ou l’autre de ces bits vaut un alors que la
retenue d’entrée re vaut un.
s = re ⊕ x ⊕ y et rs = x × y + x × re + y × re = x × y + re × (x ⊕ y).
– Un additionneur se réalise à l’aide d’additionneur 3 bits mis bout à bout. La figure 3.10 présente un exemple
d’un tel additionneur 4 bits.
3.4. CIRCUITS COMBINATOIRES 25
re re
x y re s rs
x s x
0 0 0 0 0 y HA HA s
y
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
rs rs
1 1 1 1 1
3.4.2 Incrémenteur
Retrancher ou ajouter 1 à un nombre est une opération fréquemment réalisée par un processeur, on pourrait utiliser
l’addition mais on peut optimiser (le fait que les registres soient équipés d’incrémenteur ou décrémenteur permet en
outre de libérer l’UAL ⇒ exécution parallèle d’opérations).
La figure 3.6 présente un incrémenteur quatre bits.
e2 s2
s0 = e0
s3
ei si ei−1 = ... = e0 = 1 ⇔ ei−1 ...e0 = 1 e3
si =
ei sinon
overflow
et donc :
si = ei ⊕ (ei−1 × ... × e0 ).
3.4.3 Comparateur
– Un comparateur deux bits a deux entrées x et y et trois sorties E (égalité), S (x > y), I (x < y).
Table de vérité :
x y E S I
0 0 1 0 0
0 1 0 0 1
1 0 0 1 0
1 1 1 0 0
D’où les formules : E = x ⊕ y, S = xy et I = xy et le circuit présenté figure 3.7.
– Pour un comparateur à plusieurs bits, prenons 4 bits, on s’inspire directement des définitions suivantes :
26 CHAPITRE 3. ALGÈBRE DE BOOLE ET CIRCUITS LOGIQUES
x
S
y
F IG . 3.7 – Comparateur.
E
x0
y0
x1
y1
x2 S
y2
x3
I
y3
F IG . 3.8 – Comparateur quatre bits fabriqué à partir de comparateurs un bit (boîtes noires).
On a donc un circuit avec 4 comparateurs à deux bits plus quelques portes et, ou et une porte nor (ce circuit est
trop délicat pour pouvoir le faire au tableau, mais il est représenté figure 3.8).
– Dans certains processeurs, pour éviter cette circuiterie, on utilise la soustraction, on teste l’indicateur de signe S
et l’indicateur de zéro Z —réalisé par un nor comme le montre la figure 3.9.
indicateur de zéro
x0 z0
y0
x0
FA z0
y0
x1
FA z1
y1
x1 z1
y1 x2
FA z2
y2
x3
FA z3
y3
overflow
overflow
3.4.4 UAL
Une UAL est une Unité Arithmétique et Logique réalisant les opérations de base : opérations logiques (et, ou et
non), opérations arithmétiques, comparaisons. Un code d’entrée détermine la partie du circuit qui va fournir le résultat.
À la fin de l’opération des indicateurs sont regroupés dans un registre : dernière retenue, overflow, nullité du résultat,
signe, supériorité, etc.
La figure 3.12 présente la représentation schématique d’une unité arithmétique et logique, et la figure 3.13 présente
le schéma logique d’une telle unité 1 bit rudimentaire.
indicateurs
donnée A
n bits
résultat
donnée B
x
y
s
re
FA
rs
F0
F1
F IG . 3.13 – Circuit combinatoire d’une UAL rudimentaire à 1 bit possédant 4 opérations (et, ou, non et addition) de
code d’opérations sur 2 bits F0 et F1 (00 : ou, 01 : et, 10 : non, 11 : addition)
– Une horloge est un composant passant indéfiniment et régulièrement d’un niveau haut à un niveau bas (suc-
cession de 1 et de 0), chaque transition s’appelle un top. On distingue les bascules synchrones, asservies à des
impulsions d’horloge et donc insensibles aux bruits entre deux tops, et les bascules asynchrones, non asservies
à une horloge et prenant en compte leurs entrées à tout moment.
3.5.2 Bascule RS
– Cette bascule est réalisée par le circuit combinatoire de la figure 3.14.
S Q
S Q
R Q
Q
R
– Cette bascule présente deux états stables pour la configuration des entrées R = S = 0 : le couple de sorties Q = 0
et Q = 1 et le couple de sorties Q = 1 et Q = 0.
– R = 0 et S = 0 ⇒ Qt+1 = Qt
R = 0 et S = 1 ⇒ Qt+1 = 1 (mise à 1, S : set)
R = 1 et S = 0 ⇒ Qt+1 = 0 (effacement, R : reset)
R = 1 et S = 1 : configurations interdites : tant que R et S restent à 1, Q et Q restent à 0 mais lorsque R et S
changent on ne peut prévoir dans quel état on se trouve (ex. : montrer ce qui se passe sur le circuit avec R et S
30 CHAPITRE 3. ALGÈBRE DE BOOLE ET CIRCUITS LOGIQUES
passant à 0).
– Ce circuit donne lieu à la table de vérité suivante :
R S Qt Qt+1
0 0 0 0 Qt+1 = Qt
0 0 1 1 Qt+1 = Qt
0 1 0 1 Mise à 1
0 1 1 1 Mise à 1
1 0 0 0 Effacement
1 0 1 0 Effacement
1 1 0 ∗ Interdit
1 1 1 ∗ Interdit
En simplifiant par Karnaugh (voir la figure 3.15) en donnant la valeur 1 aux cas interdits, on obtient : Qt+1 =
S + RQt .
RS
Q RS RS RS RS
Q 1 1 1 0
Q 1 1 0 0
– Les bascules RS sont fréquemment utilisées dans la construction de circuits anti-rebond. Propriétés utiles des
bascules RS, si R = 0 et S = 1 ⇒ Q = 1 et si S change, Q reste à 1.
S
Q
S Q
C
C R Q
Q
R
3.5.4 Bascule D
– La bascule RSC ne résout pas le problème des conditions interdites. De plus ce que souhaite généralement le
concepteur, c’est mémoriser l’état en entrée. D’où la bascule D (pour data) :
D S Q
C C
R Q
– Comme R et S ne peuvent pas être égaux, les cas interdits ne peuvent plus se produire. Si C = 1 ⇒ Qt+1 = D et
si C = 0 ⇒ Qt+1 = Qt .
– Les bascules D sont généralement aménagées pour :
– se déclencher sur un front montant (immunité maximale aux bruits) ;
– disposer de deux entrées supplémentaires preset et clear indépendantes de l’horloge et permettant de mettre
à 1 ou à 0 la bascule.
3.5.5 Bascules JK et T
Une autre manière de lever les cas interdits est la bascule JK (pas de signification particulière pour J et K) présenté
figure 3.18. Cette bascule a le même comportement qu’une bascule RS sauf que si J = K = 1 ⇒ Qt+1 = Qt . La table
de vérité ci-dessous définit son comportement quand J = K = 1 :
Qt Qt J K S R Qt+1 Qt+1
0 1 1 1 1 0 1 0
1 0 1 1 0 1 0 1
J S Q
C C
K R Q
JK
Q JK JK JK JK
Q 0 0 1 1 J K Qt+1
1 0 1
Q 1 0 0 1 0 1 0
0 0 Qt
1 1 Qt+1
F IG . 3.19 – Table de Karnaugh pour la bascule JK. F IG . 3.20 – Table de vérité de la bascule JK (C = 1).
S Q
C C
C Qt Qt+1
R Q 0 0 0
0 1 1
1 0 1
1 1 0
La figure 3.23 présente le schéma d’un ensemble de trois registres à décalage et un tableau illustrant le comporte-
ment de ce système.
temps a b c
R Q R Q
0 0 1 1
a R Q
b c
1 0 0 1
S Q Q
S S Q 2 0 0 0
clock 3 1 0 0
4 0 1 0
5 0 0 1
Comme le montre la figure 3.24, nous réalisons un compteur binaire en utilisant des bascules flip-flop dont l’acti-
vation a lieu sur le front descendant du signal d’horloge. Notre compteur a trois bit et peut donc prendre 8 valeurs : de
0 à 7.
3.6. APPLICATION DES BASCULES 33
A B C
Entrée
Td Td Td
Entrée 1 2 3 4 5 6 7 8 9
Mémoires
1. Le principe de localité : on constate que l’exécution d’un programme passe 90% du temps dans 10% du
code.
– Localité temporelle : une donnée ou une instruction utilisée récemment sera probablement réutilisée
prochainement ;
– Localité spatiale : une donnée (resp. une instruction) placée près d’une autre donnée (resp. d’une autre
instruction) référencée récemment sera probablement accédée prochainement.
2. Plus une mémoire est rapide d’accès, plus elle est petite. En effet, le coût et l’encombrement des mémoires
sont proportionnels à leur rapidité ce qui impose de faire un (bon) compromis rapidité/quantité.
La mémoire centrale est volatile et parfois de taille insuffisante ⇒ disques durs. Lecture/écriture en mé-
moire centrale : opérations lentes par rapport à la vitesse du processeur ⇒ mémoire intermédiaire entre
registres et mémoire centrale = mémoire cache. Il se dessine donc une hiérarchisation de l’ensemble des
mémoires.
Ordre décroissant selon : rapidité, prix, proximité du processeur.
Type Capacité
Registre < 400
Cache interne (L1) 32 à 256 ko
SRAM (bascules)
Cache externe (L2) 128 Ko à 1 Mo
SRAM
Mémoire centrale 32 Mo à 1 Go
DRAM (condensateurs)
Disques durs Dizaines de Go
Archivage (bandes, DVD, etc.) Quelques Go
Registres : les registres sont utilisés pour assurer le stockage temporaire d’informations nécessaires à
l’exécution de l’instruction en cours de traitement. Les registres se situent à l’intérieur même de l’unité
centrale. Un registre mémorise un certain nombre de bits, souvent un mot mémoire.
35
36 CHAPITRE 4. MÉMOIRES
– Exemple de fonctionnement :
1. Le processeur demande une instruction présente dans une boucle d’un programme en plaçant l’adresse de
cette instruction sur le bus d’adresse.
2. Le contrôleur de cache cherche si l’information est dans le cache en fonction de l’adresse → échec
3. Le contrôleur de cache entame un cycle de lecture en mémoire centrale.
4. La mémoire centrale envoie l’information au processeur et le contrôleur de cache la copie au passage dans
le cache.
⇒ Au prochain accès à cette même instruction, le contrôleur de cache enverra directement la donnée au proces-
seur sans démarrer un cycle de lecture en mémoire centrale.
Repère Voie
Voies
– cache direct (direct mapped) : une donnée ne peut être placée que dans une voie précise. Ceci permet d’éviter
les N comparateurs. Si le cache dispose de 2 p voies, p bits de l’adresse servent à désigner la voie concernée,
l’entier positif représenté par les p bits est appelé index (cf. figure 4.2).
Prenons un cache direct de 4 Ko possédant 128 voies de 32 octets chacune. Les adresses sont sur 32 bits. Ainsi
le découpage de l’adresse se réalise comme suit :
– bit 0-4 (5 bits) : n◦ d’octet dans la voie (car 32 = 25 )
– bit 5-11 (7 bits) : n◦ de voie (car 128 = 27 )
– bit 12-31 (20 bits) : étiquette
Inconvénient : toutes les données dont les adresses ont la même étiquette doivent prendre place dans la même
voie du cache.
38 CHAPITRE 4. MÉMOIRES
– solution adoptée : cache associatif par n-ensembles (n-way set associative). Il combine les deux techniques
(c’est le plus couramment utilisé). On utilise ici n caches directs. L’adresse fournit un index et la donnée peut
prendre place dans n’importe quel cache direct (cf. figure 4.3).
étiquette
Un cache direct peut être vu comme un cache associatif par 1-ensemble et un cache associatif à m voies, comme
un cache associatif à m-ensembles de 1 voie chacun.
CPU RAM
Le langage de la machine
41
42 CHAPITRE 5. LE LANGAGE DE LA MACHINE
–0 : format de l’instruction ;
–17, 18, 8 : numéros de registre (sur 5 bits car 32 registres) ;
–0 : pas utilisé dans l’addition ;
–32 : indique l’addition et signifie l’addition du contenu des registres 17 et 18 et le placement du résultat dans le
registre 8.
Le premier et le dernier champ (0 : UAL et 32 : +) forment le code de l’opération (opcode).
Ex 2 :
Donne 4 8 7 9
Nombre de bits 6 5 5 16
F IG . 5.2 – Avant l’appel à F IG . 5.3 – Avant l’appel à F IG . 5.4 – Avant l’appel à F IG . 5.5 – Avant le retour de
somme(2). somme(1). somme(0). l’appel à somme(0).
(Frame pointer).
500
main() $LC0 :
{
int a, b, c ; .byte 0x4c,0x61,0x20,0x76,0x61,0x6c,0x65,0x75
.byte 0x72,0x20,0x64,0x65,0x20,0x63,0x20,0x65
a = 12 ; .byte 0x73,0x74,0x20,0x3a,0x20,0x25,0x64,0xa
b = 24 ; .byte 0x0
c = a + b;
.
printf("La valeur de c est : %d\n", c) ; .
} .
li $2,0x0000000c # 12
sw $2,24($fp)
li $2,0x00000018 # 24
sw $2,28($fp)
lw $2,24($fp)
lw $3,28($fp)
addu $2,$2,$3
sw $2,32($fp)
la $4,$LC0
lw $5,32($fp)
jal printf
.
.
.LC0 : .LLC0 :
.string "La valeur de c est : %d\n" .asciz "La valeur de c est : %d\n"
.
. .
. .
movl $12,-4(%ebp) mov 12,%o0
movl $24,-8(%ebp) st %o0,[%fp-20]
movl -4(%ebp),%edx mov 24,%o0
addl -8(%ebp),%edx st %o0,[%fp-24]
movl %edx,-12(%ebp) ld [%fp-20],%o0
movl -12(%ebp),%eax ld [%fp-24],%o1
pushl %eax add %o0,%o1,%o0
pushl $.LC0 st %o0,[%fp-28]
call printf sethi %hi(.LLC0),%o1
addl $8,%esp or %o1,%lo(.LLC0),%o0
. ld [%fp-28],%o1
. call printf,0
.
.
1200
1000
"bonjour" "bonjour"
900 jump to 100 jump to 1000
700
600
branch 300 branch 700
500 load Y, R2 load Y, R2
3.141593 3.141593
400 jump to 150 jump to 550
call B branch 400
300
F IG . 5.10 – Ensembles des fragments de codes avant et après édition de liens. Ici on a arbitrairement supposé que la
première instruction d’un programme se trouvait toujours à l’adresse 0.
48 CHAPITRE 5. LE LANGAGE DE LA MACHINE
– Information de relocalisation : identifie les instructions et données qui dépendent d’adresses absolues (ex. :
jump 1000).
– Tables des symboles : table des étiquettes internes et externes (noms de fonctions).
– Informations de mises au point : pour le débuggage (liens entre lignes sources et instructions, etc.).
– Éditeur de liens : permet d’assembler des fichiers interdépendants compilés séparément, il réalise 3 tâches :
– recherche dans les bibliothèques de programmes pour retrouver les procédures utilisées par le programme ;
– détermine les emplacements de chaque module et relocalise les instructions en ajustant les références abso-
lues ;
– résout les références entre fichiers.
Évoquer pb : fonction non existante ou non dans la bibliothèque.
– Chargement = on passe de l’exécutable au processus : structure d’un processus en mémoire : 3 parties (pile,
données, texte).
Pile
↓
↑
Données dynamiques
Données statiques
Instructions
– Chargeur :
– lit la taille du fichier et définit l’espace nécessaire ;
– crée un espace d’adressage suffisamment grand pour contenir également la pile ;
– copie les données et les instructions ;
– copie sur la pile les arguments passés au programme ;
– initialise les registres (tous à 0, sauf celui de la pile : premier emplacement libre) ;
– effectue le saut vers la première instruction du main.
Chapitre 6
Pipeline
Instr
Num/cycle 1 2 3 4 5 6 7 8 9
horloge
instr i IF ID EX MEM WB
instr i+1 IF ID EX MEM WB
instr i+2 IF ID EX MEM WB
instr i+3 IF ID EX MEM WB
instr i+4 IF ID EX MEM WB
49
50 CHAPITRE 6. PIPELINE
IF ID EX MEM WB
IF ID EX MEM WB
F IG . 6.2 – Étages du pipeline après insertion d’un registre pour contenir le code de l’instruction et un autre pour
mémoriser les sorties de l’UAL.
– le temps de traitement dans chaque unité doit être à peu près égal, sinon les unités rapides attendent les unités
lentes ;
– aléas de branchement : s’il y a saut d’instruction, les instructions qui suivent le saut et qui sont en train d’être
traitées dans les étages inférieurs le sont pour rien, il faudra vider le pipeline ; pour atténuer l’effet des branche-
ments, on peut spécifier après le branchement des instructions qui seront toujours exécutées, comme c’est le cas
dans l’assembleur S PARC ;
– conflits de dépendance, par exemple entre deux instructions consécutives travaillant sur la même zone mémoire
(RAM ou registres) ; solution logicielle : le compilateur génère des instructions nop (ne fait rien) ; solution
matérielle : détection des dépendances et mise en attente des instructions suivantes.
52 CHAPITRE 6. PIPELINE
Chapitre 7
Unité d’exécution
conversion conversion
de segments pages
registres UAL
Unité de bus
interface
Unité de contrôle bus
exécution du
microcode décodeur queue de
préextraction
queue des micro-
instructions préextraction
Unité de bus : fait l’interface entre le bus interne et le bus externe (qui ne sont pas forcément de même taille ni
de même vitesse), il gère également la circulation interne entre unités. Il est sollicité d’une part par l’unité
de contrôle pour la recherche des données en mémoire centrale, données placées ensuite dans les registres, et
d’autre part par l’unité de préextraction pour la recherche d’instructions.
Unité de préextraction : dans un processeur pipeliné, dès que l’unité de bus ne travaille pas, elle demande la re-
cherche de l’instruction suivante et la place dans la queue de préextraction, elle transmet l’instruction suivante à
l’unité de décodage.
Unité de décodage : traduit chaque instruction assembleur en microcodes.
Unité de contrôle : exécution des microcodes en synchronisant les signaux envoyés à l’UAL ou à l’interface de bus
pour la recherche de données.
53
54 CHAPITRE 7. UNITÉS D’UN MICROPROCESSEUR
Unité arithmétique et logique : contient des registres et réalise les opérations arithmétiques, logiques, les décalages
et comparaisons.
Unité de gestion mémoire : sur demande de l’unité de contrôle, elle convertit une adresse virtuelle en adresse phy-
sique. Par ce mécanisme tout programme est découpé en « pages » : des adresses consécutives dans le pro-
gramme ne sont pas forcément consécutives en mémoire centrale. De plus tout le programme n’est pas forcément
chargé en mémoire mais seulement les pages utiles.
µ pgm (ROM)
s ignaux vers
UA L, MMU , branch
M icroprogra mme
. unités de bus ,
point d’entrée
regis tres , etc. lecture données
(circuit logique) . microcode
add
signaux
. activation UAL
écriture données
cmp
microcode
– ROM : moins rapide que le circuit (temps d’accès mémoire), plus volumineux, plus facile à réaliser. De plus,
l’ajout d’une instruction demande simplement d’étendre la ROM et d’ajouter les nouvelles lignes à la table de
vérité. Ce système est utilisé dans les processeurs CISC car leur jeu d’instructions est énorme. On parle alors de
jeu d’instructions microprogrammé.
Circuit : plus rapide, peu volumineux (moins de portes que la ROM). Ce système est utilisé dans les processeurs
processeurs RISC. On parle alors de jeu d’instructions câblé.
Actuellement, la différence entre RISC et CISC s’estompe avec des processeurs utilisant les deux techniques :
les microcodes les plus fréquents sont câblés et les autres microprogrammés. Pour un exemple d’équivalence
circuit logique/ROM, voir la figure 7.1.
tructions courantes peuvent s’appareiller et dans le cas contraire mettre en attente certaines instructions conflic-
tuelles en bloquant un ou plusieurs pipelines. Notons que les pipelines sont généralement dédiés à des instruc-
tions particulières, ainsi le Pentium II possède 2 pipelines entiers et 1 pipeline flottant. Pour tirer pleinement
parti des pipelines, les caches L2 permettent plusieurs accès simultanés.
– Pour finir, les processeurs les plus récents évitent au maximum les mises en attente dues au conflits en exécutant
les microcodes dans le désordre : Out-of-Order Execution opposé à In-Order Execution. Ainsi, une instruction
en attente peut laisser la place à une instruction suivante et n’être exécutée qu’ensuite.
– 5 pipelines : 2 entiers (ALU1, ALU2), 2 flottants (1 addition, 1 multiplication), 1 pour les accès mémoire
load/store.
– 4 instructions décodées à chaque cycle horloge.
– TLB : cache associatif par blocs de 64 entrées (1 entrée = 2 pages), adresses physiques sur 40 bits ⇒ 1 Teraoctets.
– 2 caches associatifs par blocs de 32 Ko.
– Superscalaire out-of-order.
– Format d’instructions variables.
– 3 unités de décodage parallèles : 1 microprogrammée (si instruction = plus de 4 microcodes), 2 câblées.
– Jusqu’à 20 microcodes en attente.
– Plusieurs pipelines mais au mieux 5 instructions exécutées en même temps : 2 calculs entiers, 1 flottant, 2 accès
mémoire load/store.
– Pipeline entier : 12 à 17 étages ; pipeline flottant : environ 25 étages.
– Cache L2 : 512 Ko.
– AGU : Adress Generation Unit
– IEU : Integer Execution Unit
– BTB : Branch Target Buffer
– BHB : Branch History Buffer
58 CHAPITRE 7. UNITÉS D’UN MICROPROCESSEUR
– Superscalaire out-of-order.
– Format d’instructions variable.
– 6 unités de décodage parallèles (3 microprogrammées, 3 câblées) mais seules 3 peuvent fonctionner en même
temps.
– Jusqu’à 72 microcodes en attente.
– Plusieurs pipelines mais au mieux 9 instructions exécutées en même temps.
– Pipeline entier : 10 étages ; pipeline flottant : 15 étages.
– Cache L2 : 512 Ko.