Blockdiagramm der AVR-CPU Architektur
Vor dem Hintergrund einer Maximierung der Leistung und der Parallelisierung nutzt der AVR-Controller die Harvard-Architektur – mit separaten Speichern und Bussen für Programm und Daten. Der Programmspeicher ist mit einer zweistufigen Pipeline verbunden. D.h., dass während ein Befehl noch abgearbeitet wird, der nächste schon aus dem Programmspeicher „vorausgelesen“ wird. Dies ermöglicht, dass ein Befehl innerhalb eines Taktzyklus bearbeitet wird. Der Programmspeicher besteht aus einem „im System“ - programmierbaren Flash-Speicher.
Auf alle Register (32 Stück, 8 Bit breit) kann die ALU innerhalb eines Befehles zugreifen. Das heißt, dass während der Abarbeitung eines Befehls zwei Operanden aus den Registern geholt werden können, die dann dem Befehl entsprechend verarbeitet werden und das Ergebnis anschließend wieder in einem Register abgelegt wird. Das ganze geschieht innerhalb nur eines Takt-Zyklus.
Sechs der Register können zu drei 16 Bit – Registern zusammengeschlossen werden, die als Zeiger für den indirekten Speicherzugriff auf den Datenspeicher dienen. Einer der Zeiger (Z-Pointer) kann auch für die indirekte Adressierung von Speicherzellen im Programmspeicher verwendet werden. Diese Zeiger werden X-, Y-, und Z-Pointer genannt.
Die ALU unterstützt arithmetische und logische Funktionen, die mit zwei Registern oder mit einem Register und einer Konstante ausgeführt werden können. Befehle, die nur ein Register betreffen, werden natürlich auch in der ALU ausgeführt. Nach der Ausführung arithmetischer Befehle wird das Status-Register aktualisiert und enthält somit weitere Informationen zu den Ergebnissen der Operation.
Der Programmablauf wird durch bedingte und unbedingte Sprünge und Unterprogrammaufrufe unterstützt, die den gesamten zur Verfügung stehenden Programmspeicher adressieren können. Die meisten AVR-Befehle haben ein 16 Bit – Word Format. Jede Programmspeicherzelle enthält ein 16 oder 32 Bit – Befehl.
Der Programmspeicher ist in zwei Bereiche unterteilt, dem Boot-Sektor und den Applikations-Sektor. Beide Sektoren haben eigene Lock-Bits, mit denen Schreib- und Lesesicherungen programmiert werden können. Der SPM-Befehl, der in den Applikations-Sektor schreibt, muss also im Boot-Sektor liegen.
Während Interrupt- und Unterprogrammaufrufen wird die Rücksprungadresse des Program Counter (PC) in den Stack gesichert. Der Stack ist im SRAM realisiert und wird daher in seiner Größe nur durch den zur Verfügung stehenden Platz im SRAM bestimmt. Alle Anwenderprogramme müssen den Stack-Pointer, also den Zeiger auf die nächste freie Stack-Adresse, im Rahmen der Reset-Routine initialisieren. Der Stack-Pointer ist im I/O-Speicher hinterlegt und kann sowohl beschrieben als auch gelesen werden. Auf den SRAM kann mit fünf verschiedenen Adressierungsmöglichkeiten zugegriffen werden.
Die flexiblen Interruptmöglichkeiten werden über verschiedene Kontrollregister im I/O-Speicher und in Verbindung mit einer globalen Interruptfreigabe gehandhabt. Jeder Interrupt hat eine eigene Einsprungadresse. Ferner haben alle Interrupts unterschiedliche Prioritäten. Allgemein gilt, dass die Priorität eines Interrupts umso höher ist, je niedriger seine Einsprungadresse ist.
Der I/O-Speicher umfasst 64 Adressen, in denen die peripheren Funktionen, wie Kontrollregister, Timer/Counter und andere I/O-Funktionen hinterlegt sind. Auf den I/O-Speicher kann direkt zugegriffen werden oder er wird über die Adressen 20h bis 5Fh im Datenspeicher adressiert.