Intervalos de direcciones de E / S asignadas en memoria

0

En la E / S asignada en memoria, ¿cómo se deciden los rangos de direcciones y asignación de dispositivos? Por ejemplo, como EPROM tiene control sobre el bus de direcciones para direcciones desde > 0x0000 y < 0x4000, RAM1 de 0x4000 a 0x8000 Especialmente curioso acerca de los métodos de decodificación de direcciones parciales

    
pregunta Mocialov Boris

6 respuestas

2

Lógica de decodificación de direcciones pura.

Los bits superiores del bus de dirección se enrutan a través de la lógica, generalmente incluyen cosas como 'decodificador de 3 a 8' y similares para crear una selección de señales de "selección de chip" que se conectan a los diferentes dispositivos para activarlos en diferentes rangos de direcciones.

Entonces, para su ejemplo, los 2 bits superiores del bus de dirección podrían estar vinculados a un decodificador de 2 a 4 para dar los rangos de 0x0000 a 0x3FFF, 0x4000 a 0x7FFF, 0x8000 a 0xBFFF y 0xC000 a 0xFFFF

Los 14 bits inferiores se conectarán directamente a todos los dispositivos (o tantos como necesiten hasta 14)

Dentro de esos rangos, podría dividirlo aún más si desea hacer un rango de grano más fino.

    
respondido por el Majenko
2

Las asignaciones de direcciones de memoria son en gran medida el resultado de decisiones tomadas por los fabricantes de procesadores. Los usuarios pueden distribuir la memoria de forma dispersa dentro de los espacios de direcciones apropiados, pero los usuarios generalmente "siguen el flujo" y hacen lo que requiere el hardware del procesador.

Por ejemplo, si un procesador obtiene vectores de encendido y restablecimiento desde, por ejemplo, la parte inferior de la memoria, los usuarios deben disponer que la memoria del programa que contiene los vectores se encuentre en esas ubicaciones durante el inicio.

En su ejemplo, EPROM (u otra memoria del programa) probablemente estaba en 0x0000 porque el procesador observó una ubicación en o cerca de x0000 para su vector de inicio.

Es menos común, pero algunos sistemas mueven bancos de memoria para satisfacer necesidades específicas. Por ejemplo, un procesador puede tener vectores de inicio e interrupción de direcciones bajas, pero también tiene un conjunto de instrucciones que favorece las instrucciones que abordan un pequeño bloque de memoria cerca de 0x0000. Por ejemplo, el conjunto de instrucciones puede permitir que se lleven 4 o 6 bits de dirección inmediata dentro de la palabra de instrucción, lo que permite un direccionamiento eficiente de los primeros 16 o primeros 64 bytes de memoria. En tal caso, el inicio puede requerir un ROM bajo, pero el uso eficiente de las instrucciones puede requerir un RAM bajo. Ambos pueden lograrse, por ejemplo, configurando la línea de dirección 6 de la EPROM baja durante el inicio y configurándola después, moviendo el bloque de memoria de la EPROM en 64 o en cualquier posición. De manera similar, la RAM se mueve al área 0x0000. Si otros vectores interrumpidos están contenidos en un espacio de direcciones bajo, estos deben escribirse en la RAM antes de que se mueva hacia abajo.

Los decodificadores de direcciones pueden organizarse para hacer casi cualquier cosa deseada con líneas de direcciones y con lo que va a dónde. Un bloque de memoria puede repetirse N veces, o aparecer solo una vez, o puede que solo aparezca la mitad a la vez y el control de la mitad aparece controlada por un bit de E / S.

    
respondido por el Russell McMahon
1

Un enfoque que aún no se ha mencionado es dar la mitad del espacio de direcciones al dispositivo más grande, posiblemente dar la mitad de lo que queda a la siguiente más grande, y luego dividir el resto. Muchos dispositivos tienen múltiples pines de selección de chip; a veces tienen convenientemente algunos activos-altos y otros activos-bajos. Supongamos, por ejemplo, que uno estaba diseñando un sistema basado en 6502 con un bus de direcciones de 16 bits que necesitaba una ROM de 16Kx8, una RAM de 32Kx8 y ocho dispositivos de E / S que necesitan 256 bytes o menos cada uno. Uno podría alimentar A15 directamente al chip-select para la RAM, usar una sola puerta NAND (! (A15 & A14)) para generar un chip-select para la ROM (o bien usar una máscara ROM con dos chips activos-altos) selecciona), y usa un 74HC138 para generar las selecciones de chip del dispositivo de E / S, alimentando a A15 a una habilitación activa-alta y A14 a una habilitación activa-baja. El uso de este enfoque evita cualquier necesidad de 'o' juntar varias salidas del 74HC138 para manejar dispositivos que requieren más de 1/8 del espacio de direcciones.

Varios dispositivos heredados interesantes realmente logran evitar el uso de cualquier lógica discreta para la decodificación de direcciones. Por ejemplo, el Atari 2600 tiene un espacio de direcciones de 13 bits asignado de la siguiente manera:

1 xxxx xxxx xxxx -- Cartridge (external)
0 xx1x 1xxn nnnn -- RIOT I/O registers
0 xx0x 1nnn nnnn -- RIOT RAM
0 xxxx 0xnn nnnn -- TIA (Television Interface Adapter) registers

El chip RIOT (RAM / IO / Timer) tiene selecciones de chip activo bajo y activo alto, cableado a A12 y A7, respectivamente, y una línea de selección RAM / IO, cableado a A9. El TIA tiene dos selecciones de chip activo-bajo cableadas a A12 y A7. Los cartuchos suelen utilizar una ROM de máscara con una selección de chip activa-alta. De este modo, el sistema selecciona entre las cuatro categorías de espacio de direcciones sin ningún tipo de chips lógicos discretos.

    
respondido por el supercat
1

No está claro si se entiende por decodificación "parcial", pero hay un esquema que yo llamaría decodificación "incompleta".

Si tiene un procesador con más líneas de dirección que proporciona un espacio de direcciones más grande del que realmente necesita, simplemente puede ignorar algunas de ellas por algún motivo. En el caso más simple, puede tomar una línea de dirección de alto orden y usarla (posiblemente invertida) como una selección de chip. Un dispositivo así seleccionado aparecerá una y otra vez muchas veces en el espacio de direcciones del procesador, pero siempre y cuando la asignación que use en el software no se superponga con la asignación de cualquier otra cosa, estará bien.

Otra forma de esto fue tomar algo como el decodificador 74LS138 de 3 a 8, que genera 8 salidas de selección de chip de 3 entradas de línea de dirección y algunas habilitaciones activas altas y bajas. Lo cablea para darle 8 bloques de rangos de memoria del tamaño requerido por su periférico más grande y le dedica uno a cada periférico. Es probable que muchos de sus periféricos no necesiten un bloque tan grande como el periférico más grande, por lo que sus registros asignados a la memoria se repetirán varias veces dentro de él.

    
respondido por el Chris Stratton
0

Para micros de gama más alta, la lógica de decodificación es interna al microcontrolador. Le permite configurar un rango de direcciones para algunos dispositivos. Por ejemplo, puede definir un rango de direcciones para un FLASH externo, otro rango de direcciones para una SRAM externa y otro para un controlador LCD.

    
respondido por el tehnyit
0

Los rangos realmente cambian según el fabricante y el diseñador del chip. Algunas partes de estos rangos se mantienen a veces para propósitos de programación de hardware. Puede encontrar más información sobre esto en 8085 Microprocessors book >.

    
respondido por el JohnRoach

Lea otras preguntas en las etiquetas