LA MAQUINA
RUDIMENTARIA
1. ESTRUCTURA BÁSICA DE UN COMPUTADOR
En los
ordenadores se puede distinguir el hardware (circuitos integrados, placas,
cables, etc.) y el software que consta de algoritmos, y su representación en el
ordenador son los programas. La visión actual del ordenador esta jerarquizada:
-Nivel 1:
Lógica digital. Este nivel corresponde a la máquina física. Sus circuitos son
sistemas lógicos que realizan funciones lógicas elementales. Este nivel permite
comprender el funcionamiento de los distintos bloques en que se ha dividido el
computador y las conexiones de estos.
-Nivel 2:
Microprogramación.
-Nivel 3:
Lenguaje máquina. Este nivel constituye el primer nivel de programación. Para
facilitar la programación a nivel de Lenguaje máquina, los usuarios disponen de
un intérprete simbólico, llamado ensamblador. El Lenguaje Ensamblador es la
representación simbólica del lenguaje de programación del Nivel de Lenguaje Máquina.
-Nivel 4:
Sistema operativo. Facilita el uso del computador, escondiendo al usuario la
dificultad de su utilización desde el nivel inferior. El sistema operativo esta
formado por un conjunto de programas, necesarios para la correcta
administración de los recursos del ordenador
-Nivel 5:
Lenguajes de alto nivel.
-Nivel 6:
Usuario o aplicaciones.
ARQUITECTURA TIPO
VON NEUMANN
En un ordenador
tipo Von Neumann, los datos y las instrucciones están almacenados en la memoria
del computador. La arquitectura Von Neumann está formada por tres bloques,
interconectados entre sí por conjuntos de cables denominados buses:
-Memoria
principal: encargada de almacenar instrucciones y datos. Hay dos tipos: RAM
(se puede leer y escribir y en caso de apagar el ordenador pierden su
contenido) y ROM (solo se pueden leer y su contenido no se pierde al apagar el
ordenador).
-Procesador:
encargado de la ejecución de instrucciones. Se compone de dos unidades:
·Unidad
de Proceso (UP) que contiene las unidades de cálculo, los registros internos y
los caminos de conexión entre estos elementos. Realiza todos los cálculos
requeridos por las instrucciones de la máquina. Posee una Unidad
Aritmético/Lógica (UAL o ALU), Registros y buses internos a la UP.
·Unidad
de Control (UC) que interpreta las instrucciones, generando las señales de
control para coordinar el funcionamiento del resto de unidades del computador.
-Unidad de
Entrada/Salida: transfiere información entre la memoria y el exterior. Hace
de enlace entre la CPU y los equipos periféricos.
TIPOS DE BUSES:
-Bus de Datos: se
transportan los datos y instrucciones. El tamaño en bits de los datos e
instrucciones, así como el del bus de datos, es una de las características
principales del ordenador.
-Bus de
Direcciones: las direcciones son números naturales que indican la posición de
los datos dentro de la memoria principal o del espacio de direcciones de la
unidad de entrada/salida. Las direcciones son generadas por la CPU, que es
quien decide a qué dato se debe acceder en cada momento.
-Bus de control:
a través de este bus se transmiten las señales de control del sistema. Suele
incluir el reloj de la máquina, señales de sincronización entre la CPU y las demás unidades.
2. DESCRIPCIÓN DE LA ARQUITECTURA DE
LA MR
La Máquina
Rudimentaria (MR) es de arquitectura Von Neumann. La MR ejecuta programas guardados en la memoria, que
también contiene los datos requeridos pro los programas.
LA MEMORIA
La memoria esta
organizada en 256 posiciones de 16 bits cada una. Al contenido de una posición
de memoria se le denomina palabra o word.
La memoria de la
MR recibe los datos a través del bus de entrada Min y los envía a la
CPU a través del bus Mout. Ambos buses son de 16 bits. Para acceder
a una posición de memoria es preciso poner su dirección en el bus de
direcciones @. Este bus es de 8 bits. La señal `L/E, de un bit indica si se escribe o
se lee.
La MR trabaja con
datos numéricos enteros, codificados en Ca2 en 16 bits.
Las instrucciones
de la MR se codifican en 16 bits, de modo que cada posición de memoria puede
contener indistintamente una instrucción o un dato.
LA CPU
Para ejecutar una
instrucción, la MR lee la instrucción de la posición de memoria en la que se
encuentra y la escribe en un registro especial de UP, de 16 bits, denominado Registro de
instrucciones.
La ALU suma,
resta, desplaza a la derecha y realiza la función AND. También evalúa si la
operación realizada ha sido un cero o un negativo. El resultado de esta
evaluación se guarda en 2 registros de un bit denominados flags de condición. El flag N guarda un 1 si
el resultado es un negativo y 0 en caso contrario. El flag Z guarda un 1 si el resultado ha sido 0
y guarda 0 en caso contrario.
La UP además
contiene 8 registros de 16 bits para almacenar datos, numerados desde el R0 al
R7. El RO contiene siempre un 0 y no puede ser escrito.
Las instrucciones
de la MR se ejecutan secuencialmente, en el orden en que están almacenadas en
la memoria. A esta forma de ejecución se la denomina secuenciamiento implícito.
La MR dispone de
instrucciones especiales que permiten romper el secuenciamiento implícito,
estas instrucciones son denominadas instrucciones de salto. Hay dos tipos de
instrucciones de salto: salto incondicional y de salto condicional. El salto
condicional depende de los valores de los flags de condición.
Con el fin de
realizar el secuenciamiento implícito la UP debe conocer la dirección de la
siguiente instrucción a ejecutar. Para ello dispone de un registro especial
denominado Contador
de Programa (PC) de 8 bits.
La Unidad de
Control se encarga de controlar el secuenciamiento de las operaciones
realizadas en la UP para que las instrucciones del programa se ejecuten
correctamente. Recibe 3 entradas de la UP y envía 12 bits de salida hacia la UP
para controlar los módulos que la forman.
LOS BUSES
Estos realizan la
comunicación entre la CPU y memoria. En la MR los buses tienen las siguientes
características:
-El bus de datos
está dividido en dos:
·Un
bus de 16 bits para transportar los datos de la CPU a la memoria.
·Un
bus de 16 bits para transportar los datos de la memoria a la CPU.
-El bus de
direcciones es de 8 bits, y va sólo de la CPU a la memoria.
-El bus de
control tiene únicamente la señal que, en cada ciclo, indica a la memoria si la
operación que se realiza es de lectura o de escritura.
3. NIVEL LENGUAJE MÁQUINA
Las instrucciones del Lenguaje Máquina (LM) son
conjuntos de unos y ceros que deben ser interpretados digitalmente.
La arquitectura
de la MR es RISC (Reduced Instruction Set Computer). Este tipo de arquitectura
se basa en tener un juego de instrucciones reducido y simple, pero que permite
resolver cualquier tipo de problema.
INSTRUCCIONES DEL LM DE LA MR
Instrucciones
Aritmético-lógicas
La MR ofrece seis
instrucciones aritmético-lógicas, que realizaran cuatro operaciones distintas,
suma, resta, desplazamiento aritmético (multiplicación por dos) y and-lógica.
En las
instrucciones aritméticas los datos son interpretados como números enteros
codificados en Ca2. Don números positivos y negativos de 16 bits.
La UP obtiene los
datos para ejecutar las instrucciones de su banco d registros o de la propia
instrucción. El resultado se guarda en un registro del banco del mismo banco de
registros.
Las seis
instrucciones aritmético-lógicas:
-Suma - ADD:
realiza la suma aritmética de dos números de 16 bits. Los dos operandos a sumar
se encuentran en registros del BR.
-Resta - SUB:
realiza la resta aritmética de dos números de 16 bits. Los dos operandos se
encuentran en registros del BR
-Desplazamiento
a la derecha - SRL: desplaza un bit a la derecha un número de 16
bits que se encuentra en un registro del BR. EL resultado se guarda en otro
registro. El bit de más peso del número se ha de replicar en el resultado para
realizar para realizar la extensión de signo, necesaria si se trabaja con
números enteros representados en Ca2. El resultado de un desplazamiento de un
bit a la derecha es equivalente a una división por dos.
-And-lógica -
AND: realiza una and-lógica de dos números de 16 bits. Los operandos
se encuentran en registros del BR.
-Suma con
inmediato - ADDI: realiza la suma aritmética de dos números pero un
operando se encuentra en un registros y el otro se especifica en la propia
instrucción como un número entero de 5 bits.
-Resta con
inmediato - SUBI: resta de dos número pero el minuendo procede de un
registro y el sustrayendo se especifica en la propia instrucción como un número
entero de 5 bits.
Información a
codificar en el formato de estas instrucciones:
-CO:
identificador único de grupo de instrucción. Se identifica con dos bits. CO es
11 para las instrucciones aritmético-lógicas. 00 o 01 acceso a memoria y 10
para las instrucciones de salto.
-Rd:
codificación del registro del BR en el que se guarda el resultado. Con 3 bits
codificamos los 8 registros.
-Rf1:
codificación del registro en el que se encuentra un operando fuente. De 3 bits.
La instrucción SRL no utiliza este campo pues solo necesita una dato.
-Rf2:
codificación del registro en el que se halla el otro operando fuente. De 3
bits.
-Número:
operando fuente que se especifica en la propia instrucción, de nominado
inmediato. De 5 bits.
-OP:
identificador de instrucción dentro del grupo de las aritmético/ lógicas. Hacen
falta 3 bits. Los códigos son:
-100:
Suma
-101: Resta
-110: Desplazamiento aritmético a la derecha.
-111: And lógica
-000: Suma con inmediato
-001: Resta con inmediato.
Las instrucciones
que tienen operandos fuente en registros del BR necesitan 14 bits pero como las
instrucciones se almacenan en memoria, cuya palabra es de 16 bits, sobran 2
bits que se ponen a cero.
Las instrucciones
que tienen uno de los operandos en la propia instrucción y el otro operando en
un registro necesitan los 16 bits de la palabra
Formato de las instrucciones de suma y resta con inmediato.
Formato de las instrucciones de suma, resta, desplazamiento
a la derecha y and lógica.
Instrucciones de Acceso a Memoria
El acceso a
memoria ha de permitir leer y escribir datos en la memoria procedentes de
registros.
La MR ofrece dos
instrucciones de acceso a memoria:
-Lectura -
LOAD: permite traer a la UP un dato de 16 bits almacenado en una
determinada posición de la memoria. El dato se copia en un registro del BR, y
se actualizan los flags de condición. La posición se calcula durante la
ejecución de la instrucción.
-Escritura -
STORE: lleva a memoria desde el BR de la UP un dato de 16 bits. El
dato se escribe en una determinada
posición de memoria. Esta instrucción no modifica los flags de condición.
La dirección de
un dato se calcula como suma de dos valores:
dirección_acceso
= dirección_base + desplazamiento
En las
instrucciones de acceso a memoria se han de especificar los elementos
necesarios que permitan calcular la dirección de memoria de donde leer el dato
o donde escribir el dato:
-la dirección
base se especifica en la instrucción como un número natural de 8
bits.
-el desplazamiento
se halla en un registro cuyo número identificador, de 3 bits, se halla en la
instrucción.
También se ha de
especificar el registro del que leer el dato para escribirlo en memoria, o en
el copiar el dato que procede de memoria. El identificador es de 3 bits.
Para
identificar el LOAD y el STORE se han
de usar los 2 bits del código de operación (CO). El CO que identifica la
instrucción LOAD es 00, mientras que el CO del STORE es 01.



2 3 3
8
Formato de las instrucciones LOAD(00) y STORE (01)
contiene desplazamiento
registro destino o fuente
Instrucciones de
Salto
Para llevar a cabo bucles o tomas de
decisión, es necesario disponer de instrucciones que se encarguen de comprobar
si se cumple la condición del bucle o de la toma de decisión y que permitan
romper el secuenciamiento implícito del programa.
La condición es
evaluada mediante instrucciones aritmético-lógicas o de LOAD, cuya ejecución
actualiza los flags de condición. Los flags de condición (Z y N) son los que
permiten a las instrucciones de salto comprobar si se cumple la condición.
Las instrucciones
de salto que la MR ofrece son:
-Saltar si mas
pequeño -BL:
comprueba si el flag N es uno, si lo es salta.
-Saltar si más
grande -BG:
comprueba si el flag N y el flag Z son ceros, si es así salta.
-Saltar si igual
-BEQ:
comprueba si el flag Z es uno, si lo es salta.
-Saltar si no
igual -BNE:
comprueba si el flag Z es cero, si es así
salta.
-Saltar si mas
pequeño o igual -BLE: comprueba si el flag N o el flag Z son uno, si es así
salta.
-Saltar si mas
grande o igual -BGE: comprueba si el flag N es cero o el flag Z es uno, si es así
salta.
-Salto
incondicional -BR: se realiza el salto sin comprobar ninguna condición.
Ninguna de las
instrucciones de salto modifica los flags de condición.
-CO:
identificador del grupo de instrucciones, de 2 bits. CO es 10 para las
instrucciones de salto.
-COND:
identificador de instrucciones dentro del grupo de las de salto.
Hacen falta 3 bits para codificar las 7 posibles instrucciones:
-000: salto incondicional.
-001: saltar si igual.
-010: saltar si más pequeño.
-011: saltar si más pequeño o igual.
-101: saltar si no igual.
-110: saltar si más grande o igual.
-111: saltar si más grande.
-Dirección:
dirección de la que ha de ser la instrucción destino del salto. Es un número
natural de 8 bits.



2 3 3
8
Formato de las instrucciones de salto
NOTACIÓN EN
LE DE LAS INSTRUCCIONES OFRECIDAS
La notación en LE
ha de permitir identificar la instrucción y los operandos fuente y destino, así
como una dirección en las instrucciones que la requieran. Para especificar en
LE un registro su usa Rx, donde x en un número de 0 a 7. Para especificar un inmediato,
se usará la notación #num, donde num es un entero codificado en Ca2. El
resultado se guardará en un registro, especificado como Rx.
Las instrucciones
de salto han de especificar una dirección absoluta que es la de destino del
salto. La notación en LE de la dirección absoluta usa un número natural en el
rango (0, +28-1).
Las instrucciones
de acceso a memoria necesitan una dirección absoluta, que se calcula durante la
ejecución de la instrucción como suma de una dirección base más un
desplazamiento. En LE, esta dirección base se especifica mediante un número
natural en el rango (0, +28-1) escrito en decimal, y el registro se
especifica como RX,
5. NIVEL DE LÓGICA DIGITAL. UNIDAD DE
PROCESO.
La UP de un
computador actúa de acuerdo con lo que le ordena la Unidad de Control. La UP,
por tanto, es un mero ejecutor de las ordenes de la UC. Además la UP utiliza la
memoria para guardar datos que utiliza es instrucciones que ejecuta.
BANCO DE
REGISTROS
Los registros que
se usan en las instrucciones de la MR definidas sirven para: guardar datos que
se leen de memoria o se escriben en ella, para guardar los datos con los que se
realizarán distintas operaciones aritméticas o lógicas y para guardar los
resultados de las operaciones.
Estos registros
son de 16 bits debido a que el tamaño de una posición de memoria es también de
16 bits y están agrupados en un banco de registros.
El banco de
registros contiene un decodificador que permite seleccionar el registro sobre
el que se quiere escribir un dato. La selección del registro se realiza
mediante las entradas de “Selección de Escritura”. Las salidas del decodificador
van a cada una de las entradas de permiso de carga de los registros. El
registro R0 no tiene entrada de permiso ya que siempre guarda un 0.
Además para
escribir un dato a un registro concreto hay un único bus que accede a cada una
de las entradas de los registros. Esto se debe a que, en cada momento, sólo
puede haber un registro seleccionado para escritura debido al funcionamiento
del decodificador.
El banco de
registros contiene un multiplexor que permite seleccionar el registro que se
quiere leer. Para seleccionar el registro que se quiere leer se debe introducir
su codificación en la entrada “Selección de Lectura”.
UNIDAD
ARITMÉTICO-LÓGICA Y BITS DE CONDICIÓN
La unidad
aritmético-lógica (ALU) se encarga de realizar operaciones aritméticas y
lógicas. Así la ALU de la MR debe realizar operaciones de suma, resta,
desplazamiento aritmético a la derecha y AND lógica bit a bit.
Además de las
operaciones que realiza la ALU, es necesario que ésta detecte si el resultado
de estas operaciones es cero o negativo. La detección se mostrará a través de
dos salidas de un bit que llamaremos Z (detección de cero) y N (detección de
negativo). Para cualquiera de las operaciones de la ALU, el bit Z valdrá 1 si
el resultado de la operación es 0. Es importante recordar que la instrucción
LOAD también modifica los bits N y Z, mientras que las de Store y las de salto
no modifican ni el bit Z ni el N.
-Suma y resta: la
implementación de un sumador o un restador de n bits a partir de bloques
básicos sumador completo o restador completo de un bit es sencilla.
Necesitaremos 16 bloques sumador completo y 16 restador completo, ya que en la
MR los números son de 16 bits. Tanto en el caso de la suma como de la resta,
tenemos un bit de acarreo. Este bits no se utiliza en la MR.
-Desplazamiento a
la derecha: el desplazamiento a la derecha se puede implementar de forma muy
sencilla, haciendo que todos los bits de la palabra a desplazar ocupen una
posición de menos peso. En nuestra implementación, el bit de menos peso se pierde
y el de más peso se replica para realizar la extensión de signo.
-AND lógica: la
AND lógica bit a bit de dos palabras se implementa con un puerta AND para cada
pareja de bits del mismo peso.
Implementación de
la ALU.
La ALU tiene tres
entradas de selección, que permiten escoger entre las cinco operaciones
diferentes: suma, resta, desplazamiento a la derecha, AND bit a bit y dejar
pasar un operando. Además tiene las entradas de los operandos (2 entradas de 16
bits), la salida del resultado (16 bits) y las salidas correspondientes a los
bits Z y N.
El bit N es
directamente el bit de mayor peso del resultado de la operación que se esta
realizando. El bit Z viene determinado por la NOR de todos los bits de la
salida.
La ALU tiene dos
registros que guardan el valor de N y Z par que se pueda consultar por la
Unidad de Control en cualquier momento.
LAS INSTRUCCIONES
Y SU SECUENCIAMIENTO
Un computador
ejecuta programas que están formados por instrucciones. Con el objetivo de
ejecutar cada una de las instrucciones de forma adecuada, son necesarios dos
registros en la Unidad de Proceso.
El primero es el
Registro de Instrucción (IR), que sirve para guardar la instrucción durante el
tiempo que se está ejecutando. El registro IR se carga desde la memoria del
ordenador, puesto que es ahí donde se encuentran las instrucciones.
El segundo es el
registro Contador de Programa (PC), que sirve para conocer la dirección dónde
se encuentra la instrucción a ejecutar. Para implementar el secuenciamiento
implícito, el PC siempre está apuntando a la instrucción a ejecutar después de
ejecutar la que se encuentra en el registro IR en un momento determinado.
Dado que las
instrucciones se guardan en posiciones consecutivas de memoria, es necesario
que el PC tenga asociado un incrementador que actúe sobre su valor cada vez que
se comience a ejecutar una nueva instrucción.
El PC es de 8
bits. Este tamaño está condicionado por el tamaño de la memoria de la Máquina
Rudimentaria, que es de 256 posiciones. Con 8 bits se pueden direccionar
cualquier palabra de memoria.
Las instrucciones
d salto contienen la dirección de la instrucción a ejecutar si se produce el
salto. Por tanto, es necesario que se pueda seleccionar entre la dirección
apuntada por el PC y la que apuntan las instrucciones de salto. Una posible
implementación sería con un multiplexor que seleccione entre el PC y los 8 bits
de menor peso del IR.
Una vez realizado
un salto, es necesario que se siga con el secuenciamiento implícito a partir de
la dirección a la que se ha saltado. Para ello, es necesario utilizar la
dirección de memoria de la salida del multiplexor, incrementarla en uno y
guardarla en el PC. Esto se debe realizar tanto para las instrucciones de salto
como para las demás instrucciones.
LECTURA DE
DATOS DE MEMORIA
La UP de la MR
genera direcciones que le sirven para pedir a la memoria los datos con que
operar y las instrucciones del programa. Las direcciones para las instrucciones
se escogen de entre el PC y los 8 bits de menor peso del IR.
Para el LOAD/STORE
las direcciones de memoria donde se encuentra el dato se calcula sumando los 8
bits de menor peso de la propia instrucción a los ocho bits de menor peso de
uno de los registros del banco. Es necesario por tanto usar un sumador de 8
bits para sumarlos. Además usaremos un registro para guardar la suma realizada.
Si se genera una
dirección de salto también se necesitan los 8 bits de menos peso del IR. Pero
en este caso no es necesario sumar los 8 bits de menos peso de un registro del
banco. Esto se soluciona sumando el registro R0.
La instrucción
STORE, que requiere la lectura de dos registros (el que ayuda a calcular la
dirección y el que contiene el dato a guardar) deberá realizar dos lecturas al
banco. En la primera lee el registro que contiene parte de la dirección que se
sumará a los 8 bits de menor peso del registro IR y se guardará en el registro
R@. En la segunda, lee el registro del dato, mientras se dejara pasar por un
multiplexor, el contenido de la dirección de memoria calculada y guardada en
R@.
Una vez accedido
a la memoria para leer, es necesario almacenar el valor en su lugar
correspondiente. Si la dirección corresponde a una instrucción, el destino será
el IR, y si es un dato será un registro del banco. Para la escritura en el
banco de registros, es necesario poner la entrada de la ALU, OPERAR a 0.
REGISTRO DE
ALIMENTACIÓN DE LA ALU.
El banco de
registros no puede leer dos registros a la vez. Por tanto con el objetivo de
que la ALU pueda operar correctamente con los datos que procesa la UP, es
necesario que tenga un registro de alimentación (registro A). En este registro
se guarda uno de los dos operandos para las instrucciones aritméticas y lógicas
durante el tiempo en que se utiliza la ALU. El otro operando estará guardado en
uno de los registros del banco.
LECTURA DE DATOS
DE LAS INSTRUCCIONES
Dado que la ALU
opera datos de 16 bits, es necesario realizar una extensión de signo del
operando que se encuentra en las instrucciones ADDI y SUBI. Esto se realiza
asignando el valor del bit de más peso de cinco bits de IR (que contienen el
dato) a los 11 bits de mas peso de la palabra que va a la ALU.
MULTIPLEXOR DE
ENTRADA A LA ALU
La ALU tiene el
registro A en una entrada. Por la otra entrada puede recibir distintos valores
que pueden provenir del banco de registros (operación aritmética o lógica), de
la memoria (operación LOAD) o del IR si se realiza una operación aritmética o
lógica con un inmediato. Por tanto será necesario utilizar un multiplexor para
poder seleccionar de entre los distintos buses aquel que sea necesario para
cada instrucción concreta.
IMPLEMENTACIÓN DE
LA UNIDAD DE PROCESO
La UP tiene unas
entradas que permiten manejar sus componentes. Estas entradas provienen de la
UC. Además, la UP genera unas salidas que van a la UC. Estas salidas sirven a
la UC para saber que es lo que ocurre en la UP. Sirven para que la UC sepa que
instrucción se está ejecutando en un momento dado.
En torno a la ALU
están el registro de alimentación A, los registros para almacenar el valor de
los bits Z y N, el multiplexor de acceso al operando B de la ALU.
El banco d
registros también tiene una lógica asociada. En concreto un multiplexor para
seleccionar el número de registro que se quiere leer del banco. La decisión
sobre el registro a leer debe ser seleccionado en cada momento se toma desde la
UC.
La salida de
datos del banco de registros accede a la entrada de datos de la memoria, a la
entrada del registro de alimentación A, a la lógica de generación de
direcciones y al multiplexor de selección de dato para la entrada B de la ALU.
Por ultimo existe
una lógica de evaluación de la condición. Esto determina si la condición de las
instrucciones de salto se cumple en función de los bits de condición Z y N y de
la codificación de la condición (COND) para estas instrucciones.
6. NIVEL DE LÓGICA DIGITAL.
DISEÑO DE LA UNIDAD DE CONTROL.
La unidad de
control (UC) es un sistema secuencial, cuya misión es determinar el
secuenciamiento en que los distintos elementos de la unidad de proceso deben
operar. La unidad de control recibe información de la instrucción que debe ser
ejecutada (código de operación) y de los bits de evaluación de la condición del
salto.
FASES DE EJECUCIÓN
DE UNA INSTRUCCIÓN
El
secuenciamiento de una instrucción está dividido en cuatro fases. Estas fases
son:
-Fase de FETCH:
realiza la búsqueda en memoria de la instrucción que se desea ejecutar y se
almacena en el Registro de Instrucciones. También se incrementa el Contador de
Programa.
-Fase de DECODIFICACIÓN:
La UC analiza el código de operación de la instrucción con el objeto de decidir
cuales son las acciones posteriores para su correcta ejecución.
-Fase de BÚSQUEDA DE
OPERANDOS: en esta fase, si es necesario, se realiza la búsqueda de
los operandos en registros de la UP. En esta fase se realiza la evaluación de
los flags de condiciones en las instrucciones de salto.
-Fase de EJECUCIÓN DE
LA INSTRUCCIÓN: se realiza la operación descrita por la instrucción
y el resultado se guarda en los registros de la UP o bien en la memoria.
FASES DE LA
EJECUCIÓN DE INSTRUCCIONES EN LA MR
Cada fase puede
durar un número distinto de ciclos dependiendo de su complejidad y de las
facilidades que la Unidad de Proceso ofrezca para su implementación.
Dado que la UC es
un sistema secuencial esta puede ser diseñada como una máquina de estados
(modelo de Moore donde cada estado representará un ciclo de reloj en el
procesador.
Las fases de
fetch y decodificación son comunes a todas las instrucciones en los
procesadores. Debido a que para poder ejecutar una instrucción primero es
necesario leerla de memoria y almacenarla en el IR, y segundo es necesario
analizar que tipo de instrucción es para poder determinar las operaciones a
realizar.
FASE FETCH
En esta fase se
asume que el PC contiene la dirección de memoria de la instrucción que se va
ejecutar. El objetivo es almacenar la instrucción en el IR. Para ello se envía
la dirección del PC a la entrada de direcciones de memoria (M@). Paralelamente
se activa el señal de carga del IR (Ld_IR) para almacenar la instrucción cuando
llegue el siguiente flanco de reloj.
La dirección
enviada a la entrada de direcciones de la memoria es incrementada en 1. Para
almacenar esta nueva dirección en el PC se activa la señal de carga del PC
(Ld_PC) de forma que en el siguiente ciclo la dirección incrementada queda
almacenada.
La duración de la
fase de fetch
es de un ciclo. En el tiempo correspondiente a ese ciclo el contenido del PC
debe pasar a través del multiplexor de memoria, la memoria tiene que tener
tiempo de servir el contenido de esa dirección al registro IR y el
incrementador debe poder calcular la siguiente dirección.
FASE DE DECODIFICACIÓN
En esta fase la
UC evalúa el código de operación de la instrucción con el objeto de decidir
cuales serán las siguientes acciones a realizar. Las operaciones en la UP
dependerán del tipo de instrucción, que es determinado por los dos bits de su
código de operación.
Si es 00 hace
LOAD, 01 un STORE, 10 instrucción de salto y si es 11 instrucciones ARITMÉTICAS.
La fase de decodificación
dura 1 ciclo, durante el cual la UP no realiza ningún tipo de operación. El
contenido de todos los registros en la MR es preservado desactivando sus
respectivas señales de load a 0.
Después de esta
fase, y en función del código de operación y del valor de la evaluación de la
condición, la UC debe decidir cual es el conjunto de pasos a seguir para que la
instrucción se ejecute de forma correcta. Las transiciones entre estados se
efectuarán en función del código de operación y del bit COND, procedente del
bloque de Evaluación de la Condición, que evalúa la condición de salto.
FASE DE EJECUCIÓN
DE LAS INSTRUCCIONES ARITMÉTICAS.
Las instrucciones
se realiza sobre dos números naturales de 16 bits de codificados en Ca2. Los
operandos pueden estar contenidos en:
-Registros en el
Banco de Registros.
-Los 5 bits de
menor peso del registro IR.
En la fase de
búsqueda de operandos, la UC se encarga de enviar a la UP, en
correcto orden de secuenciamiento, las señales de control necesarias para traer
los operandos de cada instrucción desde el lugar donde se hallan almacenados.
En el caso de la instrucción SRL, el único operando se lee del Banco de
Registros pero esta se considera como una instrucción de dos operandos, en la
que el primer operando no se utiliza.
Dado que el BR
sólo permite la lectura de un operando cada ciclo serán necesarios dos ciclos
para leer los dos operandos. En el primer ciclo el primer operando se cargará en el registro A de la UP. En el
segundo ciclo, el segundo operando (proveniente del BR o de los 5 bits más
bajos del IR) se dejara pasar a través del multiplexor de la ALU de forma que
la ALU realizará la operación correspondiente con ambos operandos. El resultado
de la ejecución de la instrucción se escribirá en el registro destino.
BÚSQUEDA DEL
PRIMER OPERANDO
La lectura del
primer operando requiere 1 ciclo de reloj. El contenido del registro fuente 1
se carga en el registro A. El Rf1 esta codificado en los bits de IR de la
instrucción. Para acceder a Rf1, las señales de control CRf se activan a 01,
seleccionando del BR el contenido de Rf1 en el multiplexor da salida del BR.
Simultáneamente se activa la señal de carga Ld_A del registro A. De esta forma
cuando llegue el flanco de reloj que indica el final del ciclo, en el registro
A se cargará el contenido del registro Rf1.
En el caso de la
instrucción SRL, la lectura del primer operando se realiza con el fin de no
establecer diferencias en la ejecución de las distintas operaciones
aritméticas. La lectura de este primer operando ficticio no afectará de ninguna
forma al resultado de realizar el desplazamiento aritmético sobre el segundo
operando.
BÚSQUEDA DEL
SEGUNDO OPERANDO
La lectura del
segundo operando se realiza en 1 ciclo de reloj.
Para operando
almacenados en el BR, el registros Rf2 que contiene el operando está codificado
en los bits de IR. Para acceder a él, las señales de control CRf se activan 10,
seleccionando el registros adecuado en el multiplexor de salida del BR. Los 2
bits de control en el multiplexor de la ALU provienen del registro IR y se
ponen a 11 y por lo tanto la entrada 3 del multiplexor de la ALU es
seleccionada para alimentar la entrada B de la ALU, así en B esta el Rf2.
Para operandos
inmediatos, la constante num puede obtenerse directamente del registro IR. Como
el operando requerido es de 16 bits, es preciso hacer una extensión de signo
del operando antes de que este llegue al multiplexor de la ALU. Los 2 bits de
control en el multiplexor seleccionan en este caso la entrada 2.
EJECUCIÓN DE
LA INSTRUCCIÓN
En el segundo
ciclo ambos operandos ya están presentes en las entradas de la ALU. De esa
forma, el cálculo de la operación puede activarse en el mismo ciclo en el que
se lee el segundo operando. Para que la ALU realice la operación requerida por
la instrucción, las instrucciones han sido codificadas de modo que el campo OP
del registro IR coincida con la codificación de la operación que la ALU debe
realizar. A demás la señal OPERAR de la
UC debe estar activada a 1 para que la operación aritmética se realice.
Dado que el mismo
ciclo en el que se lee el segundo operando se calcula el resultado de la
ejecución, al llegar el flanco que indica el final de ese ciclo el resultado
debe ser escrito en el registro destino. Para permitir realizar la escritura en
el BR, la UC debe activar el bit ER, mientras que el registro a escribir es
directamente seleccionado del BR a partir de los bits que codifican el registro
destino en la instrucción.
Además de
escribir el resultado de la operación realizada por la ALU en el registro
destino, en la fase de ejecución de las instrucciones aritméticas se deben
actualizar los flags de condición RZ y RN.
Una vez
finalizada la ejecución de la instrucción aritmética se debe realizar el fetch
de la siguiente instrucción en secuencia (cuya dirección se haya almacenada en
el registro PC).
En el caso de que
el operando sea inmediato la extensión de signo no provoca retardo alguno, ya
que solo implica la replicación del bit de más peso de la constante de 5 bits.
Como hemos visto
son necesarios 2 ciclo de reloj para leer los operandos de una instrucción
aritmética y ejecutarla. Como cada ciclo es un estado habrá dos estados
diferentes después de la fase de decodificación.
FASES DE EJECUCIÓN
DE LA INSTRUCCIÓN LOAD
Una vez
codificada la instrucción LOAD, el operando fuente debe ser traído desde la
memoria y almacenado en el registro destino. Para leer el operando fuente son
necesarios dos ciclos, uno para calcular la dirección de memoria en la que se encuentra
y otro para la lectura del dato. Como durante el segundo ciclo el dato ya
estará disponible, se puede realizar su escritura en el BR.
CARGA DE LA
DIRECCIÓN DEL OPERANDO EN EL REGISTRO R@
Para leer el dato
de la memoria es necesario enviar su dirección. Esta dirección se calcula
sumando el contenido del registro índice (Ri) con los 8 bits de menor peso del
registro IR. Para realizar esta suma se utiliza un sumador conectado a R@. Una
de las entradas del sumador está directamente conectada a los bits de IR y la
otra proviene del BR, de donde se obtendrá Ri. El registro índice se selecciona
activando la señal CRf a 01. Así, a la salida del sumador se obtiene la
dirección del operando Ri+IR7-0 . La señal de carga de R@ (Ld_R@)
deberá estar también activada a 1 en este ciclo para que la dirección del dato
se almacene en R@.
LECTURA DEL
OPERANDO EN MEMORIA Y ESCRITURA DEL REGISTRO DESTINO
Una vez la
dirección se halla en R@, ésta puede ser enviada al bus de direcciones de la
memoria. Para ello, la UC pondrá un 1
en la señal de control `P`C/@.
Como el operando
debe escribirse en el registro destino, el multiplexor de la ALU y la propia
ALU deben dejar pasar el dato hacia el BR. Para ello, la entrada de control de
mayor peso del multiplexor esta conectada al bits CO del código de operación.
Dado que el bits CO vale 0 en las instrucciones de LOAD y que el bus de datos
de Mout está conectado a las entradas 0 y 1 del multiplexor el dato
llegará a la ALU independientemente del valor de OP.
Para que la ALU
deje pasar el valor presente en la entrada B, la UC debe activar a 0 la señal
OPERAR. Al mismo tiempo cuando el dato pase a través de la ALU, la activación
de las señales Ld_RZ y Ld_RN permite la actualización de los flags de condición
RZ y RN, según sea el valor.
Una vez
transcurrido el tiempo para que el dato pase por el multiplexor y la ALU, el
dato puede ser escrito en el registro destino. Para ello, la UC debe activar a
1 la señal ER. La selección del registro a escribir la realiza directamente el
decodificador del BR, utilizando los bits 11-13 del IR que codifican el
registro destino.
Todas estas
operaciones se realizan en un sólo ciclo de reloj.
Después de la
ejecución de una instrucción LOAD, la UC debe hacer fetch de la siguiente
instrucción en secuencia.
FASES DE EJECUCIÓN
DE LA INSTRUCCIÓN STORE
La instrucción
STORE almacena en memoria el contenido de un determinado resurtió del BR. El
STORE no altera el valor de los flags de condición. Esta instrucción requiere
al igual que LOAD dos ciclos para completarse una vez ya ha sido codificada. La
instrucción STORE mezcla la fase de búsqueda de los operando y la de ejecución
como las vistas hasta ahora.
CALCULO DE LA
DIRECCIÓN DEL DESTINO.
En un primer
ciclo, la dirección donde debe guardarse el registro fuente (Rf) debe
calcularse y almacenarse previamente en el registro R@. Esta dirección se
calcula de la misma forma que la dirección en la instrucción LOAD.
ESCRITURA DEL
RESULTADO EN MEMORIA
Una vez la
dirección de memoria ha sido almacenada en R@, la UC envía el contenido de Rf
al bus de entrada de la memoria (Min) a través del multiplexor de
salida del BR. Para ello, la señal CRf en el BR se activa a 00. Mediante la
activación de la señal `P`C/@ a 1, la dirección donde debe
escribirse el dato es enviada al bus M@. Es necesario activar la señal `L/E
durante todo el ciclo en que se realiza la escritura a memoria. De este modo,
el dato se escribe en la dirección adecuada una vez transcurrido el tiempo
requerido.
El STORE requiere
dos estados para ejecutarse una vez ha sido decodificada. El primer estado
carga la dirección de la memoria y el segundo estado, corresponde a la
escritura del registro fuente en memoria.
FASES DE EJECUCIÓN
DE LAS INSTRUCCIONES DE SALTO
Una vez
decodificada, una instrucción de salto tiene dos fases bien diferenciadas.
Primera fase se comprueba si se debe realizar el salto o no y se calcula la
dirección de la siguiente instrucción en caso de que se deba romper el
secuenciamiento implícito. En la segunda según haya sido el resultado de
evaluar la condición de salto, se efectúa el salto o bien se ejecuta la
siguiente instrucción.
FASE DE EVALUACIÓN
DE LA CONDICIÓN DE SALTO
El módulo
“Evaluación de la condición” se encarga de decidir si un salto debe o no
producirse. Recibe el valor de los flags y el código correspondiente a la
condición de salto a evaluar. El código de salto está formado por los 3 bits de
la instrucción que codifican el tipo de la instrucción de salto. El bloque
“Evaluación de la condición” envía un bit COND a la UC, indicándole si el salto
debe o no realizarse. Si se debe realizar se ejecuta una fase fetch
especial en la que en lugar de utilizar el contenido del registro PC como
dirección se utiliza la dirección del salto contenida en la instrucción. En
caso contrario, se pasa a ejecutar el fetch con la dirección del PC.
FASE DE EJECUCIÓN
DEL SALTO
En caso de que se
deba ejecutar el salto se requieren dos ciclos adicionales. En el primero la
dirección de salto debe ser almacenada el registro R@. Como para llegar al R@
la dirección debe pasar a través del sumador, es preciso que en la otra entrada
del sumador se encuentre la constante cero.
Para conseguir
este cero, todas las instrucciones de salto codifican en los bits IR10-8
tres ceros. Utilizando la codificación de estos tres ceros se realiza una
lectura del registro R0. Para ello la UC activa 01 la señal CRf.
El proceso se
completa activando la señal de carga del registro R@(Ld_R@) de modo que al
llegar el flanco del siguiente ciclo de reloj, R@ se cargará con el valor de
los 8 bits de menor peso del registro IR.
El segundo ciclo
de reloj se procede ha hacer fetch del contenido del registro R@. Para
ello se siguen los mismos pasos para realizar el fetch exceptuando la señal
PC/@, que ahora debe tomar valor 1. El registro PC se carga con el valor de la
dirección que se acaba de leer incrementado en 1. Con ello se consigue que,
después de ejecutarse el salto, se siga con el secuenciamiento implícito a partir
de la dirección a la que se ha saltado.
Es necesario un
primer estado (ECS) para evaluar si se cumple o no la condición de salto. Si el
resultado de la evaluación es negativo entonces el siguiente paso a realizar
por la UC es el fetch de la siguiente instrucción, cuya dirección se haya
almacenada en el registro PC.
Si el resultado
es positivo, son precisos dos estados para completar el salto. EL primer estado
sirve para cargar la dirección de salto en el registro R@. El segundo estado
(BRANCH) realizará el fetch de la instrucción que se encuentra
en la dirección de memoria apuntada por el registro R@. Una vez realizado este
fetch, la UC procederá a decodificar la instrucción que se encuentra en esta
dirección. Por ello, y a diferencia del resto de las instrucciones, después del
estado de BRANCH se ejecuta el estado de decodificación.
La ejecución de
la instrucción de salto dura tres ciclos si el salto no se produce y cuatro si
se efectúa el salto.
OPTIMIZACIONES EN
EL GRAFO DE ESTADOS
una forma de
simplificar el grafo de estados consiste en estudiar las tareas que realizan
dos o más estados consecutivos. Si estas tareas pueden ser realizadas
simultáneamente, los estados se transforman en uno solo que realiza el trabajo
de todos ellos. La función de salida de este nuevo estado será una combinación
de las funciones de salida de todos los estados a los que substituye.
Una segunda forma
consiste en estudiar las tareas de dos o más estados A y B que se ejecutan de
forma excluyente a partir de un tercer estado C.
-Si los valores
de las señales de salida en A y B son equivalentes (tienen la misma tabla de
salidas), ambos estados pueden combinarse en un único estado D que sucederá al
estado C, y que tendrá la misma tabla de salidas.
-Si los valores
de la señales de salida en A y B son compatibles (realizan operaciones sobre
distintos componentes de la UP) ambos estados pueden combinarse en un único
estado D que sucederá el estado C, y que tendrá como salida una combinación de
las salidas de A y B.
MODIFICACIÓN 1
Los estados de decodificación
(DEC) y evaluación de la condición de salto (ECS) son consecutivos, tienen la
misma tabla de salidas y ninguno realiza operaciones sobre la UP. Durante el
estado DEC se evalúa el código de operación (bits CO1-0) y durante
ECS se evalúa la condición de salto (bit COND). La evaluación de estos tres
bits puede realizarse simultáneamente, ya que durante el estado DEC no se
altera el valor de la evaluación de la condición. Por tanto, los estados DEC y
ECS pueden formar un nuevo estado, al que llamaremos DECS.
MODIFICACIÓN 2
ADR1, ADR2, ADR3
se ejecutan tras el estado de decodificación DECS. Estos tres estados
son equivalentes y producen los mismos valores en las salidas de la UC. Por
tanto, todos ellos pueden reunirse en un único estado ADR, cuya tabla de
salidas será la de cualquiera de ellos.
MODIFICACIÓN 3
Dado que en el
estado DECS no se realiza ninguna operación sobre la UP, podemos aprovechar
para anticipar parte del trabajo que deba realizarse una vez la instrucción a
ejecutar haya sido decodificada.
La actividad en
la UP en los estados ADR y LPO es muy parecida. Ambos leen del banco de
registros el registro codificado en los bits IR10-8. En el caso de
LPO, su contenido se escribe sobre el registro A, mientras que en el caso de
ADR, su contenido se escribe sobre R@. Las únicas diferencias son las señales
de carga de estos registros. En este caso, decimos que ambos estados son
compatibles. Por tanto, es posible anticipar las operaciones que realizan ambos
estados durante el estado de DECS. Llamaremos DECO a este nuevo estado, y su
salida será una combinación de la salida de los estados ADR y LPO.
Esta modificación
puede realizarse porque las instrucciones aritméticas no utilizan el valor que
pudiese haber almacenado en R@.
Est
simplificación hace que las instrucciones comiencen a ejecutarse antes de haber
sido decodificadas, y por tanto reduce el tiempo de ejecución.
MODIFICACIÓN 4
Esta modificación
afecta a la ejecución de las instrucciones aritméticas y consiste en adelantar
el fetch
de la siguiente instrucción. Los estados FETCH y LSOE son compatibles y por
tanto pueden unificarse en un solo estado al que llamaremos ARIT. La salida de
este nuevo estado será el resultado de combinar la salida de los estados FETCH
y LSOE. Dado que el fetch de la siguiente instrucción en
secuencia se realiza en el estado ARIT, el estado que se ejecutará
inmediatamente después de ARIT será DECO.
Esta
simplificación no puede ser realizada en los estados de STORE, LOAD o BRANCH ya
que en ellos se utiliza la memoria para otros fines y por lo tanto no son
compatibles con el fetch.