martes, 5 de junio de 2012

Despedida

Bueno, a expensas de que Julián y Cristina corrijan sus resúmenes, el blog queda finalizado. Únicaente nos falta, por lo tanto, la defensa del trabajo, que se llevará a cabo, Dios mediante, este miércoles 6 de junio. Os felicito por el trabajo desempeñado, y os deseo suerte en la defensa del trabajo. Como colofón, coloco aquí además la maquina del ejercicio 4 con las mejoras que le he incluido, que son:

-Añadida entrada reset al banco.
-Añadido teclado para introducir valores en el bus interno.
-Añadidos tres módulos para sacar del RI el inmediato según el tipo de instrucción (desplazamiento de las instrucciones R, 16 bits de inmediato de las de tipo I y 26 de las de tipo J).
-Corregido el sumador/restador, que le faltaba icluir el acarreo previo para pasar el número a complemento a 2.
- Añadidas las operaciones lui (cargar en la parte alta del registro) y slt, quedando las operaciones implementadas así:

00000 Suma
00001 Resta
00010 OR
00011 AND
00100 Despl. lógico a la izquierda.
00101 Despl. lógico a la derecha.
00110 LUI A
00111 XOR
01000 NOT A
01001 SLT

- Corregidos los desplazamientos, ya que antes si indicabas 2 bits de desplazamiento, se desplazaba 1, y así. Ahora sin indicamos desplazamiento 2, se desplazará 2 bits.

El comentario en la defensa sobre la máquina, lo puede hacer Javier (que hizo el resumen del tema 4) o si lo prefiere, yo mismo.

Aquí incluyo la máquina:

domingo, 3 de junio de 2012

Resumen tema 5


En esta práctica aprendimos a analizar y utilizar memorias RAM y ROM. Implementándolas con el programa Logisim
Primero explicaré como determinar el tamaño del chip de memoria sea RAM o ROM. Para ello deberemos cambiar los atributos "número de bits  de datos y dirección".
El número de bits de datos define el ancho del chip mientras que el número de bits de direcciones definirá el número de posiciones o alto del chip. El número de posiciones será 2 elevado al número de bits de direcciones.


Ahora que sabemos determinar el tamaño de nuestro chip de memoria podemos realizar los cinco ejercicios propuestos.

El primer ejercicio nos pedía introducir una memoria RAM de 64Kx8 (número de bits de dirrecciones 16 y número de bits de datos 8) y realizar un circuito que permita leer y escribir en ella. Probar a introducir en las direcciones 0023h el dato 3A y en la dirección C120h el dato 25.


Como vemos en el circuito la entrada de direcciones es de 16 bits y con esto podremos
seleccionar el lugar donde guardas los datos de entrada, que como dijimos
anteriormente son de 8 bits

A continuación probamos a introducir en las direcciones 0023h el dato 3A


Ahora probamos en la dirección C120h el dato 25.


El segundo ejercicio consistía en unir dos memorias del tipo utilizado en el apartado 1, para conformar una de 64Kx16.
Después comprobaríamos su funcionamiento de forma similar al apartado anterior: introduciendo algunos
datos de 16 bits en varias direcciones.
Se puede comprobar que es exactamente igual que el primer ejercicio, pero poniendo dos chips en paralelo.



En el tercer ejecicio se pide unir dos módulos como los del segundo ejercicio  (64Kx8) para conformar una de 128Kx16. Podemos comprobar su funcionamiento introduciendo valores como en los apartados anteriores.



En el cuarto ejercicio se pide ampliar la memoria hasta 256Kx16, por lo tanto necesitaremos cuatro módulos del ejercicio dos. Para seleccionar entre los cuatro módulos utilizaremos un decodificador unido a los dos bits más significativos de dirrección, que será en este caso de 18 bits (16 para seleccionar las posiciones dentro de un módulo y los dos más significativos para seleccionar el módulo)




En el último ejercicio solo debemos cambiar el primer módulo por memorias ROM con los mismos atributos.


Hay que observar en el siguiente circuito como en la memoria ROM únicamente nos encontramos una señal de control: el selector, que va junto con los selectores de las memorias RAM al decodificador para poder seleccionar el módulo de memorias ROM.
 

Espero que os sirva éste resumen en el cual se explica todo lo que si hizo ese día en las practicas del tema 5 correspondientes a la cuarta practica.

viernes, 1 de junio de 2012

Tema 6 - Resumen

En esta última práctica tendremos que demostrar todo lo que hemos ido aprendiendo de las anteriores, ya que se mezclarán todas las operaciones y comandos, seguiremos usando Logisim para crear los circuitos que se nos proponen, tales como un circuito conversor de paralelo-serie-paralelo y matrices gráficas; para este último usaremos un nuevo elemento, “LED Matrix”.
A continuación explicaremos todos los circuitos:

1. Montar un circuito conversor paralelo-serie-paralelo por medio de un registro de desplazamiento serie.
Como recordaremos, para montar un registro de desplazamiento usaremos separadores, solo que en vez de unir dos, los uniremos a dos registros de desplazamiento, llamados Shift Register.
 


Este circuito tiene este nombre ya que si nos fijamos en el dibujo, manda los datos de forma paralela al registro, y de este sale en serie al siguiente registro para volver a acabar en paralelo

2. Una vez comprobado el buen funcionamiento del sistema, ampliarlo a un bit adicional (9) que contenga la paridad del dato a enviar. Comprobar también la paridad del dato recibido.
Para modificar el circuito deberemos poner una entrada/salida más a los registros para así tener nuestro bit de paridad y unir este junto con los otros ocho a una puerta AND con la intención de conseguir al final una salida la cual será correcta si su resultado es cero.

3. Automatizar el envío de datos mediante un contador.
Como nos dice el enunciado, añadiremos un contador, este estará unido al reloj, ya que así trabajará según los ciclos, además tendrá 4 salidas que implementaremos con un separador que se unirán a una puerta NAND para obtener una salida


4. Montar una matriz gráfica de 8x8 puntos conectada a una memoria que sirva para almacenar un gráfico en la matriz. Cada fila de la matriz debe poseer un registro que actúe como buffer para retener el dato a visualizar. Programar la memoria para visualizar cuadrado.
Como tenemos una matriz 8x8 y nos piden un registro por fila, tendremos que usar en total 8 registros; por otro lado usaremos una memoria RAM (ya vista en la práctica anterior), y un decodificador que básicamente haga de unión con todos los elementos.
 Una vez montado el circuito, os explicaremos como trabajar con esta matriz gráfica; a cada columna de la matriz de llegan 8 bits, así que imaginad que queremos activar el primer y tercer cuadrado de nuestra fila, en ese caso deberemos pasarle el siguiente conjunto de bits: 10100000


5. Modificar el circuito anterior, duplicando la capacidad de memoria y utilizando un
contador de 4 bits, de forma que se visualicen dos figuras una detrás de otra, en la matriz.
Para realizar este circuito solo deberemos modificar un poco el anterior, aumentaremos nuestra RAM a 16GB y el contador con un bit más, usaremos dos separadores, uno de 4 bits y otro de 3 para así poder seguir trabajando con nuestro anterior decodificador, el cual hará que se visualicen las dos figuras



6. Modificar el circuito anterior volviendo a duplicar la memoria, de forma que se visualicen
cuatro figuras una detrás de otra. Crear una pequeña animación.
Al igual que en el ejercicio anterior, volveremos a duplicar la memoria RAM y jugando con el reloj y las direcciones de memoria de la RAM, nos fijamos que conseguimos que cada circuito se encienda o apague. Adjuntamos también una pequeña animación sencilla en gif.

FAQ Tema 5


· ¿Qué significan los elementos que veo en el módulo de memoria?

Dentro del módulo de memoria (ya sea RAM o ROM) veremos un rectángulo con el borde más fino y a la izquierda del mismo encontramos una serie de dígitos de color gris. Estos dígitos serán las posiciones a las que estamos accediendo en hexadecimal, habiendo 2n posiciones, y siendo n el número de bits del bus de direcciones (se puede cambiar en los atributos del módulo, así como el número de bits del bus de datos). 
Dentro del rectángulo se mostrarán con dígitos negros en hexadecimal los valores almacenados en las distintas posiciones. Dependiendo del tamaño del bus de datos y del bus de direcciones se mostrará en una misma fila el contenido de varias posiciones, siendo por lo tanto los dígitos en gris que se sitúen en esa fila la dirección de la primera posición de la fila. Por lo tanto, la dirección de las siguientes posiciones de la misma fila será la dirección de la primera más lo que nos desplacemos con respecto a la primera posición (si hay 4 posiciones por fila, y la dirección de la primera posición es 4, la dirección de la segunda será 5, la de la tercera 6 y la de la cuarta 7).
· A la hora de editar los datos de la memoria, solo veo las primeras posiciones, ¿Cómo puedo editar el resto de posiciones? 

Existen tres alternativas para editar el resto de posiciones tanto en RAM como en ROM:
  •         Al seleccionar una posición cualquiera, aparecerá un rectángulo rojo en esa posición, indicando que podemos editar su contenido. Si queremos mover el rectángulo rojo para introducir datos en el resto de posiciones pulsaremos la barra espaciadora para avanzar a la siguiente posición, tecla de borrar (retroceso) para volver a la anterior posición, o tecla intro (debajo de la de borrar) para avanzar a la siguiente fila.
  •         Si pinchamos en una dirección (dígitos en gris) el rectángulo rojo se situará sobre ella y podremos teclear la dirección a la que deseamos acceder. De esta forma, nos llevará a la fila en la que se encuentre la posición a la que deseamos acceder.
  •         Si hacemos clic con el botón derecho sobre el módulo y seleccionamos editar contenidos, se nos abrirá el editor hexadecimal, con el que nos será más fácil acceder a cualquier posición para editar su contenido.
· ¿Qué diferencia existe entre RAM y ROM en logisim, si puedo modificar los datos en ambos tipos de memoria?

Ciertamente, en ambos casos es posible modificar el contenido mediante cualquiera de las tres alternativas mencionadas en la anterior pregunta. No obstante, en el caso de la ROM solo podremos hacer la operación de lectura (no en vano ROM significa Read Only Memory), es decir, no se pueden escribir los datos que vengan por el bus de datos y solo podremos modificar el contenido de la memoria como se hizo en la pregunta anterior. Sin embargo, en la memoria RAM es posible realizar tanto la operación de lectura como la de escritura, por lo tanto, podremos modificar el contenido de la memoria escribiendo los datos que vengan por el bus de datos o bien, como se hizo en la pregunta anterior.

· ¿Para qué sirven los pines de entrada y salida de la RAM y la ROM?
  •         Sel: Nos permite activar o desactivar un chip RAM o ROM. Si tenemos uno o más chips en paralelo (módulo) no es necesario, pero será muy útil si tenemos varios módulos, ya que podremos activar únicamente el módulo al que accedamos en cada momento.
  •         Triángulo (Escritura de datos, E): Puede ser conectado a un pin de entrada de 1 bit o a un reloj. En cualquier caso, en nivel alto, y con clr y out en nivel bajo, escribirá en la posición suministrada por la entrada A el dato que llega por la entrada D. (Solo RAM)
  •         Out (Lectura de datos, L): Cuando está en nivel alto permitirá salir por D el contenido de la dirección indicada por A. Al estar en nivel alto no permite que se carguen datos, por lo que debe ser desactivado si queremos escribir en la memoria. (Solo RAM)
  •         Clr (clear): Cuando está en nivel alto, se resetea la memoria. (Solo RAM)
  •         A: Suministra la posición a la que deseamos acceder.
  •         D: Entrada o salida de datos a la memoria.
· Estoy haciendo una simulación y por cualquier motivo debo dejarla a la mitad, ¿Podría salvar los datos que he introducido en memoria para no tener que volver a introducirlos cuando reanude la simulación?

Por supuesto. Para salvar los valores solo se debe hacer clic derecho sobre el módulo de memoria y seleccionar salvar imagen. El archivo con los datos de ese módulo de memoria se salvarán en un archivo que deberá tener el siguiente nombre: nombre_archivo.raw. Para cargar en el módulo de memoria los datos salvados en el archivo, solo se debe hacer clic derecho sobre el módulo y seleccionar cargar imagen, seleccionando en la ventana que se abre el archivo en el que habíamos guardado los datos.
· ¿Por qué a partir del ejercicio 3 uno o más de los bits más significativos de la dirección se quedan aparte de los primeros dieciséis?

Eso es debido a que los bits menos significativos (en este caso son dieciséis, pero depende de las posiciones que tenga el módulo) del bus de direcciones tienen como finalidad identificar a qué posición del módulo accedemos, mientras que los más significativos (en cada caso necesitaremos un número distinto según el número de módulos que tengamos) se utilizan para seleccionar qué módulo está activo en cada momento. Como se dijo antes, se activará la entrada sel del módulo al que queramos acceder utilizando un decodificador con los hilos de selección de módulo; de esta forma, solo un en un módulo se podrán escribir o leer datos, mientras que los demás permanecerán inactivos (evitando que un mismo dato se escribiera en varias posiciones a la vez o que de cada módulo saliera un dato distinto, provocando colisiones). 

· ¿Cómo puedo determinar el tamaño de mi chip de memoria RAM o ROM?
Para ello solo debemos modificar los atributos de nuestro chip de memoria, ya sea RAM o ROM.
Seleccionamos nuestro chip y observamos que podemos cambiar tres atributos. Para modificar el tamaño de nuestro chip nos interesan los dos primeros. El primero de ellos: Número de bits de dirección, nos permitirá definir el ancho del bus de direcciones que se debe conectar a dicho módulo; por lo tanto definiremos así el número de posiciones de nuestro chip, siendo éstas tantas como 2 elevado al número de bits de dirección que seleccionemos (en nuestro ejercicio utilizamos chips de 64 K posiciones, o lo que es lo mismo 2^16 posiciones, por lo tanto debemos seleccionar 16 en el número de bits de dirección). Así hemos definido el “alto” de nuestro chip. Para definir el “ancho”, es decir, el número de bits que de los datos almacenados en el chip, usaremos el atributo: Número de bits de datos (en nuestro ejemplo, el chip es de 64K x 8, luego el número de bits de datos será 8).

jueves, 31 de mayo de 2012

Tema 6 - FAQ



- Al empezar la práctica hay muchos ejercicios y poco tiempo, ¿Por donde empiezo?

No hay que alertarse, ya que la práctica es simplemente ir conectando elementos conforme se avanza en los ejercicios. Por ejemplo, el segundo ejercicio es una ampliación del primero.

-Al estar montando el circuito, observo que mi cableado aparece de color azul y no funciona, ¿qué puedo hacer?

Puede que los cables no están correctamente conectados a la entrada o salida, así que observa que los extremos de los cables estén correctamente unidos a cualquier punto de conexión de cualquier componente. Tras esto, los cables deberían aparecer en verde o en negro, que indica la conexión correcta.

- Ahora los cables son naranjas, ¿Por qué?
El ancho de banda es incompatible, esto quiere decir que el numero de bits que intercambiada dos componentes no es la más correcta. Esto se arregla modificando el apartado "bits de datos" al nº más adecuado a la situación. 

-En el cuarto ejercicio me piden visualizar un grafico, ¿Cómo lo hago?
Simplemente comprueba que cada columna de la matriz de 8x8 tiene asociado un registro que retiene datos a mostrar.

-¿Cómo funciona la matriz?
Para cargar una imagen necesitaremos 8 bytes, de los cuales cada uno de ellos corresponderá a una columna. El contador hará que se vaya almacenando cada byte de la imagen en un registro cuya salida estará conectada a una columna de la matriz de forma que la imagen se irá dibujando columna a columna. 


El byte que llega a la matriz definirá que fila/s se enciende en esa columna iluminandose en verde oscuro si llega un 0 a la fila o en verde claro si llega un 1 a la fila. Por ejemplo, si a una columna llega (10000001) se activará la primera fila y la última.


Ampliando la memoria podremos almacenar más imagenes que se mostraran una a continuación de la otra. De esa forma y cambiando la frecuencia del reloj podremos hacer las animaciones que se piden en el último ejercicio.

-¿Para qué sirve el conversor paralelo-serie-paralelo? 

El conversor que construimos en el primer ejercicio, y que vamos ampliando en los dos siguientes. Su función es transmitir en serie (bit a bit) un dato que le llega en paralelo, para después volver a sacarlo en paralelo. Utilizaremos un registro de desplazamiento, que transmitirá en serie a otro registro de desplazamiento, el dato que ha cargado en paralelo, para que vuelva a salir de forma paralela por el segundo registro. 
En el segundo ejercicio ampliaremos el conversor añadiendo un bit de paridad, y en el tercero automatizaremos el envío paralelo con un contador que pare al llegar a 9 (ya que son 9 los bits a enviar).

miércoles, 30 de mayo de 2012

Tema 4 - FAQ


-Necesito las tablas de equivalencias de las instrucciones de MIPS en binario, ¿Dónde las puedo encontrar?
Las tablas de equivalencia se pueden encontrar en los apuntes del Campus.

-¿Por qué se producen errores cuando hay más de un triestado activado?
Cuando un triestado se abre es deja pasar la información al bus, por lo tanto si se abren varios llega información de diferentes lugares y se producen colisiones.

¿Qué significa la señal de “RESET” de la esquina inferior derecha del circuito de la CPU?
Como su nombre indica, el RESET permite reiniciar el circuito, para poder realizar nuevos cambios

-¿Cómo se codifican las instrucciones a hexadecimal?
Cada instrucción tiene un formato determinado para ser codificada en binario. Por ejemplo, en la práctica, la operación ADD $t0, $t1, $t2 sería del siguiente modo:


De esta forma la operación ADD tiene valor 0 y se coloca en el primer espacio de 6 bits (seis ceros), en los próximos se almacenará el número de registro que corresponda (la tabla de equivalencias de registros con sus números está en el campus), en el quinto espacio almacenaremos el desplazamiento en 5 bits (en este caso serán cinco ceros) y por último escribiremos 20 en hexadecimal y con 6 bits (quedando en este campo 100000). Posteriormente podremos pasar la instrucción a hexadecimal dividiendo los 32 dígitos en binario en grupos de 4 y pasando cada grupo a su valor en hexadecimal (por ejemplo, si tenemos 1010, pondremos A). Si algún registro no se usa en la instrucción, se escribirán 0 en 5 bits.

-Cuando realice los ciclos de instrucción, ¿Los 4 primeros ciclos son siempre los mismos?
Sí, ya que hasta el proceso de decodificación los pasos a seguir son los mismos para todas las instrucciones. El resto de pasos será propio de cada instrucción.

-¿Por qué la ALU tiene dos salidas? 
Una de las salidas de la ALU denominada salida directa se utilizará para que el resultado de la ALU salga al bus interno en el mismo ciclo en el que se hace la operación. De esta forma conseguimos reducir ciclos de reloj pero solo puede utilizarse si el bus no esta ocupado por otro dato en ese ciclo. En ese caso utilizaremos la otra salida que almacena el resultado en RT3 para sacarlo al bus interno en el siguiente ciclo.

-¿Cuándo puedo colocar en un mismo ciclo varias instrucciones?
Se podrán solapar varias instrucciones en un mismo ciclo si no producen colisiones en el bus interno.

-¿Cómo funcionan las entradas de la ALU? 
En la máquina usada en este tema nos encontramos con que el banco de registros tiene dos salidas, una para el operador A y otra para el operador B, pudiendo seleccionarse para cada una de ellas registros diferentes. También podremos capturar en RT1 y RT2 valores para A y B, respectivamente, desde el bus interno (para utilizar los inmediatos que están en la instrucción). Necesitaremos por lo tanto dos multiplexores (uno en A y otro en B) que seleccionen de cuál de los dos caminos se tomará el dato. 


-¿Cómo leo y escribo en la memoria?

En el caso de la lectura se almacenará la dirección de la que quiero leer en el MAR y activaremos la señales Td, Sel, L. En el caso de la escritura almacenaremos la dirección en la que queremos escribir en el MAR y el dato que queremos escribir en el MBR y despues activaremos la señales Ta, Td, Sel, E.

lunes, 28 de mayo de 2012

Resumen de las practicas del tema 4


Unidad de Control.
En esta práctica el objetivo central era comprender como funcionaba la ALU, la gestión de los buses y la forma en la que interactúan los diferentes componentes.
En las practicas se nos proponía una serie de instrucciones diferentes para codificarlas en hexadecimal, posteriormente realizar la secuencia para ejecutar dichas instrucciones y por ultimo comprobar, con ayuda del software logisim y el circuito proporcionado en el Campus Virtual ,que la secuencia que hemos realizado con anterioridad estaba correcta y no creamos ningún conflicto con el uso del Bus.
A la hora de realizar la secuencia tenemos que mucha atención con el uso que le damos al bus y no intentar trasmitir dos datos diferentes al mismo tiempo por el bus ya que eso ocasionaría graves errores.
Para realizar todo el resumen utilizare la primera instrucción que nos plantean como ejemplo, todas las demás instrucciones variarían según la codificación que tengan y según la función que hagan habrá que hacer el seguimiento acorde a su función.
La instrucción que utilizaremos será la ADD $t0, $t1, $t2.  Para la codificación de la instrucción utilizaremos el siguiente esquema que nos dice cuantos bits tenemos que dedicar a cada parte de la operación. Para la instrucción ADD se seguirá el siguiente esquema.
De tal manera habrá que sustituir según el valor que tengan nuestros registros en los correspondientes. Una vez tenemos todo el numero en binario agrupamos los bits de 4 en 4 para que nos dé el numero en hexadecimal que sería el 0x012A4020.
Para la realización del seguimiento tenemos que usar el esquema proporcionado en el Campus virtual.
 
 La secuencia se podría dividir en tres apartados, el primer apartado corresponde a la lectura de la instrucción, la segunda fase es la fase de la decodificación y por ultimo seria la fase de ejecución. En la fase de decodificación solo se puede descodificar la señal y no se pueden ejecutar varias acciones a la vez en el mismo ciclo.
A partir de ahora cuando nos refiramos a los ciclos estaremos haciendo referencia a todas las señales y operaciones que se pueden hacer en un solo ciclo de reloj.
Primero para leer la instrucción tendremos que pasar la dirección de PC hasta MAR, posteriormente leer en la memoria principal la dirección que está en MAR y llevarlo hasta MBR, en este paso también incrementaremos el contador PC en 4. El siguiente paso sería pasar el contenido de MBR hasta RI, todo esto sería la fase de lectura de instrucción y después tendríamos la fase de decodificación en la que se decodifica la instrucción que está en RI. Todo esto visto en ciclos quedaría de esta manera:

C1:
MAR ← PC
T4,C1
C2:
MBR Ml(MAR)
Td,L,C2

PC PC+4
C4
C3:
RI MBR
T3,C6
C4:
Decodificación



Después de la decodificación se pasaría a la fase de ejecución que sería propia de cada instrucción y en nuestro caso habría que pasar el registro $t1 y el registro $t2 a la ALU para llevar a cabo la operación y el resultado tendríamos que almacenarlo en $t0, todo esto visto en ciclos quedaría de la siguiente forma:

C5:
ALU $t1
RA=01001,MA=0

ALU $t2
RB=01010,MB=0

$t0 ALU
OP=Suma,T5,RC=01000,SC

RE ALU
C8
Una vez tenemos la secuencia realizada procedemos a comprobar el correcto funcionamiento con el software y el esquema proporcionado. La realización es simple y sirve para ver de una manera directa que lo que hemos realizado en teoría si lo llevamos a la práctica se cumple sin ningún error.
Una vez hecho todo el proceso y verificado que realmente siguiendo los pasos que hemos descrito en la secuencia escrita con anterioridad, habría que repetir el proceso con cada una de las instrucciones hasta terminar  la práctica completa.
.