Actualización de varios puertos en 8bit AVR en un solo ciclo

2

En el 8bit Atmel AVR MCUS (específicamente las series mega y xmega), ¿es posible modificar simultáneamente varios puertos en un solo ciclo de instrucciones?

Por ejemplo, tengo un chip 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 a 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 gama baja para pasar a través de la RAM, sin embargo, la asignación puede no ser secuencial. ¿Puedo, de nuevo para tomar un ejemplo aleatorio, hacer que la RAM coloque el primer byte, luego el 510º byte y luego el 294º byte en el bus de datos en tres ciclos de reloj de CPU secuenciales?

¡Gracias!

    
pregunta user3081739

3 respuestas

5

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 ir a por una MCU de 32 bits. Es posible obtener Procesadores AVR de 32 bits si desea un CPU similar. Alternativamente, hay muchos procesadores ARM de 32 bits relativamente simples / baratos de muchos fabricantes. Haz tu elección.

    
respondido por el Tom Carpenter
2

El AVR XMEGA tiene una Interfaz de Bus Externa que atiende hasta 16MB. 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 puede cronometrarse a 32MHz, lo que lo hace equivalente a un solo ciclo en un AVR de 16MHz.

Interfaz de bus externo de XMEGA

Sin embargo, como la memoria externa está asignada al espacio de memoria de datos de 64k, solo se puede acceder aleatoriamente a 48-55.5kB (dependiendo de la cantidad de espacio de memoria de datos que se utiliza para IO / EEPROM / RAM interna) sin cambiar los bancos. El 8.5-16k más bajo no está normalmente disponible. Para acceder a los 512k completos, tendría que controlar manualmente la línea de dirección A15, haciendo que el tamaño del banco sea de 32kB (asignado en el espacio superior de 32k 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 importante, no deberías usar un AVR de 8 bits de todos modos!

    
respondido por el Bruce Abbott
2

Por lo general, a un chip de memoria no le va a importar si todos los cables de dirección cambian al mismo tiempo. Lo más que se requeriría normalmente sería que todos los cables de dirección se configuren a sus niveles adecuados antes de que se inicie el acceso, y que permanezcan en sus niveles adecuados durante un período de tiempo posterior a la finalización del acceso. En muchos casos, los requisitos para los accesos de lectura son incluso 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 datos válidos dentro de un período de tiempo. último cambio en el bus de direcciones.

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

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

  1. Bits de salida 16-23 de la dirección deseada.
  2. Unidad "Clock / LE" alta.
  3. Bits de salida 8-15 de la dirección deseada.
  4. Unidad "Clock / LE" baja.
  5. Envía los bits 0-7 de la dirección deseada
  6. Golpee cualquier otro pin que sea necesario para activar el acceso deseado.

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

Es posible realizar una variedad de disposiciones dependiendo de los requisitos de velocidad y la cantidad de pines de E / S que tenga disponibles.

    
respondido por el supercat

Lea otras preguntas en las etiquetas