• No results found

El objetivo de diseñar una memoria RAM es para almacenar las instrucciones, datos y resultados que deriven del programa. Al igual que la memoria ROM su funcionamiento es por flanco de bajada del reloj del sistema debido a que es negado antes de entrar por el puerto destino al reloj, la cual alimentara a un proceso interno de esta.

como se menciono con anterioridad, el diseño de una memoria se puede realizar de muchas maneras, aquí se presenta una de ellas[10].

El diseño en vhdl de sus puertos es la siguiente:

1 l i b r a r y i e e e ; observa que el bus de direcciones es de 7 bits. De aquí se puede deducir que el tamaño de la memoria RAM:

C ap aci d ad Ram=ancho bus d e d at os[b y t es]·numer o d e d i r ecci ones (2.1) C ap aci d ad Ram=12bi t s·1b y t e

8bi t s ·27=192b y t es (2.2) Además se observa que el máximo de direcciones en la RAM es de:

nžmáxi mo d e d i r ecci ones=27=128posi ci ones (2.3) Las entradas y salidas de la memoria RAM son la siguientes:

• Entradas

– data: Corresponde al bus de datos de entrada hacia la RAM, este bus se encarga de escribir en la memoria RAM los datos resultados de alguna instrucción. La instrucción STR1 y STR2 son un ejemplo.

– wren: Si es 0 indica lectura y si es 1 escritura

– address: Bus de direcciones de la RAM que se encarga de indicar la posición lógica o dirección en la RAM donde se quiere realizar una operación de lectura o escritura.

– clock: Reloj del sistema negado; se niega mediante una puerta not antes de conectar con este puerto

• Salidas

– q: Bus de datos de salida; permite el paso de los datos o instrucciones a la unidad de proceso

sus conexiones con los componentes externos es la siguiente:

• Entradas

– data: Conectado con la salida MDRdata de la unidad de proceso – wren: conectado con el bus control_signals_to_UP(8)

– address: Conectado con la salida MARdata de la unidad de proceso – clock: Conectado con el reloj del sistema negado

• Salidas

– q: Conectado con el bus de entrada MEM[11..0] de la unidad de proceso

Figura 2.20: Componente memoria RAM 2.3.1 Arquitectura memoria RAM

El código vhdl para implementar la arquitectura es la siguiente:

1 a r c h i t e c t u r e b e h a v e o f ram i s

3 c o n s t a n t mem_size : n a t u r a l : = 2** a d d r _ l e n g t h ; −−** = e l e v a d o

t y p e r a m _ t y p e i s a r r a y ( mem_size1 downto 0 ) o f s t d _ l o g i c _ v e c t o r ( d a t a _ w i d t h1 downto 0 ) ;

5 s i g n a l RAM : r a m _ t y p e : = (

−−0 => x " 0 0 0 " , −−e q u i v a l e a un LDR1 00

7 0 => x " 800 " , −−F I 1 => x " 00F " , −−LDR1 15

9 2 => x " 110 " , −−LDR2 16 3 => X" 400 " , −−CMP

11 4 => x " 509 " , −−BRE 9 , S I R1=R2 SALTA 5 => x " 011 " , −−LDR1 17

13 6 => x " 110 " , −−LDR2 16 7 => x " 700 " , −−SUB R1 , R2

15 8 => x " 313 " , −−STR1 19 9 => X" D00 " , −−DELAY

17 10 => x " 800 " , −−F I

15 => x " 003 " , −−DATOS

• Lineas [27-41]: Procesos de control de lectura y escritura

– Se observa que el proceso reg encargado de escribir en la memoria cada flanco de subida si wren =1 y también de activar el proceso escritura para sacar por su salida q el valor escrito. El proceso de lectura se activa si wren=0 y también activa el proceso escritura para sacar por su salida q el valor escrito.

• Lineas [7-23]: Programa principal

– El programa se principal que se esta probando se encuentra en estas lineas y como se explico en otras secciones, cada linea es una instrucción. Se observa también que hay zonas diferenciadas. Por ejemplo desde la linea 7 hasta 17 son instrucciones, desde la linea 18 hasta la 20 son datos y desde la 21 hasta la 23 espacio reservado para resultados.

Cada instrucción desde la linea 7 a 23 están codificadas. Están codificadas en hexade-cimal; se recuerda que el bus de datos es de 12 bits. El valor hexadecimal es de 3 números donde el primero de la izquierda corresponde con la operación de instrucción(mirar IR-decoder, opcode) y los 2 números restantes pueden ser dirección de la ram donde se encuentran los datos, la dirección de la RAM donde saltar, datos numéricos o nada.

Programa de la RAM

Como se observa en el listing 21 el programa empieza ejecutando la linea 0 ya que fue inicializado a esta posición en el registro PC,0x000. Por lo tanto empezara ejecutando la instrucción FI, la ejecución del programa termina aquí, el resto de instrucciones de abajo

no se ejecutaran porque la ejecución siempre termina cuando se encuentre la instrucción FI.

Por esto se aconseja que esta instrucción se encuentre al final del programa.

Si por el contrario se cambiase la posición de inicialización en el registro PC a 0x001 el programa omitiría todas las instrucciones anteriores. En nuestro caso la instrucción FI no seria un problema y empezaría la ejecución del programa. Dicho esto supondremos que la ejecución empieza en la linea de código 8.

La primera instrucción es de tipo LDR1 por el primero numero de la izquierda, con lo que se carga en el registro R1 un dato. El dato que se carga también esta en la RAM y esta en la posición 15 de la RAM. La dirección del dato a cargar se extrae de la instrucción que se este ejecutando de los 2 números en hexadecimal de la instrucción. "0F.endecimal representa un 15 y ahí donde se encuentra el dato. El dato a cargar en el registro R1 es el 3.

Una vez termina de ejecutarse la instrucción se pasa a la siguiente. La siguiente instrucción es LDR2. Se carga en el registro R2 el dato que se halla en la posición 16, explicado en el anterior párrafo.El dato a cargar en el registro R2 es 3.

La siguiente instrucción es CMP. Esta instrucción compara el registro R1 y R2 y si son iguales activa el flag Zero. Aquí se puede observar que los 2 últimos números de la instrucción no representan nada con lo que se puede colocar cualquier valor. Como se cumple se activa el flag.

La siguiente instrucción es BRE tiene una dirección de salto incorporada en su ins-trucción. Si se cumple salta. Como el flag Zero esta activo salta a la posición 9. Las instrucciones anteriores a la posición 9 se omiten.

Se ejecuta la instrucción DELAY, Esta instrucción decrementa el registro R1. Como R1 contiene un 3 decrementara 3 veces. Cuando finaliza pasa a la siguiente instrucción.

Se usa para introducir un retraso.

Finalmente tenemos la instrucción FI, se ejecuta y finaliza el programa.

Este es un programa de prueba se mostraran algunos más mas adelante.