Decodificador de Direcciones de Memoria en una GAL La decodificación de memoria es una aplicación típica de los dispositivos lógicos programables, y la siguiente describe la implementación con ABEL-HDL de tal diseño. Aquí se diseña el decodificador de memoria para el diseño del programa monitor del curso de quinto semestre de ICE sobre microprocesadores. Especificación del Diseño La figura 1 muestra el diagrama a bloques para este diseño y un bloque continuo de memoria dividido en secciones conteniendo RAM estática (SRAM), tres de E/S (dos PPI y uno de reserva llamado otro), y dos secciones de memoria no volátil EEPROM (EEPROM1 y EEPROM2). El propósito de este decodificador es el de monitorear los 4 bits (A15-A12) de mayor orden del bus de direcciones de 16 bits y seleccionar la sección correcta de memoria basándose en el valor de tales bits de direccionamiento. Para llevar al cabo dicha función, un simple decodificador con seis entradas y siete salidas se diseña para implementarse en una GAL22V10. Un segundo propósito es generar la señal de habilitación de lectura para los tres bloques de memoria. Eso lo logra combinando dos señales de habilitación de lectura; PSEN que permite leer memoria de código y RD que permite leer memoria de trabajo. Los dispositivos PPI-8255 (Interfaz Paralela Programable) reciben RD y WR de manera directa desde el microprocesador 80C31 de INTEL. Figura 1 Mapa de Memoria y Diagrama a bloques del Decodificador. La siguiente tabla resume la capacidad de cada sección, el rango de localidades de un byte y una descripción somera del dispositivo. Sección Capacidad Rango en HEX Descripción EEPROM1 2,048 bytes 0000 a 07FF Programa Monitor EEPROM2 2,048 bytes 2000 a 27FF Programa Usuario SRAM 2,048 bytes 6000 a 67FF Memoria Volátil PPI1 4 bytes 8000 a 81FF Puertos E/S PPI2 4 bytes E000 a E1FF Puertos E/S otro Por definir A000 a A1FF Expansión futura Prof. S. Saucedo 1 ICE/2007
La siguiente figura ofrece el único archivo fuente necesario para el diseño. MODULE DecMem TITLE 'Decodificador de Memoria' " ENTRADAS A15,A14,A13,A12,PSEN,RD pin; "SALIDAS EEPROM1,EEPROM2,SRAM,PPI1,PPI2,otro,OE pin istype 'com'; " DEFINICIONES H,L,X = 1,0,.X.; Address = [A15,A14,A13,A12, X,X,X,X, X,X,X,X, X,X,X,X]; equations!oe =!PSEN #!RD;!PPI1 = (Address >= ^h8000) & (Address <= ^h81ff);!sram = (Address >= ^h6000) & (Address <= ^h67ff);!eeprom2 = (Address >= ^h2000) & (Address <= ^h27ff);!eeprom1 = (Address <= ^h07ff);!ppi2 = (Address >= ^he000) & (Address <= ^he1ff);!otro = (Address >= ^ha000) & (Address <= ^ha1ff); test_vectors ([Address, PSEN, RD] -> [EEPROM1,EEPROM2,SRAM,PPI1,PPI2,otro, OE]) [^h0000, 0, 1] -> [ L, H, H, H, H, H, L ]; [^h2000, 1, 0] -> [ H, L, H, H, H, H, L ]; [^h4000, 0, H] -> [ H, H, H, H, H, H, L ]; [^h6000, H, L] -> [ H, H, L, H, H, H, L ]; [^h8000, H, H] -> [ H, H, H, L, H, H, H ]; [^ha000, H, H] -> [ H, H, H, H, H, L, H ]; [^hc000, H, L] -> [ H, H, H, H, H, H, L ]; [^he000, L, H] -> [ H, H, H, H, L, H, L ]; [^h0800, H, L] -> [ L, H, H, H, H, H, L ]; [^h2800, L, H] -> [ H, L, H, H, H, H, L ]; [^h4800, H, L] -> [ H, H, H, H, H, H, L ]; [^h6400, H, H] -> [ H, H, L, H, H, H, H ]; [^h8180, H, H] -> [ H, H, H, L, H, H, H ]; [^he180, H, H] -> [ H, H, H, H, L, H, H ]; [^ha040, H, H] -> [ H, H, H, H, H, L, H ]; END "Seccion de Memoria Rango de Dir. Capacidad (hex) " SRAM: 6000-67FF 2KB " PPI1 8255: 8000-81FF 4B " EEPROM2: 2000-27FF 2KB " EEPROM1: 0000-07FF 2KB " PPI2 8255: E000-E1FF 4B " otro: A000-A1FF Figura 2 Listado para definir Variables, Ecuaciones y vectores de Prueba Prof. S. Saucedo 2 ICE/2007
Método del Diseño La figura 3 exhibe un diagrama a bloques simplificado del decodificador de direccionamiento. El decodificador se implementa con ecuaciones empleando operadores relacionales y lógicos según se muestra en la figura 2. Una simplificación significativa se logra al agrupar los bits de direcciones en un conjunto llamado Address. Los doce bits de direccionamiento que no se usan para decodificar la dirección reciben valores de no conexión en el conjunto, indicando que la dirección en el diseño global (más allá del decodificador) contiene 16 bits, pero que los bits 0 a 11 no afectan la decodificación de tal dirección y no son monitoreados. En contraste, definiendo al conjunto como Address = [A15,A14,A13,A12] ignora la existencia de los bits de orden bajo. Especificando todas las 16 líneas de direccionamiento como miembros del conjunto Address permite una comparación completa de 16-bits de los valores de dirección contra los rangos dados arriba. Para explotar al máximo la GAL se agregó una compuerta interna AND para ahorrarse un integrado, de modo que la GAL alberga dos diseños algo independientes. Figura 3 Diagrama simplificado mostrando las dos funciones. La figura 4 ilustra la simulación del JEDEC grabado en la GAL para los quince vectores de prueba. Las variables PSEN, RD y OE son de lógica negativa, de modo que en la gráfica cuando se exhiben en bajo en realidad están en la fase activa y viceversa. El sistema mínimo puede prescindir de la EEPROM2 y la PPI2. La idea principal del desarrollo es que el estudiante pueda colocar código ejecutable en la RAM, además del de las EEPROM; y que también pueda poner datos constantes en la EEPROM2. Prof. S. Saucedo 3 ICE/2007
Figura 4. Simulación de los vectores de Prueba. Asignación de Pines: +---------\ /---------+ \ / PSEN 1 24 Vcc RD 2 23 OE A15 3 22!PPI2 A14 4 21!SRAM A13 5 20!EEPROM1 A12 6 19 7 18 8 17 9 16!EEPROM2 10 15!PPI1 11 14!otro GND 12 13 `---------------------------' Figura 5. Asignación de terminales Diagrama general del Diseño La figura 6 exhibe al diagrama de la práctica final del curso de de Microprocesadores, aunque falta el detalle de la comunicación con la interfaz RS-232. Prof. S. Saucedo 4 ICE/2007
Figura 6 Sistema mínimo para probar el programa Monitor. Prof. S. Saucedo 5 ICE/2007