MIPS R2000 Monociclo
INTRODUCCIÓN:
El simulador construido corresponde al procesador monociclo MIPS R2000, dicho procesador
opera con formatos de instrucción de 32 bits y dispone de una memoria SRAM
de 64 instrucciones por 32 bits (longitud del procesador), además implementa un fichero de
registros de 32 bits. A continuación se listan los componentes del procesador:
+ Un PC (Contador de programa)
+ Un incrementador para el PC
+ Una ALU que opera con longitudes de palabra de 32 bits
+ Una memoria de instrucciones de 64 posiciones por 32
+ Una memoria de datos
+ Una unidad de extensión de signo
+ 32 registros de 32 bits
+ Unidad de control
+ Control de la ALU
+ Multiplexores
INSTRUCCIONES
Las instrucciones que es capaz de reconocer el procesador, junto con sus códigos de
operación, son las siguientes:
Formato R: add (0), sub (0)
Lógicas: or(0), and(0)
Transferencia de datos: lw (35), sw (43)
Salto condicional: slt (0), beq (4)
Bifurcación incondicional: j (2)
Burbuja: nop (1)
Parada del procesador: halt (63)
LÓGICA DE LA UNIDAD DE CONTROL
Se puede ver el diseño a nivel de puertas lógicas en la página 271 del libro Organización
y diseño de computadores. La unidad que se presenta en el libro sólo reconoce las instrucciones
de tipo R, lw, sw, beq; en el simulador además se ha añadido la parada del
procesador (halt), bifurcación a una dirección (j), para ello ha sido necesario la adicción
de dos puertas AND además de las 4 existentes de que disponía la UC.
LÓGICA DE ALU CONTROL
Su diseño a nivel de puertas se puede ver en la página 256 del libro Organización y diseño
de computadores. A ésta le llegan dos entradas y su lógica genera una salida que va directa
a la ALU, esta salida son 3 bits que le dicen a la ALU si tiene que efectuar una operación
aritmética, lógica, de transferencia de datos, o de salto ya se condicional o incondicional.
Una de las entradas proviene de decodificar la instrucción y corresponden a los 6 LSB de dicha
instrucción, es el campo función, y los otros bits de entrada corresponden a los que genera la UC.
UNIDAD DE EXTENSIÓN DE SIGNO
Se encarga de convertir un bus de 16 líneas en otro de 32. Al método run de la clase
SignoExtendido le llega un array de entrada de tipo WIRE que es de 16 posiciones, entonces
en un array de salida de 32 posiciones, se copia en las primeras 16 el array de entrada y
el MSB es copiado 16 veces a la izquierda hasta completar el array de salida, ya se ha
convertido el bus de entrada de 16 bits a uno de 32.
PC
Para su implementación se ha utilizado un registro de tipo D, pero que se le ha añadido
dos señales que corresponden al preset y clear.
INCREMENTADOR DEL PC
Está construido a partir de una ALU normal de 32 bits, pero el código de operación que
se le pasa es el de la suma, éste es generado en la unidad ALU control y consta de 3 bits:
op[0]=op[2]=GND
op[1]=VCC
BUS DE MULTIPLEXORES
En realidad no se tiene un multiplexor, sino 32 multiplexores, esto es debido a
que cada línea que es representada en los gráficos que aparecen en los libros (véase tema 5 del libro
'organización y diseño de computadores') y que le llega al multiplexor es
realmente un bus de 32 líneas, ya que ésta es la longitud de palabra del procesador.
Entonces a cada uno de los multiplexores le va a llegar una línea de cada bus, que al
final las salidas estarán cortocircuitadas formando otro bus de 32 bits.
Construcción de un multiplexor
Estos se diseñan a partir de bufferes triestado y un decodificador. Un buffer triestado
va a dejar pasar corriente o no en función de si está a alta impedancia o no. Explicado de
mejor forma un buffer triestado, es un inversor de dos estado lógicos, con una línea de
control que permite desconectar la salida de la entrada. Los tres eestados de salida son:
nivel bajo (cuando la entrada está a nivel alto), nivel alto (cuando la entrada está a
nivel bajo) y alta impedancia (cuando la salida está desconectada de la entrada). Cuando
la línea de control está a nivel alto, el buffer está activo; y cuando la línea de control
está a nivel bajo, el buffer está en estado de alta impedancia.
Ahora que se conoce el funcionamiento de un buffer triestado se explicará el funcionamiento
del multiplexor con estos componentes. Cada una de las líneas de cada bus tiene asociado
un buffer triestado, entonces cada una de las líneas de control de cada buffer se
encuentra enganchado a la salida de un decodificador, éste seleccionará que conjunto de
bufferes son los que se tienen que activar, entonces se permitirá el paso de corriente
correspondiente a un bus en concreto.
En el simulador del programa se han utilizado la construcción de arrays dinámicos que
contienen las señales de cada bus, es decir, si a un multiplexor le llegan dos buses, se
construirá un array de tamaño 64 ( 2 * 32 bits ), de 0 a 31 se encontrará el primer bus y
de 32 a 63 se encontrarán las señales correspondientes al segundo bus.
IMPORTANTE: Si el multiplexor tiene dos líneas de control (se puede direccionar 4 buses
de datos) y, sólo le llegan tres buses entonces la última entrada del multiplexor hay que
ponerla a tierra.
DISEÑO DE LA MEMORIA SRAM
Es una memoria de 64 posiciones por 32bits, se compone de 4 bloques de 16 por 32, es decir,
hacen falta 4 líneas para direccionar cada bloque (2^4=16) y cada bloque puede ser seleccionado
de forma independiente. Aparte se encuentra la línea write, que
permitirá la lectura o escritura de la memoria y el bus de entrada de datos y el de salida,
ambos claramente de una anchura de 32 líneas.
CARGADOR DE DATOS E INSTRUCCIONES
El primer paso es leer el archivo de datos o instrucciones mediante el método leebus que
se encuentra en bus.cpp. Segundo se direcciona la memoria, son necesarias 6 iteraciones debido
al tamaño de la memoria ( 2^6 = 64 ). En el caso de leer el contenido de la memoria
la señal write debe estar a GND, si lo que se va a hacer es escribir en ella entonces write tiene
que estar a VCC.
Cuando se realiza el volcado de la memoria a un archivo, lo que se está haciendo es copiar las 64
posiciones de ésta en un archivo final en formato binario, tal y como está almacenado en la propia
memoria SRAM, durante este proceso por InputBus lógicamente no va a entrar nada.
ORDEN DE PARADA DEL PROCESADOR (INSTRUCCIÓN HALT)
La instrucción halt se reconoce por el código de operación 63, es decir, todas las líneas
de entrada de la puerta AND que se encuentra en el PLA de la unidad de control tienen
que estar activas (a 1), no se utiliza a la entrada de esta puerta ningún inversor, ya
que la salida debe ser igual a un nivel bajo o alto, en función de si las 6 entradas a
la puerta tienen todas uno de estos dos niveles. Ha sido necesario añadir una puerta AND en la unidad
de control para esta instrucción.
HACERLO FUNCIONAR TODO
Compilación:
En archivos separados en formato txt, se deben escribir en uno las instrucciones en ensamblador y en
el otro los datos. La sintaxis para las instrucciones es la siguiente, es la misma que se utiliza en el
libro, salvo que para las de transferencia de datos es
lw registro destino, registro del dato de memoria, desplazamiento
sw dato de registro, registro destino, desplazamiento
Con los ejecutables Convdat y Convinst se compilan los archivo de datos e instrucciones y se pasan a
un formato binario, estos después son leídos una vez se ha ejecutado el simulador MIPSm.
Simulación:
Mientras la línea de ControlLines[8] no contenga '1' se estará realizando la simulación, ya que si
contiene un nivel alto significa que se ha leído la instrucción halt y por tanto hay que parar la
simulación del procesador.
En cuanto al reseteo del procesador que se realiza siempre antes de comenzar a utilizar el micro,
consiste en poner la señal clear a GND, el valor de iteraciones del reloj a '0', inicializar el PC
para que apunte a la primera posición de memoria y ControlLines[8], que como se ha dicho antes era
la señal de halt, ponerla a GND para poder proceder a la simulación.