Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Ein Addierwerk aus Logikgattern bauen

Nach dieser Lektion: Ich kann aus Logikgattern einen Addierer bauen.

Lektion, 55 Min.9 BefehleLab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Ein Automat, der nicht zählen kann

Ein Fahrkartenautomat addiert eine Fahrt für 3 Euro und einen Zuschlag für 2 Euro in wenigen Milliardstel Sekunden. Trotzdem kann kein Teil in seinem Prozessor zählen.

Jedes winzige Bauteil beantwortet nur eine Ja-Nein-Frage über zwei Bits. In dieser Lektion bauen Sie aus solchen Fragen eine Addition.

Am Ende dieser Lektion

Notiz

Ich kann aus Logikgattern einen Addierer bauen.

Schlüsselwörter

BegriffWas er bedeutet
Logikgattereine Schaltung, die aus einem oder zwei Eingangsbits ein Ausgangsbit macht
Wahrheitstabelleeine Liste aller Eingaben mit ihrer Ausgabe
Übertragdas Bit, das an die nächste Stelle geht, wenn eine Summe zu groß ist
Halbaddiererzwei Gatter, die zwei Bits addieren
VolladdiererGatter, die zwei Bits und einen Übertrag addieren
Überlaufein Ergebnis, das nicht in die vorhandenen Bits passt

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Vier Gatter beantworten Fragen über Bits

Ein Logikgatter nimmt Bits und gibt ein Bit aus. UND gibt 1 nur, wenn beide Eingänge 1 sind. ODER gibt 1, wenn mindestens ein Eingang 1 ist. XOR, das exklusive Oder, gibt 1, wenn die Eingänge verschieden sind. NICHT hat einen Eingang und kehrt ihn um.

Eine Wahrheitstabelle listet jede Eingabe mit ihrer Ausgabe. Zwei Eingänge haben nur vier Fälle.

Wahrheitstabelle: drei Gatter

ABA UND BA ODER BA XOR B
00000
01011
10011
11110

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

In den Architektur-Ordner wechseln

Befehl
cd ~/arch

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Gatter auf 12 und 10 anwenden

Befehl
python3 -c "print(12 & 10, 12 | 10, 12 ^ 10)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Beispiel: die Gatter Bit für Bit

BitsZahl
A110012
B101010
A UND B10008
A ODER B111014
A XOR B01106

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

NICHT auf vier Bits

Befehl
python3 -c "print(~12 & 15)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Zwei Gatter addieren zwei Bits

Zwei Bits zu addieren hat vier Fälle. 0 + 0 ist 0, 0 + 1 und 1 + 0 sind 1. Aber 1 + 1 ist 2, binär 10.

Das rechte Bit des Ergebnisses ist A XOR B. Das linke Bit, der Übertrag, ist A UND B. Ein XOR-Gatter und ein UND-Gatter bilden also einen Halbaddierer.

Wahrheitstabelle: ein Halbaddierer

ABSumme (XOR)Übertrag (UND)
0000
0110
1010
1101

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

XOR ist die Summe ohne Überträge

Befehl
python3 -c "print(12 + 10, 12 ^ 10, (12 & 10) << 1)"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Volladdierer nimmt den Übertrag mit

Jede Stelle außer der ersten muss auch den Übertrag von rechts addieren. Sie addiert also drei Bits.

Ein Volladdierer schafft das mit zwei Halbaddierern und einem ODER-Gatter. Mit vier davon in einer Kette addieren Sie 4-Bit-Zahlen. Der Übertrag wandert von rechts nach links von einem Volladdierer zum nächsten. Deshalb heißt der Aufbau Ripple-Carry-Addierer.

Beispiel: 0111 + 0011, von rechts

StelleABÜbertrag einSummeÜbertrag aus
1er11001
2er11111
4er10101
8er00110

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Wenn das Ergebnis nicht passt

Ein Addierer hat eine feste Zahl von Bits. Bei Zahlen ohne Vorzeichen geht ein Übertrag aus der obersten Stelle verloren. Das Ergebnis fängt wieder von vorn an.

Bei Zahlen mit Vorzeichen gilt ein anderer Test. 0111 + 0011 ist 10, aber 1010 bedeutet im 4-Bit-Zweierkomplement -6. Zwei positive Zahlen ergaben eine negative. Auch das ist ein Überlauf, obwohl oben nichts herausfiel.

Ein Programm, das 180 und 90 addiert

Befehl
printf '.globl _start\n_start:\n  li a0, 180\n  li a1, 90\n  add a0, a0, a1\n  li a7, 93\n  ecall\n' > ueberlauf.s

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Assemblieren

Befehl
riscv64-linux-gnu-as ueberlauf.s -o ueberlauf.o

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Linken

Befehl
riscv64-linux-gnu-ld ueberlauf.o -o ueberlauf

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Im Emulator ausführen

Befehl
qemu-riscv64 ./ueberlauf

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Den Exit-Status lesen

Befehl
echo $?

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele glauben, Überlauf heißt immer, dass oben ein Übertrag herausfällt. Das stimmt nur ohne Vorzeichen. Im Zweierkomplement fällt bei 1110 + 0011 ein Übertrag heraus, und -2 + 3 = 1 ist trotzdem richtig. Ein Überlauf mit Vorzeichen entsteht, wenn beide Eingaben dasselbe Vorzeichen haben und das Ergebnis das andere.

Weiterführend: mit einem Addierer subtrahieren

Ein Prozessor hat keine eigene Schaltung zum Subtrahieren. Er rechnet a - b als a + (NICHT b) + 1, denn NICHT b + 1 ist im Zweierkomplement -b.

Schreiben Sie subtrahiere(a, b) mit Ihrer Funktion addiere: Kehren Sie jedes Bit von b um, addieren Sie es zu a und addieren Sie dann 0001. Probieren Sie 0110 - 0010 und 0010 - 0110. Wie könnte die Hardware die zweite Addition sparen?

Über dieses Lab und seinen Quellcode: Lab für Compilerbau und Rechnerarchitektur: gcc, flex, bison und RISC-V in einer VM

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.