Ich werde versuchen, Ihnen eine Vorstellung davon zu geben, wie digitale Schaltungen zur Lösung von Problemen bei der digitalen Verarbeitung entwickelt wurden, indem Sie die von Ihnen gestellten Probleme verwenden: Wie implementieren CPUs Additionen und Multiplikationen.
Lassen Sie uns zunächst die direkte Frage aus dem Weg räumen: Wie bewertet eine Programmiersprache Multiplikationen und Additionen effizient? Die Antwort ist einfach, sie kompilieren sie in Multiplikation und fügen Anweisungen hinzu. Zum Beispiel der folgende Code:
a = 1 + 1;
b = a * 20;
wird einfach so kompiliert:
ADD 1 1 a
MUL a 20 b
(Beachten Sie, dass die obige Baugruppe der Einfachheit halber für eine imaginäre CPU gedacht ist, die nicht existiert).
An diesem Punkt stellen Sie fest, dass die obige Antwort das Problem einfach verschiebt und es durch Hardware-Magie löst. Die Folgefrage ist natürlich, wie diese Hardware-Magie funktioniert.
Schauen wir uns zuerst das einfachere Problem an: Addition.
Zuerst machen wir ein bekanntes Problem, indem wir 10 Zahlen zur regulären Basis hinzufügen:
17
+28
Der erste Schritt wäre, 7 und 8 zu addieren. Dies ergibt jedoch 15, was mehr als eine einzelne Ziffer ist. Also tragen wir die 1:
(1)
17
+28
= 5
Nun addieren wir 1, 1 und 2:
17
+28
=45
Daraus ergeben sich folgende Regeln:
Wenn das Ergebnis der Addition mehr als eine Ziffer ist, behalten wir die niedrigstwertige Ziffer bei und übertragen die höchstwertige Ziffer nach vorne
Wenn wir eine Ziffer in unsere Spalte übertragen haben, fügen wir sie zusammen mit den Zahlen hinzu, die wir hinzufügen
Nun ist es an der Zeit, die obigen Regeln in der Basis 2 - Boolesche Algebra - zu interpretieren.
Also addieren wir in der Booleschen Algebra 0 und 1 = 1. Addieren von 0 und 0 = 0. Addieren von 1 und 1 = 10, was mehr als eine Ziffer ist, also tragen wir die 1 vor.
Daraus können wir eine Wahrheitstabelle erstellen:
a b | sum carry
-------------------
0 0 | 0 0
0 1 | 1 0
1 0 | 1 0
1 1 | 0 1
Daraus können wir zwei Schaltungen / Boolesche Gleichungen konstruieren - eine für die Ausgabe der Summe und eine für die Ausgabe des Übertrags. Am einfachsten ist es, alle Eingaben aufzulisten. Jede Wahrheitstabelle, egal wie groß und komplex, kann in dieser Form ausgedrückt werden:
(AND inputs in first row) OR (AND of inputs in second row) OR ...
Dies ist im Grunde die Summe der Produktformen. Wir betrachten nur Ausgaben, die zu einer 1 führen, und ignorieren die Nullen:
sum = (NOT a AND b) OR (a AND NOT b)
Ersetzen wir das UND ODER und NICHT durch die Symbole der Programmiersprache, um die Lesbarkeit zu verbessern:
sum = (!a & b) | (a & !b)
Grundsätzlich haben wir die Tabelle folgendermaßen konvertiert:
a b | sum equation
-------------------
0 0 | 0
0 1 | 1 (!a & b)
1 0 | 1 (a & !b)
1 1 | 0
Dies kann direkt als Schaltung implementiert werden:
_____
a ------------| |
\ | AND |-. ____
\ ,-NOT--|_____| \ | |
\/ `--| OR |----- sum
/\ _____ ,--|____|
/ `-NOT--| | /
/ | AND |-`
b ------------|_____|
Beobachter würden an dieser Stelle bemerken, dass die obige Logik tatsächlich als einzelnes Gatter implementiert werden kann - ein XOR-Gatter, das in geeigneter Weise das von unserer Wahrheitstabelle geforderte Verhalten aufweist:
_____
a ------------| |
| XOR |---- sum
b ------------|_____|
Wenn Ihre Hardware Ihnen jedoch kein XOR-Gatter bietet, definieren und implementieren Sie es in den obigen Schritten in Bezug auf AND-, OR- und NOT-Gatter.
Wie Sie Logikgatter in tatsächliche Hardware umwandeln, hängt von der Hardware ab, über die Sie verfügen. Sie können unter Verwendung verschiedener physikalischer Mechanismen implementiert werden, solange der Mechanismus eine Art Schaltverhalten bereitstellt. Logikgatter wurden mit allem implementiert, von Wasserstrahlen oder Luftstößen (Fluidik) über Transisitoren (Elektronik) bis hin zu fallenden Murmeln. Es ist ein großes Thema für sich, also beschönige ich es einfach und sage, dass es möglich ist, logische Gatter als physische Geräte zu implementieren.
Jetzt machen wir dasselbe für das Übertragsignal. Da es nur eine Bedingung gibt, in der das Übertragsignal wahr ist, lautet die Gleichung einfach:
carry = a & b
So tragen ist einfach:
_____
a ------------| |
| AND |---- carry
b ------------|_____|
Wenn wir sie miteinander kombinieren, erhalten wir das, was als Halbaddierer bekannt ist:
_____
a ------;-----| |
| | XOR |---- sum
b --;---|-----|_____|
| | _____
| '-----| |
| | AND |---- carry
'---------|_____|
Die Gleichungen für die obige Schaltung sehen übrigens so aus:
sum = a ^ b
carry = a & b
Dem Halbaddierer fehlt etwas. Wir haben die erste Regel implementiert - wenn das Ergebnis mehr als eine Ziffer als Übertrag ist, aber wir haben die zweite Regel nicht implementiert - wenn es einen Übertrag gibt, addieren Sie sie zusammen mit den Zahlen.
Um einen Volladdierer zu implementieren, eine Addierschaltung, die Zahlen mit mehr als einer Ziffer addieren kann, müssen wir eine Wahrheitstabelle definieren:
a b c | sum carry
---------------------
0 0 0 | 0 0
0 0 1 | 1 0
0 1 0 | 1 0
0 1 1 | 0 1
1 0 0 | 1 0
1 0 1 | 0 1
1 1 0 | 0 1
1 1 1 | 1 1
Die Gleichung für die Summe lautet nun:
sum = (!a & !b & c) | (!a & b & !c) | (a & !b & !c) | (a & b & c)
Wir können den gleichen Prozess durchlaufen, um die Gleichung herauszuformulieren und zu vereinfachen und sie als Schaltung usw. zu interpretieren, wie wir es oben getan haben, aber ich denke, diese Antwort wird zu lang.
Inzwischen sollten Sie eine Vorstellung davon bekommen, wie digitale Logik aufgebaut ist. Es gibt andere Tricks, die ich nicht erwähnt habe, wie Karnaugh-Maps (zur Vereinfachung von Wahrheitstabellen) und Logik-Compiler wie Espresso (damit Sie Boolesche Gleichungen nicht von Hand ausrechnen müssen), aber die Grundlegenden sind im Grunde die, die ich habe oben umrissen:
Zerlegen Sie das Problem, bis Sie auf Einzelbitebene (Ziffernebene) arbeiten können.
Definieren Sie die gewünschten Ausgaben mithilfe einer Wahrheitstabelle.
Konvertieren Sie die Tabelle in eine Boolesche Gleichung und vereinfachen Sie die Gleichung.
Interpretieren Sie die Gleichung als logisches Gatter.
Wandeln Sie Ihre Logikschaltung in echte Hardwareschaltungen um, indem Sie Logikgatter implementieren.
Auf diese Weise werden grundlegende (oder eher einfache) Probleme wirklich gelöst - viele, viele Wahrheitstabellen. Die eigentliche kreative Arbeit besteht darin, eine komplexe Aufgabe wie die MP3-Dekodierung auf Bit-Ebene aufzubrechen, damit Sie mit Wahrheitstabellen daran arbeiten können.
Entschuldigung, ich habe keine Zeit zu erklären, wie die Multiplikation implementiert wird. Sie können versuchen, einen Riss zu machen, indem Sie herausfinden, wie lange die Multiplikation funktioniert, und sie dann als Binärdatei interpretieren und dann versuchen, sie in Wahrheitstabellen zu zerlegen. Oder Sie können Wikipedia lesen: http://en.wikipedia.org/wiki/Binary_multiplier