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).