Lógica del decodificador de memoria 8086

Comencé a crear un esquema para una computadora basada en 8086 y ahora tengo problemas con el direccionamiento de la memoria. Sé que una línea de direccionamiento de 20 bits de ancho puede direccionar hasta 1024 KB de RAM y que el pin A0, cuando está alto, selecciona todos los bancos de memoria pares y cuando BHE está alto, se seleccionan los bancos de memoria impares (sí, sé que hay un poco más complicado circuito lógico para hacer esto).

Elegí una configuración donde hay 8 chips (6x 128 KB son chips SRAM y los 2x 128 KB restantes son chips EEPROM).

Al leer en línea, sé que al usar un M74HC138B1R (un llamado decodificador 3: 8) necesito usar A17, A18 y A19 para decodificar qué chip seleccione, terminando con las líneas A1-A16 para usar para el direccionamiento del chip. El problema surge cuando, de acuerdo con la hoja de datos IS62C1024AL (chip que deseo usar como SRAM), el chip usa 17 líneas para el direccionamiento (A1 hasta A17), lo que significa 17 bits = 128 KB. Pero al hacer esto termino con 1 línea de dirección en conflicto (A17).

No puedo descifrar cómo salir de esta extraña situación y no puedo descifrar si el A0 todavía está disponible para direccionar, mi suposición siguiendo la lógica es no. Otra cosa que me parece obvia es buscar un decodificador 2:8 que aparentemente no existe.

Cualquier consejo es muy apreciado, puede ser que actualmente me esté perdiendo algo estúpido que no puedo resolver ahora.

"Necesidad" es una palabra tan fuerte. Vcc y GND siempre están disponibles como 1 y 0 respectivamente.
A17-A19 -> 74HC138 que da 8 salidas - 6 para SRAM, 2 para EEPROM; A0-A16 será un autobús
@Flanker Desafortunadamente A0no está disponible. Los chips que tiene son de 8 bits y el 8086 es un bus de datos de 16 bits. El OP tiene que usar A0como selector entre fichas altas y bajas, como dijo en el primer párrafo.
Mi mal, ahora veo por qué BHE # es importante. La búsqueda rápida revela que A0 todavía se usa: la combinación de BHE # y A0, ambos LOW, abordarán datos de 16 bits de ancho (de lo contrario, datos de 8 bits, supongo que para compatibilidad con 8080). Parece que debería organizar toda la memoria en 2 bancos lógicos; la decodificación de la dirección anterior sigue siendo válida; solo se debe implementar una lógica adicional para seleccionar el banco inferior (datos de 8 bits), el banco superior (datos de 8 bits) o ambos bancos (datos de 16 bits)

Respuestas (3)

Su problema es que habló sobre el uso de bancos de RAM en su primer párrafo, pero luego asumió que usaría los chips en serie.

Debes usar las fichas en pares, usando A0y BHEcomo lo describiste. Entonces, en realidad tiene una matriz de chips de RAM de 2x3 y una matriz de EEPROM de 2x1.

No existe un decodificador de "2 a 8" precisamente porque necesita 3 bits para obtener 8 posibilidades, pero necesita un decodificador de 2 a 4:

  • A19- A18para decodificar qué par de chips RAM o EEPROM;
  • A17- A1decodificar la dirección en cada par;
  • A0y BHEpara decodificar qué chip en el par.
Estoy un poco avergonzado. Cuando pensé en 3:8 y 2:8, no pensé en 3 bits que producen 8 posibilidades, por lo que está claro que necesitaré 2:4 para producir 4 posibilidades, 4 bloques donde 3 son RAM y 1 es ROM. Gracias por limpiar el polvo de la neurona que contiene esa información.
pequeña aclaración: "A0 y BHE para decodificar qué chip en el par".. o ambos chips en par

El 8086 tiene un bus de datos de 16 bits de ancho. Debe combinar 2 chips (8 bits de ancho) cada uno y conectar A1-A17 en 8086 a A0-A16 en los chips.

A18 y A19 deben decodificarse para selecciones de chip. Puede usar un decodificador de 3 a 8 aquí, solo conecte un pin de entrada a GND o VCC.

Mirando el pinout del 8086, parece usar líneas de datos/direcciones multiplexadas. Esto significa que necesita usar pestillos, y es posible que deba "intercambiar bytes" de los datos cuando los bits de dirección A0 o BHE se configuran usando algunos chips lógicos adicionales.

Gracias por sus respuestas, todas las respuestas para mí son oro. Dijo que sé que A0/BHE requiere más lógica que simplemente conectarlos al chip de memoria.

Esto simplemente proviene del hecho de que IS62C1024AL tiene un bus de 8 bits. Mientras que el 8086 tiene un bus de 16 bits. Entonces, el chip RAM necesita 17 líneas de dirección, pero una zona de 128k del 8086 se direcciona usando solo 16 líneas de dirección (más A0 y BHE para seleccionar entre bytes altos y bajos).

Esto es lo que debe hacer: divida su memoria en 4 áreas grandes (determinadas por A18 y A19), no en 8 áreas. Entonces tiene A18 y A19 que van a un decodificador de 2 a 4 que proporcionará las selecciones de chip. Luego tienes A17-A1 que van a las líneas de dirección de cada chip de memoria.

Luego agrupe los chips de memoria en pares. Para cada par, el primer chip de memoria se conectará a los bits de datos 0-7 de la CPU y el otro a los bits de datos 8-15. Entonces tiene cuatro grupos (determinados por la selección de chip) de dos chips de memoria, cada chip conectado a la parte baja o alta del bus de datos. En total tienes tus 8 chips de 128k, aportando un total de 1Meg. Todo muy bien.

Esto significa que la selección de chip (del decodificador) de cada uno de los cuatro grupos se proporcionará a ambos chips de memoria del grupo. Llamémoslo la selección de chip principal . Luego, debe usar A0 y BHE como selección de chip secundario para habilitar/deshabilitar cada uno de los dos chips de memoria del grupo. ¿Y adivina qué? Por casualidad, el IS62C1024AL tiene dos pines de selección de chip.

Para resumir : use un decodificador de 2 a 4 que alimentará CS1 de ambos chips de memoria de cada grupo, alimentará el CS2 de todos los chips de memoria de bajo byte de A0 y el CS2 de todos los chips de memoria de alto byte de BHE. Ahora, si observa los detalles, verá que probablemente necesite algunos inversores adicionales, a menos que encuentre un decodificador con salidas altas activas.

Último consejo : la lógica del pegamento no es tan simple, especialmente porque el 8086 usa un bus multiplexado. Un error siempre es posible (ni siquiera pretendo haber dado la respuesta correcta). Y los 74 chips lógicos no son fáciles de encontrar, son voluminosos y si cometiste algunos errores, tendrás que retransmitirlos, etc. Si yo fuera tú, usaría algo de CPLD para hacer toda la lógica del pegamento . Entonces realmente puede reconfigurar las cosas fácilmente en caso de error, o si de repente desea cambiar la configuración del hardware. Incluso podría construir algunos periféricos simples (GPIO, teclado, ...) dentro del propio CPLD. Es mucho más divertido que soldar/desoldar/recablear/soldar/... chips DIP.

Sé que es posible que tenga que emparejar la RAM/ROM por 2 en 4 grupos donde 1 chip es par y el otro es impar y luego seleccionarlos usando A0/BHE pero me faltaba, como dije antes una tontería, la lógica 2:4 que erróneamente terminé llamando 2:8 mientras buscaba en Internet. Sobre el multiplexado ya lo sabía y tengo latches y transcievers para demultiplexar. Lo último que dijiste es mi último recurso, ya que tengo muchos de los componentes necesarios y el reacondicionador local tiene los chips lógicos 74.