Solution td4
Solution td4
Solution td4
TD 4 - C ONCEPTION D ’ UN MICROPROCESSEUR 16
[15 :9]
[11 :9] 2
DR 3
R0
LD.PC
LD.REG
[11 :9]
PC
Ce TD est prévu pour s’étaler sur deux séances. 2
PCMX [8 :6]
SR1 3 R7
MARMX 2
On étudie les étapes de l’exécution d’une instruction, le fonctionnement du pro- @ +1
SR2 3
SR2 SR1
2
cesseur et particulièrement du circuit de contrôle. Le schéma du processeur LC-2 est SR1MX
OUT OUT
ZEXT +
rappelé dans la figure 13. Les composants suivants sont fournis : ALU 16-bits, registre [8 :0]
16 16
Note : les circuits PC, IR, MAR, MDR, N, Z et P sont des registres (bascules D).
MDR MAR LD.MAR
Le rôle des signaux de contrôle de la figure 13 est explicité dans la liste suivante. LD.MDR
MIO.EN R.W MIO.EN
– LD.MAR/1 , LD.MDR/1 , LD.IR/1 , LD.REG/1 , LD.CC/1 et LD.PC/1 commandent
l’écriture dans les divers registres du LC-2. mémoire contrôle KBDR CRTDR
adressable des
– LD.BEN/1 commande l’écriture dans le registre BEN (branch enable) ; ce re- sur 16 bits adresses KBSR CRTSR
gistre vaut 1 lorsque le branchement doit être pris (si l’instruction courante est un MEM.EN
2 INMUX Input Output
branchement conditionnel).
– GatePC/1 , GateMDR/1 , GateALU/1 et GateMARMX/1 commandent les accès en
écriture sur le bus.
– MIO.EN/1 doit être mis à 1 lorsque l’on souhaite accéder à la mémoire, en lecture
ou en écriture. F IG . 13 – Diagramme des blocs du LC-2
– R.W/1 est mis à 0 pour une lecture et 1 pour une écriture en mémoire.
– ALUK/2 : 00 pour ADD, 01 pour AND, 10 pour NOT, 11 pour faire « traverser »
– DRMX/2 vaut toujours 0 dans le cadre de cet exercice, il sélectionne le registre
l’entrée 1 sans calcul.
destination (signal DR) à partir de IR[11 : 9].
– PCMX/2 sélectionne l’une des quatre entrées du multiplexeur : de droite à gauche,
– SR2MX/1 est à part : ce signal détermine si la deuxième opérande vient du banc
00, 01, 10 et 11.
des registres ou du champ immédiat, il est par construction égal au bit 5 du re-
– MARMX/2 sélectionne l’une des trois entrées du multiplexeur : de gauche à
gistre d’instruction IR et n’intervient pas dans la microprogrammation.
droite, 00, 01 et 10 (11 est inutilisé).
– SR1MX/2 sélectionne l’une des quatre entrées du multiplexeur : de haut en bas, Question 4.1.1
00 et 01 (10 et 11 ne sont pas utilisés dans cet exercice). Plusieurs instructions disposent d’une opérande spécifiée sous la forme d’un champ
TD 4 37 38 TD 4
immédiat. Avant de pouvoir être utilisés par le processeur, ces immédiats doivent subir 1
une transformation. Pourquoi ? Pour chaque type d’immédiat, indiquer la transforma- MAR←PC
tion qu’il doit subir, et retrouver le circuit correspondant sur le schéma du processeur. PC←PC+1
Réponse 2
Cette question et les trois suivantes sont corrigées ensemble, à la fin de l’exercice.
MDR←Mémoire
Question 4.1.2 3
A partir du format des instructions vu en cours, énumérer les différentes façons IR←MDR
de calculer une adresse pour une instruction de chargement. Retrouver les différents
4
composants du circuit du processeur qui interviennent dans le calcul des adresses des
BEN←IR[11]N+IR[10]Z+IR[9]P
instructions de chargement.
[IR[15]]
Question 4.1.3 [IR[14]]
[IR[13]]
A partir du format des instructions vu en cours, énumérer les différentes façons de [IR[12]]
calculer l’adresse de destination d’une instruction de branchement. Retrouver les diffé-
rents composants du circuit du processeur qui interviennent dans le calcul de l’adresse 6
ADD BR
20
0
d’une instruction. AND
vers 1 DR←SR1+SR2 [BEN]
Question 4.1.4 CC←N,Z,P
1
35
On suppose que PC = 0 et que l’adresse 0 contient le code de l’instruction ADD 7 LEA STR vers 1
PC←adresse
R1, R2, R3. Retrouver toutes les étapes nécessaires à l’exécution de cette instruction,
vers 1
en commençant par son chargement. Spécifier à chaque fois la valeur des différents DR←SR1&SR2
CC←N,Z,P
signaux de contrôle. Indiquer à quel cycle chaque signal doit être activé, en supposant
que l’on commence l’exécution à t = 0. Ensuite, décrire le contrôle de l’exécution de 11 13
vers 1
l’instruction sous la forme d’un organigramme. DR←adresse MAR←R+ZEXT
Réponse 25
Code de l’instruction ADD R1, R2, R3 : 0001 001 010 0 00 011, c’est à dire x1283. MDR←SR
La figure 14 décrit tous les états et transitions nécessaires à l’exécution de l’instruction ADD et
des instructions étudiées dans l’exercice suivant. Un signal entre crochets (par exemple [BEN]) 26
vers 1
représente une condition à tester, les étiquettes des arcs sortants correspondent aux différentes Mémoie←MDR
valeurs de la condition. On utilisera la numérotation des états proposée dans la spécification du
LC-2.
Pour toutes les instructions, la phase de chargement comprend les quatre étapes suivantes : F IG . 14 – Contrôle de quelques instructions du LC-2
1. le PC est chargé dans MAR et incrémenté,
2. puis l’instruction est lue en mémoire et rangée dans MDR, Dans le cas d’une addition, deux étapes sont a priori nécessaires : la première exécute l’opé-
3. puis le contenu de MDR est rangé dans IR, ration proprement dite sur l’ALU et la deuxième range le résultat dans le banc de registres. Les
états et les signaux utiles sont les suivants (toutes les valeurs sont en binaire) :
4. enfin la phase de décodage sélectionne les 16 états d’arrivée possibles en fonction du code
d’opération.
Par la suite, l’exécution d’une instruction comporte dans la un nombre variable d’étapes (de 1 à
5), en fonction de la complexité des tâches à effectuer.
TD 4 39 40 TD 4
teM U
LD.IR R
Op
LD.MDR
X
tio
LD.REG
GateMD
LD.BEN
R.IWO.EN
C
X
LD.MA
RM
LD.CC
.PC
M K
teP
1M
ndi
cro
U
t
MA
DR
PC
LD
Ga
Ga
AL
Co
SR
Mi
|
x| x| x | | | | | | | | |
x x x x| x | | | |
x| x| x| x |
– Pour la microprogrammation de l’instruction BR, on doit réaliser les microinstructions
correspondant aux états 20 et 35 :
(Les 6 signaux concernant la gestion des interruptions ont été omis de cette version – pour l’état 20, on doit sauter à l’état 1 si BEN/1 = 0, c’est-à-dire BEN/1 = 1, on utilise
simplifiée.) donc une microinstruction de branchement conditionnel avec Condition/3 = 000 ;
– pour l’état 35, on range le résultat du calcul d’adresse dans PC, LD.PC/1 = 1 et PCMX/2 =
Question 4.2.1 11, et on retourne à l’état 1.
TD 4 41 42 TD 4
– L’instruction LEA est implémentée par l’état 11 : on concatène l’offset de page sur 9 bits microcontrôleur « maison » pour la selection des opcodes d’instructions. On propose donc une
avec les 7 bits de poids fort du PC, MARMX/2 = 10, puis le résultat est rangé dans le banc correction fondée sur le microcontrôleur « officiel » du processeur LC-2. La partie du microcon-
des registres en posant GateMARMX/1 = 1 et LD.REG/1 = 1. trôleur consacrée au contrôle de l’exécution des microinstructions s’appelle le microséquenceur ;
– L’instruction STR est implémentée par les états 13, 25 et 26 : celui-ci est optimisé pour le contrôle du LC-2, avec des microinstructions conditionnelles spé-
– pour l’état 13, l’offset sur 6 bits étendu avec des zéros est ajouté au registre de base, cifiques, notamment le choix d’une destination parmi 16 états correspondant aux 16 opcodes du
SR1MX/2 = 01), et le résultat est rangé dans MAR en posant LD.MAR/1 = 1, GateMARMX/1 = jeu d’instructions du LC-2. Ces optimisations rendent le microcontrôleur moins polyvalent mais
1 et MARMX/2 = 01 ; beaucoup plus élégant et efficace dans la microprogrammation du LC-2.
– pour l’état 25, la valeur issue du banc des registres traverse l’ALU sans modification, Le microséquenceur est conçu pour commencer à l’adresse 111011. Les microinstructions
ALUK/2 = 11, puis est rangé dans MDR en posant GateALU/1 = 1 et LD.MDR/1 = 1 ; se décomposent en deux parties : 10 bits de contrôle du microséquenceur (branchement, adresse
– pour l’état 26 ; la valeur issue de MDR est rangée en mémoire en posant MIO.EN/1 = 1 suivante sur 6 bits) et 29 bits pour les signaux de contrôle du LC-2 à générer. Le format des
et R.W/1 = 1. microinstructions est le suivant :
Pour réaliser le microprogramme correspondant à ces 4 nouvelles instructions, le problème
principal vient de la limitation des microinstructions de branchement conditionnel à un seul signal
de condition. Pour détecter les opcodes de chacune des 5 instructions envisagées, on propose une
ST
X
X
e V X
.TE
RM
N
MX
MX X
MX
.PC
t
U
1M
A
A
IRD
CO
INT D
J
LD
LD.MA
LD.MDR
LD.IR R
LD.BE
LD.CCN
LD.REG
Ga
GatePC
GatePC
GateMD-1
GateAL R
GateMAU
GateINTRM
P C CC
DR
SR
M
ST
CC KM
AL
M K
R.IWO.EN
état adresse signaux de adresse LD. ? Gate ? ?MX divers état adresse signaux de adresse LD. ? Gate ? ?MX divers
contrôle suivante contrôle suivante
#1 111011 ····0001 ··010000 ·1000001 ·1000000 00000000 000·0000
#20 000000 ····0100 ··111011 ·0000000 ·0000000 00000000 000·0000 #2 010000 ····0010 ··010000 ·0100000 ·0000000 00000000 000·0010
#35 111111 ····0000 ··111011 ·0000001 ·0000000 11000000 000·0000 #3 010010 ····0000 ··110010 ·0010000 ·0010000 00000000 000·0000
#4 110010 ····1000 ··000000 ·0001000 ·0000000 00000000 000·0000
L’instruction LDR est implémentée par les états 16, 29 et 30 : #5 001000 ····0000 ··010001 ·1000000 ·0001000 00001100 000·1100
– pour l’état 16, l’offset sur 6 bits étendu avec des zéros est ajouté au registre de base #6 000001 ····0000 ··111011 ·0000110 ·0001000 00000100 000·0000
#7 000101 ····0000 ··111011 ·0000110 ·0001000 00000100 000·0100
(SR1MX=01), et le résultat est rangé dans MAR en posant LD.MAR = 1, GateMARMX = 1 #8 001001 ····0000 ··111011 ·0000110 ·0001000 00000100 000·1000
et MARMX = 01 ; #9 001111 ····0000 ··110101 ·1000000 ·0000100 00000000 000·0000
#10 001101 ····0000 ··111011 ·0000001 ·0000000 10001000 000·0000
– pour l’état 29, la valeur lue est rangée dans MDR (LD.MDR = 1, MIO.EN = 1, R.W = 0, #11 001110 ····0000 ··111011 ·0000010 ·0000100 00000010 000·0000
ainsi que COND = 01 et J = 110001 pour boucler sur l’état 29) ; #12 000011 ····0000 ··111101 ·1000000 ·0000100 00000010 000·0000
– pour l’état 30 ; la valeur de MDR est transférée dans le banc de registres en posant LD.REG = #13 000111 ····0000 ··111101 ·1000000 ·0000100 00000101 000·0000
#14 001011 ····0000 ··110100 ·1000000 ·0000100 00000010 000·0000
1, LD.CC = 1, GateMDR = 1 et DRMX=00. #15 001010 ····0000 ··111100 ·1000000 ·0000100 00000010 000·0000
#16 000110 ····0000 ··110001 ·1000000 ·0000100 00000101 000·0000
état adresse signaux de adresse LD. ? Gate ? ?MX divers #17 000010 ····0000 ··110001 ·1000000 ·0000100 00000010 000·0000
contrôle suivante #18 001100 ····0110 ··100000 ·0000000 ·0000000 00000000 000·0000
#16 000110 ····0000 ··110001 ·1000000 ·0000100 00000101 000·0000 #19 000100 ····0110 ··100100 ·0000000 ·0000000 00000000 000·0000
#29 110001 ····0010 ··110001 ·0100000 ·0000000 00000000 000·0010 #20 000000 ····0100 ··111011 ·0000000 ·0000000 00000000 000·0000
#21 110101 ····0010 ··110101 ·0100010 ·1000000 00010000 000·0010
#30 110011 ····0000 ··111011 ·0000110 ·0010000 00000000 000·0000 #22 110111 ····0000 ··111011 ·0000001 ·0010000 01000000 000·0000
#23 110100 ····0010 ··110100 ·0100000 ·0000000 00000000 000·0010
Deux autres instructions sont nécessaires pour exécuter le code de la question suivante, on #24 110110 ····0000 ··111101 ·1000000 ·0010000 00000000 000·0000
les décrit brièvement. #25 111101 ····0000 ··111001 ·0100000 ·0001000 00000000 000·1100
#26 111001 ····0010 ··111001 ·0000000 ·0000000 00000000 000·0011
L’instruction LEA concatène l’offset de page sur 9 bits avec les 7 bits de poids fort du PC, #27 111100 ····0010 ··111100 ·0100000 ·0000000 00000000 000·0010
puis traverse MARMX et le bus pour ranger le résultat dans le banc des registres : #28 111110 ····0000 ··110001 ·1000000 ·0010000 00000000 000·0000
#29 110001 ····0010 ··110001 ·0100000 ·0000000 00000000 000·0010
état adresse signaux de adresse LD. ? Gate ? ?MX divers #30 110011 ····0000 ··111011 ·0000110 ·0010000 00000000 000·0000
contrôle suivante #31 100001 ····0000 ··100000 ·0000010 ·1000000 00010000 000·0000
#32 100000 ····0000 ··111011 ·0000001 ·0000100 01000101 000·0000
#11 001110 ····0000 ··111011 ·0000010 ·0000100 00000010 000·0000 #33 100101 ····0000 ··100100 ·0000010 ·1000000 00010000 000·0000
#34 100100 ····0000 ··111011 ·0000001 ·0000000 11000000 000·0000
L’instruction STR est implémentée par les états 13, 25 et 26. L’offset (ou la base) sur 6 bits #35 111111 ····0000 ··111011 ·0000001 ·0000000 11000000 000·0000
étendu avec des zéros est ajouté au registre de base (ou d’offset), et le résultat est rangé dans #36 010001 ····0010 ··010001 ·0100000 ·0000000 00000000 000·0010
#37 010011 ····0000 ··111000 ·0000100 ·0010000 00000000 001·0000
MAR. La valeur issue du banc des registres traverse l’ALU (ALUK = 11) puis est rangée dans #38 111000 ····0000 ··010100 ·1000010 ·0001000 00101100 100·0000
MDR puis dans la mémoire (boucle sur l’état 26) : #39 010100 ····0010 ··010100 ·0100000 ·0000000 00000000 000·0010
#40 010110 ····0000 ··111010 ·0000001 ·0010000 01000000 000·0000
état adresse signaux de adresse LD. ? Gate ? ?MX divers #41 111010 ····0000 ··111011 ·0000010 ·0001000 00101100 100·0000
contrôle suivante #42 110000 ····0000 ··011001 ·1000010 ·0001000 00101100 010·0000
#43 011001 ····0000 ··010101 ·0100000 ·0100000 00000000 000·0000
#13 000110 ····0000 ··111101 ·1000000 ·0000100 00000101 000·0000 #44 010101 ····0010 ··010101 ·0000000 ·0000000 00000000 000·0011
#25 111101 ····0000 ··111001 ·0100000 ·0001000 00000000 000·1100 #45 010111 ····0000 ··011011 ·1000010 ·0001000 00101100 010·0000
#26 111001 ····0010 ··111001 ·0000000 ·0000000 00000000 000·0011 #46 011011 ····0000 ··011000 ·0100000 ·0000001 00000000 000·0000
#47 011000 ····0010 ··011000 ·0000000 ·0000000 00000000 000·0011
Le reste du microprogramme suit les mêmes règles de construction. Le microprogramme #48 011010 ····0000 ··011100 ·1000000 ·0000010 00000000 000·0000
#49 011100 ····0010 ··011100 ·0100000 ·0000000 00000000 000·0010
complet — avec la gestion des interruptions — est donné dans le tableau suivant. #50 011110 ····0000 ··111011 ·0000001 ·0010000 01000000 000·0000
Réponse
.ORIG x0000
LEA R0, Tableau ; 11100000 00001001
AND R1, R1, #0 ; 01010010 01100000
Boucle ADD R2, R1, #-10 ; 00010100 01110110
BRz Fin ; 00000100 00001000
STR R1, R0, #0 ; 01110010 00000000
ADD R0, R0, #1 ; 00010000 00100001
ADD R1, R1, #1 ; 00010010 01100001
BRnzp Boucle ; 00001110 00000010
Fin ; boucle infinie (HALT n’est pas disponible)
BRnzp Fin ; 00001110 00001000
Tableau .BLKW #10
.END
Question 4.3.2
Écrire le code machine correspondant à ce programme assembleur, et vérifier son
exécution sur le LC-2.
Réponse
Le code machine est donné en partie droite du programme assembleur précédent. Il est
contenu dans les fichiers boucle_hi.ram et boucle_lo.ram, à charger dans la RAM du
LC-2 à l’adresse x0000.