Actualización de múltiples puertos en AVR de 8 bits en un solo ciclo

En el Atmel AVR MCUS de 8 bits (específicamente las series mega y xmega), ¿es posible modificar simultáneamente múltiples puertos en un solo ciclo de instrucción?

Por ejemplo, tengo un chip de RAM de 512 kB que requiere 19 líneas de dirección. Esto requiere múltiples puertos de 8 bits para abordar adecuadamente. ¿Es posible, en un solo ciclo de instrucción, configurar los 19 bits en una dirección específica? Entiendo que puedo configurar los bits altos, luego los bits medios, luego los bits bajos e incrementar el puerto de extremo bajo para recorrer la RAM, sin embargo, es posible que la asignación no sea secuencial. ¿Puedo, nuevamente para tomar un ejemplo aleatorio, hacer que la RAM coloque el primer byte, luego el byte 510 y luego el byte 294 en el bus de datos en tres ciclos de reloj de CPU secuenciales?

¡Gracias!

Intentar colgar una gran SRAM externa de estos chips es básicamente comenzar con un diseño mal concebido. Elija algo con un espacio de memoria externa y un espacio de direcciones lineal suficiente : los núcleos de 32 bits no son caros en estos días.

Respuestas (3)

No.

El AVR tiene un bus de datos de 8 bits y eso significa que solo puede escribir en un registro de 8 bits a la vez. No hay forma de programar tres bytes al mismo tiempo.


Si está accediendo a tanta memoria, le sugiero que considere optar por una MCU de 32 bits. Es posible obtener procesadores AVR de 32 bits si desea una CPU similar. Alternativamente, hay muchos procesadores ARM de 32 bits relativamente simples/baratos de muchos fabricantes. Elige tu opción.

Hay algunas aplicaciones en las que una CPU puede necesitar acceder a muchos elementos pequeños desde una gran memoria; una CPU de 8 bits puede ser perfectamente adecuada para propósitos como sacar datos de audio sin comprimir de un dispositivo de memoria de casi cualquier tamaño si se agregan algunos pestillos externos para los bits de dirección superior.
@supercat Estoy de acuerdo: de hecho, algunos AVR tienen una interfaz XMEM que permite que 64 kB de RAM externa (más si usa bits bancarios adicionales) se asignen directamente al espacio de direcciones de la CPU que usa pestillos para reducir la cantidad de pines IO requeridos. Si bien es una excelente opción para algunas situaciones, no logra lo que se preguntaba, que es un acceso de ciclo único verdaderamente aleatorio de todo el espacio de memoria.
@supercat: si bien es posible arreglárselas con una CPU de 8 bits, no hay mucha o ninguna ventaja de costo para hacerlo hoy, por lo que tiene poco sentido en situaciones en las que las soluciones agregan mucha complejidad y enturbian la situación del software .

Por lo general, a un chip de memoria no le importará si todos los cables de dirección cambian al mismo tiempo. Lo más que normalmente se requeriría sería que todos los cables de direcciones se establezcan en sus niveles adecuados antes de que se inicie un acceso, y que permanezcan en sus niveles adecuados durante un período de tiempo después de que se complete el acceso. En muchos casos, los requisitos para los accesos de lectura son aún más flexibles que eso: si la dirección en el bus cambia durante una lectura, muchos dispositivos iniciarán automáticamente un acceso con la nueva dirección y evitarán los datos válidos dentro de un período de tiempo de la lectura. último cambio en el bus de direcciones.

Dado que el uso de un pin de E/S para cada línea de dirección consumiría una gran cantidad de E/S, puede ser útil agregar uno o más pestillos o registros. Por ejemplo, uno podría direccionar hasta 16 MB de memoria usando nueve pines para el direccionamiento. Conecte ocho de ellos a los bits de dirección 0-7, así como a las entradas de un 74HC373 y un 74HC374. Alimente el pin restante a las señales de reloj y habilitación de carga de esos chips. Conecte las salidas del 74HC373 a los bits de dirección 8-15 y las del 74HC374 a los bits de dirección 16-23.

Para acceder a un byte en particular, comience con "Clock/LE" bajo y haga lo siguiente en orden:

  1. Bits de salida 16-23 de la dirección deseada.
  2. Maneja "Clock/LE" alto.
  3. Bits de salida 8-15 de la dirección deseada.
  4. Conduzca "Reloj/LE" bajo.
  5. Emite bits 0-7 de la dirección deseada
  6. Presione cualquier otro pin que sea necesario para activar el acceso deseado.

Se pueden lograr accesos adicionales dentro de un rango de 256 bytes repitiendo los pasos 5-6 (omitiendo los pasos 1-4).

Es posible una variedad de arreglos según los requisitos de velocidad y la cantidad de pines de E/S que tenga disponibles.

Es un buen punto que no tiene que suceder todo a la vez, y si el acceso típico es hasta cierto punto secuencial, la sobrecarga de tiempo de bloquear con poca frecuencia un nuevo valor "banco" en las líneas superiores puede ser baja. Sin embargo, hoy en día no hay mucha justificación para quedarse con una parte de 8 bits en una situación en la que eso es limitante; en realidad, no tienden a ser más baratos.
Buen punto supercat: no satisfará mis necesidades para este proyecto, ¡pero lo tendré en cuenta!

El AVR XMEGA tiene una interfaz de bus externa que direcciona hasta 16 MB. Se puede acceder a la memoria externa con una sola instrucción de CPU. Una lectura toma 2 ciclos de reloj de la CPU (las escrituras solo toman 1 ciclo), pero el XMEGA se puede sincronizar a 32 MHz, lo que lo hace equivalente a un solo ciclo en un AVR de 16 MHz.

Interfaz de bus externo XMEGA

ingrese la descripción de la imagen aquí

Sin embargo, dado que la memoria externa está asignada al espacio de memoria de datos de 64k, solo se puede acceder aleatoriamente a 48-55,5 kB (dependiendo de cuánto espacio de memoria de datos se utilice para E/S/EEPROM/RAM internos) sin cambiar de banco. El 8.5-16k más bajo normalmente no está disponible. Para acceder a los 512k completos, tendría que controlar manualmente la línea de dirección A15, lo que hace que el tamaño del banco sea de 32kB (asignado a los 32k superiores del espacio de la memoria de datos).

Algunos AVR más antiguos, como el ATMega128, también tienen una interfaz de bus externa, pero con capacidades de direccionamiento más limitadas. Estos pueden ser más lentos debido a que tienen que controlar manualmente más líneas de dirección superiores y también porque tienen una velocidad de reloj más baja. Pero si la velocidad es tan crítica, ¡no debería usar un AVR de 8 bits de todos modos!

Gracias Bruce. Leí que XMEGA podía manejar 16 MB, pero no estaba seguro de cómo funcionaba con el bus de 8 bits. ¡Esto lo explica perfectamente!