Está en la página 1de 61

Tema 4

EL PROCESADOR

4.1. Introducción
Un computador es un dispositivo electrónico formado por componentes y subsistemas
digitales que permite el procesamiento de datos.
Desde el punto de vista estructural, el computador se considera dividido en varios ni-
veles organizados jerárquicamente. La Figura 4.1 muestra la organización del computador
según estos niveles. Se distinguen 5 niveles básicos:

Nivel Digital: Se corresponde con la máquina fı́sica y engloba todos los circuitos
digitales que constituyen el computador y que han sido estudiados en los capı́tulos
anteriores.
Nivel Instrucciones Máquina: En este nivel se construyen programas en lenguaje
máquina (secuencias de 0’s y 1’s), que es el lenguaje capaz de entender la CPU.
También se incluye en este nivel la programación en ensamblador. El lenguaje en-
samblador es la notación simbólica del lenguaje máquina.
Nivel Sistema Operativo: Los sistemas operativos son un conjunto de programas
que ayudan al usuario en la explotación del computador, siendo por tanto, una capa
software con la que se rodea el hardware para facilitar su utilización.
Nivel Lenguajes Alto Nivel: El objetivo de este nivel es facilitar al programador
la utilización del computador. Los programas escritos en un leguaje de alto nivel
deberán pasar por un proceso intermedio de traducción, denominado compilación,
antes de ejecutarse. El objetivo de la compilación es traducir el lenguaje de alto
nivel a un lenguaje de bajo nivel que la máquina pueda entender. La figura 4.2
muestra un ejemplo de traducción de un trozo de código codificado en un lenguaje
de alto nivel (lenguaje C) a lenguaje ensamblador para el procesador MIPS y de
lenguaje ensamblador a lenguaje máquina. El programa que traduce el código es-
crito en lenguaje ensamblador al código equivalente en lenguaje máquina se llama
ensamblador.

1
2 TEMA 4. EL PROCESADOR

Aplicaciones

Lenguajes alto nivel


Sistema operativo

Lenguaje maquina
Logica digital

Figura 4.1: Organización estructural de un computador

Nivel Aplicaciones: Este nivel está formado por paquetes de programas de aplicación
que sirven para resolver problemas en campos especı́ficos de la ciencia o la gestión.

Centrándonos en el nivel digital, los elementos principales de un computador son: la


unidad de procesamiento central (CPU, Central Processing Unit) o procesador, la memoria
principal, el subsistema de entrada/salida y algunos medios de interconexión de todos estos
componentes como se muestra en la figura 4.3.

La unidad central de procesamiento (CPU): Controla el funcionamiento del compu-


tador y lleva a cabo sus funciones de procesamiento de datos. Frecuentemente se
llama simplemente procesador. Sus principales componentes estructurales son:

• Unidad de control: Controla el funcionamiento de la CPU y, por tanto, del


computador.
• Unidad aritmético-lógica (ALU, Arithmetic Logic Unit): Lleva a cabo las fun-
ciones de procesamiento de datos del computador.
• Registros: Proporcionan almacenamiento interno a la CPU.
• Interconexiones CPU: Proporcionan comunicación entre la unidad de control,
la ALU y los registros.

La memoria principal: Almacena instrucciones y datos.

E/S: Transfiere datos entre el computador y el entorno externo.

Sistema de interconexión: Proporciona la comunicación entre la CPU, la memoria


principal y la E/S.

La tarea de un computador es el procesamiento de datos en base al contenido de las


instrucciones. Ambos elementos (instrucciones y datos) se almacenan en memoria y se
codifican empleando un número especifico de bits. De este modo, la arquitectura de un
computador está diseñada para transferir bloques de información (o múltiplos de blo-
ques) de un determinado tamaño. A cada uno de estos bloques se le denomina palabra y
4.1. INTRODUCCIÓN 3

High-level swa p ( i n t v [ ] , i n t k )
language { i n t t emp ;
program t emp = v [ k ] ;
(in C) v [ k ] = v [ k +1 ] ;
v [ k + 1 ] = t emp ;
}

C compiler

Assembly swa p :
language mu l i $ 2 , $5 , 4
program a dd $ 2 , $4 , $2
(for MIPS) lw $ 1 5 , 0 ( $2 )
lw $ 1 6 , 4 ( $2 )
sw $ 1 6 , 0 ( $2 )
sw $ 1 5 , 4 ( $2 )
jr $31

Assembler

Binary machine 0 0000 000 10100 00 10000 00 0 00001 10 00


language 0 0000 000 10001 11 00001 10 0 00010 00 01
program 1 0001 100 01100 01 00000 00 0 00000 00 00
(for MIPS) 1 0001 100 11110 01 00000 00 0 00000 01 00
1 0101 100 11110 01 00000 00 0 00000 00 00
1 0101 100 01100 01 00000 00 0 00000 01 00
0 0000 011 11100 00 00000 00 0 00000 10 00

Figura 4.2: Programa C compilado a lenguaje ensamblador y después ensamblado a len-


guaje máquina

su tamaño, en número de bits, se denomina ancho de palabra. Todos los elementos del
computador (registros, buses, memorias, periféricos, ALUs) están diseñados para transfe-
rir, almacenar o procesar palabras.
El modo de funcionamiento de un computador consiste en la ejecución continua de
instrucciones que operan sobre diferentes datos. El proceso de ejecución de una instrucción
sigue una secuencia de 4 pasos:

1. Lectura o carga de la instrucción: La instrucción se transfiere desde memoria a


uno de los registros internos de la CPU, el denominado registro de instrucción (IR,
Instruction Register).

2. Decodificación de la instrucción: La unidad de control lee el contenido del IR y


4 TEMA 4. EL PROCESADOR

PROCESADOR

PC IR

Instrucciones
ENTRADA

REGISTROS
UNIDAD DE
MEMORIA
Datos

SALIDA
UNIDAD DE
ALU
CONTROL

Figura 4.3: El computador: unidades funcionales básicas

decodifica la operación a ejecutar.

3. Ejecución de la instrucción: Se activan las señales necesarias para la ejecución de la


operación.

4. Determinación de la siguiente instrucción: Se asume que las instrucciones se eje-


cutarán de forma ordenada, es decir, después de la ejecución de una instrucción
concreta se carga y se ejecuta la siguiente instrucción contigua en memoria. Sin em-
bargo, en ciertas situaciones se realizan saltos, pasando a ejecutarse otra instrucción
situada en una posición de memoria diferente. La CPU lleva un control de la direc-
ción en memoria de la siguiente instrucción por medio del empleo de un registro de
la CPU especial al que se denomina contador de programa (PC, Program Counter).
Después de traer una instrucción, el contenido del PC se actualiza para apuntar a
la siguiente instrucción de la secuencia.

4.2. El repertorio de instrucciones

El funcionamiento de la CPU está determinado por las instrucciones máquina que


ejecuta. Al conjunto de instrucciones distintas que puede ejecutar la CPU se le denomina
repertorio de instrucciones de la CPU. El repertorio de instrucciones define las funciones
que puede realizar la CPU y tiene, por tanto, un efecto significativo sobre la implemen-
tación de la misma.

Cada instrucción máquina debe contener la información que necesita la CPU para su
ejecución. Los elementos constitutivos de una instrucción máquina son:
4.2. EL REPERTORIO DE INSTRUCCIONES 5

4 bits 6 bits 6 bits

Codop Ref. a operando Ref. a operando

16 bits

Figura 4.4: Un formato de instrucciones sencillo

Código de operación: Especifica la operación a realizar (suma, E/S, etc.). La opera-


ción se indica mediante un código binario.

Referencia a operandos fuente: La operación puede implicar a uno o más operandos


fuente, es decir, operandos que son entradas para la instrucción.

Referencia al operando resultado: La operación puede producir un resultado.

Referencia a la siguiente instrucción: En la mayorı́a de los casos la siguiente ins-


trucción sigue inmediatamente a la instrucción en ejecución. En tales casos no hay
referencia explı́cita a la siguiente instrucción. Cuando sea necesaria una referencia
explı́cita, debe suministrarse la dirección de memoria.

Los operandos fuente y resultado pueden estar en algunas de las siguientes áreas:

Memoria: Como en las referencias a instrucciones siguientes, debe indicarse la di-


rección de memoria.

Registro de la CPU: Salvo raras excepciones, una CPU contiene uno o más registros
que pueden ser referenciados por instrucciones máquina. Si existe más de uno, cada
registro tendrá asignado un número único, y la instrucción debe contener el número
del registro deseado.

Dispositivo de E/S: La instrucción debe especificar el módulo y dispositivo de E/S


para la operación. En el caso de E/S asignadas en memoria, se dará otra dirección
de memoria.

Dentro del computador, cada instrucción se representa por una secuencia de bits. Esta
secuencia se puede interpretar dividida en campos, correspondientes cada uno de ellos a
los elementos constitutivos de la instrucción. La descripción de la instrucción en campos
y bits se denomina formato de instrucción. La figura 4.4 muestra un ejemplo sencillo de
formato de instrucción. En la mayorı́a de los repertorios de instrucciones se emplea más
de un formato. Durante su ejecución, la instrucción se escribe en el registro de instrucción
(IR) de la CPU. La CPU debe ser capaz de extraer los datos de los distintos campos de
la instrucción para realizar la operación requerida.
Los aspectos más importantes a tener en cuenta en el diseño del repertorio de instruc-
ciones son:
6 TEMA 4. EL PROCESADOR

Repertorio de operaciones: Cuántas y qué operaciones considerar, y cuán complejas


deben ser.

Tipos de datos: Los distintos tipos de datos con los que se efectúan operaciones.

Formatos de instrucciones: Longitud de la instrucción (en bits), tamaño de los dis-


tintos campos, etc.

Registros: Número de registros de la CPU que pueden ser referenciados por instruc-
ciones, y su uso.

Direccionamiento: El modo o modos de direccionamiento mediante los cuales puede


especificarse la dirección de un operando o instrucción.

4.2.1. Modelo de ejecución

El modelo de ejecución especifica el dispositivo (memoria, registro, etc.) que almacena


los operandos de las instrucciones. Una arquitectura no está restringida a un único modelo,
sino que suele dar soporte a varios. La elección de un modelo u otro es fuertemente
dependiente de la arquitectura del sistema. Por ejemplo, una unidad aritmético-lógica
que está exclusivamente conectada con registros (tanto para acceder a los operandos de
entrada como para almacenar el resultado) quedará limitada al empleo de un modelo
registro-registro (en el que ambos operandos son registros). Los modelos de ejecución
posibles son:

Modelo de pila: En este modelo los operandos se almacenan en una pila de modo
que se opera con datos de la pila y el resultado es colocado encima de la pila. Se
denota por POP a la instrucción que retira de la pila un dato y lo copia a memoria
o a un registro. Se denomina PUSH a la instrucción que inserta en la pila un valor
de memoria o de un registro.

Modelo de registro-registro (o carga/almacenamiento): En este caso ambos operan-


dos deben residir en un registro. Es el modelo de ejecución más extendido, ya que
las instrucciones que lo emplean se pueden ejecutar de forma rápida (dado que el
acceso a un registro es inmediato). En este modelo es necesario transferir de forma
explı́cita los datos entre la memoria y los registros a través de instrucciones de carga
y de almacenamiento.

Modelo registro-memoria: En este modelo un operando está en un registro y el otro


está en una posición de memoria. El resultado se almacena en un registro.

Modelo memoria-memoria: Ambos operandos residen en memoria principal y el


resultado también se almacena en memoria principal. Mediante este modelo no es
necesario transferir los datos entre la memoria y los registros, sin embargo, tiene el
inconveniente de que la ejecución de las instrucciones requiere un gran número de
ciclos de reloj (necesarios para acceder a los datos en memoria).
4.2. EL REPERTORIO DE INSTRUCCIONES 7

4.2.2. Direccionamiento

En esta sección analizamos las técnicas de direccionamiento más comunes. Se denomi-


nan modos de direccionamiento a aquellos algoritmos empleados por el procesador para
calcular las direcciones de las instrucciones y datos. La dirección real de memoria especi-
ficada por el modo de direccionamiento se denomina dirección efectiva.

Direccionamiento inmediato: El operando es una constante cuyo valor se almacena


en el campo operando de la instrucción. La ventaja del direccionamiento inmediato
es que una vez captada la instrucción no se requiere una referencia a memoria para
obtener el operando. La desventaja es que el tamaño del dato está restringido a la
longitud del campo de direcciones.

Direccionamiento directo: El operando se encuentra almacenado en memoria en


la posición indicada por el campo operando. La limitación es que proporciona un
espacio de direcciones reducido.

Direccionamiento indirecto: La instrucción contiene en el campo operando la direc-


ción de una posición de memoria en la que se almacena la dirección del operando
deseado. La desventaja es que la ejecución de la instrucción requiere dos referencias
a memoria para capturar el operando, una para captar su dirección y otra para
obtener su valor.

Direccionamiento de registros: El operando referenciado se encuentra en un registro.


El número de registro se especifica dentro de la instrucción en el campo operando.
Las ventajas son: (1) solo es necesario un campo pequeño de direcciones en la ins-
trucción; (2) el tiempo de acceso a un registro interno es mucho menor que a la
memoria principal. La desventaja es que el espacio de direcciones está muy limita-
do.

Direccionamiento indirecto con registro: La instrucción contiene en el campo ope-


rando el número del registro en el que se almacena la dirección de memoria del
operando deseado. La ventaja es que este direccionamiento emplea una referencia
menos a memoria que el direccionamiento indirecto.

Direccionamiento con desplazamiento: El campo operando contiene una dirección


relativa o desplazamiento (D). La instrucción también especifica, implı́cita o explı́ci-
tamente, otras posiciones de memoria de almacenamiento (R), usualmente registros
del procesador, conteniendo información adicional de direccionamiento. La direc-
ción efectiva se calcula a través de una suma (D+R). Los tres usos más comunes
del direccionamiento con desplazamiento son:

• Desplazamiento relativo: El registro referenciado implı́citamente es el contador


de programa (PC). La dirección efectiva es un desplazamiento relativo a la
dirección de la instrucción.
8 TEMA 4. EL PROCESADOR

• Direccionamiento con registro-base: El registro referenciado (implı́cita o explı́ci-


tamente) contiene una dirección de memoria, y el campo de dirección contiene
un desplazamiento desde dicha dirección.
• Indexado: El campo de operando referencia una dirección de memoria y el
registro referenciado contiene un desplazamiento positivo desde esa posición.

En la Figura 4.5 se muestra gráficamente un resumen de los modos de direccionamiento


vistos aquı́.

4.2.3. Operaciones del repertorio de instrucciones

El número de códigos de operación diferentes varı́a ampliamente de una máquina a


otra. Sin embargo, en todas las máquinas podemos encontrar los mismos tipos generales
de operaciones. Una clasificación tı́pica y útil es la siguiente:

Transferencias de datos. Las instrucciones que transfieren datos entre memoria y


registros se denominan instrucciones de transferencia de datos. Para acceder a una
palabra en memoria la instrucción debe proporcionar la dirección de memoria. La
instrucción de transferencia que mueve datos de memoria a algún registro se deno-
mina carga (load ). La instrucción complementaria transfiere datos de un registro a
memoria y se denomina almacenamiento (store).

Aritméticas. La mayorı́a de las máquinas proporcionan las operaciones artiméti-


cas básicas de suma, resta, multiplicación y división. Estas se tienen siempre para
números enteros con signo y, a menudo, para números en coma flotante. Otras ope-
raciones posibles son, por ejemplo, cálculo del valor absoluto, cambiar el signo al
operando o incrementar o decrementar el operando.

Lógicas. La mayorı́a de las máquinas también disponen de diversidad de opera-


ciones para manipular bits individuales dentro de una palabra o de otra unidad
direccionable. Están basadas en operaciones booleanas.

De Entrada/Salida. Son instrucciones de transferencia de datos en las cuales el


origen/destino es un módulo de E/S.

De control de flujo. En todos los tipos de operaciones discutidos hasta aquı́, la


siguiente instrucción a ejecutar es la inmediatamente posterior en memoria a la
instrucción en curso. Sin embargo, una fracción significativa de las instrucciones
de cualquier programa tienen como misión cambiar la secuencia de ejecución de
instrucciones. La operación que realiza la CPU es actualizar el contador de programa
para que contenga la dirección de alguna de las instrucciones que hay en memoria.
Las operaciones de control de flujo que se pueden encontrar en los repertorios de
instrucciones son:
4.2. EL REPERTORIO DE INSTRUCCIONES 9

Figura 4.5: Modos de direccionamiento

• Instrucciones de bifurcación, también llamadas de salto. Tienen como uno de


sus operandos la dirección de la siguiente instrucción a ejecutar.
• Instrucciones de salto condicional. Se efectúa la bifurcación (se actualiza el
10 TEMA 4. EL PROCESADOR

contador de programa con la dirección especificada en el operando) sólo si se


cumple una condición dada, en caso contrario se ejecuta la instrucción siguiente
de la secuencia (se incrementa el contador de programa de la forma habitual).
• Instrucciones de llamada a subrutina. En cualquier punto del programa se
puede invocar o llamar a una subrutina. Se ordena al computador que pase
a ejecutar la subrutina y que retorne después al punto en que tuvo lugar la
llamada. El uso de subrutinas requiere por tanto dos instrucciones básicas: una
instrucción de llamada, que produce una bifurcación desde la posición actual
al comienzo de la subrutina, y una instrucción de retorno de la subrutina al
lugar desde el que se llamó.

De control del sistema. Llamadas al sistema operativo para que realice algún
servicio: E/S, detener la ejecución del programa, ...

4.3. Repertorio de instrucciones del MIPS

El diseño del juego de instrucciones es un tema complejo y sujeto a un gran número de


compromisos. Existen tantos juegos de instrucciones como arquitecturas, cada uno con sus
ventajas y sus inconvenientes. No obstante, existen básicamente dos filosofı́as de diseño
en las que se pueden agrupar todas las arquitecturas: CISC y RISC. Los diseños CISC
(Complex Intruction Set Computer, computadora de conjunto de instrucciones complejo)
se basan en un juego de instrucciones muy rico con modos de direccionamiento potentes y
complejos. Esto implica que los programas necesitan menos instrucciones, con lo cual son
más fáciles de desarrollar y mantener por los programadores. Además, los programas ocu-
pan menos memoria. La filosofı́a RISC (Reduced Instruction Set Computer, computadores
de conjunto de instrucciones reducido) en contrapartida se basa en un número relati-
vamente pequeño de instrucciones disponibles, por lo regular unas 50, todas ellas muy
sencillas, con pocos modos de direccionamiento, pero que se ejecutan muy eficientemente.
En lo que resta del capı́tulo se estudiará un subconjunto del repertorio de instrucciones
de un computador real. El repertorio de instrucciones escogido proviene del MIPS, usado
por NEC, Nintendo, Silicon Graphics y Sony, entre otros, y es un tı́pico ejemplo de diseño
RISC.

4.3.1. Arquitectura del MIPS

Las primeras implementaciones de la arquitectura MIPS (familia R20x0 y R30x0)


consistieron en una unidad de proceso de enteros (la CPU) y un conjunto de procesadores
que realizaban tareas auxiliares u operan con otros tipos de datos, como números en coma
flotante. En la figura 4.6 se muestra el esquema del MIPS R2000.
El ancho de palabra de la arquitectura MIPS es de 32 bits. La arquitectura MIPS po-
see 32 registros genéricos de 32 bits ($0-$31) para utilización de la CPU, siendo el registro
4.3. REPERTORIO DE INSTRUCCIONES DEL MIPS 11

Memory

CPU Coprocessor 1 (FPU)

Registers Registers

$0 $0

$ 31 $31

Arithmetic Multiply
unit divide

Arithmetic
Lo Hi unit

Coprocessor 0 (traps and memory)


Registers

BadVAddr Cause
Status EPC

Figura 4.6: Esquema del MIPS R2000

$0 solo de lectura y con valor cero. De los restante registros, solo el $31 es implı́citamente
usado por una instrucción. Concretamente, por la instrucción de invocación de una subru-
tina (jal) y se utiliza para guardar la dirección de retorno, como veremos más adelante.
Adicionalmente, el MIPS contiene dos registros para poder operar con operandos de 64
bits, como sucede en el caso de la multiplicación y división, llamados hi (high) y lo (low).
En el cuadro 4.1 se puede ver la lista de registros del MIPS y sus usos.
Como se ha comentado antes, estos procesadores MIPS no disponen de unidad de coma
flotante incluida en el microprocesador, implementando estas funciones en coprocesadores
separados. La arquitectura MIPS tiene en cada coprocesador 32 registros de 32 bits para
coma flotante ($f0-$f31), que pueden ser organizados en 16 registros de doble precisión
con 64 bits (las designaciones par de los registros).
En cuanto al direccionamiento de la memoria, éste se realiza por bytes. Esto quiere
decir que las direcciones de memoria de 2 palabras consecutivas estarán separadas en 4
unidades (ya que las palabras son de 4 bytes). Cuando una palabra se carga desde memoria
a un registro o se pasa a memoria desde un registro, la dirección de memoria involucrada
ha de ser múltiplo de 4. Esto es lo que se denomina restricción de alineamiento. Las
direcciones que son múltiples de 4 se llaman direcciones alineadas.
Un aspecto importante en cualquier procesador con un ancho de palabra superior a 1
12 TEMA 4. EL PROCESADOR

Nombre Número Uso Preservado


en llamada
$zero 0 Valor constante 0 n.a.
$at 1 Reservado para el ensamblador n.a.
$v0-$v1 2-3 Valores para resultados y evalua- no
ción de expresiones
$a0-$a3 4-7 Paso de parámetros sı́
$t0-$t7 8-15 Registros temporales no
$s0-$s7 16-23 Registros que deben preservarse sı́
$t8-$t9 24-25 Registros temporales no
$k0-$k1 26-27 Reservado para núcleo de SO n.a.
$gp 28 Puntero global sı́
$sp 29 Puntero de pila sı́
$fp 30 Puntero de bloque de activación sı́
$ra 31 Dirección de retorno sı́
n.a.: no aplica

Cuadro 4.1: Registros del MIPS y su uso convencional en llamadas a procedimientos

byte es el ordenamiento de los bytes dentro de una palabra. Dicho ordenamiento puede
tomar dos alternativas: big endian o little endian. En little endian la dirección de un dato
es la dirección del byte menos significativo del dato. En big endian la dirección del dato
es el byte más significativo del mismo:
palabra de 4 bytes
Big Endian

A B C D
Little Endian
Este aspecto ha de tenerse en cuenta cuando se intercambia información entre dis-
tintas máquinas. Ejemplos de arquitecturas little endian son los procesadores x86, DEC
ALPHA y VAX. Ejemplos de arquitecturas big endian son IBM POWER, Motorola 6800
y 68k. Algunos procesadores (por ejemplo MIPS, PowerPC, Alpha y SPARC v9) permiten
configurar el comportamiento, estas arquitecturas reciben el nombre de bi-endian.

4.3.2. Tipos de instrucciones MIPS

Los tipos básicos de instrucciones que soporta el MIPS son los siguientes:

Transferencia de datos
Aritméticas y lógicas
De Control de Flujo
4.3. REPERTORIO DE INSTRUCCIONES DEL MIPS 13

• Salto condicional
• Bifurcación

Las caracterı́sticas más importantes de estas instrucciones en el procesador MIPS son:

La longitud de todas las instrucciones MIPS es de 32 bits.

Los operandos de las operaciones aritméticas son siempre registros. MIPS es, por
tanto, una arquitectura de carga/almacenamiento (registro-registro).

El acceso a memoria se hace a través de las operaciones de carga y almacenamiento


(transferencia de datos).

Para acceder a una palabra en memoria hay que indicar su dirección. MIPS direc-
ciona bytes individuales. No obstante, debe tenerse en cuenta que la mayor parte
de las instrucciones que acceden a memoria lo hacen de forma alineada, por lo que
la dirección a la que se accede debe ser múltiplo de 4.

4.3.3. Formatos de las instrucciones MIPS

Como comentábamos anteriormente, el número de bits de una instrucción MIPS es


siempre de 32, el mismo tamaño que una palabra. Cada instrucción MIPS se divide en
una serie de campos a los que se les da unos nombres para identificarlos fácilmente:

op: operación básica de la instrucción, tradicionalmente llamada código de opera-


ción.

rs: primer registro operando fuente.

rt: segundo registro operando fuente.

rd : registro operando destino, donde se almacena el resultado de la operación.

shamt: tamaño del desplazamiento (shift amount).

funct: función. Este campo selecciona la variante especı́fica de la operación del campo
op, y a veces se le denomina código de función.

El compromiso elegido por los diseñadores del MIPS es guardar todas las instrucciones
con la misma longitud, pero utilizar diferentes clases de formatos de instrucción para
diferentes clases de instrucciones. Los tres tipos de formatos posibles en MIPS son:

Formato tipo R: utilizado por las instrucciones aritméticas y lógicas.

Formato tipo I: utilizado por las instrucciones de transferencia, las de salto con-
dicional y las instrucciones con operandos inmediatos.
14 TEMA 4. EL PROCESADOR

Tipo - R

op rs rt rd shamt funct

6 bits 5 bits 5 bits 5 bits 5 bits 6 bits

Tipo - I
op rs rt direccion

6 bits 5 bits 5 bits 16 bits

Tipo - J
op direccion

6 bits 26 bits

Figura 4.7: Codificación de instrucciones en el MIPS

Formatos tipo J: utilizado por las instrucciones de bifurcación.

En la figura 4.7 se muestran los campos para cada uno de los tres tipos de formato.
Aunque tener múltiples formatos complica la circuiterı́a, se puede reducir la complejidad
guardándolos de forma similar. Por ejemplo, los tres primeros campos de los formatos
tipo-R y tipo-I son del mismo tamaño y tienen los mismos nombres. Los formatos se
distinguen por el valor del primer campo: a cada formato se le asigna un conjunto de
valores distintos en el primer campo y por lo tanto la circuiterı́a sabe si ha de tratar
la última mitad de la instrucción como tres campos (tipo-R) o como un campo simple
(tipo-I), o si la instrucción es tipo-J.

4.3.4. Instrucciones aritmético-lógicas

El tipo de formato de las instrucciones aritmético-lógicas es tipo-R y el número de


operandos es siempre tres. Estos operandos son siempre registros. El modo de direcciona-
miento empleado, por tanto, es direccionamiento de registro.
En la figura 4.8 se muestran las codificaciones en el lenguaje máquina MIPS para dos
ejemplos de instrucciones aritméticas, suma y resta. Para cada instrucción se muestra
también la codificación de cada campo en decimal y la representación simbólica de la
instrucción utilizando leguaje ensamblador. La instrucción add $rd,$rs1,$rs2 suma el
contenido de los registros $rs1 y $rs2 y almacena el resultado en $rd.
Muchas veces los programas usan constantes en las operaciones. Para usar una cons-
tante utilizando las instrucciones de la figura 4.8 habrı́a que cargarla de memoria al
registro para posteriormente sumarla. Una alternativa que evita los accesos a memoria es
ofrecer versiones de las instrucciones aritméticas en las cuales un operando es constante.
Se usa en este caso el formato de instrucción tipo-I y el modo de direccionamiento es
4.3. REPERTORIO DE INSTRUCCIONES DEL MIPS 15

add $7,$3,$6

0 3 6 7 0 32

000000 00011 00110 00111 00000 100000

31 25 20 15 10 5 0

sub $7,$3,$6

0 3 6 7 0 34

000000 00011 00110 00111 00000 100010

31 25 20 15 10 5 0

Figura 4.8: Estructuras del lenguaje MIPS para suma y resta

direccionamiento inmediato. En la figura 4.9 se muestra la estructura para el ejemplo de


la operación suma inmediata. La instrucción addi $rd,$rs1,inm suma el contenido de
$rs1 y el valor inm y almacena el resultado en $rd.

addi $8,$8,4

8 8 8 4

001000 01000 01000 0000 0000 0000 0100

31 25 20 15 0

Figura 4.9: Estructura del lenguaje MIPS para la suma inmediata

Los operandos constantes aparecen con frecuencia, y situarlos dentro de las instruc-
ciones aritméticas hace que se ejecuten mucho más rápido.

4.3.5. Instrucciones de transferencia

Las instrucciones de transferencia son instrucciones tipo-I. En la figura 4.10 se mues-


tran las codificaciones en lenguaje MIPS para dos ejemplos de operaciones de transferencia
muy comunes, la carga y el almacenamiento de una palabra (lw y sw respectivamente).
El direccionamiento usado en este tipo de instrucciones es direccionamiento con desplaza-
miento (registro-base). La instrucción lw $rt,desp($rs) carga la palabra almacenada en
la dirección de memoria $rs+desp en el registro $rt. La instrucción sw $rt,desp($rs)
almacena la palabra contenida en el registro $rt en la dirección de memoria $rs+desp.
16 TEMA 4. EL PROCESADOR

Los 16 bits para especificar el desplazamiento significan que una instrucción de carga
puede cargar cualquier palabra dentro de la región ±215 de la dirección del registro base
$rs.

lw $8,1200($15)

35 15 8 1200

100011 01111 01000 0000 0100 1011 0000

31 25 20 15 0

sw $8,1200($15)

43 15 8 1200

101011 01111 01000 0000 0100 1011 0000

31 25 20 15 0

Figura 4.10: Estructura del lenguaje MIPS para las instrucciones de transferencia

Existe también otra instrucción de transferencia que implementa MIPS, es la llamada


instrucción load upper inmediate (lui) que sirve especı́ficamente para almacenar los 16
bits de la parte alta de una constante en un registro. La instrucción lui $rt,inm almacena
los 16 bits de inm en los 16 bits más significativos del registro $rt poniendo los otros 16
bits a cero ($rt=inm((16). En la figura 4.11 se puede ver la operación lui.

Version en lenguaje maquina: lui $8,255

001111 00000 01000 0000 0000 1111 1111

Contenido del registro $8


tras la ejecucion:

0000 0000 1111 1111 0000 0000 0000 0000

Figura 4.11: El efecto de la instrucción lui

4.3.6. Instrucciones de salto condicional

Lo que distingue a un computador de una simple calculadora es la habilidad de tomar


decisiones. Basándose en los datos de entrada y los valores creados durante la compu-
tación, el computador ejecuta diferentes instrucciones. La toma de decisiones se represen-
ta comúnmente en los lenguajes de programación de alto nivel usando la sentencia if (si
4.3. REPERTORIO DE INSTRUCCIONES DEL MIPS 17

condicional), combinada a veces con sentencias go to (ir a) y etiquetas. El lenguaje máqui-


na del MIPS incluye dos instrucciones de toma de decisiones, similares a una sentencia if
con un go to. Las instrucciones beq (branch if equal ) y bne (branch if not equal ). Estas
dos instrucciones se conocen tradicionalmente como saltos condicionales. Son instruccio-
nes de tipo-I y el modo de direccionamiento empleado por ambas es direccionamiento
con desplazamiento relativo (direccionamiento con desplazamiento relativo al PC donde
el desplazamiento se indica en número de palabras en vez de en número de bytes).

La instrucción beq $rs,$rt,despl significa ir a la instrucción que se encuentra en


la dirección de memoria (PC+4)+4*despl si el valor del registro $rs es igual al valor
del registro $rt. La instrucción bne $rs,$rt,despl significa ir a la instrucción que se
encuentra en la dirección de memoria (PC+4)+4*despl si el valor de $rs no es igual al
valor en $rt. En ensamblador, el uso de etiquetas libera al programador del tedioso cálculo
de las direcciones de salto. Estas instrucciones se muestran en la figura 4.12. En este caso
se utilizan etiquetas. El ensamblador calculará el desplazamiento necesario para saltar a
L1.

beq $19,$20,L1

4 19 20 L1

000100 10011 10100 0001 1000 0011 1101

31 25 20 15 0

bne $19,$20,L1

5 19 20 L1

000101 10011 10100 0001 1000 0011 1101

31 25 20 15 0

Figura 4.12: Estructura en lenguaje MIPS de las instrucciones de salto condicional

La prueba de igualdad y desigualdad es probablemente la más habitual, pero a veces es


útil establecer comparaciones del tipo “menor que”. Para ello se dispone de la instrucción
lógica MIPS slt (set on less than), activar si es menor que. El efecto de la instrucción slt
$rd,$rs,$rt es $rd=($rs<$rt). También existe la versión de esta instrucción utilizando
operandos inmediatos: slti $rd,$rs,inm es $rd=($rs<inm) La estructura de ambas
instrucciones se muestra en la figura 4.13.
18 TEMA 4. EL PROCESADOR

slt $8,$19,$20

0 19 20 8 0 42

slti $8,$19,10

10 18 8 10

Figura 4.13: Estructura de las instrucciones slt y slti en el MIPS

4.3.7. Instrucciones de bifurcación

Una bifurcación se puede ver como un salto incondicional, es decir, la instrucción


obliga a la máquina a seguir siempre el salto. Para distinguir entre saltos condicionales e
incondicionales, el nombre MIPS para este tipo de instrucción es jump.
j L1

2 L1

jr $8

0 8 0 0 0 8

Figura 4.14: Estructura de las instrucciones jump y jump register en el MIPS

La instrucción de bifurcación jump (j) es de tipo-J y su modo de direccionamiento es


pseudodirecto. El efecto de la instrucción j es saltar a la dirección de salto especificada
por la instrucción. La dirección de salto son los 26 bits de la instrucción desplazados 2
posiciones a la izquierda (es decir, se multiplica por 4) y concatenados con los 4 bits de
mayor peso del contador de programa (P C ← (P C + 4)31−28 IR25−0 00). Al igual que en
las instrucciones de salto condicional, el ensamblador permite el uso de etiquetas.
La instrucción de bifurcación jump register (jr) es de tipo-R y utiliza modo de direc-
cionamiento indirecto con registro. El efecto de la instrucción es saltar a la dirección de
memoria almacenada en el registro.
En la figura 4.14 se muestran estas instrucciones y su formato.

4.3.8. Modos de direccionamiento del MIPS

Resumimos aquı́ los modos de direccionamiento del MIPS:

Modo de direccionamiento registro, donde el operando es un registro.


4.3. REPERTORIO DE INSTRUCCIONES DEL MIPS 19

Modo de direccionamiento base más desplazamiento, donde el operando está en una


localización de memoria cuya dirección es la suma de un registro y una constante
presente en la propia instrucción.

Modo de direccionamiento inmediato, donde el operando es una constante que apa-


rece en la misma instrucción.

Modo de direccionamiento relativo al PC, donde la dirección es la suma del conta-


dor de programa (PC) y la constante de la instrucción multiplicada por 4. Como se
verá más adelante, es conveniente incrementar el PC pronto para apuntar a la si-
guiente dirección. De aquı́ que la dirección MIPS es realmente relativa a la dirección
de la siguiente instrucción (PC+4) en lugar de a la instrucción actual (PC).

Modo de direccionamiento pseudodirecto, donde la dirección de salto son los 26 bits


de la instrucción desplazados 2 posiciones a la izquierda y concatenados con los 4
bits de mayor peso del contador de programa. Esto limita los saltos a 256MB, si
necesitaramos saltar más allá tendrı́amos que sustituir la instrucción jump por jump
register precedida por otra instrucción para cargar la dirección de 32 bits completa
en el registro.

Una operación simple puede usar más de un modo de direccionamiento. La operación


de sumar, por ejemplo, usa tanto el direccionamiento inmediado (si usamos la instrucción
addi), como el direccionamiento registro (si usamos la instrucción add). La figura 4.15
muestra, para cada modo de direccionamiento, cómo se localiza el operando correspon-
diente.

4.3.9. Llamadas a subrutinas

Un procedimiento o subrutina es una herramienta que los programadores usan para


estructurar programas con el fin de hacerlos fácilmente comprensibles y permitir que
el código sea reutilizado. Los parámetros de las subrutinas permiten pasar valores a la
subrutina y que esta retorne resultados.
En la ejecución de una subrutina el programa debe seguir los siguientes pasos:

1. Situar los parámetros en un lugar donde la subrutina pueda acceder a ellos.

2. Transferir el control a la subrutina.

3. Adquirir los recursos de almacenamiento necesarios para el procedimiento.

4. Realizar la tarea deseada.

5. Situar el valor del resultado en un lugar donde el programa que lo ha llamado pueda
acceder a él.

6. Retornar el control al punto de origen.


20 TEMA 4. EL PROCESADOR

x4

x4

4 bits

Figura 4.15: Modos de direccionamiento del MIPS.


4.3. REPERTORIO DE INSTRUCCIONES DEL MIPS 21

En la figura 4.16 se muestra gráficamente la distribución de la memoria para programas


y datos. El espacio de memoria de un programa de usuario se organiza en varios segmentos:

Segmento de texto: Es un segmento de tamaño fijo que contiene las instrucciones


del programa ejecutable.

Segmento de datos: Es un segmento de tamaño variable dividido en varias secciones


para los distintos tipos de datos.

Montı́culo (heap): Contiene los datos reservados dinámicamente y crece de direccio-


nes menores a mayores.

Segmento de pila (stack): Avanza de direcciones mayores a menores. Se utilizará en


las llamadas a procedimientos.

$sp 7 f f f f f f f hex Stack

Dynamic data
$gp 1000 8000 h e x Static data
1000 0000 h e x
Text
pc 0040 0000 h e x
Reserved
0

Figura 4.16: Distribución de la memoria para programas y datos en el MIPS

En general, en la mayorı́a de los procesadores la comunicación entre un segmento de


código que llama a una subrutina (invocador) y la subrutina se realiza mediante la pila. El
invocador sitúa los parámetros en la pila. Posteriormente la subrutina coloca también en
la pila la información que debe guardar temporalmente y al finalizar libera dicho espacio
y deja en la pila el resultado de la subrutina. Finalmente el invocador recupera de la pila
el resultado.
La pila es un espacio de memoria con estructura tipo LIFO (Last In First Out), en
la que el último que entra es el primero en salir. Esta estructura necesita un puntero que
apunte a la dirección más recientemente utilizada, para guardar dónde deberı́a de situar el
22 TEMA 4. EL PROCESADOR

siguiente elemento a volcar, o para saber dónde se pueden encontrar los valores guardados.
Por razones históricas, la pila crece de direcciones de memoria superiores a inferiores. Por
tanto, para poner valores en la pila tendremos que restar al puntero de pila y para quitar
valores tendremos que sumar al puntero de pila.
Los programas del MIPS reservan un registro solo para la pila, stack pointer ($sp) o
puntero de pila. Veamos un par de ejemplos de como introducir datos en la pila y como
transferirlos desde ella.
Para realizar la operación de push (guardar) salvando dos registros en la pila:

addi $sp,$sp,-8 # ajusto la pila para a~


nadir dos elementos
sw $v0,0($sp) # salvo el registro $2
sw $v1,4($sp) # salvo el registro $3

Para realizar la operación de pop (recuperar) transfiriendo los datos de la pila a dos
registros:

lw $v0,0($sp) # restaura el registro $2


lw $v1,4($sp) # restaura el registro $3
addi $sp,$sp,8 # ajusta el puntero de la pila para eliminar
# dos elementos
Sin embargo, es más rápido acceder a registros que a memoria, de aquı́ que el convenio
de llamadas MIPS se apoya en el banco de registros para evitar accesos a pila y acelerar
ası́ la ejecución de los programas. Los programas MIPS asignan por convenio los siguientes
registros de los 32 disponibles en cada llamada de procedimiento:

$a0-$a3: cuatro registros de argumentos en los cuales se pasan parámetros. Si se


necesitan más parámetros se pasan a través de la pila.

$v0-$v1: dos registros de valores en los cuales se retornan valores.

$ra: un registro de retorno de dirección para volver al punto de origen.

Además de esta asignación de registros, el lenguaje ensamblador del MIPS incluye


una instrucción solo para procedimientos (jal): salta a una dirección y simultáneamente
salva la dirección de retorno (dirección de la siguiente instrucción) en el registro $ra. La
instrucción jal (jump-and-link ) se muestra en la figura 4.17. Utiliza direccionamiento
pseudodirecto al igual que jump para el cálculo de la dirección de salto. El ensamblador
permite el uso de etiquetas para especificar la dirección de salto.
La dirección de retorno es necesaria porque el mismo procedimiento se puede llamar
desde diferentes puntos del programa. La instrucción jal guarda P C + 4 en el registro
$ra para encadenar la siguiente instrucción con el retorno del procedimiento.
4.3. REPERTORIO DE INSTRUCCIONES DEL MIPS 23

jal direccion_subrutina

3 direccion_subrutina

Figura 4.17: Estructura de la instrucción jump-and-link en MIPS.

Para realizar el salto de retorno disponemos de la instrucción jump register comen-


tada anteriormente: jr $ra salta a la dirección almacenada en el registro $ra, que es
justamente lo que se requiere.

Resumiendo, el programa que llama al procedimiento (invocador) pone los valores


de los parámetros en $a0-$a3 y usa la instrucción jal para saltar al procedimiento. El
procedimiento (también conocido por invocado) realiza los cálculos, pone los resultados
en $v0-$v1 y devuelve el control al invocador usando jr $ra.

Salvaguarda de registros

Si un procedimiento modifica los registros utilizados por la rutina invocadora los va-
lores de los registros deben ser guardados y restaurados utilizando para ello la pila. Los
dos convenios estándares para guardar y restaurar registros son:

Guardar invocador (caller save): el procedimiento invocador es el responsable de


guardar y restaurar los registros que necesite conservar.

Guardar invocado (callee save): el invocado es el responsable de guardar y restaurar


cualquier registro que vaya a utilizar.

Para evitar salvar y restaurar un registro cuyo valor nunca se usa, los programas MIPS
ofrecen dos clases de registros (ver cuadro 4.1):

Registros temporales ($t0-$t9): Se utilizan para guardar datos temporales que no


necesitan ser preservados entre llamadas. No son preservados por el invocado (pro-
cedimiento llamado) en una llamada de procedimiento. Estos registros deben ser
guardados por el invocador en caso de que necesite conservar sus valores.

Registros salvados ($s0-$s7): Se utilizan para almacenar valores de vida más larga
que se deben preservar durante las llamadas. Si el invocado los usa salva previamente
su valor.

Esta simple convención reduce el volcado de registros.


24 TEMA 4. EL PROCESADOR

4.4. Diseño de la Unidad Central de Proceso

La unidad central de proceso es la encargada de la ejecución de las instrucciones


especificadas por el programa. Este módulo esta formado por dos bloques, el Camino de
Datos y la Unidad de Control.

Camino de Datos: se encarga de realizar todas las operaciones requeridas por las
instrucciones del nivel de lenguaje máquina. Contiene los siguientes elementos (ver
Figura 4.18):

• Unidad Aritmético-Lógica (ALU): está formada por los circuitos digitales ne-
cesarios para realizar las operaciones aritméticas y lógicas requeridas por las
instrucciones.
• Banco de Registros: contiene los registros que almacenan temporalmente los
datos y resultados con los que opera la ALU.
• Registros Especiales: contienen información necesaria para la correcta ejecución
de las instrucciones y del programa. Por ejemplo, la instrucción en ejecución
(registro de instrucciones, IR), la dirección de la siguiente instrucción a ejecutar
(contador de programa, PC), etc.
• Buses internos: son los caminos de conexión entre los distintos elementos que
forman la Unidad de Proceso.

Figura 4.18: Estructura del Camino de Datos


4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 25

Unidad de Control: se encarga de gestionar el secuenciamiento de las operaciones


que se realizan en el Camino de Datos para que las instrucciones se ejecuten adecua-
damente. Este secuenciamiento se realiza generando en el orden correcto las señales
de control necesarias para coordinar el funcionamiento del resto de unidades del
computador. La unidad de control es un sistema secuencial y su complejidad de-
pende básicamente de la complejidad del Camino de Datos y del número y tipo de
instrucciones a ejecutar.

En general, la ejecución de una instrucción se puede entender como un proceso dividido


en 5 pasos:

Captar la instrucción: El procesador debe leer la instrucción de la memoria.

Interpretar las instrucción: La instrucción debe decodificarse para determinar qué ac-
ción es necesaria.

Captar datos: La ejecución puede exigir leer datos de la memoria o de un módulo


de E/S.

Procesar datos: La ejecución de una instrucción puede exigir llevar a cabo alguna
operación aritmética o lógica.

Escribir datos: Los resultados de una ejecución pueden tener que ser escritos en la
memoria o en un módulo de E/S.

En las siguientes secciones estudiaremos como llevar a cabo el diseño de una Unidad
Central de Proceso (Camino de Datos y Unidad de Control). Para ello tomaremos como
ejemplo el procesador MIPS. En concreto, diseñaremos una Unidad Central de Proceso
para ejecutar el siguiente subconjunto del repertorio de instrucciones del MIPS:

Las instrucciones de acceso a memoria lw y sw

Las instrucciones aritmético-lógicas add, sub, and, or y slt

La instrucción de salto condicional beq

La instrucción de salto incondicional j

4.5. Construcción del Camino de Datos


Una forma razonable de empezar el diseño de una Unidad Central de Proceso es la
construcción del Camino de Datos. Examinaremos para ello los componentes que serán
necesarios para la ejecución de cada una de las instrucciones. Utilizaremos tanto sistemas
combinacionales como secuenciales. Para los sistemas secuenciales asumiremos sincroni-
zación por flancos.
26 TEMA 4. EL PROCESADOR

4.5.1. Carga de la instrucción

Para ejecutar cualquier instrucción se debe empezar por cargar la instrucción desde
memoria. La dirección de memoria nos la indica el registro de 32 bits contador de programa
(PC). Para ejecutar la siguiente instrucción el contador de programa ha de incrementarse
para que apunte 4 bytes más adelante. El Camino de Datos para este paso se muestra en
la figura 4.19.

Sumador
4

PC Dirección
Instrucción
Memoria de
instrucciones

Figura 4.19: Parte del Camino de Datos correspondiente a la búsqueda de la instrucción


e incremento del contador de programa

4.5.2. Instrucciones aritmético-lógicas

Las instrucciones aritmético-lógicas son instrucciones tipo R que leen dos registros,
operan con la ALU los contenidos de estos registros y escriben el resultado. El ejemplo
tı́pico de este tipo de instrucciones es add $t1, $t2, $t3, que suma los contenidos de
$t2 y $t3 y escribe el resultado en $t1. En la figura 4.20 se muestra el Camino de Datos
para estas instrucciones suponiendo que ya se ha obtenido la instrucción. Los registros
de 32 bits del procesador se agrupan en un banco de registros. Se puede acceder a cada
uno de los registros especificando su número. El banco de registros tiene dos puertos de
lectura y uno de escritura. Para escribir hay que activar explı́citamente la señal de control
de escritura. Las entradas que indican el número de registro a leer o escribir son todas de
5 bits, mientras que las salidas (lı́neas de datos) son de 32 bits.
Necesitaremos una ALU que pueda realizar las operaciones sumar, restar, AND, OR
y realizar la comparación set on less than (slt). El cuadro 4.2 muestra las lı́neas de
control de la ALU con las correspondientes operaciones. La ALU admitirá como entrada
dos operandos de 32 bits (a y b) y una lı́nea de control de tres bits para seleccionar la
operación a realizar. Ofrecerá como salida el resultado de la operación, también de 32 bits,
un bit de acarreo, una salida de detección de desbordamiento y una salida de detección de
cero como se ilustra en la figura 4.21. La salida Cero de la ALU se utilizará en la realización
de los saltos condicionales como veremos más adelante. La salida de Desbordamiento se
usará para la detección de excepciones.
4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 27

3 Operación de la ALU
Reg. de
Instrucción lectura 1

REGISTROS
Dato ALU
Reg. de leído 1
lectura 2 Cero

Reg. de Resultado
escritura Dato de la ALU

Dato a leído 2
escribir
EscribirReg

Figura 4.20: Parte del Camino de Datos correspondiente a las instrucciones aritmético-
lógicas (tipo R)

lı́neas de control de la ALU función


000 and
001 or
010 suma
110 resta
111 slt

Cuadro 4.2: Valores de las tres lı́neas de control de la ALU y las operaciones correspon-
dientes.

4.5.3. Instrucciones de transferencia de datos

Las instrucciones de carga y almacenamiento son instrucciones tipo I con el siguiente


formato: lw $t1, desp1($t2) o sw $t1, desp1($t2). Estas instrucciones leen o escri-
ben un dato en memoria. La dirección de memoria se calcula añadiendo al registro base
($t2) el campo de desplazamiento (positivo o negativo) de 16 bits contenido en la ins-
trucción. El desplazamiento se extiende a 32 bits antes de realizar la suma en la ALU.
Si la instrucción es la sw, el dato a almacenar ha de leerse del registro $t1 del banco de
registros. En caso de lw, el valor leı́do de memoria debe escribirse en el registro $t1. La
figura 4.22 muestra el Camino de Datos para este tipo de instrucciones. Los identificado-
res de registros para el banco están en los campos de la instrucción, ası́ como el valor del
desplazamiento, el cual tras extender el signo se convierte en el segundo operando de la
ALU. La memoria de datos tiene señales de control de lectura y escritura, una entrada de
dirección, una entrada de datos para la escritura y una salida de datos para la lectura. La
señal de control de lectura de la memoria es necesaria para evitar el acceso a posiciones
no válidas.
28 TEMA 4. EL PROCESADOR

Figura 4.21: Sı́mbolo de la ALU


3 Operación de la ALU
Reg. de
Instrucción lectura 1 EscribirMem
REGISTROS

Dato ALU
Reg. de leído 1
lectura 2 Cero

Reg. de Resultado Dato


de la ALU Dirección
escritura Dato leído
Dato a leído 2 Memoria
escribir de Datos
EscribirReg Dato a
escribir
16 32
Extensión
de signo
LeerMem

Figura 4.22: Parte del Camino de Datos correspondiente a las instrucciones de acceso a
memoria

4.5.4. Instrucción de salto condicional

La instrucción beq es una instrucción tipo I con 3 operandos, dos registros y un


desplazamiento de 16 bits utilizado para calcular la dirección destino del salto. Su formato
es beq $t1, $t2, despl. Evalúa si el contenido de los registros $t1 y $t2 son iguales,
si la condición se cumple aplica un salto relativo a la dirección de la instrucción con
signo. Es la dirección PC+4 la que se utilizará como base para el cálculo de la dirección
destino. Para realizar esta instrucción se ha de calcular la dirección destino del salto:
(PC+4)+4*despl. Los 16 bits del campo desplazamiento se extienden a 32 y se desplazan
a la izquierda 2 posiciones para multiplicar por 4. Además de calcular la dirección de
salto, se tiene que determinar si se realiza el salto o no. Si la condición se cumple, es
decir, los dos operandos son iguales, la dirección de salto calculada pasa a ser el nuevo
PC. Si los operandos son diferentes, el PC+4 deberı́a reemplazar al actual. La figura 4.23
muestra el Camino de Datos para esta instrucción. Para calcular la dirección de salto se
4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 29

incluye una unidad de extensión de signo y un sumador. Para la comparación se necesita


utilizar el banco de registros y la ALU. A la ALU entran los dos datos a comparar, la
señal de control de la ALU se configura para hacer una resta, de esta forma si son iguales
se activará la salida Cero de la ALU.

PC +4 del camino de datos de instrucciones

Resultado Destino salto


Desp. Sumador
2 bits a
la izq.
3 Operación de la ALU
Reg. de
Instrucción lectura 1
REGISTROS

Dato
Reg. de leído 1
lectura 2 Decidir si se
Cero hace el salto
Reg. de
escritura Dato ALU
Dato a leído 2
escribir
EscribirReg

16 32
Extensión
de signo

Figura 4.23: Parte del Camino de Datos correspondiente a la instrucción de salto condi-
cional (beq)

4.5.5. Instrucción de salto incondicional

La instrucción de salto incondicional (j) es una instrucción tipo J con un modo de


direccionamiento pseudodirecto. Esta instrucción reemplaza los 28 bits de menor peso del
PC con los 26 bits de menor peso de la instrucción desplazados 2 bits hacia la izquierda.
No se necesita hardware adicional para llevar a cabo esta instrucción.

4.5.6. Camino de Datos completo

El Camino de Datos necesario para la ejecución del subconjunto de instrucciones ele-


gido estará formado por la combinación de los elementos explicados en las subsecciones
anteriores. Como hemos visto en la sección 4.4, la ejecución de una instrucción la po-
demos dividir en 5 pasos, correspondiendo cada uno de ellos a diferentes operaciones de
las unidades funcionales requeridas. Cada paso lo vamos a ejecutar en un ciclo de reloj
diferente, de esta forma podremos utilizar una determinada unidad funcional más de una
vez en una instrucción siempre y cuando se haga en ciclos diferentes, reduciendo ası́ la
30 TEMA 4. EL PROCESADOR

cantidad de hardware empleado. Ası́ por ejemplo, las sumas realizadas para calcular la
siguiente instrucción a ejecutar (ver figuras 4.19 y 4.23) se pueden realizar con la ALU
y no se necesitan sumadores independientes para esa operación. La ALU llevará a cabo
diferentes operaciones dependiendo de la instrucción que se ejecute y del ciclo de ejecución
en el que nos encontremos:

Cuando se realice la carga de la instrucción, sumará el PC+4 para incrementar el


contador del programa y que este apunte a la siguiente instrucción a ejecutar.

En el caso de instrucción de carga/almacenamiento, calculará la dirección de me-


moria sobre la que leer o escribir sumando a un operando almacenado en registro el
campo desplazamiento con el signo extendido.

En el caso de instrucción tipo R, realizará una operación aritmética o lógica (and,


or, add, sub y slt) con 2 operandos almacenados en los registros.

En el caso de salto condicional, evaluará la condición de salto restando 2 operandos


almacenados en los registros. También calculará la dirección de salto sumando al PC
incrementado los 16 bits menos significativos de la instrucción con el signo extendido
y desplazados dos bits a la izquierda.

Del mismo modo, no se necesita una memoria para instrucciones y otra para datos, ya
que el acceso a la memoria de instrucciones y a la de datos se realiza en ciclos diferentes
de la ejecución.
Al finalizar cada ciclo todos los datos que vayan a utilizarse en el siguiente ciclo se
deben almacenar en un elemento de almacenamiento (memoria o registro). Los datos a
utilizar por las siguientes instrucciones en ciclos posteriores se almacenarán en elementos
de almacenamiento visibles al programador (el banco de registros, el PC o la memoria).
En cambio, los datos que va utilizar la misma instrucción en ciclos posteriores deben
guardarse en registros temporales.

Registro de Reg. de
instrucciones lectura 1
Memoria
REGISTROS

Dato A
P Reg. de
Dirección leído 1
C lectura 2 Salida
Instrucciones ALU
o datos Reg. de ALU
escritura Dato
Dato Registro de leído 2 B
Dato a
datos de escribir
memoria

Figura 4.24: Visión de alto nivel del Camino de Datos del MIPS

La figura 4.24 muestra una visión de alto nivel del Camino de Datos completo. En
este diseño se utiliza una única ALU en vez de una ALU y dos sumadores, una memoria
4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 31

única para instrucciones y datos, y se han añadido registros temporales tras cada unidad
funcional para almacenar la salida de dicha unidad hasta que este valor vaya a utilizarse
en el siguiente ciclo. En concreto, se han añadido los siguientes registros temporales:

El registro de instrucción (IR) y el registro de datos de memoria (MDR) se añaden


para almacenar la salida de la memoria tras la lectura de una instrucción o un dato,
respectivamente. Se utilizan dos registros separados, ya que, como se verá más tarde,
ambos valores se necesitarán en un mismo ciclo.
Los registros A y B se utilizan para guardar los valores de los registros operandos
leı́dos del banco de registros.
El registro SalidaALU almacena la salida de la ALU.

Todos los registros, excepto el IR, guardan datos entre dos ciclos de reloj consecutivos
y por tanto no necesitarán señal de escritura. El IR sı́ necesita conservar la instrucción
hasta el final de su ejecución y por lo tanto sı́ requiere de esa señal de control.
Debido a que se utilizarán varias unidades funcionales para diferentes propósitos,
será necesario introducir multiplexores para poder escoger entre diferentes entradas. Se
necesita un MUX para seleccionar:

el origen de la dirección de acceso a memoria (el PC para acceder a instrucciones,


el registro SalidaALU para acceder a datos).
el registro de destino, que estará indicado por los bits 16-20 (rt) en los casos de ins-
trucciones de carga y por los bits 11-15 (rd) en los casos de instrucciones aritmético-
lógicas.
el dato a escribir, que será un dato de la memoria en el caso de instrucciones de
carga y la salida de la ALU en el caso de instrucciones aritmético-lógicas.
la primera entrada de la ALU, que podrá ser el registro A o el PC.
la segunda entrada de la ALU, que podrá ser el registro B (en el caso de instrucción
aritmética lógica o instrucción de salto condicional), el número 4 (utilizado para
incrementar el PC), el campo desplazamiento con el signo extendido (en el caso
de instrucciones de transferencia de datos) o el campo desplazamiento con el signo
extendido y desplazado 2 bits a la izquierda (para el cálculo de la dirección destino
en los saltos condicionales).
la dirección de la siguiente instrucción a ejecutar, que se almacenará en PC y que
podrá ser PC+4, la dirección de salto calculada por la ALU en caso de salto con-
dicional o la dirección de salto indicada en la propia instrucción en caso de salto
incondicional. En este último caso, la dirección destino se obtiene mediante el des-
plazamiento de los 26 bits de menor peso de la instrucción 2 bits a la izquierda
(añadiendo 00 como bits de menor peso) y concatenando los 4 bits de mayor peso
de PC+4 como bits de mayor peso.
32 TEMA 4. EL PROCESADOR

La figura 4.25 muestra el Camino de Datos completo para ejecutar las instrucciones
básicas del MIPS.

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0

REGISTROS
C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.25: Camino de Datos para ejecutar las instrucciones básicas del MIPS

El primer paso en la ejecución de una instrucción es común a todas las instrucciones y


consiste en el almacenamiento de la instrucción a ejecutar en el registro de instrucción. Se
envı́a el PC a memoria como dirección, se efectúa la lectura de la instrucción y se escribe
en el registro de instrucciones (IR).También se incrementa el PC en cuatro para apuntar
a la siguiente instrucción a ejecutar. La figura 4.26 muestra la parte del Camino de Datos
que se utiliza. Debido a que nuestro diseño utiliza sincronización por flanco, se puede leer
el contenido de un registro que se vaya a escribir ya que el nuevo valor no será accesible
hasta el siguiente ciclo de reloj. En este caso, el incremento del PC y la búsqueda de la
instrucción puede realizarse en paralelo ya que el nuevo valor del PC no será visible hasta
el siguiente ciclo.

A continuación describiremos como se utiliza este Camino de Datos para cada una de
las instrucciones consideradas.

Instrucciones aritmético-lógicas

Si la instrucción a ejecutar es una instrucción aritmético lógica, el siguiente paso será la


búsqueda de los registros con los operandos, la ejecución de la operación aritmético-lógica
sobre los operandos y la escritura del resultado en el registro destino.

La figura 4.27 muestra la parte del Camino de Datos que se utiliza para la búsqueda de
los registros. En esta etapa se leen los dos registros indicados por rs y rt y se almacenan
en los registros temporales A y B.
4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 33

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0

REGISTROS
C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.26: Camino de Datos: etapa de carga de la instrucción

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0
REGISTROS

C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.27: Camino de Datos: búsqueda de registros (instrucción tipo R e instrucción


sw)
34 TEMA 4. EL PROCESADOR

La figura 4.28 muestra en rojo la parte del Camino de Datos que se utiliza para la
ejecución de la operación y en rosa lo que se utiliza de ciclos anteriores. En esta etapa
la ALU lleva a cabo la operación especificada en el código de función sobre los datos
almacenados en A y B en el ciclo anterior y almacena el resultado en el registro SalidaALU.

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0

REGISTROS
C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.28: Camino de Datos: instrucción tipo R, ejecución

La figura 4.29 muestra en rojo la parte del Camino de Datos que se utiliza para escribir
el resultado (almacenado en el ciclo anterior en el registro SalidaALU) en el registro destino
especificado por el campo rd de la instrucción (bits 15-11).

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0
REGISTROS

C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.29: Camino de Datos: instrucción tipo R, escritura de resultado

En total, este tipo de instrucciones necesitarán 4 ciclos de reloj para ejecutarse.


4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 35

Instrucción lw

Si la instrucción a ejecutar es un load (lw $t1, desp1($t2)) el siguiente paso a la


carga de la instrucción será el cálculo de la dirección de memoria a leer, la lectura del
dato y el almacenamiento del mismo en el registro destino.

La dirección de memoria se calcula sumando al registro base ($t2) el campo des-


plazamiento. Por tanto, antes de calcular la dirección de memoria tendremos que leer
el registro base y almacenarlo en el registro temporal A para poder operar con él. La
figura 4.30 muestra el Camino de Datos utilizado para esta operación.

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0
REGISTROS

C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.30: Camino de Datos: instrucción lw, búsqueda de registro

La figura 4.31 muestra la parte del Camino de Datos que se utiliza para calcular la
dirección de memoria utilizando el dato almacenado en el registro A en el ciclo anterior.

A continuación se accede a memoria y se carga una palabra en el registro MDR. La


dirección de memoria que se utiliza se ha calculado en el ciclo anterior y se encuentra
almacenada en SalidaALU. La figura 4.32 muestra en rojo la parte del Camino de Datos
que se utiliza y en rosa lo que se utiliza de ciclos anteriores.

Las instrucción se completa escribiendo el valor leı́do de memoria, almacenado en el


ciclo anterior en el registro MDR, en el banco de registros. La figura 4.33 muestra en rojo
la parte del Camino de Datos que se utiliza en esta etapa y en rosa lo que se utiliza de
ciclos anteriores.

Esta instrucción necesita un total de 5 ciclos de reloj para completarse.


36 TEMA 4. EL PROCESADOR

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0

REGISTROS
C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.31: Camino de Datos: instrucción lw, cálculo de la dirección de memoria

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0
REGISTROS

C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.32: Camino de Datos: instrucción lw, lectura de memoria


4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 37

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0

REGISTROS
C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.33: Camino de Datos: instrucción lw, almacenamiento de dato en registro

Instrucción sw

Si la instrucción a ejecutar es un store, los siguientes pasos después de la carga de


la instrucción serán la búsqueda del registro a almacenar, el cálculo de la dirección de
memoria en la que escribir el dato y la escritura del mismo.
Como en la instrucción lw, la dirección de memoria se calcula sumando al registro base
el campo desplazamiento. Por tanto, antes de calcular la dirección de memoria tendremos
que leer el registro base y almacenarlo en el registro temporal A para poder operar con
él. Esta operación se puede hacer en paralelo a la carga del registro a almacenar. La
figura 4.27 muestra el Camino de Datos que se utiliza para estas operaciones.
La figura 4.34 muestra en rojo la parte del Camino de Datos que se utiliza para calcular
la dirección de memoria utilizando el dato almacenado en el registro A en el ciclo anterior.
A continuación se accede a memoria y se escribe el dato almacenado en el registro B.
La dirección de memoria que se utiliza se ha calculado en el ciclo anterior y se encuentra
almacenada en SalidaALU. La figura 4.35 muestra en rojo la parte del Camino de Datos
que se utiliza y en rosa lo que se utiliza de ciclos anteriores.
Esta instrucción necesita un total de 4 ciclos para ejecutarse.

Instrucción beq

Si la instrucción a ejecutar es una beq, una vez cargada la instrucción se almacenarán


los operandos en los registros A y B, se calculará la dirección de salto y se compararán
los valores de los operandos utilizando la ALU para determinar si el salto se toma o no.
38 TEMA 4. EL PROCESADOR

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0

REGISTROS
C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.34: Camino de Datos: instrucción sw, cálculo de la dirección de memoria

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0
REGISTROS

C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.35: Camino de Datos: instrucción sw, escritura en memoria


4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 39

En caso de que los operandos sean iguales, el salto será efectivo y se escribirá el PC con
el valor de salto calculado previamente.

La carga de los operandos y el cálculo de la dirección de salto se puede hacer en


paralelo. La figura 4.36 muestra la parte del Camino de Datos que se utiliza para llevar a
cabo estas acciones.

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0

REGISTROS
C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.36: Camino de Datos: instrucción beq, búsqueda de los registros y cálculo de la
dirección de salto

A continuación se utiliza la ALU para restar los dos operandos leı́dos en el paso
anterior y comprobar de esta forma si son iguales. La señal de Cero de la ALU se utiliza
para determinar si el salto se toma o no. Si se toma el salto se escribe el PC con el nuevo
valor (la figura 4.37 muestra en rojo la parte del Camino de Datos que se utiliza y en rosa
lo que se utiliza de ciclos anteriores), si no se cumple la condición de igualdad el PC no se
modifica (la figura 4.38 muestra la parte del Camino de Datos que se usa en este caso).

Esta instrucción necesita 3 ciclos para ejecutarse.

Instrucción j

Si lo que tenemos es una instrucción de salto incondicional lo único que tendremos que
hacer es escribir el PC con la dirección de salto. La figura 4.39 muestra en rojo la parte
del Camino de Datos que se utiliza.

Esta instrucción necesitarı́a solamente 2 ciclos para ejecutarse, pero como veremos
más adelante, se ejecutará en tres para simplificar el diseño de la Unidad de Control.
40 TEMA 4. EL PROCESADOR

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0
M

REGISTROS
C Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2
Dato a M ALU
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.37: Camino de Datos: instrucción beq, ejecución cuando se cumple la condición
de salto

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0
M
REGISTROS

C Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2
Dato a M ALU
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.38: Camino de Datos: instrucción beq, ejecución cuando no se cumple la condición
de salto
4.5. CONSTRUCCIÓN DEL CAMINO DE DATOS 41

0
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0

REGISTROS
C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
signo 32 2 bits a
16 la izq.

Figura 4.39: Camino de Datos: ejecución de una instrucción de salto incondicional

4.5.7. Señales de control

Se van a necesitar un conjunto de señales de control para utilizar el Camino de Da-


tos de la forma descrita en la sección anterior. Los elementos de estado visibles por el
programador (el PC, la memoria y los registros), ası́ como el IR, necesitan señales de
control de escritura. Además, la memoria necesita una señal para lectura. Los multiplexos
de 2 entradas requieren una lı́nea de control, mientras que los de 4 entradas necesita dos
señales. En cuanto a la ALU, mediante una pequeña unidad de control que tiene como
entradas el código de función de la instrucción y 2 bits de control adicionales que reciben
el nombre de ALUop, se pueden generar los 3 bits que conforman las señales de control de
la ALU. Los dos bits de ALUop indican si la operación a realizar es una suma para accesos
a memoria o cálculo de la dirección de salto (00), una resta para saltos condicionales (01),
o si la operación está codificada en el código de función (10) para instrucciones tipo R.
La salida de la unidad de control de la ALU es una señal de 3 bits que le indica a la ALU
la operación a realizar codificando una de las 5 combinaciones vistas en el cuadro 4.2. La
figura 4.3 muestra la relación entre los bits de control de la ALU, los bits ALUop y los
diferentes códigos de función de las instrucciones tipo R. Si ALUop tiene como valor 00
la ALU realizará una suma (instrucción sw, lw o beq para el cálculo de la dirección de
salto), si su valor es 01 la ALU realizará una resta (instrucción beq para el chequeo de la
condición de igualdad). Si tenemos una instrucción tipo R, ALUop tomará el valor 10 y
la operación a realizar por la ALU dependerá del código de función.
La figura 4.40 muestra el Camino de Datos con la señales de control ya añadidas. La
señales ALUop, SelALUB y FuentePC son de 2 bits, mientras que el resto son solo de 1
bit. Los registros A, B, Salida ALU y MDR no requieren ninguna señal de escritura ya
que sus contenidos solamente se leen en el ciclo inmediatamente posterior a su escritura.
La figura 4.41 muestra la unidad de control con todas las lı́neas de control conectadas
42 TEMA 4. EL PROCESADOR

ALUOp Campo de función Acción Lı́neas de control de la ALU


00 XXXXXX suma 010
01 XXXXXX resta 110
10 100000 suma 010
10 100010 resta 110
10 100100 AND 000
10 100101 OR 001
10 101010 slt 111

Cuadro 4.3: Cálculo de los bits de control de la ALU en función de ALUop y el código de
función de las instrucciones tipo R

Escribir LeerMem EscrMem EscrIR RegDest EscrReg SelALUA SelALUB FuentePC


PC

0
IoD Mem2Reg
1
M
Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0
REGISTROS

C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
2 bits a Control
16 signo 32 ALU
la izq.

ALUop

Figura 4.40: El Camino de Datos de la figura 4.25 mostrando las señales de control
4.6. DISEÑO DE LA UNIDAD DE CONTROL 43

a ella. La principal diferencia con la figura 4.40 es la incorporación de las señales EscrPC
y EscrPCCond. El PC deberı́a escribirse en caso de salto incondicional (EscrPC=1) o en
caso de salto condicional si se cumple la condición de igualdad (EscrPCCond=1 y Cero
ALU=1).

EscrPC Cond
EscrPC FuentePC
IoD ALUop
LeerMem SelALUB
EscrMem Control SelALUA
Mem2Reg 0
EscrReg M
EscrIR OP RegDest 1
[31-26] Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0

REGISTROS
C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x
de datos de
memoria Exten. Desp.
2 bits a Control
16 signo 32 ALU
la izq.

Figura 4.41: El Camino de Datos con la Unidad de Control

Las figuras 4.42 y 4.43 muestran qué hace cada señal de control cuando está activa e
inactiva.

4.6. Diseño de la Unidad de Control

La unidad de control debe especificar qué señales se van a activar en cada paso y cuál
es el siguiente paso de la secuencia. Se construye como un sistema secuencial o autómata
que va pasando por diferentes estados, indicando cada estado qué puntos de control se
activan (salidas del autómata) y, en función de las condiciones (entradas del autómata),
cual es el estado siguiente. Las condiciones de la unidad de control serán los bits de la
instrucción y los indicadores internos (por ejemplo, la salida Cero de la ALU).
Cada estado del autómata representará una etapa de la ejecución de la instrucción
y tardará un ciclo de reloj. Como hemos visto en la sección anterior, cada instrucción
necesita de tres a cinco etapas para ejecutarse. Gran parte de lo necesario para la ejecución
de estas instrucciones será común a todas ellas, de hecho, para cada instrucción los dos
primeros pasos serán idénticos. A partir de aquı́, las acciones necesarias para completar la
44 TEMA 4. EL PROCESADOR

1 El nombre de esta señal proviene de la disyuntiva entre Instrucciones o Datos

Figura 4.42: Acciones de las señales de control de 1 bit

Figura 4.43: Acciones de las señales de control de 2 bits


4.6. DISEÑO DE LA UNIDAD DE CONTROL 45

instrucción dependerán de la instrucción concreta. Después de la última etapa el autómata


debe volver al estado inicial para procesar la siguiente instrucción.

En las siguientes subsecciones se muestra lo que ocurre en cada una de las etapas
dependiendo de la instrucción.

4.6.1. Etapa 1. Carga de una instrucción

El primer paso en la ejecución (estado 0) es el almacenamiento de la instrucción a


ejecutar en el registro de instrucción. Se envı́a el PC a memoria como dirección, se efectúa
la lectura de la instrucción y se escribe en el registro de instrucciones (IR).También se
incrementa el PC en cuatro. La figura 4.26 muestra la parte del Camino de Datos que se
utiliza. Para la realización de este primer paso, se han de activar las señales LeerMem y
EscrIR. La señal IoD tiene que estar a 0 para seleccionar el PC como dirección a buscar
en memoria. Para incrementar el PC se ha de poner la señal SelALUA a 0 (para enviar el
PC a la ALU), SelALUB a 01 (para seleccionar el 4 como segundo operando) y ALUop
a 00 (para sumar). Finalmente, para almacenar el nuevo valor del PC se debe activar la
señal EscrPC. La figura 4.44 muestra gráficamente la activación de estas señales sobre el
Camino de Datos.

EscrPC Cond
EscrPC FuentePC
IoD ALUop
LeerMem SelALUB
EscrMem Control SelALUA
Mem2Reg 0
EscrReg M
EscrIR OP RegDest 1
[31-26] Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0
M
REGISTROS

C Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2
Dato a M ALU
instrucción 4 1
Estado 0 escribir u
Instr. 0 2
LeerMem M x
[15-0] u 3
SelALUA = 0
Registro
selALUB = 01 A 1x
Inicio deEstado
datos de1
ALUOp = 00 Desp.
memoria Exten.
IoD = 0 2 bits a Control
16 signo 32 ALU
EscrIR la izq.
EscrPC
FuentePC = 00

Figura 4.44: Estado 0. Cargar instrucción


46 TEMA 4. EL PROCESADOR

4.6.2. Etapa 2. Decodificación de la instrucción y búsqueda de


los registros

En esta etapa (estado 1) se decodifica la instrucción, es decir, todavı́a no se conoce que


instrucción se va a ejecutar. Para aprovechar el ciclo se adelantan acciones que puedan
ser útiles a posteriori. Por ejemplo, se leen los dos registros indicados por rs y rt y
se almacenan en los registros temporales A y B. También se puede calcular la dirección
destino del salto con la ALU. Dicha dirección de salto potencial se almacena en SalidaALU
para su posterior utilización si fuera necesario. El acceso al banco de registros y el cálculo
de la dirección de salto se realizan en paralelo. La figura 4.36 muestra la parte del Camino
de Datos que se utiliza. Para llevar a cabo estas acciones se requiere que la señal SelALUA
esté a 0 (para enviar el PC a la ALU), SelALUB a 11 (para tomar el campo desplazamiento
de la instrucción desplazado 2 bits y con el signo extendido) y ALUOp a 00 (para calcular
una suma). La figura 4.45 muestra gráficamente la activación de estas señales sobre el
Camino de Datos.

EscrPC Cond
EscrPC FuentePC
IoD ALUop
LeerMem SelALUB
EscrMem Control SelALUA
Mem2Reg 0
EscrReg M
EscrIR OP RegDest 1
[31-26] Salto u
Desp. 28 incond. [31-0] x
Instrucción [25-0] 26
2 bits a 2
la izq.

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0
REGISTROS

C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
Estado 1 [15-0] u 3
Registro
1x
De Estado 0 SelALUA = 0 Estado
de datos?de
memoria Exten. Desp.
selALUB = 11 Control
signo 32 2 bits a
ALUOp = 00 16 ALU
la izq.

Figura 4.45: Estado 1. Decodificación, búsqueda de los registros y cálculo de la dirección


de salto potencial

A partir de aquı́ las operaciones del Camino de Datos vienen determinadas por el
tipo de instrucción. Las siguientes subsecciones describen las diferentes etapas por las que
pasan cada una de las instrucciones consideradas.
4.6. DISEÑO DE LA UNIDAD DE CONTROL 47

4.6.3. Instrucciones de acceso a memoria (sw o lw)

La figura 4.46 muestra los diferentes estados por los que se pasa en la ejecución de una
instrucción de acceso a memoria, ası́ como las señales de control que se activan en cada
paso. En los siguientes apartados se explican con más detalle cada una de las etapas.

De Estado 1
(Op = “LW”) o (Op = “SW”)
Estado 2

SelALUA = 1 Cálculo
selALUB = 10 dirección de
ALUOp = 00 memoria

(Op = “LW”) (Op = “SW”)


Estado 5
Estado 3

LeerMem EscrMem Acceso a


IoD = 1 I0D = 1 memoria
Acceso a
memoria

Estado 4
Etapa de escritura
EscrReg
Mem2Reg = 1 Vuelta al
RegDest = 0 Estado 0

Figura 4.46: Control de instrucciones de acceso a memoria

Etapa 3. Cálculo de la dirección de memoria

Esta etapa se corresponde con el estado 2 de la figura 4.46. La ALU debe efectuar
una suma para calcular la dirección de memoria (ver figuras 4.31 y 4.34). Para efectuar la
operación la señal de control SelALUA debe estar a 1 (el primer operando de la ALU es
el registro A) y SelALUB a 10 (el segundo operando de la ALU son los 16 bits de menor
peso de la instrucción con el signo extendido). La señal de ALUop vale 00 para hacer una
suma.

Etapa 4. Acceso a memoria

Si la instrucción es un load, se carga una palabra de memoria y se escribe en el MDR.


La dirección de memoria que se utiliza se ha calculado en el ciclo anterior y se encuentra
almacenada en SalidaALU (ver figura 4.32). Se debe activar la señal de control LeerMem y
48 TEMA 4. EL PROCESADOR

poner a 1 IoD para forzar que la dirección con la que se va a acceder a la memoria provenga
de la ALU. El registro MDR se escribe en cada ciclo de reloj, no necesita ninguna señal de
control de escritura explı́cita. Esta etapa se corresponde con el estado 3 en la figura 4.46.
Si es un store, el operando fuente almacenado en B se escribe en la memoria en la
dirección que se encuentra almacenada en SalidaALU y que ha sido calculada en el ciclo
anterior (ver figura 4.35). Se ha de activar la señal de control EscrMem y poner IoD a 1
para coger la dirección de memoria almacenada en SalidaALU. Esta etapa se corresponde
con el estado 5 en la figura 4.46. La instrucción sw finaliza aquı́, con lo cual en el siguiente
ciclo se volverı́a al estado 0.

Etapa 5. Etapa de escritura

En esta etapa la instrucción lw se completa escribiendo el valor leı́do de memoria (al-


macenado en el ciclo anterior en el registro MDR) en el banco de registros (ver figura 4.33).
Para hacer esto Mem2Reg debe ponerse a 1 para escribir el resultado procedente de la
memoria, EscrReg debe activarse para escribir y RegDest debe ponerse a 0 para elegir
rt (bits 16-20) como identificador de registro destino. Al finalizar se volverı́a el estado 0
para procesar una nueva instrucción.

4.6.4. Instrucciones aritmético-lógicas (tipo R)

La figura 4.47 muestra los diferentes estados por los que se pasa en la ejecución de
una instrucción aritmético-lógica, ası́ como las señales de control que se activan en cada
paso. Las siguientes subsecciones explican en más detalle cada una de las etapas.

Etapa 3. Ejecución de la operación

La ALU debe realizar la operación aritmético-lógica especificada en el código de fun-


ción sobre los datos leı́dos del banco de registros en la etapa anterior (ver figura 4.28).
Para llevar a cabo la operación la señal de control SelALUA se tiene que poner a 1 y
SelALUB debe tomar el valor 00 (para que las entradas de la ALU sean los registros A
y B respectivamente). La señal ALUop ha de estar a 10 para que la operación a realizar
por la ALU venga determinada por el código de función. Esta etapa se corresponde con
el estado 6 en la figura 4.47.

Etapa 4. Finalización de la operación

El resultado de la operación aritmético-lógica realizada en el ciclo anterior y guardada


en el registro SalidaALU se almacena en el registro destino (ver figura 4.29). La señal
RegDest debe estar a 1 para forzar que el campo rd (bits 15-11) se use para seleccionar
el registro donde se va a escribir; EscrReg también debe estar activa y Mem2Reg debe
4.6. DISEÑO DE LA UNIDAD DE CONTROL 49

De Estado 1
(Op = Aritmético-lógica)
Estado 6

SelALUA = 1 Ejecución de la
selALUB = 00 operación
ALUOp = 10

Estado 7

RegDest = 1 Finalización de
EscrReg la operación
Mem2Reg=0

Vuelta al
Estado 0

Figura 4.47: Control de instrucciones aritmético-lógicas

estar a 0 para que se escriba la salida de la ALU en lugar del dato obtenido de memoria.
Esta etapa se corresponde con el estado 7 en la figura 4.47.

4.6.5. Instrucciones de salto condicional (beq)

Esta instrucción necesita solamente una etapa más, etapa 3. En esta etapa, la ALU
se utiliza para efectuar la comparación de igualdad entre los dos registros leı́dos en el
paso anterior. La señal de Cero de la ALU se utiliza para determinar si el salto se toma
o no (ver figuras 4.37 y 4.38). La señal SelALUA está a 1 y SelALUB a 00 para tomar
las salidas del banco de registros como entradas de la ALU. La señal ALUop está a 01
para realizar la resta y efectuar ası́ la comprobación de igualdad. La señal EscrPCCond
está activa para ası́ modificar el PC en caso de que la señal de Cero de la ALU también
lo esté. La señal FuentePC está a 01 indicando que el valor a escribir en el registro de
PC es almacenado en SalidaALU, el cual guarda la dirección de destino de salto que se
calculó en la etapa previa.

La figura 4.48 muestra el estado correspondiente a esta etapa, estado 8. Una vez
finalizado se vuelve al estado 0 para procesar la siguiente instrucción.

4.6.6. Instrucción de salto incondicional (jump)

Si lo que tenemos es una instrucción de salto incondicional, en la tercera etapa el PC


se sustituye por la dirección de salto incondicional (ver figura 4.39). FuentePC se pone a
50 TEMA 4. EL PROCESADOR

De Estado 1
(Op = “beq”)
Estado 8
SelALUA = 1 Finalización
selALUB = 00
ALUOp = 01
de salto condicional
EscrPCCond
FuentePC = 01

Vuelta al
Estado 0

Figura 4.48: Control de instrucciones de salto condicional (beq)

10 y EscrPC se activa para escribir dicha dirección de salto en el PC. La instrucción jump
requiere un único estado adicional, el estado 9 (ver figura 4.49).

De Estado 1
(Op = “j”)
Estado 9

Finalización
EscrPC
FuentePC = 10 de jump

Vuelta al
Estado 0

Figura 4.49: Control de instrucciones de salto incondicional (j)

4.6.7. Autómata de control completo

La figura 4.50 muestra el autómata de control completo. A partir de la definición de


este autómata, existen dos formas de abordar el diseño de la unidad de control: unidad
de control cableada y unidad de control microprogramada.

La unidad de control cableada se construye utilizando alguno de los métodos clásicos


de diseño de circuitos secuenciales como el que hemos visto en el tema 3. En la unidad de
control microprogramada se utiliza una memoria de control para almacenar el estado de las
diferentes señales de control durante cada uno de los ciclos de ejecución de una instrucción.
La implementacion es sencilla y estándar, el hardware es prácticamente independiente de
la implementación. La Unidad de Control microprogramada es fácil de depurar, modificar
y ampliar, por lo que es la mejor opción para sistemas grandes y/o complejos.

Como ya hemos visto el método de diseño cableado, a continuación estudiaremos la


unidad de control microprogramada.
4.7. CONTROL MICROPROGRAMADO 51

Estado 0 Estado 1
LeerMem
SelALUA = 0
Inicio selALUB = 01 SelALUA = 0
ALUOp = 00 selALUB = 11
IoD = 0 ALUOp = 00
EscrIR
EscrPC

s)
ica
FuentePC = 00

(O
óg
(Op
”) = “j

p=
-L
“SW ”)

itm
Op =
”) o (

“be
Ar
= “LW Finalización

q”)
(Op

p=
Estado 2 Estado 6 de jump

(O
Estado 8 Estado 9
SelALUA = 1 Finalización
SelALUA = 1 Cálculo Ejecución de la SelALUA = 1 selALUB = 00
de salto condicional EscrPC
selALUB = 10 dirección de operación selALUB = 00 ALUOp = 01 FuentePC = 10
ALUOp = 00 memoria ALUOp = 10 EscrPCCond
FuentePC = 01

(Op = “LW”) (Op = “SW”)


Estado 5
Estado 3 Estado 7

RegDest = 1 Finalización de
LeerMem EscrMem EscrReg
IoD = 1 I0D = 1 la operación
Mem2Reg=0
Acceso a Acceso a
memoria memoria

Estado 4
Etapa de escritura
EscrReg
Mem2Reg = 1
RegDest = 0

Figura 4.50: Autómata de control completo para el Camino de Datos de la figura 4.41

4.7. Control microprogramado

El autómata se transforma en un programa de control formado por instrucciones de


control llamadas microinstrucciones. Cada microinstrucción define el conjunto de señales
de control del Camino de Datos que deben estar activas en un estado determinado. La
ejecución de una microinstrucción tiene como efecto la activación de las señales de control
especificadas por dicha microinstrucción. Además de definir qué señales deben estar acti-
vas, también se debe especificar la secuencia, es decir, cuál es la siguiente microinstrucción
a ejecutar.
El conjunto de las microinstrucciones se denomina microprograma y se almacenará en
una memoria de solo lectura, como por ejemplo una ROM. Cada microinstrucción ten-
drá asignada una dirección en dicha memoria. La figura 4.51 muestra una implementación
tı́pica de una sección de control microprogramada. Además de la memoria de control para
almacenar las microinstrucciones, se necesita un secuenciador encargado de ir generando
las direcciones de las siguientes microinstrucciones a ejecutar y que veremos más adelante
como implementar. La siguiente microinstrucción a ejecutar dependerá de la instrucción
máquina que se esté ejecutando en el Camino de Datos y de la condiciones generadas por
el Camino de Datos.
Existen dos forma de realizar el secuenciamiento de la memoria de control:
52 TEMA 4. EL PROCESADOR

Codigo operacion
Secuenciador Condiciones camino datos
Reloj

Memoria de Control

(ROM)

Registro de Microinstruccion
.......

Señales de control

Figura 4.51: Esquema de una unidad de control microprogramada

Secuenciamiento explı́cito: cada microinstrucción incluye la dirección de la micro-


instrucción siguiente.

Secuenciamiento implı́cito: existen dos tipos de microinstrucciones, de control y


de salto. Dentro de cada microinstrucción se reserva un campo para especificar el
tipo de microinstrucción. Por defecto la siguiente microinstrucción a ejecutar es la
siguiente, es decir, la que ocupa la posición de memoria consecutiva. Para ejecutar
otra microinstrucción necesitaremos incluir una instrucción de salto.

Nosotros vamos a ver como construir una unidad de control con secuenciamiento
explı́cito para el conjunto básico de instrucciones MIPS consideradas. Cada estado del
autómata de control de la figura 4.50 se va a corresponder con una microinstrucción.
Para llevar a cabo el secuenciamiento tenemos que tener en cuenta el diagrama de
estados del automáta de control. En general:

Tras terminar una instrucción se ha de retornar al estado 0.

Las instrucciones solamente tienen algunos estados en común, después divergen.

Esta divergencia puede ocurrir en varios lugares en el diagrama de estados.

Existen, por tanto, tres métodos posibles para la elección de la siguiente microinstruc-
ción a ejecutar:
4.7. CONTROL MICROPROGRAMADO 53

1. Incrementar la dirección de la microinstrucción actual para obtener la de la siguiente.


2. Saltar a la microinstrucción que inicia la ejecución de la siguiente instrucción.
3. Elegir la siguiente microinstrucción en función del estado en el que nos encontre-
mos. Esta elección en base al estado recibe el nombre de dispatch. Las operaciones
de dispatch suelen realizarse mediante una tabla que contenga las direcciones de
las microinstrucciones destino. Esta tabla se suele realizar en una ROM denomina-
da ROM de envı́o. En el caso general, crearemos una tabla para cada estado con
múltiples estados destino. Para la implementación de las instrucciones básicas del
MIPS que hemos considerado en este capı́tulo se necesitan dos tablas, una para ele-
gir la siguiente microinstrucción después del estado 1 y otra para elegir la siguiente
microinstrucción después del estado 2 (ver figura 4.50).

Por lo tanto, para el conjunto básico de instrucciones MIPS consideradas necesitamos


2 bits (CtrlDir) para especificar cómo elegir la siguiente microinstrucción a ejecutar. Las
opciones posibles son:

CtrlDir=00: Va a la primera microinstrucción para comenzar una nueva instrucción.


CtrlDir=01: Selecciona la siguiente microinstrucción utilizando la tabla de envı́o 1.
CtrlDir=10: Selecciona la siguiente microinstrucción utilizando la tabla de envı́o 2.
CtrlDir=11: Selecciona la siguiente microinstrucción (secuencia normal).

Vamos a suponer la implementación más sencilla, cada punto de control del Camino
de Datos se corresponde con un bit de las microinstrucciones, es decir, cada una de las
microinstrucciones constan de 18 bits (1 bit por cada punto de control del Camino de
Datos y 2 bits para especificar la siguiente microinstrucción)1 .
La implementación de la Unidad de Control microprogramada completa puede verse
en la figura 4.52. El microprograma se almacena en una memoria de solo lectura (ROM).
El registro de estado almacena la dirección de la microinstrucción a acceder. La función
de secuenciación se realiza aparte en función de CtrlDir y el código de operación de la
instrucción. La figura 4.53 muestra una posible implementación de la lógica de selección
de dirección. Un mux selecciona en función de CtrlDir si aumentar la dirección actual
(se utiliza un sumador para realizar el incremento), utilizar las tablas de envı́o 1 o 2, o
saltar a la microinstrucción 0 para empezar el procesamiento de una nueva instrucción. La
selección de la entrada en las tablas de envı́o se hace en función del código de operación
de la instrucción.
Finalmente, la figura 4.54 muestra el contenido de la memoria de control, es decir, el
microprograma completo correspondiente al autómata de control de la figura 4.50. Ca-
da microinstrucción representa un estado del autómata de control y define las señales de
1
Los puntos de control podrı́an estar codificados para ahorrar bits en las microinstrucciones. En
contrapartida se necesitarı́a incluir un decodificador.
54 TEMA 4. EL PROCESADOR

FuentePC (2)
ALUop (2)
SelALUA
SelALUB (2)
EscrReg
RegDest
Salidas EscrPC cond
EscrPC
Lógica de Control IoD
(ROM) LeerMem
EscrMem
Mem2Reg
EscrIR

CtrlDir (2)
Entradas

1
2
4

Sumador Registro de estado

Selección
dirección siguiente

Código de operación
Bits [31-26] del
registro de instrucción

Figura 4.52: Unidad de control microprogramada

ROM CtrlDir
Entradas

1 2
4

Sumador Registro de estado

MUX
3 2 1 0

Tabla de envío 2 Tabla de envío 1

Selección
dirección siguiente
Código de operación
Bits [31-26] del
registro de instrucción

Figura 4.53: Lógica de selección de dirección para la unidad de control de la figura 4.52
4.7. CONTROL MICROPROGRAMADO 55

control activas en ese estado, ası́ como la siguiente microinstrucción a ejecutar. Las instruc-
ciones del microprograma se etiquetan simbólicamente. Estas etiquetas serán utilizadas
para especificar los contenidos de las tablas de envı́o. Un campo en blanco correspondiente
a una señal que afecta al control de una unidad de estado significa que la señal de control
asociada no debe activarse. Un campo en blanco correspondiente a una señal de control
de un MUX o al control de operación de la ALU significa que la salida no se usa, por lo
que las señales asociadas pueden considerarse indiferentes.

SelALUB (2)
FuentePC (2)
EscrPCCond

ALUOp (2)

CtrlDir (2)
Mem2Reg

SelALUA
LeerMem
EscrMem

RegDest
EscrReg
EscrPC

EscrIR
IoD

1 0 1 1 0 0 1 0 3 estado 0
0 3 0 1 estado 1
Mem1 0 2 1 2 estado 2
Lw2 1 1 3 estado 3
1 1 0 0 estado 4
Sw2 1 1 0 estado 5
Rformat1 2 0 1 3 estado 6
0 1 1 0 estado 7
Beq1 1 1 1 0 1 0 estado 8
Jump1 1 2 0 estado 9

Figura 4.54: Microprograma para las instrucciones básicas del MIPS

En la figura 4.55 se pueden ver las dos tablas de envı́o mostrando el contenido en forma
simbólica utilizando las etiquetas del microprograma. Dependiendo de la instrucción que
se esté ejecutando en el Camino de Datos se saltará a una u otra microinstrucción de la
memoria de control.
56 TEMA 4. EL PROCESADOR

Figura 4.55: Tablas de envı́o para el microprograma de la figura 4.54

4.8. Temporización
En el diseño propuesto cada instrucción se divide en una serie de etapas, correspon-
diéndose cada una de ellas con un estado de la unidad de control, es decir, cada etapa
necesitará un ciclo de reloj para ejecutarse. La figura 4.56 resume las etapas realizadas
para ejecutar cualquier tipo de instrucción y el cuadro 4.4 el número de ciclos consumido
por cada instrucción o CPI (Clock Cycles per Instruction).

Figura 4.56: Resumen de las etapas realizadas para ejecutar cualquier tipo de instrucción

El ciclo de reloj debe acomodarse al tiempo de las operaciones del Camino de Datos
que se realizan en las diferentes etapas: acceso a memoria, acceso al banco de registros o
una operación de la ALU. El ciclo de reloj deberı́a ser al menos tan largo como la más
larga de las operaciones anteriores. Si suponemos, por ejemplo, que se necesitan 2.5 ns
para la lectura de memoria, 3 ns para la escritura en memoria, 2 ns para que la ALU lleve
a cabo una operación y 1 ns para el acceso a los registros (lectura y escritura), el ciclo de
reloj deberı́a ser al menos de 3 ns. En este caso, tardarı́amos 12 ns (4 × 3 ns) en ejecutar
una instrucción aritmética.
4.9. PROCESAMIENTO DE EXCEPCIONES 57

Tipo de instrucción Ciclos


Aritmética 4
lw 5
sw 4
salto condicional 3
jump 3

Cuadro 4.4: Resumen del número de ciclos por instrucción

4.9. Procesamiento de excepciones

Una excepción es un suceso inesperado que se produce en el procesador, por ejemplo


el desbordamiento aritmético. Una interrupción es un suceso que provoca un cambio
inesperado, pero se produce externamente al procesador. Las interrupciones son utilizadas
por los dispositivos de Entrada/Salida para comunicarse con el procesador, como se verá en
el siguiente capı́tulo.
En la implementación básica de las instrucciones del MIPS que hemos considerado
pueden ocurrir dos tipos de excepciones: la ejecución de una instrucción no definida y un
desbordamiento aritmético.
Las acciones que se han de llevar a cabo cuando ocurre una excepción son:

Guardar la dirección de la instrucción causante en el registro contador de programa


de la excepción (EPC).

Transferir el control al sistema operativo en alguna dirección especı́fica.

El sistema operativo ejecuta una rutina especı́fica.

Finalizar el programa o continuar con su ejecución, usando EPC para saber dónde
retomar la ejecución.

Para que el sistema operativo pueda tratar la excepción, debe conocer las razones
por las que se ha producido, además de la instrucción que la ha causado. El método
empleado en la arquitectura MIPS para comunicar la causa es incluir un registro de estado
denominado Registro de Causa o Cause Register, que contiene un campo que indica la
razón de la excepción.
Se puede incluir el procesamiento de excepciones a la unidad central de proceso pre-
viamente diseñada añadiendo algunos registros extra y algunas señales de control. En
concreto, se tendrán que añadir 2 registros adicionales al Camino de Datos:

EPC: Registro de 32 bits para guardar la dirección de la instrucción afectada.


58 TEMA 4. EL PROCESADOR

Causa: Registro de 1 bit para almacenar la causa (instrucción no definida=0, des-


bordamiento aritmético=1).

En cuanto a las señales de control, necesitaremos dos señales de control para que se es-
criban el EPC y el Registro de Causa llamadas EscrEPC y EscrCausa respectivamente.
Además, también se necesita una señal de control de 1 bit para fijar el valor del Regis-
tro de Causa, es decir, para fijar el tipo de excepción. Esta señal recibe el nombre de
CausaInt. Finalmente, se tiene que poder escribir la dirección del punto de entrada del
sistema operativo para el tratamiento de la excepción en el PC. Supondremos en nuestra
implementación que esta dirección es la C0000000hex . Actualmente, el PC está conecta-
do a la salida de un multiplexor de cuatro entradas controlado por la señal FuentePC
(ver figura 4.41). De las cuatro entradas solamente se utilizan tres. Podemos por tanto
añadir una entrada adicional con el valor constante C0000000hex . La figura 4.57 muestra
el Camino de Datos con los elementos necesarios para el procesamiento de excepciones.

EscrCausa
CausaInt
EscrPC Cond EscrEPC
EscrPC FuentePC
IoD ALUop
LeerMem SelALUB
EscrMem Control SelALUA
Mem2Reg 0
EscrReg M
OP Salto 1
EscrIR RegDest Desp. 28 incond. [31-0] u
[31-26] Instrucción [25-0] 26
2 bits a 2
x
la izq. 3
C0000000

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0
REGISTROS

C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU EPC
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x 0 0
de datos de M
memoria Exten. Desp.
2 bits a Control u Causa
signo 32
16 la izq. ALU 1 1x

Figura 4.57: Camino de Datos con los componentes adicionales necesarios para realizar
las excepciones

Las acciones a tomar durante el procesamiento de una excepción serán escribir en


el Registro Causa un 0 o un 1 para indicar el tipo de excepción y guardar la dirección
de la instrucción causante de la excepción en el registro EPC. Debido a que el PC se
incrementa durante el primer ciclo de cada instrucción, para guardar la dirección de la
instrucción causante de la excepción en el registro EPC tenemos que utilizar la ALU para
restarle 4 al PC. La figura 4.58 muestra como se utiliza el Camino de Datos anterior para
el procesamiento de una excepción.
Por tanto, para tratar los dos tipos de excepciones que se están considerando, solo
se han de añadir los dos estados mostrados en la figura 4.59. Cada estado proporciona
4.9. PROCESAMIENTO DE EXCEPCIONES 59

EscrCausa
CausaInt
EscrPC Cond EscrEPC
EscrPC FuentePC
IoD ALUop
LeerMem SelALUB
EscrMem Control SelALUA
Mem2Reg 0
EscrReg M
OP Salto 1
EscrIR RegDest Desp. 28 incond. [31-0] u
[31-26] Instrucción [25-0] 26
2 bits a 2
x
la izq. 3
C0000000

PC [31-28]
Instrucción Reg. de 0
P [25-21] lectura 1 M
0

REGISTROS
C M Memoria Dato u
Instrucción Reg. de leído 1 A
u Dirección 1x
ALU
[20-16] lectura 2
1x Instrucciones 0 Cero
Instrucción M Reg. de
o datos Instr.
[15-0] u escritura Dato Resultado
Salida
[15-11] B 0 ALU EPC
1x
Datos Registro de leído 2 ALU
Dato a M
instrucción escribir 4 1
u
Instr. 0 2
M x
[15-0] u 3
Registro
1x 0 0
de datos de M
memoria Exten. Desp.
2 bits a Control u Causa
signo 32
16 la izq. ALU 1 1x

Figura 4.58: Camino de Datos: procesamiento de excepciones

el control para tres acciones: activar el Registro de Causa, obtener la dirección de la


instrucción que ha provocado la excepción y guardarla en el EPC, poner en el PC la
dirección para el procesamiento de la excepción por parte del sistema operativo. El control
se transfiere a uno de estos estados cuando sucede una excepción. Cuando estos estados
finalizan, el control se transfiere al estado 0 y se carga una nueva instrucción.
Estado 10 Estado 11
CausaInt=0 CausaInt=1
EscrCausa EscrCausa
SelALUA = 0 SelALUA = 0
selALUB = 01 selALUB = 01
ALUOp = 01 ALUOp = 01
EscrEPC EscrEPC
EscrPC EscrPC
FuentePC = 11 FuentePC = 11

Al Estado 0
Inicio de una nueva
instrucción

Figura 4.59: Par de estados que muestran las acciones necesarias para las dos excepciones
consideradas
Ahora falta detectar estas excepciones y transferir el control al estado apropiado. Cada
una de las dos excepciones posibles se detecta de forma diferente:

Instrucción no definida: Se detecta cuando no está definido el estado siguiente al


estado 1 para ese código de operación. Esta excepción se trata definiendo como
siguiente estado el estado 11 de la figura 4.59 para todos los códigos de operación
no definidos.
60 TEMA 4. EL PROCESADOR

Desbordamiento aritmético: La ALU tiene una señal de salida de desbordamiento.


Esta señal se utiliza para pasar del estado 6 al estado 10 de la figura 4.59.

La figura 4.60 muestra la máquina de estados finita con los estados adicionales para
tratar la detección de excepciones.

Estado 0 Estado 1
LeerMem
SelALUA = 0
Inicio SelALUB = 01
SelALUA = 0
ALUop = 00
SelALUB = 11
IoD = 0
ALUop = 00
EscrIR
EscrPC

a
FuentePC = 00

gic
Op

-Ló

Op
sw =j
Op = rit. Op

=b
=
=A
ot

eq
ro Finalización
Op

s de jump
Estado 2 Estado 6 Estado 8 Estado 9
SelALUA = 1 Finalización
SelALUA = 1 Cálculo Ejecución de la SelALUA = 1 SelALUB = 00 de salto condicional
SelALUB = 10 dirección de operación SelALUB = 00 EscrPC
ALUop = 01
ALUop = 00 memoria ALUop = 10 FuentePC=10
EscrPCCond
FuentePC=01
D
es
bor
Op = lw Op = sw dam
Estado 5 ie
Estado 3 Estado 7 nt
o Estado 10
Estado 11
RegDest = 1 CausaInt = 0 CausaInt = 1
LeerMem EscrMem EscrReg
IoD = 1 IoD = 1 EscrCausa EscrCausa
Mem2Reg = 0 SelALUA = 0 SelALUA = 0
Acceso a Acceso a SelALUB = 01 SelALUB = 01
memoria memoria ALUop = 01 ALUop = 01
Finalización de EscrEPC EscrEPC
la operación EscrPC EscrPC
FuentePC = 11 FuentePC = 11
Estado 4
Etapa de escritura
EscrReg
Mem2Reg = 1
RegDest = 0

Figura 4.60: Máquina de estados finitos completa

Tendremos que hacer algunas modificaciones en la sección de control microprogramada


para incorporar los dos nuevos estados. Además de añadir las 2 nuevas microinstrucciones,
una correspondiente al estado 10 y otra al 11, tendremos que modificar la tabla de envı́o
1 para considerar otros códigos de operación (ver cuadro 4.5) y añadir una tercera tabla
para tener en cuenta la bifurcación en el estado 6 (ver cuadro 4.6).
Ahora CtrlDir puede tomar 5 valores diferentes, por lo que necesitamos ampliar esta
señal a 3 bits. CrtlDir = 4 se corresponderá con la selección de la siguiente microinstruc-
ción utilizando la tabla de envı́o 3. También tendremos que añadir las señales de control
CausaInt, EscrCausa y EscrEPC. Pasarı́amos, por tanto, a tener microinstrucciones de
tamaño 22 bits. La figura 4.61 muestra el contenido de la memoria de control completa.
4.9. PROCESAMIENTO DE EXCEPCIONES 61

Código de operación instrucción Valor


000000 Tipo R Rformat1
000010 jmp JUMP1
000100 beq BEQ1
100011 lw Mem1
101011 sw Mem 1
otro otra Nodef1

Cuadro 4.5: Tabla de envı́o 1 para el autómata de la figura 4.60

señal de desbordamiento valor


0 Arit3
1 Ov3

Cuadro 4.6: Tabla de envı́o 3 para el autómata de la figura 4.60 SelALUB (2)
FuentePC (2)
EscrPCCond

ALUOp (2)

EScrCausa
CtrlDir (3)
Mem2Reg

SelALUA
LeerMem
EscrMem

EscrEPC
CausaInt
RegDest
EscrReg
EscrPC

EscrIR
IoD

1 0 1 1 0 0 1 0 3 estado 0
0 3 0 1 estado 1
Mem1 0 2 1 2 estado 2
Lw2 1 1 3 estado 3
1 1 0 0 estado 4
Sw2 1 1 0 estado 5
Rformat1 2 0 1 4 estado 6
Arit3 0 1 1 0 estado 7
Beq1 1 1 1 0 1 0 estado 8
Jump1 1 2 0 estado 9
Ov3 1 3 1 1 0 0 0 1 1 estado 10
Nodef1 1 3 1 1 0 0 1 1 1 estado 11

Figura 4.61: Microprograma correspondiente al autómata de la figura 4.61

También podría gustarte