HTG erklärt, wie eine CPU tatsächlich funktioniert
Die meisten Dinge in einem Computer sind relativ einfach zu verstehen: Der Arbeitsspeicher, der Speicher, die Peripheriegeräte und die Software arbeiten zusammen, um eine Computerfunktion zu schaffen. Aber das Herz Ihres Systems, die CPU, scheint selbst vielen Technikern magisch. Hier werden wir unser Bestes geben, um es aufzubrechen.
Die meisten Recherchen zu diesem Artikel stammen von "Aber woher?" Von J. Clark Scott. Es ist eine fantastische Lektüre, geht viel tiefer als in diesem Artikel und ist das Paar wert auf Amazon.
Eine Anmerkung, bevor wir beginnen: Moderne CPUs sind um Größenordnungen komplexer als das, was wir hier skizzieren. Es ist für eine Person fast unmöglich, jede Nuance eines Chips mit über einer Milliarde Transistoren zu verstehen. Die grundlegenden Prinzipien, wie alles zusammenpasst, bleiben jedoch gleich. Wenn Sie die Grundlagen verstehen, werden Sie moderne Systeme besser verstehen.
Klein anfangen
Computer arbeiten binär. Sie verstehen nur zwei Zustände: Ein und Aus. Um Berechnungen im Binärformat durchzuführen, verwenden sie einen sogenannten Transistor. Der Transistor lässt nur dann den Source-Strom zum Drain fließen, wenn Strom über das Gate fließt. Im Wesentlichen bildet dies einen binären Schalter, der die Leitung abhängig von einem zweiten Eingangssignal abschneidet.
Moderne Computer verwenden Milliarden von Transistoren, um Berechnungen durchzuführen. Auf den niedrigsten Ebenen benötigen Sie jedoch nur eine Handvoll, um die grundlegendsten Komponenten (Gates) zu bilden.
Logikgatter
Stapeln Sie einige Transistoren richtig, und Sie haben ein sogenanntes Logikgatter. Logikgatter nehmen zwei Binäreingaben auf, führen eine Operation aus und geben eine Ausgabe zurück. Das ODER-Gatter gibt beispielsweise true zurück, wenn einer der Eingänge true ist. Das UND-Gatter prüft, ob beide Eingänge wahr sind, XOR prüft, ob nur einer der Eingänge wahr ist, und die N-Varianten (NOR, NAND und XNOR) sind invertierte Versionen ihrer Basisgatter.
Mathe mit Gates machen
Mit nur zwei Gattern können Sie eine grundlegende binäre Addition durchführen. Dieses Diagramm oben zeigt einen Halbaddierer, erstellt mit Logicly, einem kostenlosen Online-Spielplatz für Logikgatter. Das XOR-Gate wird hier eingeschaltet, wenn nur einer der Eingänge eingeschaltet ist, jedoch nicht beide. Das UND-Gatter wird eingeschaltet, wenn beide Eingänge eingeschaltet sind, bleibt aber ausgeschaltet, wenn keine Eingabe erfolgt. Wenn also beide eingeschaltet sind, bleibt das XOR ausgeschaltet, und das UND-Gatter wird eingeschaltet, wodurch die richtige Antwort von zwei angezeigt wird:
Dies ermöglicht uns ein einfaches Setup mit drei verschiedenen Ausgängen: Null, Eins und Zwei. Ein Bit kann jedoch nichts höher als 1 speichern, und diese Maschine ist nicht sehr nützlich, da sie nur eines der einfachsten mathematischen Probleme löst. Dies ist jedoch nur ein Halbaddierer, und wenn Sie zwei von ihnen mit einem anderen Eingang verbinden, erhalten Sie einen Volladdierer:
Der Volladdierer hat drei Eingänge - die zwei hinzuzufügenden Zahlen und ein "Übertrag". Der Übertrag wird verwendet, wenn die endgültige Zahl den Wert überschreitet, der in einem einzigen Bit gespeichert werden kann. Volladdierer werden in einer Kette verknüpft, und der Übertrag wird von einem Addierer zum nächsten übergeben. Der Übertrag wird zu dem Ergebnis des XOR-Gatters im ersten Halbaddierer addiert, und es gibt ein zusätzliches ODER-Gatter, um beide Fälle zu behandeln, wenn das also eingeschaltet sein müsste.
Wenn beide Eingänge eingeschaltet sind, wird der Übertrag eingeschaltet und an den nächsten Volladdierer in der Kette gesendet:
Und das ist ungefähr so komplex wie der Zusatz. Wenn Sie zu mehr Bits wechseln, bedeutet dies im Wesentlichen nur mehr volle Addierer in einer längeren Kette.
Die meisten anderen mathematischen Operationen können mit Addition ausgeführt werden. Die Multiplikation ist nur eine wiederholte Addition, die Subtraktion kann mit einer etwas ausgefallenen Bitinversion durchgeführt werden, und die Division ist nur eine wiederholte Subtraktion. Und während alle modernen Computer mit Hardware-basierten Lösungen ausgestattet sind, um kompliziertere Vorgänge zu beschleunigen, können Sie alles technisch mit dem Volladdierer erledigen.
Der Bus und das Gedächtnis
Im Moment ist unser Computer nichts anderes als ein schlechter Rechner. Dies liegt daran, dass es sich an nichts erinnern kann und mit seinen Ausgängen nichts tut. Oben ist eine Speicherzelle dargestellt, die das alles kann. Unter der Haube werden viele NAND-Tore verwendet, und im wirklichen Leben kann es je nach Speichertechnik sehr unterschiedlich sein, aber seine Funktion ist dieselbe. Sie geben ihm einige Eingaben, aktivieren das 'Schreib'-Bit und speichern die Eingaben in der Zelle. Dies ist nicht nur eine Speicherzelle, da wir auch eine Möglichkeit benötigen, Informationen daraus zu lesen. Dies geschieht mit einem Enabler, einer Sammlung von UND-Gattern für jedes Bit im Speicher, die alle an einen anderen Eingang, das "Lesebit", gebunden sind. Die Schreib- und Lesebits werden häufig auch als "Setzen" und "Aktivieren" bezeichnet.
Dieses gesamte Paket ist in ein sogenanntes Register eingepackt. Diese Register sind mit dem Bus verbunden, einem Bündel von Drähten, die um das gesamte System herumlaufen und mit jeder Komponente verbunden sind. Selbst moderne Computer verfügen über einen Bus, obwohl sie möglicherweise mehrere Busse haben, um die Multitasking-Leistung zu verbessern.
Jedes Register hat noch ein Schreib- und Lesebit, aber in diesem Setup sind die Eingabe und Ausgabe dasselbe. Das ist eigentlich gut. Zum Beispiel. Wenn Sie den Inhalt von R1 in R2 kopieren möchten, aktivieren Sie das Lesebit für R1, wodurch der Inhalt von R1 auf den Bus verschoben wird. Wenn das Lesebit eingeschaltet ist, aktivieren Sie das Schreibbit für R2, wodurch der Businhalt in R2 kopiert wird.
Register werden auch verwendet, um RAM zu erstellen. RAM wird häufig in einem Raster angeordnet, wobei die Kabel in zwei Richtungen verlaufen:
Die Decoder nehmen eine binäre Eingabe auf und schalten die entsprechende nummerierte Leitung ein. Beispielsweise ist „11“ im Binärformat 3, die höchste 2-Bit-Zahl, sodass der Decoder die höchste Leitung einschalten würde. An jeder Kreuzung gibt es ein Register. Alle diese Geräte sind an den zentralen Bus und an einen zentralen Schreib- und Leseeingang angeschlossen. Sowohl der Lese- als auch der Schreibeingang werden nur dann eingeschaltet, wenn auch die beiden das Register kreuzenden Drähte eingeschaltet sind. So können Sie das Register auswählen, von dem aus Sie schreiben und lesen möchten. Wieder ist moderner RAM weitaus komplizierter, aber dieses Setup funktioniert immer noch.
Die Uhr, der Stepper und der Decoder
Register werden überall verwendet und sind das grundlegende Werkzeug, um Daten zu verschieben und Informationen in der CPU zu speichern. Also, was sagt ihnen, Dinge zu bewegen??
Die Uhr ist die erste Komponente im Kern der CPU und schaltet sich in einem eingestellten Intervall (gemessen in Hertz oder Zyklen pro Sekunde) aus und ein. Dies ist die Geschwindigkeit, die neben den CPUs angezeigt wird. Ein 5-GHz-Chip kann 5 Milliarden Zyklen pro Sekunde ausführen. Die Taktfrequenz ist oft eine sehr gute Messgröße für die Geschwindigkeit einer CPU.
Die Uhr hat drei verschiedene Zustände: die Basisuhr, die Freigabeuhr und die eingestellte Uhr. Der Basistakt ist für einen halben Zyklus eingeschaltet und für die andere Hälfte ausgeschaltet. Die Aktivierungsuhr wird zum Einschalten der Register verwendet und muss länger eingeschaltet sein, um sicherzustellen, dass die Daten aktiviert sind. Die eingestellte Uhr muss immer zur gleichen Zeit wie die Freigabe-Uhr eingeschaltet sein, da sonst falsche Daten geschrieben werden könnten.
Die Uhr ist mit dem Stepper verbunden, der von einer bis zur maximalen Stufe zählt und sich danach wieder auf eins zurückstellt. Die Uhr ist außerdem mit UND-Gattern für jedes Register verbunden, in das die CPU schreiben kann:
Diese UND-Gatter sind auch mit dem Ausgang einer anderen Komponente, dem Befehlsdecodierer, verbunden. Der Befehlsdecodierer nimmt einen Befehl wie „SET R2 TO R1“ und dekodiert ihn in etwas, was die CPU verstehen kann. Es verfügt über ein eigenes internes Register, das "Instruction Register", in dem die aktuelle Operation gespeichert ist. Wie genau dies geschieht, hängt von dem System ab, auf dem Sie laufen, aber sobald es entschlüsselt ist, wird es den richtigen Satz aktivieren und Bits für die richtigen Register aktivieren, die entsprechend der Uhr ausgelöst werden.
Programmanweisungen werden im RAM (oder L1-Cache auf modernen Systemen, näher an der CPU) gespeichert. Da Programmdaten wie jede andere Variable in Registern gespeichert werden, können sie im Handumdrehen manipuliert werden, um im Programm zu springen. So erhalten Programme ihre Struktur, mit Schleifen und if-Anweisungen. Eine Sprunganweisung legt den aktuellen Ort im Speicher fest, von dem der Befehlsdecodierer an einem anderen Ort liest.
Wie alles zusammenkommt
Nun ist unsere grobe Vereinfachung der Funktionsweise einer CPU abgeschlossen. Der Hauptbus erstreckt sich über das gesamte System und ist mit allen Registern verbunden. Die vollständigen Addierer werden zusammen mit einer Reihe anderer Operationen in die Arithmetic Logic Unit oder die ALU gepackt. Diese ALU hat Verbindungen zum Bus und verfügt auch über eigene Register zum Speichern der zweiten Nummer, auf der sie arbeitet.
Um eine Berechnung durchzuführen, werden Programmdaten aus dem System-RAM in den Steuerbereich geladen. Der Steuerabschnitt liest zwei Zahlen aus dem RAM, lädt die erste in das Befehlsregister der ALU und dann die zweite in den Bus. Inzwischen sendet es an die ALU einen Anweisungscode, der sie darüber informiert, was zu tun ist. Die ALU führt dann alle Berechnungen durch und speichert das Ergebnis in einem anderen Register, aus dem die CPU lesen und den Prozess fortsetzen kann.
Bildnachweis: Rost9 / Shutterstock