Kann man aus Logikgattern eine CPU machen?

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).

Was denkst du, woraus CPUs bestehen ?
Es ist eine echte Frage, und keine Notwendigkeit, sie herunterzuspielen. Auch kurze & knackige Fragen brauchen echte Antworten. Es geht darum, Ideen zu entfachen, zu teilen und zu diskutieren.
Du meinst so ?
Etwas wie der alte Intel 4004, 8008 oder, wenn Sie ambitioniert sind, sogar der 8080, könnte ein gutes Ziel sein. Der 4004 verwendete 2.300 Transistoren und der 8008 verwendete 3.500 Transistoren und der 8080 verwendete 6.000 Transistoren, alle laut Wikipedia. Dies ist klein genug, um praktisch erreichbar zu sein, und obwohl es nach heutigen Maßstäben nicht besonders nützlich ist, haben es die Leute geschafft, mit solchen CPUs nützliche Arbeit zu leisten. Es sollte auch nicht allzu schwer sein, Dokumentationen dazu zu finden, wenn man sich umschaut.

Antworten (4)

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:

  1. Entwickeln Sie zuerst einen Befehlssatz. Listen Sie jede Anweisung und die erforderliche Anzahl von Operanden auf. Weisen Sie jeder Anweisung eine eindeutige Binärzahl zu. Ihr Befehlsdecoder erkennt diese eindeutigen Befehle anhand der von Ihnen zugewiesenen Nummer.

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.

  1. Ihre Anweisungen und Architektur definieren implizit die Busbreite (Anweisung, Daten - 8,16,32,64 oder sogar 128 Bit!)

  2. 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.

  3. Erstellen Sie alle notwendigen Register, Sonderfunktionsregister SFRs, I/O-Puffer, Pins, Aktivierungs-/Deaktivierungssignale.

  4. Bauen Sie die Timer, Zähler, Synchronisationsschaltungen

  5. 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.

  6. Baue die ALU (Arithmetic Logic Unit). Bauen Sie tatsächlich eine fortschrittliche ALU!

  7. 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.)

  8. Tatsächlich leben wir im Zeitalter von Data Science und KI. Implementieren Sie also Array- / Vektorverarbeitungseinheiten. Bauen Sie einen Vektorprozessor!

  9. Implementieren Sie Scratchpad, Cache und andere interne Buchhaltungsspeicherbereiche.

  10. Bauen Sie Bus-Peripheriegeräte wie I2C-, SPI- und Speicherschnittstellen und alle anderen nützlichen Peripheriegeräte, die man sich vorstellen kann!

  11. 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

  12. 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!

  13. 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.

Bodenplanung

Damit ein Prozessor ordnungsgemäß funktioniert, benötigen Sie einige Funktionsmodule:

  • Alu,
  • System Bus,
  • Registerdatei (GPRs und Anzahl davon),
  • Programm zähler,
  • Befehlsregister,
  • Befehlsdekodereinheit,
  • Controller-Einheit.

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:

  • Befehlssatz (bestimmt, wie Ihr Befehlsregister, Ihre Befehlsdecodereinheit und Ihr Controller aussehen)
  • Endianness (wenn Sie Multibyte-Maschinenwörter verwenden, wie wir es jetzt tun, 64-Bit-Wörter verwenden)
  • Busbreite

Alu

Sie können immer noch die wichtigsten ALU-Chips kaufen, 74HC181und 74HC182zwar jetzt, obwohl sie jetzt mit CMOS- statt TTL-Technologie gebaut wurden und viel weniger Strom verbrauchen als die ursprünglichen TTL-Chips. Mit 16 74HC181s und 5 74HC182s 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. 74HC194scheinen ein guter Kandidat zu sein. Schleifen Sie 16 davon zusammen und Sie erhalten einen 64-Bit-Barrel-Shifter.

System Bus

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 74HC173s 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 74HC241s aufgebaut werden.

Registrieren Sie den Datei- und Befehlszeiger

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, r1mit 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 6116s 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.

Befehlsregister, Decoder und Steuereinheit

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.