Reciente

6/recent/ticker-posts

MIPS R2000: Camino de Datos Monociclo



El camino de datos en los MIPS R2000 y R3000

Como continuación a artículo sobre Instrucciones del Mips, hoy trataremos el camino de datos monociclo, el multiciclo lo trataré próximamente en otro artículo. El camino de datos es el camino que deben de recorrer los datos para ejecutar una instrucción. Para poder trazar un camino de datos primero debemos saber que hacen las instrucciones y que componentes del procesador debemos utilizar.

El diagrama del MIPS

Para trazar un camino de datos utilizaremos el diagrama del MIPS que podemos ver encima de este texto, de buenas a primeras puede parecer una maraña de líneas y cuadrados, por eso vamos a explicar poco a poco y por partes como funciona el MIPS. La mejor manera de hacer esto es ir viendo como fuciona cada tipo de instrucción y que partes del mips utilizan.

Camino de datos Instrucciones Tipo R

Para comprender el camino de datos de una instrucción R, primero debemos entender como funciona la instrucción y que hace exactamente. Normalmente cuando ejecutamos una instrucción, comenzamos por el PC (Program Counter o Contador de Programa) y vamo directamente a la Memoria de Intrucciones, de esta saldrá una señal de 32 Bits que contendrá nuestra instrucción. En este caso la salidad de la Memoria de Instrucciones será una Instrucción de Tipo R con la siguiente estructura:

Para abreviar, el diagrama que utilizaremos será uno reducido que solo incuirá no que necesitan las instrucciones de tipo R, que sería el siguiente:

La señalque saldrá del Registro de Instrucciones, se dividirá en 3 ramificaciones donde cada una de estas contendrá uno de los campos de la instruccion que estemos utilizando:

  • Los Bits del 25 al 21, correspondientes al campo rs, entrarán en el registro de memoria por la entrada Leer Registro 1
  • Los Bits del 20 al 16, correspodientes al campo rt, entrará en el registro de memoria por la entrada Leer Registro 2
  • Los Bits del 15 al 11, corespondientes al campo rd, entran en Escribir Registro.
  • Los Bits Restantes no los vamos a utilizar en este momento.

Antes de continuar voy a explicar que hacen el Registro de Datos y la ALU

Registro de Datos

El registro de datos es, como indica su nombre, el registro donde se almancenan los datos. Este regisro tiene 4 entradas:

  • Leer Registro 1: Le indicamos al Registro la ubicación de los datos que queremos leer, que saldrán por la salida Lectura de Dato 1.
  • Leer Registro 2: Le indicamos al Registro la ubicación de los datos que queremos leer, que saldrán por la salida Lectura de Dato 2.
  • Escribir Registro: Indicamos la ubicación en la que queremos guardar el valor que entrará por la entrada Escribir Dato
  • Escribrir Dato: Indicamos el valor a guardar en la ubicación indicada en la entrada Escribir Registro.

 El Registro de Datos también tiene 2 salidas:

  • Lectura de Dato 1: Saldrá el valor del dato que se encuentra en la ubicación que indica la entrada Leer Registro 1
  • Lectura de Dato 2: Saldrá el valor del dato que se encuentra en la ubicación que indica la entrada Leer Registro 2

ALU

 


La ALU o Unidad Aritmético Lógica, se encarga de realizar diferentes tipos de operaciones lógicas, como sumas, restas, operaciones OR, operaciones AND, etc... Tiene 2 entradas de 32 Bits, por ellas entrarán los valores con los que queramos operar siendo la entrada de arriba la Entrada 1 y la de abajo la Entrada 2, la salida será el resultado de la operación. (En este caso ignoraremos la salida Zero ya que no le vamos a dar uso).


Ahora que hemos explicado que hacen estos 2 componentes, podemos seguir explicando que hacen las instrucciones de tipo R. Del Registro de datos saldrán los valores con los que queramos operar y entrarán en la ALU, la salida de la ALU irá de vuelta al Registro de Datos y entrará en el campo Escribir Dato del Registro de Datos. Como ejemplo, tomaremos la siguiente instrucción: 

add $4, $5, $6

 La instrucción primero entrará en el registro de datos, lo indicamos en rojo:

Lo que pasará será lo siguiente:

  • Por Leer Registro 1 entrará rs, que en este caso sería $5, lo que hará que por Lectura de Dato 1 salga el valor almacenado en $5, al que denominaremos R(rs). 
  • Por Leer Registro 2 entrará rt, que en este caso sería $6, lo que hará que por Lectura de Dato 2 salga el valor almacenado en $6, al que denominaremos R(rt).
  • Por Escribir Registro entrará rd, que en este caso sería $4, esto lo que hará es indicarle al registro la ubicación en la que se quiere guardar lo que entre por la entrada Escribir Dato.

Esto lo podemos dibujar en el diagrama de la siguiente forma, indicando este paso en azul:

Tras esto, R(rs) y R(rt) entrarán en la ALU y la ALU los sumará, tras eso de la ALU saldrá el resultado y entrará en el Registro por la salida Escribir Dato, almacenandose así la suma de los valores de $5 y $6 en $4, finalizandose así la operación.

Instrucciones de Tipo I

Las instruciones de Tipo I son similares a las de Tipo R, pero la principal diferencia es que no tienen campo rd, Shamt ni Funct y en el lugar de estos campos se encontraría el valor inmediato o la etiqueta en caso de estar con un Salto condicional.


Con las instrucciones de Tipo I vamos a añadir más componentes al diagrama simplificado que hemos utilizado con el de tipo R:

Lo que se ha hecho es añadir una unidad de signo extendido por la que entran de los bits 15 al 0 y se extiende para ser de 32 bits para a continuación entrar directamente en la ALU, esto se hace por que el segundo operando que vamos a utilizar no está almacenado en ningún registro, si no que es un valor inmediato que indicaremos en la instrucción. El Signo extendido es necesario ya que la ALU debe recibir señales de 32 bits y nuestra señal es inicialmente de 16 bits.

Por otro lado, para el contador de programa hemos añadido un Sumador que suma 4 al PC cada vez que se realiza una operación. y se ha añadido al diagrama la memoria de instrucciones.

En este caso el camino de datos de las instrucciones de Tipo I puede variar de muchas formas y es posible que tengamos que añadir algún elemento más, por lo que vamos a hacer ejemplos de las principales instrucciones de tipo I: addi, LW, SW y Beq

Ejemplo addi

addi $4, $6, 10

Lo primero que haremos será salir del PC e ir a la Memoria de instrucción, de ahí saldrá la instrucción de 32 Bits, de forma que los bits del 25 al 21 irán al Banco de Registros por la entrada Leer Registro 1, por otro lado, los bits del 20 al 16 entrarán por Escribir Registro para indicar la posición en la que se guardará el resultado de la operación. Los bits restantes, del 15 al 0, irán a la unidad de signo extendido para convertir la señal de 16 a 32 bits.

Tras eso, del Banco de registros saldrá por Lectura Dato 1 el valor almacenado en $6 y entrará en la ALU, por otro lado, la señal de salida de la unidad de Signo Extendido, entrará en la ALU.

A continuación la ALU hará la operación de suma y el resultado irá al Banco de Registros por la entrada Escribir Dato, finalizándose asó el proceso.



Ejemplo LW

Para este ejemplo, añadiremos al diagrama la Memoria de Datos, que será a donde irá la salida de la ALU.

El ejemplo que utilizaremos esta vez es el siguiente:
lw $4, 10($5)

La instrucción lw o Load Word, lo que hace es cargar un dato del la Memoria de Datos y guardarlo en el registro que hemos indicado. Primero comenzaremos como siembre saliendo del PC y yendo a la memoria de instrucciones de donde saldrá nuestra instrucción. En este caso los bits 25 al 21, correspondientes al registro $5, entrarán por Leer Registro 1 del Banco de Registros, los bits 20 al 16, correspondientes a $4 entrarán en Escribir Registro para indicar donde queremos guardar el resultado de la operación y finalmente, los bits del 15 al 0, correspondientes al valor inmediato 10, pasarán por la unidad de signo extendido para convertirse en señal de 32 Bits.

Tras eso, del Banco de registros saldrá por Lectura Dato 1 el valor almacenado en $5 y se meterá en la ALU, por otro lado, la salida de la unidad de Signo Extendido entrará por la otra entrada de la ALU.
Después el valor almacenado en $5 se sumara con el valor inmediato 10 en la ALU y la salida irá a Memoria de Datos por la entrada Leer Dirección.
Finalmente, el dato que queríamos cargar saldrá por Lectura de Dato en Memoria de Datos al Banco de Registros y entrará por la entrada Escribir Dato, guardando el valor en cuestión en la dirección $4, finalizándose así el proceso.


Ejemplo SW 

La instrucción sw o Store Word funciona de una forma similar a lw, pero con algunas pequeñas diferencias, para esta instrucción tendremos que añadir algunos cables más al diagrama que utilizamos lw siendo el que utilizaremos ahora así:

El ejemplo que utilizaremos será el siguiente:
sw $6 20($3)
El camino de datos de esta instrucción comienza al igual que todos los anteriores, comenzando en el PC, pasando a Memoria de Instrucciones y de ahí saliendo nuestra instrucción. Tras eso, los bits del 25 al 21 entrarán por Leer Registro 1 y los bits del 20 al 16 por Leer Registro 2. Los Bits del 15 al 0 irán a la unidad de Signo Extendido para transformar la señal a 32 Bits.
Tras eso, del Banco de Registros, saldrán por Lectura de Dato 1 el valor almacenado en $e y entrará directo a la ALU y por Lectura de Datos 2 el valor almacenado en $6, que irá directo a la Memoria de Datos por la entrada Escribir Dato para indicar donde se quiere almacenar el resultado de la operación.
La salida del Signo Extendido irá directa a la ALU.

Tras esto, la ALU realizará la operación y la salida de esta irá directamente a la entrada Escribir Dirección de la Memoria de Datos, guardando así el dato en esta y finalizándose el proceso.

Ejemplo Beq

 Para finalizar con las instrucciones de Tipo I le vamos a echar un vistazo a la instrucción beq, para esta instrucción vamos a necesitar modificar de nuevo el diagrama que utilizamos antes añadiendo un multiplexor y una unidad de  desplazamiento:

La instrucción beq o Branch if EQual funciona de forma similar que un condicional, lo que hace es comparar los 2 registros que se le den y en caso de que ambos sean iguales, procede a saltar a la ubicación de una etiqueta que le demos.
En este caso el ejemplo que utilizaremos es el siguiente:
beq $4, $6, #inicio

Para el camino de datos comenzaremos, como siempre en el PC, en este caso la señal del pc pasará por el sumador PC+4 que podemos ver en el diagrama encima de la memoria de instrucciones y después pasará por la Memoria de Instrucciones, de donde saldrá la instrucción. Los bits del 25 al 21, correspondientes a $4 entrarán por Leer Registro 1 al Banco de registros, mientras que los bits del 20 al 16, correspondientes a $6 entrarán por Leer Registro 2. Los bits del 16 al 0 pasarán por la Unidad de Signo Extendido para convertir la señal a 32 Bits.

Tras eso, de la salida Leer Registro 1 del Banco de Registros saldrá el valor almacenado en $4 y entrará directamente en la ALU, lo mismo pasará con el Registro , del que saldrá el valor almacenado en $6. Por otro lado, del PC+4 saldrá una señal que irá directamente a un sumador y simultáneamente a un Multiplexor. El valor del signo extendido pasará por la Unidad de Desplazamiento y entrará en el sumador.


A continuación se realizará una resta en la ALU y si el resultado es 0, entonces los valores de los 2 registros indicados es el mismo y por la salida Zero de la ALU sale una señal que pasa por una puerta AND que se activará en caso de que reciba una señal de control beq (De esto último hablaremos en el próximo artículo). Si los 2 registros son iguales, el Multiplexor dejará pasar la señal que sale del sumador, lo que realizaría el salto de la etiqueta, en caso contrario, dejaría pasar la señal PC+4 que iría directa al PC, finalizándose así el proceso.

Instrucciones de tipo J

Finalmente, el último tipo de camino de datos que veremos hoy es el del salto incondicional, que está compuesto por solo 2 campos, el de operación y el de etiqueta o valor absoluto.

Ejemplo Jump

Para la instrucción jump debemos modificar el diagrama que hemos utilizado anteriormente para el beq siendo este el resultante:

Las modificaciones que hemos hecho han sido la de añadir otra unidad de desplazamiento y conectar los bits 26 al 0 de la salida de la memoria de instrucciones a este, después uniremos esta unidad de desplazamiento con los bits 31 al 28 de la salida PC+4 y tendremos como resultado una dirección de 32 bits que conectaremos a un multiplexor al que también va conectado el multiplexor que utilizamos para la señal beq.

El camino de datos de esta instrucción comienza como siempre en el PC, la señal de este irá a la Memoria de instrucciones y al sumador que esta encima de este en el diagrama. De la Memoria de Instrucciones saldrá nuestra instrucción de la cual los bits 25 al 0 irán a una Unidad de Desplazamiento.
Tras esto, del sumador saldrá la señal PC+4 de la que tomaremos los bits del 31 al 28 y los juntaremos con la señal que sale de la Unidad de desplazamiento, obteniendo una señal de 32 bits que irá directa al último multiplexor.

En este caso, como tenemos un salto incondicional, iremos directamente desde el último Multiplexor al PC y finalizaremos el proceso

Y con esto terminaría este artículo sobre los caminos de datos del MIPS, en el próximo Artículo veremos como funcionan las señales de cotnrol del MIPS ya con el diagrama completo del procesador.



Si quieres enterarte de nuevos artículos antes que nadie puedes unirte al Canal de Telegram de RetroGamesHistory

Publicar un comentario

1 Comentarios

  1. Muchisimas gracias por el artículo, ahora empiezo a entender este tema, ya que lo ha explicado de una forma clara concisa y concreta. Un saludo!!

    ResponderEliminar
Emoji
(y)
:)
:(
hihi
:-)
:D
=D
:-d
;(
;-(
@-)
:P
:o
:>)
(o)
:p
(p)
:-s
(m)
8-)
:-t
:-b
b-(
:-#
=p~
x-)
(k)