Arquitectura de memoria y almacenamiento de instrucciones - Naimi: Microcontrolador AVR

LDI R16, 0x25 --> E 2 0 5 --> 1110 0010 0000 0101

Aparentemente, en AVR, el código y los datos se almacenan por separado y se accede a cada área (código, área de datos) mediante un bus único.

Ahora que el contador de programa contiene la dirección de la siguiente instrucción, que en este caso es LDI:PC --> E (PC points to 'E')

Mi pregunta es, al cargar las partes de datos (instrucción) dentro de 1 ciclo de reloj, bueno ... la PC se refiere directamente al código de operación 'E'. ¿Cómo encuentra la CPU la porción de datos (0010 0000 0101)?

¿O me equivoqué por completo y son los 2 bytes (E + 0010 0000 0101) de la instrucción el 'código' y se mantienen como una sola unidad en el área del código? En cuyo caso, ¿cuál es el área de datos? Es la de las instrucciones que usan direcciones de memoria: por ejemplo,

LDS R10, $FFFF ¿Aquí el código son los bytes para la instrucción completa y el ensamblador probablemente completa los datos a partir de alguna asignación de variable?

¿Por qué entonces dice:

En las Secciones 2-2 y 2-3, aprendió sobre el espacio de la memoria de datos y cómo usar las instrucciones STS y LDS. ?Entonces la CPU quiere ejecutar el ?LDS Rn,k? instrucción, pone k en el bus de direcciones del bus de datos y recibe datos a través del bus de datos. Por ejemplo, para ejecutar ?LDS R20, 0x90?, la CPU coloca 0x90 en el bus de direcciones. La ubicación $90 está en la SRAM (vea la Figura 2-4). Por lo tanto, la SRAM coloca el contenido de la ubicación $90 en el bus de datos. La CPU obtiene el contenido de la ubicación $90 a través del bus de datos y lo coloca en R20.

¿QUÉ? ¿Alguien podría explicar claramente la arquitectura del bus de datos/código AVR y cómo se obtienen y ejecutan las instrucciones?

Arquitectura de Harvard en AVR

Los operandos inmediatos se almacenan como parte de la instrucción, como ocurre con casi todas las arquitecturas.

Respuestas (3)

Bien, entonces: LDS R10, $FFFF es la instrucción y se resuelve en bytes (2 o lo que sea) y todo se almacena en el 'código'.

El 'código' y los 'datos' de AVR son como C, segmento de código y segmento de datos. El compilador asigna almacenamiento para variables/literales de cadena en 'datos' (no constantes).

La CPU absorbe toda la instrucción (2 bytes) utilizando el registro del contador de programa. Lo decodifica (extrae la información de registro/dirección/código de operación) y ejecuta la instrucción bloqueando la dirección en el bus de direcciones y tomando el valor del bus de datos en el registro R10.

La arquitectura es tan simple como puede ser para un sistema de Harvard:

Hay memoria de programa (flash) accesible a través de un bus, y hay memoria de datos (RAM) accesible a través del otro bus.

El bus de programa tiene 16 bits de ancho, es decir, se pueden leer hasta 16 bits de la memoria del programa a la vez.

Todos los códigos de operación de instrucción tienen 16 bits de ancho, por lo que cada instrucción se puede obtener en un solo paso. Sin embargo, las instrucciones LDSconsisten en el código de operación de la instrucción (16 bits) y un argumento adicional de 16 bits, por ejemplo, la dirección de RAM para leer. Esto significa que primero se obtiene el código de operación de la instrucción de la memoria del programa y se decodifica; durante la decodificación, la CPU detecta que la instrucción tiene un argumento, por lo que se realiza otra lectura de 16 bits de la memoria del programa para obtener el valor del argumento. (Esa es también la razón por la que LDStoma dos ciclos de reloj de la CPU, mientras que LDIsolo necesita uno y LPMnecesita tres. En los AVR, la velocidad de la memoria flash es lo que limita principalmente la frecuencia del reloj de la CPU).

Luego, la CPU quiere ejecutar la LDS Rn,kinstrucción, se coloca ken el bus de direcciones del bus de datos y recibe datos a través del bus de datos.

Esto también es sencillo: después kde leer de la memoria del programa, kse deben recuperar los datos de RAM de la dirección indicada por. Esto se hace poniendo la dirección a leer, el valor de k, en el bus de direcciones del bus RAM, que responde en el bus de datos del bus RAM con los datos extraídos de la dirección RAM enviados previamente al bus de direcciones .

Básicamente: desea leer desde una dirección RAM, enviar la dirección que desea al bus de direcciones y luego leer los datos del bus de datos .

son los 2 bytes (E + 0010 0000 0101) de la instrucción el 'código' y se mantienen como una sola unidad en el área de código. En cuyo caso, ¿cuál es el área de datos? ¿Es para instrucciones que usan direcciones de memoria?

Sí, esto es básicamente correcto. Creo que la diferencia clave que te estás perdiendo son los modos de direccionamiento . LDI utiliza el modo de direccionamiento "inmediato", lo que significa que el valor se especifica en la instrucción misma y, por lo tanto, se toma del área de código. Esto es cierto para el modo inmediato en básicamente todas las arquitecturas.

LDS usa direccionamiento "directo". Se codifica un valor en la instrucción, pero ese valor no se carga en el registro de destino; en su lugar, se envía al bus de direcciones para especificar qué valor del área de datos debe cargarse.