← Zurück zum BlogEinen Computer aus Relais bauen · 18/18

1-Bit-Speicher: Das Atom des RAM – und das Finale von Ein Computer aus Relais

Bauen Sie eine 1-Bit-Relaisspeicherzelle auf: Write auf High zum Speichern, auf Low zum Halten. Verfolgen Sie die Entwicklung vom Relais zum RAM anhand von Zuses Z3, Aikens Mark I und Grace Hoppers dokumentiertem Computerfund.

Matthias KellerMatthias Keller
11 Min. Lesezeit
Chalkboard feature illustration for “1-Bit-Speicher: Das Atom des RAM – und das Finale von Ein Computer aus Relais”

Im vorigen Beitrag haben wir das D-Latch gebaut: eine Schaltung, die einen Data-Eingang und eine Write-Freigabeleitung annimmt und zuverlässig den Wert speichert, der an Data anliegt, wenn Write aktiviert wird. In der Relaiswelt war das die Entsprechung eines steuerbaren Speicherplatzes – und beinahe schon eine vollständige, wiederverwendbare Speicherzelle. Beinahe. Es fehlte nur noch eine kleine Verpackung.

Dies ist Beitrag 18 von Einen Computer aus Relais bauen – die letzte Station. Wir werden diese Speicherzelle vollenden, sie bei ihrem richtigen Namen nennen und anschließend etwas tun, worauf diese Serie seit siebzehn Beiträgen hinarbeitet: Sprosse für Sprosse die ganze Leiter nachzeichnen, die wir gemeinsam erklommen haben – von einem einzelnen klickenden Schalter bis zum gespeicherten Bit.

Willkommen beim Atom des RAM.

Die 1-Bit-Speicherzelle verpacken

Das D-Latch erledigt bereits die schwierige Arbeit. Es besitzt eine Write-Freigabeleitung (oft EN oder WE genannt) und eine Data-Leitung (D) und hält den letzten Wert von D, den es gesehen hat, während Write High war. Als unverpacktes Latch legt es jedoch seine innere Topologie offen – die kreuzgekoppelte Relaisrückkopplung und die direkten Ausgangspins – und verleitet Nutzende dazu, es auf problematische Weise zu verdrahten.

Eine 1-Bit-Speicherzelle ist das D-Latch, verpackt mit einem klaren Schnittstellenvertrag:

  • Write – eine einzelne Steuerleitung. Auf High (1) setzen, um zu schreiben; auf Low (0) halten, um zu lesen oder einfach zu halten.
  • Data – das Bit, das gespeichert werden soll: 0 oder 1.
  • Q – der gespeicherte Ausgang. Spiegelt Data, solange Write 1 ist; hält seinen letzten Wert, wenn Write wieder auf 0 fällt.

Alles andere – die kreuzgekoppelte Rückkopplung, der Inverter, der den verbotenen Zustand verhindert – bleibt im Inneren versiegelt. Nutzende müssen es nie sehen. Die Zustandstabelle dieser Zelle ist erfreulich klein:

WriteDataQ (nächster)
0–Q (gehalten)
100
111

Der Gedankenstrich in der Data-Spalte bei Write = 0 ist der Kern der Sache. Wenn Write Low ist, spielt Data keine Rolle. Die Zelle hört nicht zu. Sie hält fest, was sie zuletzt gehört hat – und sie wird es so lange halten, wie sie mit Strom versorgt wird.

Beachten Sie, welche Information die Zustandstabelle nicht liefert: Ohne Kenntnis des zuletzt geschriebenen Werts lässt sich der aktuelle Wert von Q nicht bestimmen. Ein Speicher besitzt einen Zustand. Sein Ausgang ist keine reine Funktion der aktuellen Eingänge, sondern hängt von den Eingängen und der Vorgeschichte ab. Darin liegt der grundlegende Unterschied zwischen kombinatorischen Schaltungen (UND, ODER, XOR und Addierer) und sequentiellen Schaltungen (Latches, Flipflops, Register und RAM). Kombinatorische Schaltungen sind zustandslos: Eingänge anlegen, Ausgänge ablesen, fertig. Sequentielle Schaltungen übertragen die Vergangenheit in den aktuellen Zustand. Ihr Latch speichert diese Information.

Hochskalieren: von einem Bit zu einem Computer

Hier zeigt die Abstraktion ihren Wert.

Acht gemeinsam angesteuerte Zellen speichern ein Byte – einen Wert von 0 bis 255, den Ihr Prozessor in einem Vorgang laden, ändern und speichern kann. Tausend Bytes entsprechen einem Kilobyte im dezimalen SI-System; eine Million Bytes einem Megabyte und eine Milliarde Bytes einem Gigabyte. Moderne Computer integrieren Milliarden solcher Zellen auf einem Chip und wechseln mit hoher Frequenz zwischen Schreib- und Haltezuständen.

Jede Zelle folgt derselben zweizeiligen Zustandstabelle oben. An dieser Tabelle ändert sich nichts, wenn man das Relais auf die Größe eines Transistors schrumpft und vier Milliarden davon auf einem Quadratzentimeter Silizium unterbringt. Der Schalter wurde kleiner. Die Logik blieb unverändert.

Selbst ausprobieren

Unten sehen Sie die Zelle memory-bit – ein als übersichtliche 1-Bit-Speicherzelle gekapseltes D-Latch, das als Relaissimulation in Ihrem Browser ausgeführt wird. Es handelt sich nicht um eine vorab aufgezeichnete Animation: Die simulierten Relaiskontakte wechseln ihren Zustand, der berechnete Strom fließt, und Q hält den gespeicherten Zustand.

Eine 1-Bit-Speicherzelle aus Relais. Write aktivieren und Data setzen, um ein Bit zu speichern; Write loslassen, und die Relais halten es ohne weitere Eingabe.
Open in the Relay Lab

Führen Sie diese Abfolge schrittweise durch:

  1. Eine 1 speichern. Setzen Sie Data = 1 und aktivieren Sie anschließend Write = 1. Die Zelle übernimmt den Wert; Q wird 1. Setzen Sie Write danach wieder auf 0. Data hat nun keinen Einfluss mehr – verändern Sie den Wert, setzen Sie ihn auf 0 oder stellen Sie sich eine Unterbrechung der Verbindung vor. Q bleibt bei 1. Sie haben damit ein Bit gespeichert.

  2. Mit einer 0 überschreiben. Setzen Sie Data = 0 und legen Sie kurzzeitig High an Write an. Q wechselt auf 0. Deaktivieren Sie Write anschließend wieder; Q hält den Wert 0. Damit haben Sie das Bit überschrieben.

  3. Den Haltezustand prüfen. Lassen Sie Write und Data beide auf 0. Q bleibt ebenfalls 0. Solange Write nicht aktiv ist, reagiert die Zelle nicht auf Änderungen an Data, sondern hält den zuletzt übernommenen Wert.

Sie haben soeben ein Bit manuell gespeichert. Stellen Sie sich nun eine Million solcher Zellen vor – jede hält ihre eigene 0 oder 1 und übernimmt erst dann einen neuen Wert, wenn ihre Write-Leitung aktiviert wird. Dieses Prinzip bildet die Grundlage eines RAM-Speichers.

Die Entwicklungsschritte im Überblick

Diese Serie hatte vom ersten Klicken in Beitrag 1 an einen Plan. Bevor wir die Relaiscomputer betrachten, die mit Schaltungen wie diesen arbeiteten, gehen wir jede Sprosse noch einmal gemeinsam durch – denn der gesamte Bogen ist, auf einen Blick, bemerkenswert.

Beitrag 1 – Das Relais selbst. Ein Schalter, den Elektrizität steuert. Eine Spule zieht einen Anker an; der Anker bewegt einen Kontakt; ein Stromkreis betätigt einen Schalter in einem anderen Stromkreis. Als Schließer verdrahtet ist es ein Puffer, als Öffner verdrahtet ein Inverter. Dieses Klicken war nicht nur ein angenehmes Geräusch. Es war der Keim von allem.

Beiträge 2–3 – Reihenschaltung und Parallelschaltung. Zwei Schalter in Reihe, und Strom fließt nur, wenn beide geschlossen sind: UND. Zwei Schalter parallel, und Strom fließt, wenn einer von beiden schließt: ODER. Noch keine Gattersymbole – nur Draht und das beobachtbare Verhalten von Strom. Die Logik war schon da, in Kupfer geschrieben.

Beiträge 4–7 – Die benannten Gatter. UND, ODER und NICHT erhielten auf Grundlage von George Booles Algebra und Claude Shannons Arbeit von 1937 ihre schaltungstechnische Entsprechung. Puffer, Inverter und die drei Grundgatter wurden aus elementaren Relaiskontakten aufgebaut.

Beiträge 8–9 – Die universellen Gatter. NAND und NOR: Mit jedem dieser Gattertypen lässt sich jede boolesche Funktion implementieren. Ein geeignet verschalteter Gattertyp kann alle anderen ersetzen. Anschließend folgte die bekannte Verwendung von NOR-Gattern im Apollo Guidance Computer: Die zugrunde liegenden Schaltungsprinzipien können Sie nun selbst nachvollziehen.

Beiträge 10–11 – XOR und XNOR. Der Unterschiedsdetektor. XOR liefert 1, wenn seine Eingänge nicht übereinstimmen – eine überraschend mächtige Idee, die bei Fehlererkennung, Verschlüsselung und, entscheidend, in der Arithmetik auftaucht.

Beiträge 12–13 – Der Addierer. XOR erzeugt das Summenbit; UND erzeugt den Übertrag. Zwei Schalter, zwei Ausgänge, binäre Addition. Dann wurde der Halbaddierer mit einem Eingangsübertrag zum Volladdierer erweitert – zusammensetzbar, kaskadierbar, die Ripple-Carry-Architektur, die jeder Prozessor noch immer in seinem Kern verwendet. George Stibitz bewies 1937 an seinem Küchentisch, dass dies funktioniert, mit Relais und einer Tabakdose als Kontakten.

Beiträge 14–16 – Rückkopplung und Takt. Die erste rein sequentielle Idee der Serie: Wird ein Inverter so rückgekoppelt, dass sein Ausgang den eigenen Eingang speist, kann die Schaltung oszillieren. Aus einer stabilisierten periodischen Rechteckwelle entsteht ein Taktsignal, das Zustandsänderungen in synchronen Schaltungen koordiniert. Ohne Taktsignal fehlt einer synchronen Schaltung diese zeitliche Koordination; mit jedem wirksamen Taktübergang kann sie den nächsten Verarbeitungsschritt ausführen.

Beitrag 17 – Das D-Latch. Rückkopplung wird konstruktiv: kreuzgekoppelte Relais, die einen Zustand halten, bis sie angewiesen werden, ihn zu ändern. Die Write-Freigabeleitung verhindert den verbotenen Zustand, in dem beide Relais eingeschaltet sind. Gesteuerter Speicher in einer Relaisschaltung.

Beitrag 18 – Die 1-Bit-Speicherzelle. Das D-Latch hinter einer sauberen Schnittstelle verpacken. Write High zum Speichern; Write Low zum Halten. Acht davon für ein Byte stapeln. Millionen davon für ein Megabyte stapeln.

Und jetzt die Belohnung.

Ein Computer besteht im Kern aus vier Dingen:

  1. Ein Takt – ein regelmäßiger Oszillator, der den Takt schlägt und jeder anderen Schaltung sagt, wann sie handeln soll.
  2. Eine ALU – eine arithmetisch-logische Einheit: Addierer, Vergleicher, boolesche Operationen.
  3. Speicher – Aufbewahrung, die ihren Zustand zwischen Taktflanken, während Programmen und über Stromzyklen hinweg hält.
  4. Steuerung und Auswahl – Multiplexer, Dekoder und Befehlslogik, die die richtigen Daten zur richtigen Zeit an den richtigen Ort leiten.

Sie haben nun jedes dieser Elemente aus Relais und grundlegenden Prinzipien aufgebaut. Das Taktsystem behandeln die Beiträge 14–16, die ALU die Beiträge 12–14, den Speicher die Beiträge 16–18 sowie Steuerung und Auswahl die Beiträge 7 und 12 (Multiplexer und Decoder). Der verbleibende Schritt besteht in Skalierung und Organisation: Tausende dieser Bausteine müssen unter der Steuerung eines Programms zusammengeschaltet werden. Die grundlegenden physikalischen und logischen Prinzipien sind damit vorhanden; hinzu kommen Umfang und Struktur der Verdrahtung.

Die Maschinen, die genau das taten

Die Relaiscomputer der 1940er-Jahre nutzten dieselben Grundprinzipien, die Sie soeben untersucht haben – allerdings in einem Maßstab, der ganze Räume beanspruchte und Millionen US-Dollar kostete.

Konrad Zuses Z3 (1941) gilt weithin als die erste vollständig programmierbare, automatisch gesteuerte Rechenmaschine. Zuse – ein deutscher Bauingenieur, der seine ersten Computer im Berliner Wohnzimmer seiner Eltern baute – setzte etwa 2.000 Relais zu einer Maschine zusammen, die ein auf einem gelochten Filmstreifen gespeichertes Programm ausführen konnte. Die Z3 verwendete Gleitkommaarithmetik und ließ sich ohne Neuverdrahtung umprogrammieren. Sie wurde 1943 bei einem alliierten Bombenangriff zerstört. Zuse wurde in dieser Serie bereits kurz erwähnt, als es um Arithmetik ging; doch die Z3 verdient hier ihren großen Auftritt: Sie war die erste Maschine, die zu der Architektur passte, die wir aufgebaut haben. Takt, ALU, Speicher, Steuerung – zusammengesetzt aus denselben klickenden Schaltern.

In den Vereinigten Staaten baute Howard Aiken in Harvard gemeinsam mit IBM die Mark I – offiziell den IBM Automatic Sequence Controlled Calculator – der 1944 vorgestellt wurde. Fünfzehn Meter lang, zweieinhalb Meter hoch und etwa fünf Tonnen schwer, enthielt die Mark I ungefähr 3.300 Relais neben einem Wald aus mechanischen Zählern, Kupplungen und Nockenwellen. Für die Multiplikation zweier Zahlen brauchte sie 3 bis 5 Sekunden. Ihre Befehle kamen über ein gelochtes Papierband, und sie lief jahrelang ununterbrochen, um ballistische Tabellen, Logarithmentafeln und später mathematische Arbeiten für das Manhattan-Projekt zu berechnen. Besuchende in Harvard konnten sie außerhalb des Gebäudes hören – das rhythmische Klappern eines arbeitenden Computers mit 3.300 Relais war nicht zu überhören.

Der Mark I folgte 1947 die Mark II – eine ähnliche elektromechanische Maschine, ebenfalls in Harvard. Und die Mark II bescherte uns eine der dauerhaftesten Geschichten der Informatik.

Am 9. September 1947 bemerkte ein Team von Bedienenden, zu dem die junge Marineoffizierin und Mathematikerin Grace Hopper gehörte, dass sich die Mark II unberechenbar verhielt. Sie verfolgten den Fehler bis zu Relais Nr. 70 in Feld F. Als sie das Relais herauszogen, fanden sie eine Motte – eine echte biologische Motte – die zwischen den Kontakten eingeklemmt war und verhinderte, dass sie richtig schlossen. Die Motte wurde sorgfältig mit einer Pinzette entfernt, mit einem Klebestreifen in das Betriebslogbuch geklebt und mit einem Vermerk versehen: „First actual case of bug being found.“

Die Logbuchseite existiert noch. Sie wird im National Museum of American History der Smithsonian Institution ausgestellt. Die Motte ist noch immer da, unter ihrem Stück Klebeband.

Das Wort „Bug“ für einen technischen Fehler war schon Jahrzehnte zuvor umgangssprachlich gebräuchlich – Thomas Edison verwendete es bereits 1878 für Störungen an seinen Apparaten –, doch an diese angeklebte Motte erinnert sich jeder, weil sie so vollkommen wörtlich ist. Ein echtes Insekt in einem echten Relais in einem echten Computer. Die Metapher wurde Fleisch. Und es geschah in einem Relaiscomputer, weil Relaiscomputer groß und offen genug waren, dass Motten hineingelangen konnten. Ein Transistor ist versiegelt. Eine Motte hat keine Chance.

Die Abstammung: Relais → Vakuumröhre → Transistor → Chip

Die Relaiscomputer arbeiteten von den späten 1930er- bis in die frühen 1950er-Jahre. Dann wurden sie – schnell und vollständig – durch Computer mit Vakuumröhren verdrängt. Röhren hatten keine beweglichen Teile: Statt eines mechanischen Ankers steuerte eine Gitterelektrode in einem evakuierten Glaskolben den Elektronenfluss und führte dieselbe Schaltfunktion in Mikrosekunden statt Millisekunden aus. Die Logik war identisch. Die Architektur war identisch. Nur der Schalter hatte sich geändert.

Vakuumröhren wurden ihrerseits durch Transistoren verdrängt, die 1947 in den Bell Labs vorgeführt und in den 1950er-Jahren kommerzialisiert wurden. Ein Transistor ist ein Halbleiterschalter: Eine kleine Spannung an einem Basisanschluss steuert einen viel größeren Strom zwischen Kollektor und Emitter. Keine beweglichen Teile, kein Glaskolben, kein Glühfaden, der durchbrennt. Millionen Operationen pro Sekunde. Die Logik war identisch. Die Architektur war identisch. Nur der Schalter hatte sich geändert.

Später wurden Milliarden von Transistoren auf Siliziumwafern integriert. Der 1958 entwickelte integrierte Schaltkreis bildet bis heute die technologische Grundlage moderner Rechengeräte. Die booleschen Funktionen bleiben vergleichbar, während die Schaltelemente auf mikroskopische Abmessungen schrumpfen und die Architekturen erheblich komplexer werden.

Das in Beitrag 1 vorgestellte Relais mit seinem hörbar schaltenden, federbelasteten Anker und ein Transistor in einer modernen integrierten Schaltung erfüllen auf unterschiedlichen physikalischen Ebenen dieselbe logische Grundfunktion. Beide dienen als gesteuerte Schaltelemente. Shannons algebraische Beschreibung von 1937 lässt sich auf beide anwenden und führt zu denselben Wahrheitstabellen.

Die Geschichte der Computerhardware ist, wenn man sie so liest, die Geschichte des Relais. Alles, was danach kam, ist eine schnellere, leisere, kleinere Version derselben Idee.

Wohin von hier aus?

Drei ehrliche Empfehlungen für Lesende, die bis zum Ende dieser Serie gekommen sind.

Erstens: Bauen Sie eine größere Schaltung auf. Die Schaltungen dieser Serie sind auf den Umfang eines Blogbeitrags zugeschnitten. Kaskadieren Sie acht Volladdierer, verdrahten Sie ein Ergebnisregister, ergänzen Sie ein Taktsignal und untersuchen Sie die Ausführung einer 8-Bit-Arithmetikoperation. Das DigiSim Relay Lab bietet entsprechende Aufbauten: eine 8-Bit-Addiermaschine, an der Sie den Übertrag durch alle acht Stufen verfolgen können, einen asynchronen 3-Bit-Zähler (Ripple Counter), ein flankengesteuertes D-Flipflop, das Daten ausschließlich an der steigenden Taktflanke übernimmt, sowie einen Frequenzteiler, der die Frequenz eines Taktsignals mit einem Flipflop halbiert. Diese umfangreicheren Relaisschaltungen machen die einzelnen Schaltvorgänge sichtbar und hörbar und nutzen daher die vollständige Arbeitsfläche.

Zweitens: Lesen Sie Charles Petzolds CODE. Diese Serie ist wesentlich davon inspiriert. Petzolds Buch beginnt mit Morsecode und Taschenlampen und entwickelt daraus schrittweise eine funktionsfähige CPU. Es behandelt dieselben Grundlagen und führt anschließend zu Maschinensprache, Assemblersprache und Betriebssystemen weiter. Als textliche Ergänzung zur interaktiven Simulation bietet CODE eine fundierte Darstellung.

Drittens: Entwickeln Sie eine eigene Schaltung. Öffnen Sie die DigiSim-Arbeitsfläche, platzieren Sie ein Relais und setzen Sie eine beim Lesen dieser Serie entstandene Idee praktisch um. Der Übergang vom Nachvollziehen einer vorgegebenen Schaltung zum eigenständigen Entwurf schließt den Lernprozess ab. Die dafür benötigten Grundlagen haben Sie nun erarbeitet.

Vor siebzehn Beiträgen haben Sie einen elektrisch betätigten Schalter kennengelernt. Inzwischen haben Sie eine Speicherzelle aufgebaut, die ein Bit ohne erneute Ansteuerung hält, und die Entwicklungslinie vom Relais bis zu modernen Computern nachvollzogen. Die zugrunde liegende logische Beziehung besteht fort.

Untersuchen Sie die Arbeitsweise eines aus Relais aufgebauten Computers im DigiSim Relay Lab.

Machen Sie aus der Idee eine funktionierende Schaltung.