Você está na página 1de 22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

MICROPROCESADOR MICROPROGRAMABLE mmp16


1. Introduccin
Como parte de las prcticas de laboratorio de la asignatura Arquitectura de Ordenadores I y en
concreto del tema Organizacin de la CPU se ha preparado la prctica que se describe a continuacin.
Esta prctica consistir en microprogramar un microprocesador. Con ello se pretende que el estudiante
comprenda el funcionamiento interno de una CPU.
Para ello se ha desarrollado un microprocesador didctico con una arquitectura sencilla y un juego
de instrucciones reducido. Sin embargo no sigue la filosofa RISC. El nombre de este microprocesador
didctico (mmp16) le viene de microprocesador microprogramable de 16 bits. Su arquitectura se describe
en la figura 4 y ser comentada ms adelante. Consta bsicamente de un conjunto de 16 registros
generales incluidos SP y PC que son los registros 14 y 15 respectivamente, y una ALU de 16 bits capaz
de realizar operaciones aritmticas (suma, resta), y lgicas (and, or, xor, not), lo que va a condicionar su
juego de instrucciones. Este se describe en el apndice 1.

2. Descripcin del sistema


En la figura 1 se muestra el sistema simulado completo que consta del mmp16 y una memoria de
64K palabras de 16 bits. Este sistema no permite direccionar octetos. Cada direccin de memoria
corresponde a una palabra de 16 bits. Tanto el bus de direcciones como el bus de datos son tambin de 16
bits siguiendo la filosofa de que todo en la mquina sea de 16 bits. Las seales externas de que dispone el
mmp16 son: r, que indica lectura de una posicin de memoria, w que indica escritura, ready que es
utilizada por la memoria para indicarle al procesador que ya ha realizado la operacin que se le haba
pedido, reset que permite inicializar la mquina (reset tiene una duracin de un ciclo de reloj y ha sido
sincronizada previamente con fi1) y una lnea de peticin de interrupcin (int) que en el sistema simulado
no se va a utilizar puesto que no va a haber ningn perifrico.

data_bus

mmp16

memoria
addr_bus
r
w
ready

int
reset

Figura 1. Sistema completo


La memoria del sistema est dividida en dos zonas: la parte alta en ROM donde estar el programa
de carga y las rutinas bsicas del sistema operativo, y la parte baja en RAM. En este sistema se han
eliminado todos los dispositivos de E/S con el fin de centrar el esfuerzo en la CPU. Con ello se ha
conseguido un sistema muy sencillo y de fcil comprensin.

3. Ciclos de memoria
El mmp16 utiliza dos fases de reloj, fi1 y fi2. Fi1 marca los estados de la mquina, pues gobierna la
unidad de control, mientras que fi2 controla los registros de la unidad de proceso de datos, es decir, todos
los registros internos y los registros generales, etc. Las seales externas y la carga de los buses se
sincroniza con los flancos de fi2.
Ciclo de lectura
Se carga el bus de direcciones con la direccin del dato que se desea leer y se activa la seal de
lectura, todo ello sincronizado con fi2. La direccin deber permanecer estable el tiempo que est activa

1/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

la seal r. La memoria utiliza la seal ready para pedir ciclos de espera (Te) a la CPU hasta tener los
datos listos para entregar. Cuando la memoria active la seal ready, que reconocer el mmp16 en el
siguiente estado definido por fi1, recoger los datos y desactivar la seal de lectura. La recogida de datos
se realiza en los flancos de fi2. Durante los ciclos de espera, la CPU estar recogiendo datos invlidos.
Este proceso se muestra en la figura 2.

T1

Te

Te

T2

T3

fi1
fi2
r
addr_bus

direccin

ready
data_bus

dato

lectura

Figura 2. Ciclo de lectura en memoria


Ciclo de escritura
El mmp16 carga la direccin y los datos en los buses de direcciones y datos respectivamente y
activa la seal de escritura, todo ello sincronizado con fi2. Del mismo modo que en un ciclo de lectura, la
memoria requerir ciclos de espera mediante la seal ready. Tanto la informacin de los buses como la
seal de escritura permanecern activas hasta que se complete la escritura. Esto se detectar en un nuevo
estado definido por fi1, y las seales se desactivarn en el siguiente flanco de fi2.

T1

Te

Te

T2

T3

fi1
fi2
w
addr_bus

direccin

ready
data_bus

dato

Figura 3. Ciclo de escritura en memoria

4. Organizacin interna
La figura 4 muestra el diagrama de bloques del mmp16. Los bloques en que se divide la CPU estn
detallados en figuras sucesivas. Como puede observarse, toda la organizacin gira en torno a un Bus
Interno de Datos (IDB) que interconecta los diferentes bloques funcionales.
La caracterstica fundamental del mmp16 es que todos los registros y buses son de 16 bits. Esto se
ha hecho as buscando la mayor simplicidad posible. Puede considerarse que el hecho de no poder

2/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

manipular octetos (habitualmente utilizados para representar caracteres) es una limitacin importante,
pero cabe indicar que hoy en da se est trabajando con juegos de caracteres que usan 16 bits por carcter.
El mmp16 es microprogramable. Su memoria de control es de 256 palabras de 32 bits cada una.
Para direccionar la memoria de control se necesitan microdirecciones de 8 bits. Cada palabra contendr
una microinstruccin. Se ha elegido una unidad de control microprogramada frente a una cableada por su
mayor simplicidad. El objetivo de la prctica es consolidar los conocimientos del estudiante en materia de
organizacin interna de la CPU y secuenciamiento de las instrucciones.

micrordenes

seales
externas

reset

Unidad de Control

ready
Control de
microprograma

Seleccin
de
condicin

int
5

IR

IDB

16

Seleccin de operandos
Interfaz
con el Bus de
Datos

Interfaz
con el Bus de
Direcciones

Bus de
Direcciones

ALU

SP

flags

16

16
Bus de
Datos

Bloque de
Registros

PC

Figura 4. Arquitectura y Organizacin del mmp16


Cada microinstruccin controla lo que ocurre en todas y cada una de las partes del mmp16. A
continuacin se presentan los diversos bloques funcionales y las seales de control con que se gobierna
cada uno de ellos.
Bloque de registros
La estructura del bloque de registros se detalla en la figura 5. Tiene un banco de 16 registros de
propsito general de los cuales el registro 14 (R14) corresponde al puntero de pila (SP) y el registro 15
(R15) corresponde al contador de programa (PC).
El direccionamiento de los registros puede hacerse por dos razones: se est ejecutando una
instruccin que hace referencia a algunos registros, o bien la unidad de control selecciona PC o SP para
alguna operacin de actualizacin del PC o de manejo de la pila. Para que las operaciones de incremento
y decremento de PC y SP sean rpidas, se dispone de un incrementador y un decrementador, y as se evita
pasar por la ALU para realizar estas operaciones.
selR es un campo de la microinstruccin que selecciona si el direccionamiento del banco de
registros se realiza mediante uno de los campos del registro de instruccin (IR): op1R (0), op2R (1) y
op3R (2), o bien es la unidad de control la que selecciona PC o SP. En este ltimo caso, la microorden
pc_sp permite seleccionar entre PC (1) y SP (0).
El diseo del formato de instruccin permite simplificar considerablemente la organizacin interna
del mmp16 permitiendo una decodificacin directa de los operandos. Los bits del registro de instruccin
sirven como seales de control directamente en muchos casos. Esto permite minimizar el conjunto de
microordenes y por tanto reducir el tamao de las microinstrucciones.
opR es una microorden que sirve para seleccionar la operacin que se va a realizar con el registro
seleccionado: nada (0), incrementarlo (1), decrementarlo (2), o cargarlo desde IDB (3). El banco de
registros tiene una entrada de seleccin (SEL) que selecciona el registro cuyos datos se obtienen y que
ser actualizado con el siguiente flanco de fi2.
El registro seleccionado se enviar a IDB si la seal RaIDB activa el triestado que da acceso al bus.
La seal RaIDB se obtiene decodificando la microorden aIDB de la microinstruccin (figura 11).

3/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

IDB

16

op1R
op2R
op3R

R0
R1
R2
R3
R4
R5
R6
R7
R8
R9
R10
R11
R12
R13
SP
PC

pc_sp

MUX

1
2

SEL

3
3
1

CLK

selR
Fi2

MUX
0

opR

3
16

+1

RaIDB

-1
16

Figura 5. Bloque de registros


Seleccin de operandos
El primer operando (op1) de la ALU se puede cargar desde IDB mediante la microorden ld_op1.
Est conectada multiplicando la seal de reloj, pero sera equivalente que se conectara a la seal de
habilitar la carga del registro. Esta misma tcnica se aplicar en todos los casos de carga de registros.
IDB

imm<7>
8

16

imm<7:0>
8
16

16

sel_op2
MUX
ld_op1

ld_op2
op1

op2

fi2

fi2

op2_0
inv_op2
16

16
op1

op2

Figura 6. Seleccin de operandos


sel_op2 selecciona si el segundo operando (op2) se carga desde IDB o bien se carga con el dato
inmediato del registro de instruccin (IR). En este caso, como el dato inmediato de IR es de 8 bits, se hace
extensin del bit de signo. ld_op2 permite cargar el registro op2 con el valor seleccionado.
op2_0 inv_op2
op2
El primer operando de la ALU ser siempre el almacenado
0
0
0000
en op1. Sin embargo, el segundo operando puede modificarse para
0
1
FFFF
poder realizar determinadas operaciones (por ejemplo, restas
1
0
op2
utilizando la representacin de complemento a 2 para los nmeros
1
1
not
op2
negativos). Las seales op2_0 e inv_op2 controlan el valor del
segundo operando de la ALU segn la tabla de la derecha.
Tabla 1. Seleccin de op2
4/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

ALU
La ALU del mmp16 puede realizar las operaciones aritmticas de suma y resta en complemento a 2
y las operaciones lgicas AND, OR, XOR y NOT. Para ello dispone de un sumador y 3 conjuntos de
puertas lgicas. La operacin NOT tiene un nico operando (op1) y se calcula haciendo la operacin
XOR con todo unos como segundo operando. Su diagrama completo se muestra en la figura 7.
op1

op2
inv_Cin
op2

Cn-2 op1
V

Cn-1

sel_Cin

Cin

C
C

op1 op2 op1 op2 op1 op2

sel_Carry

op_ALU

MUX
N
Z
ALUaIDB
16

IDB

Figura 7. ALU
op_ALU selecciona la operacin que realiza la ALU: operacin con el sumador (tanto para sumas
como para restas), operacin AND, operacin OR y operacin XOR (tanto para XOR como para NOT).
En caso de que se realice una operacin con el sumador
(suma o resta) hay que determinar cual va a ser el acarreo inicial.
Esto se hace mediante las seales sel_Cin e inv_Cin tal como se
muestra en la tabla adjunta.
El acarreo inicial deber ser 0 para hacer la operacin de
suma. La resta se har sumando op1 y el complemento a 2 de
op2, esto es, op2 negado y acarreo inicial 1.

Sel_Cin
0
0
1
1

inv_Cin
0
1
0
1

Cin
0
1
C
not C

Tabla 2. Seleccin de Cin

Si se desea hacer una suma con nmeros de 32 bits, habr que sumar primero los 16 bits menos
significativos (con acarreo inicial 0) y luego los siguientes 16 utilizando como acarreo inicial el generado
en la suma anterior (esto es lo que se conoce como suma con acarreo). Para la resta de nmeros de 32 bits
se puede utilizar un truco similar. En este caso, se restan las partes menos significativas generando como
flag de acarreo el borrow y luego se restan las partes ms significativas utilizando como acarreo inicial el
flag de acarreo negado.
sel_carry selecciona cual va a ser el nuevo flag de acarreo entre el acarreo ltimo del sumador (bit
de acarreo para las sumas) o su negado (la llevada en las restas borrow-).
La seal ALUaIDB obtenida decodificando la microorden aIDB (figura 11)permite que el resultado
de la ALU pase a IDB a travs del triestado correspondiente.
Los flags
Los flags indican 4 condiciones que pueden producirse como resultado de una operacin en la ALU
y un bit que indica si estn prohibidas o permitidas las interrupciones:
Z:
N:
V:
C:
I:

1 si el resultado es cero y 0 en caso contrario, Z = todos los bits del resultado son 0
1 si el resultado es negativo (bit ms significativo a 1) y 0 en caso contrario, N = bit de signo
1 si se detecta desbordamiento en complemento a 2, V = Cn-1 XOR Cn-2
Cn-1 en caso de suma (carry) y Not Cn-1 en caso de resta (borrow)
1 si estn permitidas las interrupciones y 0 en caso contrario

5/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

En la figura 8 se muestra el registro que almacena los flags. sel_f permite seleccionar si los flags se
cargan desde el bus de datos (pueden haber sido salvados en la pila, y se necesita poder cargarlos desde
IDB para ser restaurados), si se actualizan con los nuevos flags generados en la ALU, si se prohiben o si
se permiten las interrupciones. mod_f permite actualizar el registro de flags. Durante la fase de reset se
activar el flag I para permitir las interrupciones.
La seal flagsaIDB activa el triestado que deja pasar los flags a IDB, por ejemplo para guardarlos en
la pila. Esta seal se obtiene decodificando aIDB (figura 11). El registro de flags es de 5 bits mientras que
IDB y todo lo dems en el mmp16 es de 16 bits. Los 5 bits del registro de flags se corresponden con los 5
bits menos significativos de IDB.
0, Z, V, N, C
I, Z, V, N, C

16

1, Z, V, N, C

data_bus
w

3
sel_f

0
ld_data

MUX

dataaIDB

data
fi2

IDB
mod_f

16

flags

ld_addr

fi2

addr
fi2

I, Z, V,N, C
5

flagsaIDB

w
IDB

16

addr_bus

16

Figura 8. FLAGS.

Figura 9. Interfaces con los buses

Interfaces con los buses externos


Como puede observarse en la figura 9, ld_data permite cargar el registro data desde IDB. Cuando se
active la seal w, los datos de dicho registro pasarn al bus de datos para escribirse en la memoria. El
registro data mantiene el dato estable en el bus de datos durante todo el ciclo de escritura en memoria.
Desde el bus externo de datos pueden pasar los datos a IDB a travs de un triestado controlado por
dataaIDB que se genera a partir de aIDB (figura 11).
ld_addr habilita la carga del registro addr desde IDB. Cuando se activen las seales r o w, su
contenido pasar al bus de direcciones. El registro addr mantiene estable la direccin durante los ciclos de
lectura o escritura en memoria.

IDB
aIDB

ld_IR
IR
fi2

Figura 10. Registro de Instruccin

DEC

16

3
2
1
0

RaIDB
flagsaIDB
dataaIDB
ALUaIDB

Figura 11. Decodificacin de aIDB

Registro de Instruccin
El registro de Instruccin (IR) puede cargarse desde IDB activando la seal ld_IR. El formato de las
instrucciones en el mmp16 est pensado para que sea muy sencilla su decodificacin. Algunos campos
(grupos de bits) de IR se utilizan en diferentes partes del sistema con diferentes nombres como se muestra
a continuacin:
cop1<3:0> = IR<15:12>
IR
op2R<3:0> = cop3<3:0> = IR<7:4>
cop1
op1R
op2R
op3R
op1R<3:0> = cop2<3:0> = IR<11:8>
cop2
cop3
cond
imm<7:0> = IR<11:4>
imm
cop4
op3R<3:0> = cop4<3:0> = IR<3:0>
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
cond<3:0> = IR<3:0>
Tabla 3. Formato del registro de Instruccin

6/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

Bus de datos Interno (IDB)


Al bus de datos interno pueden llegar datos desde diversos lugares de la mquina: ALU, bloque de
registros, registro de flags y bus de datos. Para evitar colisiones se ha decidido controlar desde donde se
vierten datos al bus mediante la microorden codificada aIDB. Esta microorden se decodifica como se
muestra en la figura 11 y las salidas del decodificador activarn los triestados correspondientes de forma
que en cada momento solo uno de ellos enva datos al bus, quedando el resto desconectados de IDB.
Seleccin de condicin
El registro de estado almacena las condiciones en funcin de las cuales se puede modificar la
secuencia normal de ejecucin de los microprogramas. Estas condiciones incluyen las que se pueden
indicar en el campo cond de IR (condiciones basadas en los valores del registro de flags) y que se
enumeran en el apndice 2, la condicin ready para poder hacer los bucles de espera hasta que se
completen las operaciones sobre la memoria, o que estando permitidas las interrupciones (flag I), se
active la seal externa de peticin de interrupcin (int).
N

V
I

int

ready

sel_cond
inv_cond

fi1

estado
1

MUX

0
0

3
2
1
0

cond

MUX
cond<3:1>
cond<0>

Figura 12. Seleccin de condicin


Mediante un multiplexor y una puerta lgica controlados por el campo cond de IR se seleccionan
todos los posibles cdigos de salto. Mediante sel_cond e inv_cond se puede seleccionar cul va a ser la
condicin de salto en una microinstruccin tal como se muestra en la siguiente tabla.

sel_cond
0
0
1
1
2
2
3
3

inv_cond
0
1
0
1
0
1
0
1

cond
Condicin especificada por la instruccin que se est ejecutando
Condicin especificada por la instruccin, negada
ready
Not ready
Interrupcin pendiente
No hay interrupcin pendiente
1 (salto incondicional)
0 (no saltar)

Tabla 4. Condiciones de salto para la unidad de control


Control de microprograma
mPC es el contador de microprograma y contiene la direccin de la memoria de control donde se
encuentra la microinstruccin que est ejecutndose y que estar almacenada en el registro de
microinstruccin (mI). La seleccin de la siguiente microdireccin (a dnde voy) se realiza en funcin de
la condicin seleccionada (cond) y sel_sig que indica a dnde voy si se cumple la condicin
seleccionada. En caso de que no se cumpla, ir siempre a la siguiente microinstruccin (mPC+1).

7/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

fi1
Clculo de la
direccin de salto
en funcin de IR
(figura 14)

mPC

save_mpc
save
fi1

+1

d_alt
8
sel_sig

2
2

8
3

MUX

cond

01111100

8
reset

1
MUX
8

Memoria de
microprograma
(mROM)

32
fi1

Registro de microinstruccin (mI)


micrordenes

Figura 13. Control de microprograma


El registro save se puede utilizar para guardar alguna microdireccin frecuentemente utilizada. Se
carga con la seal save_mpc. Por ejemplo, puede utilizarse para almacenar la microdireccin
correspondiente al microprograma de FETCH.
d_alt es un campo de la microinstruccin
que permite saltar directamente a cualquier
direccin de la memoria de control. Como est
solapado con las microordenes que controlan la
ALU, si se utiliza d_alt no se podr utilizar la
ALU en ese estado.

cop3

cop4

1
0

1
cop3
MUX

cop2

Se puede saltar a una direccin en funcin


de la instruccin que est en el registro de
instruccin (IR). En esa direccin deber estar
cargado el microprograma que implementa esa
instruccin. Esta posibilidad es bsica en
cualquier intrprete de instrucciones.

0
0

1
cop2
MUX

cop1
1

Los cdigos de operacin en el mmp16


pueden ser de 4, 8, 12 16 bits. Los cdigos de
operacin de 16 bits tienen los 12 bits ms
significativos (cop1, cop2 y cop3) a 1. Los
cdigos de operacin de 12 bits tienen los 8 bits
ms significativos (cop1 y cop2) a 1. Los cdigos
de operacin de 8 bits tienen los 4 bits ms
significativos (cop1) a 1. Esto permite tener hasta
15 cdigos de operacin de 4 bits, 15 de 8 bits,
15 de 12 bits y 16 de 16 bits; por tanto podra
haber hasta 61 cdigos de operacin distintos. De
todos estos posibles cdigos de operacin se han

1
cop1
MUX
5

f(IR)

Figura 14. Direccin de salto en funcin de IR

8/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

elegido 45. El repertorio de instrucciones del mmp16 est especificado en el apndice 1. En la figura 14
se muestra el circuito que permite calcular la direccin de la memoria de control donde est ubicado el
microprograma correspondiente a la instruccin que est cargada en el registro de instruccin (IR) de
acuerdo con la siguiente tabla:
cop1
cop2
cop3
cop4
direccin
---------1XXXX000
XXXX F
F
------0XXXX000
XXXX F
F
F
---0XXXX100
XXXX F
F
F
F
XXXX
1XXXX100
Tabla 5. Cdigos de operacin y ubicacin del microprograma correspondiente
No todas las instrucciones del mmp16 necesitan el mismo nmero de ciclos de reloj para
completarse ni el mismo nmero de microinstrucciones para su microprograma correspondiente. Los
cdigos de operacin de las diferentes instrucciones y el clculo de la direccin de comienzo de cada
microprograma dentro de la memoria de control se ha hecho reservando para cada instruccin un nmero
suficiente de posiciones de memoria. El espacio reservado a cada instruccin se muestra en el apndice 3.
Las posiciones de la memoria de control comprendidas entre la 7C y la 8F se aprovecharn para
microprogramar en estas direcciones las rutinas de RESET y FETCH, que se darn como ejemplo ms
adelante. La seal de reset ataca un multiplexor que permite seleccionar entre la direccin seleccionada
por el microprograma y la direccin 01111100 (directamente cableada) donde est la rutina que inicializa
el mmp16.
Dada la frecuencia con que habr de hacerse un FETCH de una instruccin y que esto es siempre
igual, puede interesar guardar en el registro save la direccin donde comienza este microprograma para
saltar a l una vez terminada la ejecucin del microprograma correspondiente a una instruccin. De hecho
en la rutina de FETCH que se da como ejemplo, se guarda la direccin de comienzo en el registro save.

sel_sig

inv_cond

sel_cond

sel_f

bus_ext

r_w

save_mpc

mod_f

ld_IR

ld_addr

ld_data

ld_op1

ld_op2

pc_sp

sel_op2

inv_op2

aIDB

op2_0

opR

no usado

selR

inv_Cin

sel_Cin

sel_Carry

op_ALU

d_alt

Figura 15. Formato de la microinstruccin


Generacin de las seales de lectura (r) y escritura (w)
Las seales de lectura (r) y escritura
(w) en memoria se generan sincronizadas
con fi2 mediante sendos fipflops jk de forma
que se desactivarn automticamente cuando
se detecte la condicin de ready (operacin
sobre memoria completa) sincronizada con
fi1 en el registro de estado.
La activacin de estas seales se
controla mediante las microordenes bus_ext
y r_w. r se activa cuando bus_ext y r_w
toman ambas el valor 1 y w se activa cuando
bus_ext toma el valor 1 y r_w el valor 0.
Una vez activadas, no es necesario mantener
bus_ext y r_w activas en las siguientes
microinstrucciones.

bus_ext
J

r_w

fi2
estado<7>

bus_ext
fi2
estado<7>

Figura 16. Generacin de las seales externas

5. Segmentacin del intrprete de microprogramacin


El mmp16 est organizado en forma de pipeline con dos segmentos que se detallan en la figura 17.
El segmento I se encarga de la seleccin de la siguiente microinstruccin, mientras que el segmento II
controla las operaciones sobre datos y registros. La segmentacin se establece mediante el registro de
estado y el registro de microinstruccin. El segmento I arranca del registro de estado, pasa por la lgica
de condiciones, el contador de microprograma que decide cual ser la siguiente microinstruccin, y la

9/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

memoria de control que nos la da. Termina depositando la prxima microinstruccin a la entrada del
registro de microinstruccin. El segmento II parte del registro de microinstruccin que distribuye las
microordenes para controlar los registros, ALU, buses, etc. En particular, genera los flags que pueden
controlar la actividad del otro segmento durante el prximo ciclo.
flags

fi1

seales externas

registro de estado

Segmento I

seleccin de
condicin

control de
microprograma

memoria de
microprograma

registro de microinstruccin (mI)


flags

ALU

flags antiguos

seleccin de
operandos

IDB

registros

buses externos

seleccin de
registros

paso por IDB

operacin

nuevos
buses externos

nuevos
registros

operacin

fi2

nuevos flags

fi1

nuevos
operandos

Segmento II

fi1

estado

Figura 17. Organizacin en pipeline


Este tipo de pipeline es de los ms frecuentes. Se intenta que dos procesos lentos: la bsqueda de la
siguiente microinstruccin en la memoria y la ejecucin de la microinstruccin en curso se hagan en
paralelo, acelerando la mquina. La caracterstica fundamental de este tipo de organizacin es que la
eleccin de la siguiente microinstruccin en el caso de un salto condicional dentro del microprograma se
realiza en funcin del estado de la mquina al final de la microinstruccin anterior y no sobre el estado de
la mquina al final del ciclo actual.
mdireccin(i+1) = funcin ( minstruccin(i), estado(i-1) )
La figura 17 muestra la sincronizacin de las diferentes actividades que tienen lugar en cada uno de
los segmentos. Casi al final del segmento II llega el flanco de fi2. Despus de l se recalcula el estado de
la mquina en funcin de los flags y la seal de ready.

6. Microprogramacin
El mmp16 arranca con un RESET, que le lleva a ejecutar la microinstruccin 01111100. Aqu debe
hacerse la inicializacin de la mquina que consistir en poner a FFFE el contador de programa (PC) y
prohibir las interrupciones. En la direccin FFFE deber haber una instruccin de salto incondicional
absoluto al comienzo del programa de inicializacin del sistema. Todo ello estar en memoria ROM. La
direccin 0 de la memoria principal est reservada para el vector de interrupcin. El mmp16 dispone de
una nica lnea externa de peticin de interrupcin. Ser labor del usuario (o el sistema operativo) cargar
en la posicin 0 de memoria la direccin de comienzo de la rutina de tratamiento de dicha interrupcin.
A continuacin se pasa a la fase de bsqueda de la instruccin en memoria (FETCH). Para ello se
comprueba si hay una interrupcin pendiente de ser tratada. De ser as, habr que guardar en la pila el
registro de flags y el PC actual, cargar en el PC el valor almacenado en la direccin 0 de memoria y
prohibir las interrupciones. Esta prohibicin es necesaria para evitar que se aniden las interrupciones.

10/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

stas volvern a permitirse cuando termine la rutina mediante la instruccin RETI o cuando la rutina
ejecute la instruccin SETI. A continuacin, hubiera o n interrupcin pendiente, se hace un ciclo de
lectura en memoria para traer la instruccin a la que apunta el PC (caso de instruccin de 16 bits) o la
primera palabra de la instruccin (caso de instruccin de 2 palabras). Se utilizar la parte que indique el
cdigo de operacin (cop1, cop2, cop3 y cop4) para saltar al microprograma que implementa dicha
instruccin. Cuando se termina la ejecucin de una instruccin, se vuelve a la rutina de FETCH
Es labor del microprogramador prever las microinstrucciones necesarias para las fases de RESET y
FETCH y para cada una de las instrucciones del mmp16. La microprogramacin del mmp16 es laboriosa
pero bastante sencilla. A continuacin se muestran algunos microprogramas a modo de ejemplo en los
que se muestran las microinstrucciones en un lenguaje simblico de aconsejado seguimiento por parte del
alumno a la hora de codificar sus microprogramas junto con su codificacin en unos y ceros.
Ejemplo 1: RESET
La operacin de RESET se realiza mediante dos microinstrucciones que deben almacenarse a partir
de la direccin 01111100 de la memoria de microprograma. La primera carga FFFF en el registro op1 de
la ALU y pasa a la siguiente microinstruccin. La segunda genera FFFE en la ALU a partir del FFFF de
op1 y lo carga en PC, prohibe las interrupciones y pasa a ejecutar la siguiente microinstruccin.
Para cargar FFFF en op1 se hace lo siguiente: en la ALU, se hace un OR con op2=FFFF. Esto se
consigue con op2_0=0, inv_op2=1 y op_ALU=2. El resultado obtenido en la ALU (FFFF) se carga de
nuevo en op1 (ld_op1=1) llevndolo a travs de IDB (aIDB=00).
Para generar FFFE en la ALU, se resta 1 a op1 (FFFF). Esto puede hacerse sumando FFFF (op1)
con FFFF (generado como op2 mediante op2_0=0 e inv_op2=1) despreciando el desbordamiento. A
continuacin se lleva el resultado al PC (aIDB=00, opR=11, selR=pc_sp y pc_sp=1).
Para prohibir las interrupciones hay que poner un 0 en el bit I del registro de flags. Esto se consigue
seleccionando sel_f=2. De esta forma, el resto de los flags se quedan como estaban e I toma valor 0.
En cuanto a la eleccin de la siguiente microinstruccin a ejecutar, esta debe ser la situada en
mPC+1. Por tanto cond AND sel_sig debe ser 0. Esto se puede hacer de varias formas. Una de ellas es
conseguir que cond sea 0 (de esta forma nos da igual que valor tome sel_sig). Por tanto sel_cond=11 e
inv_cond=1 (1 XOR 1 = 0) con lo que cond=0. Estos son los valores por defecto que deben tomar las
seales sel_cond e inv_cond como puede verse en la figura 15.
El resto de los campos de la microinstruccin se rellenan siguiendo el siguiente criterio: las seales
que habilitan la carga de algn registro deben desactivarse y las dems son indiferentes. Las que tienen
valor indiferente estn marcadas con una x. La seal bus_ext se pone a 0 para indicar que no se va a
trabajar con la memoria. Los valores de relleno de cada campo se pueden ver en la figura 15. As el
microprograma completo quedara como sigue:
;RESET
;op2_0=0, inv_op2=1, op_ALU=OR, ALUop1;
01111100: 10xxxx01xxx0000x010000xx111xx0x0
;op2_0=0, inv_op2=1, sel_Cin=0, inv_Cin=0, op_ALU=ADD, ALURegistros,
selR=pc_sp, pc_sp=PC, sel_f=2, mod_f=1;
01111101: 00x00x011111100x00000110111xx0x0

Ejemplo 2: FETCH
La fase de FETCH es notablemente ms compleja que la fase de RESET. Aqu hay que comprobar si
se ha producido una interrupcin o no. Si ha sido as, habr que salvar en la pila los flags y el contador de
programa (PC), acceder al vector de interrupcin (direccin 0 de memoria principal) para obtener la
direccin de la rutina de tratamiento de la interrupcin y cargarla en el PC y por ltimo prohibir las
interrupciones. Entonces se pasa a traer propiamente la siguiente instruccin (fase de fetch clsica). Si no
ha habido interrupcin, nicamente hay que hacer la fase de fetch clsica. La figura 18 muestra el
ordinograma correspondiente a la fase de fetch siguiendo el diseo que se muestra a continuacin:
Si hay interrupcin pendiente
Almacenar los indicadores en la pila
Almacenar el contador de programa en la pila
Leer el vector de interrupcin y cargarlo en el contador de programa
Prohibir las interrupciones
Traer a IR la instruccin apuntada por PC e incrementar PC
Saltar al microprograma correspondiente a la nueva instruccin a ejecutar

11/22

Laboratorio de Arquitectura de Ordenadores I

NO

Prctica 3: Microprocesador Microprogramable mmp16

SI

int?

PCaddr, incPC, r

DecSP, flagsdata

data_busIR
NO

SPaddr, decSP, w

ready?
SI
NO

ready?
SI

0I

f(IR)?

PCdata
SI

microprograma
correspondiente

NO

SPaddr, w

ready?

data_busPC

0addr, r

SI

ready?

Figura 18. Organigrama correspondiente a la fase de FETCH


;FETCH
;jmp 10000010 if int, save_mpc=1;
01111110: 10000010xxx00xxx000000xx100101x0
;selR=pc_sp, pc_sp=PC, incR, Registrosaddr, r;
01111111: xxxxxxxx1110111x000100xx111xx011
;data_busIR, jmp $ if not ready;
10000000: 10000000xxx0001x000010xx011100x0
;jmp inst;
10000001: xxxxxxxxxxx00xxx000000xx110110x0
;selR=pc_sp, pc_sp=SP, decR, flagsdata;
10000010: xxxxxxxx0111010x001000xx111xx0x0
;selR=pc_sp, pc_sp=SP, decR, Registrosaddr, w;
10000011: xxxxxxxx0111011x000100xx111xx001
;jmp $ if not ready;
10000100: 10000100xxx00xxx000000xx011100x0
;selR=pc_sp, pc_sp=PC, Registrosdata;
10000101: xxxxxxxx1110011x001000xx111xx0x0
;selR=pc_sp, pc_sp=SP, Registrosaddr, w;
10000110: xxxxxxxx0110011x000100xx111xx001
;jmp if not ready;
10000111: 10000111xxx00xxx000000xx011100x0
;op2_0=0, inv_op2=0, op_ALU=AND, ALUaddr, r;
10001000: 01xxxx00xxx0000x000100xx111xx011
;selR=pc_sp, pc_sp=PC, data_busRegistros, jmp $ if not ready;
10001001: 100010011111101x000000xx011100x0
;sel_f=2, mod_f, jmp 01111111;
10001010: 01111111xxx00xxx00000110110100x0

12/22

NO

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

Cada rectngulo del ordinograma representa un estado en la unidad de control. Los rombos indican
condiciones sobre las cuales se puede pasar a dos estados diferentes dependiendo de que la condicin se
cumpla o no. En una unidad de control microprogramado, como sta, todas las salidas estn asociadas a
estados y no hay salidas condicionales. Cada microinstruccin corresponde a un estado del autmata.
Como puede observarse en el ordinograma de la figura 18, hay dos ciclos de lectura en memoria y
otros dos de escritura en este microprograma.
Un ciclo de escritura consta de 3 microinstrucciones:
Enviar el dato a escribir al registro interfaz con el bus de datos
Enviar la direccin al registro interfaz con el bus de direcciones y activar w
Esperar a que la operacin se complete (se active ready)
Un ciclo de lectura consta de 2 microinstrucciones:
Enviar la direccin al registro interfaz con el bus de direcciones y activar r
Cargar lo que venga por el bus de datos en el registro destino, insistiendo hasta que se active
ready
El apndice 5 muestra varios ejemplos de microprogramas correspondientes a algunas instrucciones
del mmp16.

7. La prctica
La prctica consiste en elegir al menos una instruccin (diferente de las que se muestran como
ejemplo en el apndice 5) de cada uno de los siguientes grupos:
1) aritmticas y lgicas
2) carga
3) almacenamiento
4) ruptura de secuencia
5) manejo de la pila
Elegidas las intrucciones, se debern realizar los microprogramas correspondientes, que debern ser
traducidos a micropalabras de acuerdo con el formato de microinstruccin descrito en la figura 15. En
esta figura se indican tambin los valores por defecto para cada uno de sus campos. A continuacin
realizar un pequeo programa de prueba (utilizando las instrucciones elegidas) que deber probarse en el
simulador del mmp16 que est disponible en el laboratorio.
Mediante este simulador se deber probar que los microprogramas implementan correctamente las
instrucciones elegidas. Los mandatos del simulador pueden consultarse en el apndice 6. Lo ms
interesante ser ver los valores que van tomando los registros a cada golpe de reloj, tanto fi1 como fi2.
Se recomienda escribir en un fichero los mandatos del simulador necesarios para cargar los
microprogramas en la memoria de control. En ese mismo fichero o en otro diferente, escribir los
mandatos necesarios para cargar en la memoria principal el programa de prueba. De esta forma, no habr
que volver a escribirlos todos en cada prueba.
Deber entregarse una memoria de la prctica en la que se incluirn:
1. Las instrucciones del mmp16 elegidas, justificando su eleccin y aadiendo una breve
descripcin de lo que hacen.
2. Los microprogramas para interpretar esas instrucciones tanto en lenguaje simblico como su
codificacin en unos y ceros.
3. Comentarios, crticas, mejoras a introducir, etc. sobre la prctica.

8. Apndice 1: Juego de instrucciones del mmp16


Las instrucciones del mmp16 se agrupan en 6 grupos: aritmticas y lgicas, carga, almacenamiento,
ruptura de secuencia, manejo de la pila y miscelnea (otras que no encajan en los grupos anteriores).
Las instrucciones pueden ocupar una o dos palabras de memoria (16 o 32 bits), y su cdigo de
operacin puede tener 4, 8, 12 16 bits, ocupando los bits ms significativos de la primera palabra de la
instruccin. sto puede verse en las tablas 3 y 5. Cuando la instruccin ocupa dos palabras, la segunda
palabra contiene un dato inmediato o un dato que sirve para calcular la direccin efectiva del dato en
memoria.

13/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

Instrucciones aritmticas y lgicas


Todas las instrucciones aritmticas y lgicas modifican todos los flags de condicin (N, C/B, V, Z).
En las operaciones lgicas el nico flag que tomar un valor razonable ser Z. Los dems tendrn valores
que no aportan nada sobre la operacin lgica.
Las operaciones aritmticas y lgicas trabajan sobre registros salvo ADI y SBI que trabajan con un
registro y un dato inmediato de 8 bits. Los registros tienen los nombres R0, R1, ...,R15, donde R14 puede
indicarse tambin como SP y R15 como PC.
0011 op1R op2R op3R
AND op1R, op2R, op3R
Se hace la operacin lgica AND sobre los registros indicados como op1R y op2R y se deja el
resultado en el registro indicado como op3R.
0100 op1R op2R op3R
OR op1R, op2R, op3R
Se hace la operacin lgica OR sobre los registros indicados como op1R y op2R y se deja el
resultado en el registro indicado como op3R.
0101 op1R op2R op3R
XOR op1R, op2R, op3R
El resultado de la operacin XOR de los registros indicados por op1R y op2R se deja en el registro
indicado por op3R.
1111 0100 op2R op3R
NOT op2R, op3R
Se aplica la operacin NOT al contenido del registro indicado por op2Ry el resultado se deja en el
registro indicado por op3R.
1111 1101 op2R op3R
CMP op2R, op3R
Al contenido del registro indicado por op2R se le resta el contenido del registro indicado por op3R
pero no se guarda el resultado; solamente se actualizarn los flags.
0110 op1R op2R op3R
ADD op1R, op2R, op3R
En el registro indicado por op3R se deja el resultado de sumar al registro indicado por op1R el
contenido del registro indicado por op2R.
0111 op1R op2R op3R
SUB op1R, op2R, op3R
Al contenido del registro indicado por op1R se le resta el contenido del registro op2R y el resultado
se almacena en el registro indicado por op3R.
1000 op1R op2R op3R
ADC op1R, op2R, op3R
Se suman, el contenido del registro indicado por op1R, el contenido del registro indicado por op2R y
C (el flag de acarreo). El resultado se almacena en el registro indicado por op3R. Esta operacin se
puede utilizar para sumar nmeros de 32 bits repartidos en dos registros.
1001 op1R op2R op3R
SBB op1R, op2R, op3R
Al contenido del registro indicado por op1R se le restan el contenido del registro indicado por op2R
y C (el flag de acarreo que en este caso ser entendido como flag de borrow). El resultado se
almacenar en el registro indicado por op3R. Esta operacin puede utilizarse para hacer restas de
nmeros de 32 bits en dos fases.
1010
inmediato
op3R
ADI op3R, inmediato
Como el dato inmediato es de 8 bits y el registro es de 16 bits, se hace extensin de signo del dato
inmediato y se suma el valor resultante con el contenido del registro indicado por op3R y el
resultado se deja en el registro indicado por op3R. Esta operacin es til para incrementos pequeos,
por ejemplo en el recorrido de los elementos de una tabla.
1110
Inmediato
op3R
SBI op3R, inmediato
De la misma forma que en la operacin ADI, se extiende el bit de signo del dato inmediato, se hace
la resta y se deja el resultado tambin en el registro indicado por op3R. Su uso es el mismo que el de
la operacin ADI.
Instrucciones de carga
En las instrucciones de carga se permiten gran variedad de modos de direccionamiento: inmediato,
directo, relativo, indexado, e indirecto de registro. Cada uno de estos modos de direccionamiento se
comentar en detalle cuando se presente la instruccin que lo utilice. Estas instrucciones, aunque utilizan
la ALU para calcular la direccin efectiva del dato en memoria, no alteran los flags.

14/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

1111 1111 1010 op3R


Inmediato
LIM op3R, inmediato
LIM utiliza direccionamiento inmediato. Esta instruccin consta de dos palabras: la primera
contiene el cdigo de operacin (en este caso un cdigo de operacin de 12 bits) y el registro
resultado de la carga (op3R) y la segunda contiene el dato de 16 bits que ser almacenado en el
registro correspondiente.
1111 1111 0100 op3R
Direccin
LDD op3R, direccin
Esta instruccin copia el valor almacenado en la posicin de memoria indicada por la segunda
palabra de la instruccin en el registro indicado por op3R (direccionamiento directo).
1111 0000 op2R op3R
Direccin de base
LDR op3R, base[op2R]
1111 0000 op2R op3R
Desplazamiento
LDR op3R, op2R[desp]
El valor a cargar se direcciona mediante base y desplazamiento (direccionamiento relativo). La
direccin efectiva del dato en memoria se calcular como la suma de la direccin de base y el
desplazamiento. La direccin de base puede ser un dato inmediato en la siguiente palabra de la
instruccin o un registro. El desplazamiento puede ser un registro o un dato inmediato que est en la
siguiente palabra de la instruccin. Ambos casos resultan en la misma instruccin mquina.
1011 op1R op2R op3R
LDX op3R, op1R[op2R]
Esta instruccin utiliza direccionamiento indexado. Esta indexacin se realiza utilizando dos
registros (el indicado por op1R y el indicado por op2R). La suma de estos dos registros ser la
direccin efectiva del dato que se cargar en el registro indicado por op3R.
1111 1110 op2R op3R
LDI op3R, [op2R]
La direccin efectiva del dato a cargar en el registro indicado por op3R es la almacenada en el
registro indicado por op2R (direccionamiento indirecto de registro).
Instrucciones de almacenamiento
Los modos de direccionamiento permitidos en las instrucciones de almacenamiento son bsicamente
los mismos que en las de carga, salvo el inmediato que no tiene sentido. El clculo de la direccin
efectiva no debe modificar los valores de los flags.
1111 1111 0101 op3R
Direccin
STD op3R, direccin
El contenido del registro indicado por op3R se almacenar en la direccin de memoria indicada en la
segunda palabra de la instruccin (direccionamiento directo).
1111 0001 op2R op3R
Direccin de base
STR op3R, base[op2R]
1111 0001 op2R op3R
Desplazamiento
STR op3R, op2R [desp]
La direccin efectiva donde se almacenar el valor del registro indicado por op3R se calcula
sumando la direccin de base o desplazamiento que estn en la segunda palabra de la instruccin y
el contenido del registro indicado por op2R (direccionamiento relativo).
0010 op1R op2R op3R
STX op3R, op1R[op2R]
El valor del registro indicado por op3R se almacenar en la posicin de memoria que resulte de
sumar los contenidos de los registros indicados por op1R y op2R (direccionamiento indexado).
1111 0010 op2R op3R
STI op3R, [op2R]
El valor del registro indicado por op3R se guarda en la posicin de memoria que est almacenada en
el registro indicado por op2R (direccionamiento indirecto de registro).
Instrucciones de ruptura de secuencia
Todas las instrucciones de ruptura de secuencia son condicionales. Las condiciones de salto se
comentan en el apndice 4. Lgicamente una de las condiciones de salto es el salto incondicional. Existen
varios tipos de salto que se detallan a continuacin. Las instrucciones de salto nunca alteran los flags.
El puntero de pila (SP) apunta siempre a la direccin de memoria donde se guard el ltimo dato.
Esto es, apunta a la ltima posicin llena de la pila. Es competencia del programador darle el valor
adecuado a SP si va a hacer uso de la pila.
1111 1111 0110 cond
Direccin de salto
JMP cond, direccin
Si se cumple la condicin de salto (stas se especifican en el apndice 2), se carga en el contador de
programa (PC) la direccin contenida en la segunda palabra de la instruccin. En caso contrario se
pasa a la siguiente instruccin.

15/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

1111 1111 0111 cond


Direccin
CALL cond, direccin
Si se cumple la condicin especificada, se decrementa SP, se guarda en la pila la direccin de la
siguiente instruccin y se carga en el PC el contenido de la segunda palabra de la instruccin. Si no
se cumple la condicin, se pasa a la siguiente instruccin.
1111 1011 op2R cond
JMPI cond, [op2R]
Si se cumple la condicin de salto, se cargar en el PC el valor almacenado en el registro indicado
por op2R (salto indirecto de registro).
1111 0011 op2R cond
CALLI cond, [op2R]
Si se cumple la condicin de salto, se decrementa SP, se guarda en la pila la direccin de la siguiente
instruccin y se carga en PC el contenido del registro indicado por op2R.
1100
desp/imm
cond
JMPR cond, desp
Si se cumple la condicin de salto, se sumar el desplazamiento indicado como dato inmediato de 8
bits extendido en signo a 16 bits, al contador de programa (PC). Como PC se incrementa en la fase
de FETCH, el desplazamiento se calcular respecto a la siguiente instruccin y no respecto a la
instruccin de salto. Este desplazamiento puede ser positivo o negativo.
1101
desp/imm
cond
CALLR cond, desp
Si se cumple la condicin de salto, se decrementa SP, se salva en la pila la direccin de retorno (la
de la siguiente instruccin) y se suma el desplazamiento indicado como dato inmediato de 8 bits,
extendido en signo a 16 bits, al PC. Como el PC ya se increment en la fase de FETCH, el
desplazamiento se calcular respecto a la direccin de la siguiente instruccin y no respecto a la
direccin de la instruccin de salto. Este desplazamiento puede ser positivo o negativo.
1111 1111 1001 cond
RET cond
Si se cumple la condicin de salto, se carga en el PC lo que hay en la direccin de memoria indicada
por SP y se incrementa SP.
1111 1111 1110 cond
RETI cond
Si se cumple la condicin de salto, se carga en el PC lo que hay en la direccin de memoria indicada
por SP y se incrementa SP, a continuacin se carga en el registro de flags lo que hay en la posicin
de memoria indicada por SP y se vuelve a incrementar.
Instrucciones de manejo de la pila
Se debe tener en cuenta, al igual que en el apartado anterior, que SP siempre apunta a la ltima
posicin llena de la pila.
Estas instrucciones no alteran los flags. En la pila pueden almacenarse los contenidos de cualquiera
de los registros generales (incluidos SP y PC) y el registro de flags.
1111 1111 1000 op3R
PUSH op3R
Se decrementa SP y se almacena el contenido del registro especificado por op3R en la pila.
1111 1111 1011 op3R
POP op3R
Se carga en el registro indicado por op3R el dato almacenado en la cima de la pila y se incrementa
SP.
1111 1111 1111 1110
PUSH FLAGS
Se decrementa SP y se almacena el contenido del registro de flags en la pila. Aunque el registro de
flags es de 4 bits, se almacena ocupando una palabra completa de memoria y se sita en los 4 bits
menos significativos.
1111 1111 1111 1100
POP FLAGS
Se carga en el registro de flags el valor almacenado en la cima de la pila y se incrementa SP.
Aunque se traiga toda la palabra a la CPU, en el registro de flags se cargarn slamente los 4 bits
menos significativos que son los que corresponden al valor de los flags.
Miscelnea
En este grupo se han colocado 3 instrucciones que no encajan en el resto de los grupos. Estas
instrucciones son las que permiten habilitar e inhibir las interrupciones y la instruccin de movimiento de
un registro a otro.

16/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

1111 1111 1111 1010


CLRI
Se pone un 0 en el bit I del registro de flags (se prohiben las interrupciones).
1111 1111 1111 1001
SETI
Se pone a 1 el bit I del registro de flags (se permiten las interrupciones).
1111 1100 op2R op3R
MOV op2R, op3R
El contenido del registro indicado por op2R se transfiere a op3R. No se modifican los flags

9. Apndice 2: Cuadro resumen de los campos de la microinstruccin


Campo
d_alt

Valor por defecto


xxxxxxxx

Descripcin
Selecciona la direccin de salto en el microprograma (Fig.13)

op_ALU

xx

Selecciona el resultado de la ALU 00: resultado del sumador, 01:


operacin AND, 10: operacin OR, 11: operacin XOR (Fig.7)

sel_Carry

Selecciona el modo de calcular el flag de acarreo 0: ltimo acarreo


del sumador (sumas), 1: ltimo acarreo negado (restas) (Fig.7)

sel_Cin

Selecciona la base para establecer el acarreo inicial en el sumador de la


ALU 0: un cero, 1: el valor del flag de acarreo (Fig.7)

inv_Cin

Permite invertir el acarreo base de entrada en el sumador de ALU


seleccionado por sel_Cin 0: se deja como est, 1: se invierte (Fig.7)

op2_0

Si es 0, se selecciona como segundo operando para la ALU un cero y si


es 1, el valor del registro op2 (Fig.6)

inv_op2

Permite invertir el valor previamente seleccionado por op2_0. Si es 0,


lo deja como est y si es 1 lo invierte (Fig.6)

pc_sp

Permite seleccionar entre PC y SP si selR es 11 0: SP, 1: PC (Fig.5)

selR

xx

Determina como se selecciona el registro del banco de registros 00:


el campo op1R de IR, 01: el campo op2R de IR, 10: el campo op3R de
IR, 11: segn diga pc_sp selecciona entre PC y SP (Fig.5)

opR

00

Selecciona la operacin a realizar en el banco de registros con el


registro seleccionado 00: se deja como est, 01: se incrementa. 10: se
decrementa, 11: secarga con lo que llegue desde IDB (Fig.5)

aIDB

xx

Selecciona desde donde se vierten datos a IDB (Fig.11) 00: desde la


ALU (Fig.7), 01: desde el bus de datos (Fig.9), 10: desde el registro de
flags (Fig.8), 11: desde el bloque de registros (Fig.5)

sel_op2

Selecciona con qu valor se carga el registro op2 de la ALU 0: lo que


viene de IDB, 1: el campo imm de IR extendido en signo a 16 bits
(Fig.6)

ld_op2

Habilita la carga del registro op2 (Fig.6)

ld_op1

Habilita la carga del registro op1 (Fig.6)

ld_data

Habilita la carga del registro data (Fig.9)

ld_addr

Habilita la carga del registro addr (Fig.9)

ld_IR

Habilita la carga del registro IR (Fig.10)

mod_f

Habilita la carga del registro de flags (Fig.8)

sel_f

xx

Selecciona con qu valores se va a actualizar el registro de flags en el


caso de que mod_f sea 1 00: lo que viene a travs de IDB, 01: los
nuevos flags generados en la ALU y el bit I como estaba, 10: el bit I se
pone a 0 y el resto como estaban, 11: el bit I se pone a 1 y el resto
como estaban (Fig.8)

17/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

Campo
sel_cond

Valor por defecto


11

Descripcin
Selecciona la condicin de salto en el microprograma (Fig.12) 00: la
condicin especificada por el campo cond de IR, 01: la seal ready
previamente sincronizada en el registro de estado (estado<7>), 10: hay
una interrupcin pendiente de ser tratada, 11: un uno (verdadero)

inv_cond

Permite invertir el valor seleccionado mediante sel_cond 0: la


condicin seleccionada tal cual, 1: la condicin invertida (Fig.12)

sel_sig

xx

Determina a donde se salta en caso de que cond (calculada en funcin


de sel_cond e inv_cond) sea 1 (Fig.13) 00: mPC+1, 01: el valor
guardado en el registro save, 10: el valor del campo d_alt de la
microinstruccin, 11: funcin del contenido de IR (Fig.14)

save_mpc

Permite cargar el registro save con el valor de mPC (Fig.13)

r_w

En caso de que bus_ext valga 1, permite activar la seal de lectura en


memoria r (si vale 1) o la de escritura (si vale 0) (Fig.16)

bus_ext

Si vale 0 no se puede hacer ninguna operacin sobre la memoria. Si


vale 1, se activarn las seales r o w en funcin de r_w (Fig.16)

10. Apndice 3: Organizacin de la memoria de control


000
00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

001

010

011

100

101

110

LDR
STR
STI
CALLI
NOT
LDD
STD
JMP
CALL
PUSH
RET
JMPI
MOV
CMP
LDI
RETI

LDD
STD
JMP
CALL
PUSH
RET
LIM
POP
libre
RETI
RESET/FETCH

RESET/FETCH
STX
AND
OR
XOR
ADD
SUB
ADC
SBB
ADI

libre

SETI
CLRI
LDX

JMPR

POP FLAGS
CALLR

SBI
PUSH FLAGS

PUSH FLAGS
libre

18/22

111

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

11. Apndice 4: Cdigos de condicin


Cdigo
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1111

Smbolo
LE
GT
LT
GE
LOS
HI
HIS/C
LO/NC
MI/N
PL/NN
EQ/Z
NE/NZ
V
NV
ALW

Significado
Menor o igual que (con signo) Lesser or Equal
Mayor que (con signo) GreaTer
Menor que (con signo) - Less Than
Mayor que (con signo) - Greater or Equal
Menor o igual (sin signo) - LOwer or Same
Mayor que (sin signo) Higher
Mayor o igual que (sin signo) - HIgher or Same / C
Menor que (sin signo) - Lower / No C
Negativo Minus / N
Positivo Plus / No N
Igual Equal / Z
Distinto - Not Equal / No Z
Desbordamiento oVerflow
No desbordamiento - Not oVerflow
Siempre (salto incondicional) ALWays

Clculo
(NV)+Z
! ((NV)+Z)
NV
!(NV)
!C+Z
!(!C+Z)
C
!C
N
!N
Z
!Z
V
!V
1

12. Apndice 5: Microprogramas de ejemplo


A continuacin se muestran algunos microprogramas de ejemplo, con su codificacin en unos y
ceros. No se incluyen explicaciones de los mismos porque se considera que son suficientemente claros.
Ejemplo 1: ADD
;selR=op1R, Registrosop1;
10110000:
xxxxxxxxx000011x010000xx111xx0x0
;selR=op2R, Registrosop2;
10110001:
xxxxxxxxx0100110100000xx111xx0x0
;op2_0=1, inv_op2=0, sel_Cin=0, inv_Cin=0, sel_Carry=0, op_ALU=, sel_f=ALU, mod_f=1,
;ALURegistros, selR=op3R, jmp save;
10110010:
00000x10x101100x00000101110010x0

Ejemplo 2: STX
;selR=op1R, Registrosop1;
10010000:
xxxxxxxxx000011x010000xx111xx0x0
;selR=op2R, Registrosop2;
10010001:
xxxxxxxxx0100110100000xx111xx0x0
;op2_0=1, inv_op2=0, sel_Cin=0, inv_Cin=0, op_ALU=, ALUaddr;
10010010:
00x00x10xxx0000x000100xx111xx0x0
;selR=op3R, Registrosdata, w;
10010011:
xxxxxxxxx100011x001000xx111xx001
;jmp $ if not ready;
10010100:
10010100xxx00xxx000000xx011100x0
;jmp save;
10010101:
xxxxxxxxxxx00xxx000000xx110010x0

Ejemplo 3: JMPR
;selR=pc_sp, pc_sp=PC, Registrosop1, sel_op2=inmediato, ld_op2, jmp save if not cond;
11100000:
xxxxxxxx11100111110000xx001010x0
;op2_0=1, inv_op2=0, sel_Cin=0, inv_Cin=0, op_ALU=, ALURegistros, selR=pc_sp, pc_sp=PC,
;jmp save;
11100001:
00x00x101111100x000000xx110010x0

Ejemplo 4: POP
;selR=pc_sp, pc_sp=SP, Registrosaddr, rincR, r;
01011100:
xxxxxxxx0110111x000100xx111xx011
;data_busRegistros, selR=op3R, jmp $ if not ready;
01011101:
01011101x101101x000000xx011100x0
;jmp save;
01011110:
xxxxxxxxxxx00xxx000000xx110010x0

19/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

Ejemplo 5: LDD
;selR=pc_sp, pc_sp=PC, incR, Registrosaddr, r;
00100100:
xxxxxxxx1110111x000100xx111xx011
;data_busop1, jmp $ if not ready;
00100101:
00100101xxx0001x010000xx011100x0
;op2_0=0, inv_op2=0, op_ALU=OR, ALUaddr, r;
00100110:
10xxxx00xxx0000x000100xx111xx011
;data_busRegistros, selR=op3R, jmp $ if not ready;
00100111:
00100111x101101x000000xx011100x0
;jmp save;
00101000:
xxxxxxxxxxx00xxx000000xx110010x0

13. Apndice 6: Manual del simulador del mmp16


Estn disponibles en la URL ftp://ftp.diatel.upm.es/pub/mmp16 versiones del simulador del mmp16
para los sistemas operativos Solaris, FreeBSD, Linux y WINDOWS 95/98/NT. La interfaz de usuario es
idntica en todos los casos (textual). Este simulador dispone de una serie de mandatos del tipo de los
disponibles en los depuradores. Existen mandatos para cargar valores en los registros y memorias del
sistema, mandatos para ver los valores de los registros, campos relevantes de los registros y palabras de
las memorias y otros mandatos auxiliares.
Formato de los nmeros
Los valores que se manejan tanto en los registros como en la memoria son numricos. Estos
nmeros se pueden escribir y visualizar en base 2 (binario), base 10 (decimal) y base 16 (hexadecimal).
Los valores sern siempre absolutos. A continuacin se muestran los 3 formatos:

Binario: 0[bB][01]+
Un cero seguido, bien por una b minscula o una B mayscula y despus uno o ms dgitos
binarios (unos o ceros).
Nmeros binarios correctos: 0b10011, 0B0, 0B1, 0b0101
Estos no son nmeros binarios correctos: 0b, 0B, 0b21, 78, 100, 0BA

Decimal: [0-9]+
Una secuencia de uno o ms dgitos decimales, es decir comprendidos entre 0 y 9.
Nmeros decimales vlidos: 56, 100, 0
Estos no son nmeros en base 10: 67A, B52, 0X89

Hexadecimal: 0[xX][0-9A-Fa-f]+
Un cero seguido de una x minscula o una X mayscula y uno o ms dgitos hexadecimales (los
dgitos decimales ms las letras A, B, C, D, E, F, a, b, c, d, e y f.
Nmeros hexadecimales vlidos: 0x89, 0XAF, 0x10, 0XA00, 0x9f
Estos no son nmeros hexadecimales: 78, 0bAF, 0X5H,
Mandatos para asignar valores a registros y memorias

registro = nmero
Este mandato carga el registro seleccionado con el valor indicado. registro debe ser el nombre de
algn registro del mmp16: mI, estado, save, mPC, addr, data, op1, op2, flags, IR y los registros de uso
general (desde R0 hasta R15, SP y PC que corresponden a R14 y R15 respectivamente). nmero ser un
valor numrico expresado en cualquiera de los formatos anteriormente definidos. Es responsabilidad del
usuario no intentar cargar valores que no quepan en los registros.
Como caso excepcional, la seal externa de peticin de interrupcin puede ser activada y desativada
por el usuario, de forma que se puede comprobar el funcionamiento de la gestin de las interrupciones por
parte de la CPU. Por tanto se pueden dar los valores 0 o 1 a la seal int.
Ejemplos: mPC = 0x00, op1 = 10, SP=0x0000, flags=0b00101, int=1
memoria[nmero]=nmero
Este mandato carga en la palabra de la memoria indicada entre corchetes el valor indicado a la
derecha del signo =. Los nmeros se pueden expresar en cualquiera de los formatos numricos vlidos.
Este mandato se puede usar con mem y mROM que son respectivamente la memoria principal del sistema
y la memoria de control de microprograma.
Ejemplos: mem[0x1000] = 56, mROM[0x00]=0b00000000000000000000000000000000

20/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

No es vlido hacer asignaciones del tipo mROM[0x20]=0bxxxxxxxxx000011x010000xx101xx0x0


aunque as se haya escrito en los microprogramas. Las equis de la microinstrucciones debern sustituirse,
bien por unos o bien por ceros al cargar los microprogramas en la memoria de control.
Mandatos para preguntar el valor de un registro, campo de registro o memoria
A la hora de preguntar por el valor de un registro o una posicin de memoria, se puede seleccionar la
base en la que se desea que se muestre dicho valor. Esta base se seleccionar de la siguiente forma: si no
se dice nada, se entender que se desea ver el resultado en decimal, si se desea verlo en binario, se
seleccionar b minscula o B mayscula, y se desea verlo en hexadecimal, x minscula o X mayscula.
En los casos de preguntas sobre el valor de un campo de un registro, como, por ejemplo, los flags o los
campos del registro de microinstruccin que tienen solamente un bit, o los valores de las seales externas,
no se permite indicar la base (0 y 1 son 0 y 1 en cualquier base).
registro ? base
Visualiza el valor del registro en la base seleccionada. Los registros, campos de registros o buses
que pueden visualizarse con este mandato son: data_bus (el contenido del bus de datos), addr_bus (el
contenido del bus de direcciones), R0 a R15, SP, PC, data (el registro de la interfaz con el bus de datos),
addr (el registro de la interfaz con el bus de direcciones), IR (el registro de instruccin), los campos del
registro de instruccin (cop1, cop2, cop3, cop4, op1R, op2R, op3R, cond, imm), los operandos de la ALU
(op1, op2), el registro de flags (flags), el registro de estado (estado), los registros del control de
microprograma (save, mPC, mI) y los campos de la microinstruccin sel_f, sel_sig, sel_cond, aIDB, opR,
selR, op_ALU y d_alt.
Ejemplos: IR?x, op1?, mI?b, addr?X
seal ?
Visualiza el valor de la seal o campo de un registro de un solo bit. Las seales cuyos valores
pueden consultarse son: las seales externas (ready, r, w, int), los flags (C, V, N, Z, I), y los campos de la
microinstruccin bus_ext, r_w, save_pc, inv_cond, mod_f, ld_IR, ld_addr, ld_data, lp_op1, ld_op2,
pc_sp, inv_op2, sel_op2, op2_0, sel_Cin, inv_Cin, y sel_Carry.
Ejemplos: ld_op2?, sel_Cin?
memoria[nmero] ? base
Permite visualizar el valor de la palabra de la memoria seleccionada entre corchetes. Se puede
aplicar a mem y mROM.
Ejemplos: mem[0x001F]?, mem[32]?, mROM[0xDC]?
Mandatos de control de la simulacin
reset
Enva un pulso de reset al mmp16 que ser tratado en el siguiente ciclo de reloj y automticamente
desactivado. La simulacin siempre comienza con un reset, pero este mandato permite reiniciar de nuevo
durante la simulacin.
tic
Avanza la simulacin hasta el siguiente ciclo de reloj. Si el ltimo flanco que haba llegado haba
sido el de fi1, avanza hasta el flanco de fi2 y si ya haba llegado el flanco de fi2, avanza hasta el flanco de
fi1. De esta forma se va parando la mquina a cada flanco de reloj y se pueden comprobar los valores de
los registros para ver si se han cargado con los valores esperados o no.
tictac
Avanza la simulacin hasta que llegue el siguiente flanco de fi2. Si la simulacin estaba parada justo
despus del flanco de fi2, avanza hasta el siguiente flanco de fi2 (llega fi1 y luego fi2). Si estaba justo
despus del flanco de fi1, simplemente avanza hasta que llega el flanco de fi2. Avanzando de esta forma
en la simulacin, se ve en cada tictac qu microinstruccin se ha cargado con fi1 y con qu valores se han
cargado los registros de la unidad de proceso de datos como consecuencia de la ejecucin de esa
microinstruccin.
nmero tic
Avanza tantos tic como indique el nmero. Esto puede ser til para avanzar rpidamente cuando una
parte del microprograma ya ha sido verificada anteriormente.
nmero tictac
Avanza tantos tictacs como indique el nmero. Su uso es similar al caso anterior.

21/22

Laboratorio de Arquitectura de Ordenadores I

Prctica 3: Microprocesador Microprogramable mmp16

fin
Se abandona el simulador. Usado en modo interactivo, termina la simulacin. Dentro de un fichero,
termina la lectura de mandatos desde el fichero y se vuelve a leer mandatos del teclado.
Mandatos adicionales
salvar nombre de fichero
Permite salvar el estado de la mquina en el fichero indicado. Lo que hace es generar un fichero con
mandatos del simulador que permitir cargar en los registros y memorias los valores que tenan cuando se
salv. Sin embargo, no salva el estado de los buses, seales externas y flipflops jk. El nombre del fichero
debe ir entre comillas y puede ser un nombre relativo o absoluto.
Ejemplos: salvar simulacin.sim, salvar directorio/fichero.sim
cargar nombre de fichero
Permite ejecutar los mandatos que hay en un fichero. Este puede ser uno generado previamente con
el mandato salvar o un fichero generado por el usuario, por ejemplo con las rdenes necesarias para
cargar los microprogramas en la memoria de control de microprograma. Esto evita tener que teclear todos
los mandatos cada vez.
Ejemplos: cargar microprogramaADD.sim
?
Muestra una pequea ayuda sobre la sintaxis de los mandatos del simulador.
;
El punto y coma se puede utilizar para aadir comentarios en los ficheros de mandatos del
simulador. Todo lo que vaya desde el punto y coma hasta el final de lnea ser considerado como
comentario y ser ignorado por el intrprete de mandatos del simulador.

22/22

Você também pode gostar