Reducción del bus de direcciones de memoria mediante la adición de bancos

Si está tratando de controlar la memoria desde una CPU, entonces si usa dos bancos en lugar de uno, puede eliminar la primera línea de dirección. Si usa cuatro bancos, también puede eliminar el segundo. ¿Por qué es esto?

Necesitas algunos detalles más; ¿Estás hablando de procesadores de 32 bits? ¿RAM direccionada en paralelo? 8 bits/dirección?

Respuestas (3)

Creo que la respuesta de W5VO es una excelente descripción de un sistema de memoria moderno, pero en realidad no describe el cambio de banco .

Desea cambiar de banco cuando tiene un bus de direcciones estrecho (como 8 o 16 bits) y desea agregar más memoria. Luego puede usar líneas GPIO separadas para cambiar chips de memoria tal como escribió W5VO. Debe tener cuidado porque todos sus punteros siguen siendo de 8 bits y el cambio es manual, por lo que puede causar un desastre fácilmente.

Esta técnica era/es popular en micros pequeños, pero también en DOS de 16 bits (nació en el 80286) y en procesadores modernos de 32 bits para manejar más de 4 GB de memoria (pero aquí el truco se hace de manera invisible por el kernel y un programa solo pueden ver 4GB).

Pero, ¿cómo reduce eso el número de líneas de dirección?
@2000k404notfound Le permite expandirse más allá del ancho del bus de direcciones que está disponible. Creo que no entiendo completamente tu pregunta. Si desea direccionar una memoria de 4k, necesitará 12 bits de líneas de dirección en alguna parte . La única pregunta es dónde los metes.
Hay dos formas de reducir el número de líneas de dirección. Una es dividir la memoria en filas y columnas y bloquear la dirección de la fila. El acceso verdaderamente aleatorio requiere al menos 2 ciclos de reloj, pero se puede acceder rápidamente a las columnas dentro de una fila. Así es como funciona la DRAM. El otro método es tener un bus de datos de 32 bits, descartar 2 bits de dirección de orden inferior y acceder solo a palabras completas a la vez.
Creo que tiene que ver con el último bit de la dirección. Si tiene dos bancos, puede asignar todas las direcciones pares a una línea y todas las direcciones impares a la otra. El último bit le dice si la dirección es par o impar, pero si usa la línea CS para seleccionar líneas, entonces no la necesita. ¿Esto suena bien?
@ 200ok404notfound: Sí, su descripción de la memoria intercalada es válida; dudo en decir que es "correcta" solo porque el cambio de banco es igual de válido. Estás describiendo la memoria intercalada . W5VO, jpc y supercat están describiendo el cambio de banco . El rover Sojourner Mars y algunas computadoras TRS-80 Modelo 100 usan el cambio de banco entre los 16 pines de dirección del 80C85 y la RAM; nunca usaron memoria intercalada. Ambas técnicas tienen su lugar.

Asumiré que está hablando de memoria paralela, y que cuando dice "use dos bancos en lugar de uno" está usando dos chips que tienen la misma memoria total, pero cada uno es la mitad de grande.

Aquí está la cosa: en realidad no puedes eliminar esa línea de dirección de tu CPU. Es posible que no vaya directamente al chip de memoria, pero si lo quita, no hay forma de distinguir entre los dos chips. El ingrediente que falta es la función de "selección de chip". La mayoría de los chips de memoria tendrán un pin o un conjunto de pines que se utilizan básicamente para decirle a ese chip de memoria en particular que el procesador solo quiere comunicarse con ese chip.

Consideremos un ejemplo simple: 256 palabras de memoria. Esto da como resultado un bus de direcciones de 8 bits.

  • Un chip con 256 palabras: entonces siempre estamos usando un solo chip y tiene una dirección de 8 bits.
  • Dos chips con 128 palabras cada uno: solo una memoria puede estar activa al mismo tiempo, por lo que usaremos el pin de "selección de chip". El MSB (bit más significativo) del bus de direcciones de 8 bits irá al pin de selección de chip en cada chip, y el resto de los 7 bits irá al bus de direcciones de 7 bits en ambos chips.
  • Cuatro chips con 64 palabras cada uno: solo una memoria puede estar activa al mismo tiempo, por lo que usaremos el pin de "selección de chip". Algunos chips de memoria tienen varios pines de selección de chip, pero para este ejemplo supondremos que solo hay uno. Para generar las señales de selección de chip para los cuatro chips, necesitaremos un decodificador de 2 a 4 (también conocido como decodificador $n\mbox{ }to\mbox{ } 2^{n}$, decodificador de fila, decodificador de direcciones - todas las mismas cosas). Este decodificador toma los dos primeros MSB del bus de direcciones y determina qué señal de selección de chip debe estar activa. Los 6 bits inferiores de la dirección van al bus de direcciones de 6 bits de los 4 chips de memoria.

ingrese la descripción de la imagen aquí

Este es un ejemplo realmente simple, pero escala bien. Este es básicamente el procedimiento para hacer que varios chips de memoria trabajen juntos para aumentar el espacio de direcciones.

¿No quiere decir que el LSB se usa para seleccionar el chip?
No, usas los MSB. De esa manera, no cambiará los chips cada vez que incremente la dirección. Esto facilita mucho el uso de chips ROM, espacios de direcciones parcialmente llenos y dispositivos con una interfaz de bus de memoria.
Si observa la página 13 aquí, se está utilizando el LSB. ece.cmu.edu/~ece548/handouts/13m_arch.pdf
Si desea cambiar los chips en cada lectura, puede usar el LSB como CS. Incluso puede usar una combinación de MSB y LSB o cualquier bit en la dirección, y seguirá funcionando. Si está tratando de intercalar sus chips para obtener una ventaja de rendimiento, su sistema debe poder aprovechar eso.

Si uno tiene medio egabyte de memoria direccionable por bytes, tiene que haber una forma de generar una dirección de 19 bits. Un buen enfoque fácil es tener una CPU cuyo bus de direcciones tenga 19 o más líneas de dirección (por ejemplo, un 8088). Otro enfoque es hacer que algunas de las líneas de dirección sean generadas por algo que no sea el bus de direcciones de la CPU. Por ejemplo, supongamos que uno tiene una CPU con un bus de direcciones de 16 bits y desea construir un sistema con 32 KB de RAM y ~512 KB de ROM. Se podría usar un AND de 13 entradas para detectar un acceso a la dirección 0xFFF0-0xFFFF (una entrada del AND estaría vinculada a una señal de 'dirección válida'), y un pestillo de 4 bits para agarrar los 4 bits inferiores de tal DIRECCIÓN. Quince de los bits de dirección de la ROM estarían conectados al bus de direcciones de la CPU; los otros cuatro bits estarían conectados a salidas de pestillo.

Tenga en cuenta que dicho sistema no tendría 512 KB de ROM utilizable, ya que acceder a cualquiera de los últimos 16 bytes de cada banco de 32K cambiaría a un banco de 32K en particular. Así, 0xFFF0 solo estaría disponible en el banco 0, 0xFFF1 en el banco 1, etc. Además, en muchos casos, uno terminaría teniendo que duplicar algún código en diferentes bancos. Aún así, dicho sistema sería bastante práctico y, de hecho, es muy similar a lo que se hizo en muchas cosas, como los juegos de arcade de los años 80.

Ese es un método de cambio de banco bastante peculiar. ¿Conoce algún sistema en particular donde se haya utilizado este método exacto? (Los métodos de cambio de banco con los que estoy familiarizado son ligeramente diferentes y quizás incluso más peculiares que este método; por lo general, el pestillo externo agarraba bits del bus de datos en lugar del bus de direcciones).
@davidcary: No conozco los detalles exactos de cómo se construyeron los juegos de arcade, pero tener 32K de memoria financiable era un patrón común. En cuanto al uso de direcciones en lugar de datos, esa era una técnica muy común para los cartuchos Atari 2600 (que no tenían acceso a una señal de lectura y escritura) y para el hardware Apple II. El puerto del cartucho Atari 2600 incluye D0-D7, A0-A12, VDD, VSS y nada más. Sin relojes, controles de lectura y escritura, ni nada. El hardware interno del 2600 se habilita cuando A12 es bajo (independientemente de otros bits de dirección), por lo que los cartuchos tienen 4K de espacio de direcciones.
@davidcary: De los cartuchos de más de 4K, aproximadamente el 99 % de ellos usan direcciones 1FF8-1FF9 para cambiar entre dos bancos (si es 8K), o 1FF6-$1FF9 para cambiar entre cuatro (si es 16K). Algunos cartuchos tienen RAM interna, que normalmente utiliza diferentes direcciones para lectura y escritura (la mayoría de estos cartuchos 1000-107F para escritura y 1080-10FF para lectura). Diseñé un carro para el 2600 que soporta lectura y escritura en la misma dirección; también permitió que el trazado de píxeles de las contrataciones se realizara en 3 instrucciones. Construí algunos prototipos, pero alguien más ideó una forma mucho más económica de agregar RAM a un carro 2600.
@davidcary: El enfoque de usar direcciones para controlar funciones e ignorar las líneas de datos también fue popular en el hardware de Apple II. Si uno descodifica las direcciones 7Cxx para activar un pestillo que toma 8 bits del bus de datos, configurar los pestillos requerirá dos instrucciones (una para cargar los datos en un registro y otra para almacenarlos). Si uno tiene el circuito de enganche tomado de A0-A7, puede configurar los pestillos con una instrucción (simplemente lea la dirección e ignore el resultado). Alternativamente, se puede usar un chip de pestillo direccionable de 8 bits y tener 16 direcciones que establecen o borran un bit cada una.