viernes, 17 de mayo de 2013

Resumen T4: Unidad de Control

Introducción

En esta práctica del tema 4 “Unidad de Control”, hemos aprendido su uso y funcionamiento. Para ello hemos hecho una serie de ejercicios. Teníamos que codificar una serie de instrucciones tal y como quedarían en memoria, es decir, en hexadecimal. Luego se realizará la representación de las secuencias de transferencia de registros con sus respectivas señales, las cuales hemos comprobado en una Unidad de Control implementada en el entorno de trabajo "Logisim", cuyo link de descarga se puede encontrar del Campus Virtual. De esta forma es posible comprender como trabaja la Unidad de Control de nuestro ordenador.

¿Qué se ha hecho en las prácticas? 

En primer lugar, hemos codificado las instrucciones en hexadecimal, ya que, como hemos dicho en la introducción, así se verían en memoria.

Para codificar las instrucciones en hexadecimal, es necesario saber las tablas de equivalencia de las diferentes instrucciones de MIPS, como la que se muestra a continuación:
 Para poner un ejemplo, vamos a fijarnos en el primer apartado de nuestra práctica, más concretamente, el a):

a)  ADD $t0, $t1, $t2

Está instrucción en concreto es de tipo R y, en memoria, tendría la siguiente estructura:

 
Existen, además, otros tipos de instrucciones, como la I y la J, las cuales poseen estructuras diferentes. Para poder codificarlas correctamente será necesario conocer dichas estructuras.

Volviendo a la instrucción "ADD", una vez que conocemos su tipo y su estructura, nos quedará conocer donde va cada registro que interviene en dicha instrucción:

Ahora, lo que tenemos que hacer, es buscar los registros de nuestra instrucción en la tabla para así encontrar los números a los que corresponden. Una vez hecho esto, se procederá a convertir dichos números a formato binario, para después colocarlos en fila según el orden que indique la estructura antes enseñada.
Una vez hecho esto, se procederá a agruparlos de 4 en 4 para así convertirlos a hexadecimal. Por último se transforma cada número a hexadecimal, quedando como resultado algo parecido a la tablita que se muestra a continuación:




Para el ejercicio 2  debemos realizar la secuencia de transferencia de registros con sus señales correspondientes. Para ello nos fijaremos en la CPU empleada en clase de teoría, la cual es:


 Para representar dicha secuencia, es necesario conocer las acciones que se llevan a cabo por la CPU a la hora de ejecutar una instrucción. Para empezar, siempre se tiene que implementar el ciclo de captación FETCH, el cual es necesario para todas las instrucciones. Después de la misma, se activarán el resto de las señales que corresponden con la instrucción en cuestión.

A continuación mostraré los ejercicios de esta misma práctica resueltos, para así ayudar a todo aquel que no entienda muy bien que hacer.

a) ADD $t0, $t1, $t2


b) ADDI $s0, $s1, 0x0011


c) ORI $t0, $t2, 0x00A1


d) SLL $t0, $t0, 0x0002


e) SRL $t1, $t0, 0x0002


f) LUI $s0, 0x0011


g) SW $t4, 0x0011


h) SLT $t1, $t2, $t0


i)  J 0x001A


j) JR $s0



Para terminar, el último ejercicio consiste en comprobar la correcta implementación de las instrucciones anteriores en la CPU implementada por puertas lógicas de Logisim. De esta manera se pueden asimilar mejor los conocimientos viendo el proceso de ejecución.
 

A continuación os mostraremos algunos ejemplos sobre el funcionamiento de las instrucciones en este entorno de trabajo:

a) ADD $t0, $t1, $t2:

Fase de Ejecución: (esta fase se repetiría para todas las demás instrucciones)
 - Editamos la memoria y añadimos la instrucción 0x0149420:

- Activamos T4 y en el flanco de subida C1:

- Desactivamos C1 y T4. En el nuevo ciclo de reloj activamos TD, el selector de la memoria y L:

- Activamos C4 y C2 en el flanco de subida:

- Desactivamos C2 y C4. En el siguiente ciclo de reloj activamos T3 y en el flanco de subida activamos C6:

- Finalmente desactivamos T3 y C6 para esta fase de la instrucción:


Decodificación (se realiza siempre después de la fase de captación)

Fase de Ejecución:
- Seleccionamos en RA el registro $t1, en RB el registro $t2 y en RC el registro $t0:

- Primero activamos T5 y en el flanco de subida activamos SC para cargar. En $t0 el resultado. Para el siguiente ciclo de reloj T5 y SC se desactivan:


d) SLL $t0, $t0, 0x0002:

Fase de Ejecución:
- Activamos T8 y en el flanco de subida activamos C10:
- Desactivamos  C10 y T8. Seleccionamos el registro $t0 en RA y lo ponemos a 1 MB, y en el Flanco de subida activamos C11:

- Seleccionamos el registro de carga($t0), activamos T6 y en el flanco de subida activamos SC y se guarda el resultado en el registro. Por último desactivamos SC y T6:


g) SW $t4, 0x0011:

Fase de Ejecución:
Procedemos a desactivar nuestra carga C6 y cerramos nuestro buffer triestado T3. Una vez realizadas dichas operaciones, procedemos a abrir el buffer T8 del registro inmediato para pasar nuestro dato al bus, activando la carga C1 de MAR y así guardando nuestro dato en dicha memoria:

- En primer lugar, procedemos a desactivar nuestra carga C1, y cerramos nuestro buffer T8 dejando asi almacenado nuestro dato en MAR. A continuación, procedemos a seleccionar en el banco de registros, el registro del cual cogeremos nuestro dato y abriremos el buffer T1 para dejar pasar el dato al bus. Una vez en el bus, activaremos C3 para cargar nuestro dato en MBR:

- El siguiente paso será desactivar la carga C3 y cerrar el buffer T1, dejando ya almacenado nuestro dato en MBR. Una vez tengamos ambos datos en nuestras correspondientes memorias, procederemos a abrir los buses TD y TA, y seleccionaremos con el selector (SEL, E) en qué parte de la memoria lo queremos guardar:
- Por último, procedemos a desactivar (E, SEL), así como los triestados correspondientes a cada memoria, TD, TA:


i) J 0x001A:

Fase de Ejecución:
- Activamos el buffer triestado T8 para dejar salir el dato al bus. Una vez lo tengamos en el bus, activamos la carga C5:

- Por último, sólo tenemos que desactivar la carga C5 y el buffer triestado T8. Y ya tendremos lista nuestra instrucción JUMP:



Conclusión:
En esta práctica debes estar muy atento a todos los pasos realizados, y a las señales que se van activando y desactivando, ya que es muy fácil cometer algún que otro fallo. Si no se entiende algo de esta práctica, es muy recomendable preguntar al profesor y hacer uso de los apuntes que se facilitan en el Campus Virtual.

En resumen, creemos que la clave para realizar esta práctica correctamente es ser muy cuidadoso, pues podría ser bastante complicada para aquellas personas a las que a lo mejor no les ha ido muy bien en los temas anteriores. Y, sobretodo, tener un poco de paciencia a la hora de comprender las acciones que se realizan con cada instrucción.