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
| Begriff | Was er bedeutet |
|---|---|
| Logikgatter | eine Schaltung, die aus einem oder zwei Eingangsbits ein Ausgangsbit macht |
| Wahrheitstabelle | eine Liste aller Eingaben mit ihrer Ausgabe |
| Übertrag | das Bit, das an die nächste Stelle geht, wenn eine Summe zu groß ist |
| Halbaddierer | zwei Gatter, die zwei Bits addieren |
| Volladdierer | Gatter, die zwei Bits und einen Übertrag addieren |
| Überlauf | ein 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
| A | B | A UND B | A ODER B | A XOR B |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
In den Architektur-Ordner wechseln
cd ~/archHier 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
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
| Bits | Zahl | |
|---|---|---|
| A | 1100 | 12 |
| B | 1010 | 10 |
| A UND B | 1000 | 8 |
| A ODER B | 1110 | 14 |
| A XOR B | 0110 | 6 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
NICHT auf vier Bits
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
| A | B | Summe (XOR) | Übertrag (UND) |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
XOR ist die Summe ohne Überträge
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
| Stelle | A | B | Übertrag ein | Summe | Übertrag aus |
|---|---|---|---|---|---|
| 1er | 1 | 1 | 0 | 0 | 1 |
| 2er | 1 | 1 | 1 | 1 | 1 |
| 4er | 1 | 0 | 1 | 0 | 1 |
| 8er | 0 | 0 | 1 | 1 | 0 |
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
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.sHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Assemblieren
riscv64-linux-gnu-as ueberlauf.s -o ueberlauf.oHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Linken
riscv64-linux-gnu-ld ueberlauf.o -o ueberlaufHier 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
qemu-riscv64 ./ueberlaufHier 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
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?