Wenn ich genügend binäre Addierer, binäre Subtrahierer zusammenlöte, ist es möglich, dass es wie eine moderne (sehr sehr langsame) CPU funktioniert (wie sie in einem Grafikrechner zu finden ist).
Ja! Man kann so einen wirklich langsamen Prozessor mit diskreter Logik zusammenbauen. Oder implementieren Sie es in einem FPGA.
(Vorausgesetzt, dies hat möglicherweise keine sofortige Anwendung und ist nur zum Nachdenken! Entschuldigung, wenn es zu lang ist. Nur eine Idee!) Hier sind einige grundlegende Schritte, die man in Betracht ziehen kann:
Wenn es sich um eine Taschenrechneranwendung handelt, konzentrieren Sie sich auf mathematische Operationen. Grundrechenarten sind einfach. Wissenschaftliches Rechnen erfordert einen ausgefeilteren Befehlssatz und eine ausgeklügeltere Architektur.
Ihre Anweisungen und Architektur definieren implizit die Busbreite (Anweisung, Daten - 8,16,32,64 oder sogar 128 Bit!)
Bauen Sie den Befehlsdecoder. Es wird eine kombinatorische Logikschaltung sein. Und unterstützt auch sequentielle Logik für Timing, Sequenzierung und Synchronisation. Auf einer sehr hohen Ebene kann man sich den Befehlsdecoder als Decoder/Demultiplexer vorstellen. Die Signale dieses Blocks aktivieren/deaktivieren und richten nachfolgende Operationen ein.
Erstellen Sie alle notwendigen Register, Sonderfunktionsregister SFRs, I/O-Puffer, Pins, Aktivierungs-/Deaktivierungssignale.
Bauen Sie die Timer, Zähler, Synchronisationsschaltungen
Bauen Sie spezielle periphere Hardware-Schaltkreise. Am Beispiel des Taschenrechners könnten dies der Bildschirm, die Tastatur, die Batterieüberwachung und der Lautsprecher/Summer usw. sein.
Baue die ALU (Arithmetic Logic Unit). Bauen Sie tatsächlich eine fortschrittliche ALU!
Bauen Sie eine nette Mathe-Hardware. Implementieren Sie auch Fließkomma-Arithmetik-Hardware! (Sonderfunktionen, Protokolle, trigonometrische Funktionen sind auf einigen Hardwarekomponenten als Taylor-Reihen oder andere benutzerdefinierte Reihenmathematik implementiert.)
Tatsächlich leben wir im Zeitalter von Data Science und KI. Implementieren Sie also Array- / Vektorverarbeitungseinheiten. Bauen Sie einen Vektorprozessor!
Implementieren Sie Scratchpad, Cache und andere interne Buchhaltungsspeicherbereiche.
Bauen Sie Bus-Peripheriegeräte wie I2C-, SPI- und Speicherschnittstellen und alle anderen nützlichen Peripheriegeräte, die man sich vorstellen kann!
Erstellen Sie einen Programmzähler, rufen Sie Schaltkreise ab, bevor Sie die Befehle an den Decoder weiterleiten. Oder bauen Sie eine Befehlspipeline und etwas Befehlsparallelität
Sehen Sie sich die Spezifikation der Programmiersprache C an. Versuchen Sie, Ihre eigenen CPU-Anweisungen anzupassen, die aus dieser Sprache kompiliert werden sollen. Entwickeln Sie möglicherweise Ihre eigenen Implementierungsspezifikationen und entwickeln Sie Ihren eigenen Compiler!
Am wichtigsten ist, dass ein RESET innerhalb der Schaltung implementiert und auch auf einem externen Pin verfügbar gemacht wird!
Zusätzlich zur kombinatorischen Logik (die Addierer und Subtrahierer bilden kann) benötigen Sie sequentielle Logik (die es dem Computer ermöglicht, Speicher zu haben).
Ja, mit genügend Komponenten könnte man eine CPU bauen.
Beachten Sie, dass die CPUs von Grafikrechnern mit über 15 MHz laufen können. Es ist unwahrscheinlich, dass Sie aus diskreten Elementen eine so schnelle nützliche CPU bauen könnten.
TL; DR: Prozessoren bestehen aus Logikgattern und das müssen sie auch sein!
Wenn Sie über tatsächliche Chips sprechen, die auf einer Leiterplatte installiert sind, lesen Sie weiter. Der PDP-11-Prozessor besteht tatsächlich hauptsächlich aus TTL-Logik der 7400-Serie. Hier spreche ich davon, aus diesen diskreten Logikchips eine eigene 64-Bot-CPU zu bauen.
Damit ein Prozessor ordnungsgemäß funktioniert, benötigen Sie einige Funktionsmodule:
Ich beziehe keine Speicher- oder E/A-Peripheriegeräte mit ein, da diese normalerweise außerhalb des Prozessors liegen, wenn dieser in Chipform hergestellt wird. Diese gehen auf den Systembus und gehorchen auch dem Controller.
Es gibt auch einige Punkte, über die Sie sich entscheiden müssen, bevor Sie mit der Planung Ihres Prozessors beginnen:
Sie können immer noch die wichtigsten ALU-Chips kaufen, 74HC181
und 74HC182
zwar jetzt, obwohl sie jetzt mit CMOS- statt TTL-Technologie gebaut wurden und viel weniger Strom verbrauchen als die ursprünglichen TTL-Chips. Mit 16 74HC181
s und 5 74HC182
s können Sie eine einfache, kombinatorische 64-Bit-ALU erhalten. Es wird nicht so schnell arbeiten wie Ihr Multi-Gigahertz-Core i7, aber bei einigen Kilohertz kann es immer noch seine Arbeit erledigen. Außerdem ist es ein statischer Kern, sodass Sie ihn auf 0 Hz verlangsamen können, wenn die Stromversorgung knapp wird.
Vielleicht möchten Sie einen Barrel-Shifter hinzufügen, der Schieberegister verwendet. Ein Barrel Shifter wird Dinge wie die Multiplikation sehr beschleunigen. 74HC194
scheinen ein guter Kandidat zu sein. Schleifen Sie 16 davon zusammen und Sie erhalten einen 64-Bit-Barrel-Shifter.
Ein Bus ist eine Reihe von Signalleitungen, an die mehrere Ein- und Ausgänge angeschlossen sind. Sie müssen die Ausgänge von einem Funktionsblock zum Bus mit drei Zuständen versehen, oder zwei Geräte, die entgegengesetzte Signale ausgeben, werden Ihre Platine verbrennen. Sie können auch die Eingänge vom Bus zu den Funktionsmodulen unter Verwendung eines Registers verriegeln, damit Sie den Bus andere Informationen übertragen lassen können, während das Funktionsmodul sie verarbeitet.
Eine Kette von 16 74HC173
s scheint ein guter Kandidat für ein einzelnes Register zu sein. Sie verfügen über Tri-State-Ausgänge, was die Busverwaltung erheblich vereinfacht. Platzieren Sie einen Satz davon an Stellen, an denen Sie einen Latch-Eingang benötigen.
Nicht verriegelte Tri-State-Puffer können unter Verwendung einer Kette von 8 74HC241
s aufgebaut werden.
Sie benötigen eine Registrierungsdatei für Arbeitsspeicher. Die meisten Register sind für keinen bestimmten Zweck bestimmt, aber mindestens eines muss einen besonderen Zweck haben: Befehlszeiger.
Der Anweisungszeiger wird immer um eine Anweisungslänge erhöht, nachdem jede Anweisung geladen wurde, und zeigt immer auf die nächste kommende Anweisung.
Möglicherweise möchten Sie auch einen Stapelzeiger haben, der es einigen Speicherzugriffsbefehlen ermöglicht, Speicher zu lesen und / oder zu schreiben und dieses Register in einem atomaren Befehl zu modifizieren.
Es ist schön, ein Maschinenzustandswortregister zu haben. Obwohl nichts Sie davon abhält, spezielle Anweisungen zu verwenden, um Daten zu und von dem versteckten Maschinenzustandswort und einem Mehrzweckregister zu übertragen, würde das den Assembler-Code etwas umständlich machen.
Das "Null"-Register mag nett sein, aber in Wirklichkeit ist es meistens sinnlos, da es genauso gut funktioniert wie mov r0, r1
, xor r1, r1
mit der einzigen Ausnahme, dass letzteres das Null-Flag im Maschinenzustandswort setzen kann.
Die Allzweck-Registerdatei kann unter Verwendung von SRAM-Chips (wie sie praktisch sind) wie eine Kette von 6116
s aufgebaut werden. Der Programmzähler und die Stapelzeiger sollten besser aus Aufwärts-/Abwärtszählern wie 74HC193
(wenn Sie eine feste Befehlslänge und/oder Schublänge haben) oder einer sekundären ALU aufgebaut werden. Das Maschinenzustandswort ist schwieriger zu implementieren, da es zwischen ALU und Steuereinheit überbrückt und normalerweise aus einzelnen D-Flip-Flops wie 74HC171
.
Dies ist kein vom Programm aus zugängliches Register. Stattdessen ist es der Ort, an dem der Befehlsdecoder und die Steuereinheit arbeiten. Die Steuerung kann eine große Zustandsmaschine sein, die mit Zustandsübertragungen in Form eines ROM (Mikrocode, meistens in CISC-Architekturen verwendet) oder einer ganzen Reihe von Drähten, die Demultiplexer auf Demultiplexer verzweigen (Festverdrahtungscontroller, meistens in RISC-Architekturen verwendet), programmiert ist.
Die Antwort ist ja. Dies ist ein Beispiel dafür, wie es in frühen Computertagen gemacht wurde.
https://en.wikipedia.org/wiki/Apollo_Guidance_Computer
Der Apollo-Flugcomputer war der erste Computer, der integrierte Schaltkreise (ICs) verwendete. Während die Block I-Version 4.100 ICs verwendete, die jeweils ein einzelnes NOR-Gatter mit drei Eingängen enthielten, verwendete die spätere Block II-Version (die in den bemannten Flügen verwendet wurde) 2.800 ICs, jeweils mit zwei NOR-Gattern mit drei Eingängen ICs von Fairchild Semiconductor wurden mit Widerstands-Transistor-Logik (RTL) in einem Flatpack implementiert. Sie wurden über Wire Wrap verbunden, und die Verdrahtung wurde dann in gegossenen Epoxidkunststoff eingebettet.
Dies beinhaltete keine Erinnerung:
Der Computer hatte 2048 Wörter löschbaren Magnetkernspeicher und 36 Kilowörter schreibgeschützten Kernseilspeicher.
Der Speicher kann auch mit Logikgattern implementiert werden, aber es werden viele davon benötigt.
Es könnte Sie interessieren, sich in den Verlaufsdateien über frühe Computersysteme zu informieren. Es gab eine Generation (oder vielleicht zwei), die mit einfachen Toren hergestellt wurden.
Connor Wolf
seshu
Dmitri Grigorjew
PeterG
Benutzer