# Adressdekoder

In der Mikroelektronik, der Rechnerarchitektur und der technischen Informatik wertet ein Adressdekoder (englisch address decoder) die Bits einer aktuellen Adresse aus, um die zugeordnete Speicher-Zelle oder einen bestimmten Teilbereich der Speicher (Speicher-Modul/Speicher-Chip) zu selektieren.
Ein Adressdekoder ist durch eine kombinatorische Schaltung (auch Schaltnetz) technisch zu realisieren. Er kann in seiner Funktion durch Boolesche Algebra beschrieben werden.

## Adressdekoder wählt die Speicherzelle in einem Speicher aus

Ein Adressdekoder ist eine häufig verwendete Komponente in der Mikroelektronik, die zur Auswahl von Speicherzellen in wahlfrei adressierbaren Speicherbausteinen verwendet wird.
Eine solche Speicherzelle besteht aus einer festen Anzahl von Speicherelementen oder Bits. Der Adressdekoder ist mit einem Adressbus verbunden und liest die dort angelegte Adresse. Über eine spezielle Schaltlogik berechnet er aus dieser Adresse, auf welche Speicherzelle zugegriffen werden soll. Daraufhin wählt er diese Zelle aus, indem er sie über eine spezielle Steuerleitung auswählt. Diese Leitung wird auch als Select-Leitung bezeichnet. In dynamischen Speichern (DRAM) gibt es an der Speichermatrix Zeilen- und Spalten-Select-Leitungen, die von im Chip integrierten Adressdecodern angesteuert werden.
Nach welcher Logik die Auswahl der Speicherzelle erfolgt, kann – je nach Dekodertyp – unter Umständen programmierbar sein.

## Adressdekoder wählt das passende Speichermodul aus

Ein Adressdekoder wird auch benutzt, um das zutreffende von mehreren Speichermodulen oder Speicherchips auszuwählen, wenn eine bestimmte Adresse vom Adressbus des Prozessorsystems geliefert wird.
Dazu haben die Speichermodule oder Speicherchips Selektionseingänge, meist als Chip-Select-Pin (CS) oder Chip-Enable-Pin (CE) Pin bezeichnet. Häufig haben diese Eingänge eine negative Logikfunktion (CS oder CE), d. h. mit einer anliegenden logischen Null (Spannungslevel low) wird selektiert.
Durch die jeweils unterschiedliche kombinatorische Logik platziert der Adressdekoder die Speichermodule oder -Chips im Adressraum eines Prozessors. Oft haben die Speichermodule eine geringere Kapazität als der Adressraum. Es können meist mehrere – auch vollkommen gleichartig aufgebaute – Module eingesetzt werden. Es muss dafür gesorgt werden, dass sie sich im Adressbereich unterscheiden.

## Eindeutigkeit oder Mehrdeutigkeit in der Zuordnung Adresse und Speicherzelle

Der Zugriff auf diese Module wird durch den Adressdecoder meist eindeutig organisiert (Injektivität). D.h. eine Adresse führt zu einer Speicherzelle in einem Modul. Sie führt nicht zu Speicherzellen in mehreren Modulen oder zu mehreren Speicherzellen in einem Modul.
Auf eine umkehr eindeutige Zuordnung (Eineindeutigkeit, Bijektivität) zwischen Adresse und Zelle im Modul wird manchmal wegen des Aufwands bei vielen Eingangsleitungen im Adressdekoder verzichtet. Dadurch ist die Adresse nur unvollständig dekodiert. Somit sind einer Speicherzelle mehrere Adressen zugeordnet. Ebenso liegt ein Speichermodul in mehreren Bereichen des Adressraums. Diese Erscheinung wird oft als Spiegeladressen oder gespiegelte Module bezeichnet und auch „Mirror“ genannt. Die unvollständige Dekodierung kann manchmal Hardwareaufwand sparen, bewirkt aber gelegentlich Komplikationen für die Software.

## Beispiel für einen 8-bit-Mikroprozessor

Die häufig genutzte Adressbreite von 16 Bit bei 8-bit-Mikroprozessoren entspricht einem Adressraum mit 64 k Kapazität. Adressen werden fast immer hexadezimal notiert, hier – wie auch in der Programmiersprache C – soll das Präfix "0x" als Kennzeichen genutzt werden. Der Adressraum des 8-bit-Mikroprozessors hat die Adressen 0x0000 bis 0xFFFF.
Die Adressleitungen sind mit $A15$ bis $A0$ bezeichnet. Der Datenbus ist 8 Bit breit.
Der Adressraum wird im Beispiel durch 4 Stück baugleiche RAM-Chips 16k x 8 vollständig gefüllt. Die Bezeichnung 16 k x 8 bedeutet 16 k Kapazität mit der Wortbreite 8 Bit.
Zu diesem Zweck sollen vier Adressdekoder realisiert werden, welche ihre Ausgangssignale CS$_n$ als kombinatorische Logikverknüpfungen von den Adressleitungen des Adressbus bilden.
Dort sollen in diesem Beispiel die höchstwertigen Adressleitungen A15 und A14 ausgewertet werden. Die verbleibenden 14 Adressleitungen können direkt den RAM-Chips zugeleitet werden. Damit wären die folgenden Funktionen für das Signal CS jedes RAM-Chips nutzbar:
Selektion für den ersten RAM-Chip
    ${\overline {CS}}_{0}={A15}\vee {A14}$
Selektion für den zweiten RAM-Chip
    ${\overline {CS}}_{1}={A15}\vee {\overline {A14}}$
Selektion für den dritten RAM-Chip
    ${\overline {CS}}_{2}={\overline {A15}}\vee {A14}$
Selektion für den vierten RAM-Chip
    ${\overline {CS}}_{3}={\overline {A15}}\vee {\overline {A14}}$
Mit den obigen Adressdecodern wird also wie folgt platziert:
    Der erste RAM-Chip erhält die Adressen 0x0000 bis 0x3FFF,
    der zweite RAM-Chip die Adressen 0x4000 bis 0x7FFF,
    der dritte RAM-Chip die Adressen 0x8000 bis 0xBFFF und
    der vierte RAM-Chip die Adressen 0xC000 bis 0xFFFF.