Corrigé - Inria
Corrigé - Inria
Corrigé - Inria
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
TD 4 41<br />
– L’instruction LEA est implémentée par l’état 11 : on concatène l’offset de page sur 9 bits<br />
avec les 7 bits de poids fort du PC, MARMX /2 = 10, puis le résultat est rangé dans le banc<br />
des registres en posant GateMARMX /1 = 1 et LD.REG /1 = 1.<br />
– L’instruction STR est implémentée par les états 13, 25 et 26 :<br />
– pour l’état 13, l’offset sur 6 bits étendu avec des zéros est ajouté au registre de base,<br />
SR1MX /2 = 01), et le résultat est rangé dans MAR en posant LD.MAR /1 = 1, GateMARMX /1 =<br />
1 et MARMX /2 = 01 ;<br />
– pour l’état 25, la valeur issue du banc des registres traverse l’ALU sans modification,<br />
ALUK /2 = 11, puis est rangé dans MDR en posant GateALU /1 = 1 et LD.MDR /1 = 1 ;<br />
– pour l’état 26 ; la valeur issue de MDR est rangée en mémoire en posant MIO.EN /1 = 1<br />
et R.W /1 = 1.<br />
Pour réaliser le microprogramme correspondant à ces 4 nouvelles instructions, le problème<br />
principal vient de la limitation des microinstructions de branchement conditionnel à un seul signal<br />
de condition. Pour détecter les opcodes de chacune des 5 instructions envisagées, on propose une<br />
structure conditionnelle en arbre.<br />
état adresse signaux de adresse LD. Gate MX divers<br />
contrôle suivante<br />
#1 00000000 01···000 00000000 ·1000001 ·1·000·· 00000000 ····0000<br />
#2 00000001 01···000 00000000 ·0100000 ·0·000·· 00000000 ····0010<br />
#3 00000010 01···000 00000000 ·0010000 ·0·100·· 00000000 ····0000<br />
#4 00000011 11···111 00001010 ·0001000 ·0·000·· 00000000 ····0000<br />
0 00000100 11···110 00010000 ·0000000 ·0·000·· 00000000 ····0000<br />
00 00000101 11···101 00001011 ·0000000 ·0·000·· 00000000 ····0000<br />
000 00000110 11···100 00001001 ·0000000 ·0·000·· 00000000 ····0000<br />
#20 (BR) 00000111 11···000 00000000 ·0000000 ·0·000·· 00000000 ····0000<br />
#35 00001000 10···000 00000000 ·0000001 ·0·000·· 11000000 ····0000<br />
#6 (ADD) 00001001 10···000 00000000 ·0000110 ·0·010·· 00000100 ····0000<br />
1 00001010 11···110 00001100 ·0000000 ·0·000·· 00000000 ····0000<br />
Stop 00001011 00···000 00000000 ·0000000 ·0·000·· 00000000 ····0000<br />
11 00001100 11···101 00001110 ·0000000 ·0·000·· 00000000 ····0000<br />
Stop 00001101 00···000 00000000 ·0000000 ·0·000·· 00000000 ····0000<br />
111 00001110 11···100 00001011 ·0000000 ·0·000·· 00000000 ····0000<br />
#11 (LEA) 00001111 10···000 00000000 ·0000010 ·0·001·· 00000010 ····0000<br />
01 00010000 11···101 00010100 ·0000000 ·0·000·· 00000000 ····0000<br />
010 00010001 11···100 00010011 ·0000000 ·0·000·· 00000000 ····0000<br />
Stop 00010010 00···000 00000000 ·0000000 ·0·000·· 00000000 ····0000<br />
#7 (AND) 00010011 10···000 00000000 ·0000110 ·0·010·· 00000100 ····0100<br />
011 00010100 11···100 00010110 ·0000000 ·0·000·· 00000000 ····0000<br />
Stop 00010101 00···000 00000000 ·0000000 ·0·000·· 00000000 ····0000<br />
#13 (STR) 00010110 01···000 00000000 ·1000000 ·0·001·· 00000101 ····0000<br />
#25 00010111 01···000 00000000 ·0100000 ·0·010·· 00000000 ····1100<br />
#26 00011000 10···000 00000000 ·0000000 ·0·000·· 00000000 ····0011<br />
Voir les fichiers slc2_micro_*.ram correspondant aux 6 ROM de microprogramme, et<br />
boucle_slc2_control.lgf pour le circuit de contrôle avec les ROM pré-chargées.<br />
La solution précédente est correcte, mais elle met clairement en évidence les lacunes du<br />
|<br />
|<br />
IRD<br />
COND<br />
INT.TEST<br />
J<br />
LD.MAR<br />
LD.MDR<br />
LD.IR<br />
LD.BEN<br />
LD.CC<br />
LD.REG<br />
LD.PC<br />
GatePC<br />
GatePC-1<br />
GateMDR<br />
GateALU<br />
GateMARMX<br />
GateINTV<br />
GateCC<br />
PCMX<br />
DRMX<br />
SR1MX<br />
MARMX<br />
STACKMX<br />
CCMX<br />
ALUK<br />
MIO.EN<br />
R.W<br />
42 TD 4<br />
microcontrôleur « maison » pour la selection des opcodes d’instructions. On propose donc une<br />
correction fondée sur le microcontrôleur « officiel » du processeur LC-2. La partie du microcontrôleur<br />
consacrée au contrôle de l’exécution des microinstructions s’appelle le microséquenceur ;<br />
celui-ci est optimisé pour le contrôle du LC-2, avec des microinstructions conditionnelles spécifiques,<br />
notamment le choix d’une destination parmi 16 états correspondant aux 16 opcodes du<br />
jeu d’instructions du LC-2. Ces optimisations rendent le microcontrôleur moins polyvalent mais<br />
beaucoup plus élégant et efficace dans la microprogrammation du LC-2.<br />
Le microséquenceur est conçu pour commencer à l’adresse 111011. Les microinstructions<br />
se décomposent en deux parties : 10 bits de contrôle du microséquenceur (branchement, adresse<br />
suivante sur 6 bits) et 29 bits pour les signaux de contrôle du LC-2 à générer. Le format des<br />
microinstructions est le suivant :<br />
x | x | x | x<br />
x | x<br />
| | | | |<br />
x x<br />
| | | | |<br />
Pour la microprogrammation des instructions ADD, AND et NOT, les signaux COND et IRD<br />
sont mis à 0 et J vaut toujours l’adresse de la microinstruction suivante, sauf pour :<br />
– l’état 2 où COND = 01 et J = 010000 (boucle sur la même microinstruction), le signal R<br />
provoquera le saut à l’adresse 010010 (état 3) ;<br />
– et l’état 4 où IRD = 1 force le saut à l’adresse 6, 7 ou 8, en fonction de l’opcode de<br />
l’instruction.<br />
Les microinstructions et leurs adresses pour les états 1, 2, 3, 4, 6, 7 et 8 sont décrites par le<br />
tableau suivant (toutes les valeurs sont en binaire, sauf l’état) :<br />
état adresse signaux de adresse LD. Gate MX divers<br />
contrôle suivante<br />
#1 111011 ····0000 ··010000 ·1000001 ·1000000 00000000 000·0000<br />
#2 010000 ····0010 ··010000 ·0100000 ·0000000 00000000 000·0010<br />
#3 010010 ····0000 ··110010 ·0010000 ·0010000 00000000 000·0000<br />
#4 110010 ····1000 ··000000 ·0001000 ·0000000 00000000 000·0000<br />
#6 000001 ····0000 ··111011 ·0000110 ·0001000 00000100 000·0000<br />
#7 000101 ····0000 ··111011 ·0000110 ·0001000 00000100 000·0100<br />
#8 001001 ····0000 ··111011 ·0000110 ·0001000 00000100 000·1000<br />
x<br />
Pour la microprogrammation de l’instruction BR, on doit réaliser les microinstructions correspondant<br />
aux états 20 et 35 :<br />
– pour l’état 20, on doit sauter à l’état 1 si BEN = 0 (COND = 10 et J = 111011, c’est-à-dire<br />
l’adresse de l’état 1) ;<br />
– pour l’état 35, on range le résultat du calcul d’adresse dans PC (LD.PC = 1, PCMX = 11<br />
et J = 111011, c’est-à-dire l’adresse de l’état 1).