Letztes mal wurde geklärt, wie Rechner in der Lage sind, durch Bitketten repräsentierte Zahlen zu addieren. Eigentlich müsste es heute in dieser Richtung weitergehen und es sollten weitere Addierwerke, die Darstellung von negativen und reellen Zahlen, Subtraktion, Multiplikation und Division sowie Probleme beim Rechnen in Computern erklärt werden. Das wird auch kommen, allerdings nicht in diesem Beitrag, da ich vorher noch ein für Computer und auch für das Rechnen wichtiges Thema dazwischen schieben möchte; und zwar, wie Daten im Computer überhaupt gespeichert werden können.


Ganz grob lassen sich drei Arten der Datenspeicherung im Computer unterscheiden. Die bekannteste Art dürfte die permanente Speicherung sein, etwa auf Festplatte oder CD. Hierbei werden die Daten so abgelegt, dass sie theoretisch unbegrenzt lange (in der Praxis natürlich begrenzt durch die Lebensdauer des Mediums) gehalten werden können, und zwar – das ist wichtig – unabhängig von einer Stromzufuhr. Diesen Vorteil erkauft sich die permanente Speicherung damit, dass das Schreiben und Lesen von Daten meist einige Zeit dauert.

Die zweite Art der Speicherung ist die Haltung von Daten für den laufenden Betrieb, also alles das, was in nächster Zeit für Berechnungen und ähnliches benötigt wird und wo daher ein schneller Zugriff notwendig ist. Derartige Daten werden im Arbeitsspeicher oder – je nach dem, wie dringend sie benötigt werden – im schnelleren Cache gehalten. Hier gespeicherte Daten können schnell ausgelesen und geschrieben werden, gehen allerdings verloren, wenn die Stromzufuhr unterbrochen wird.

Die dritte Art der Datenspeicherung im Computer ist der zweiten relativ ähnlich in Hinsicht auf Geschwindigkeit und Dauer; ich möchte sie dennoch separat betrachten, da sie etwas anders realisiert wird. Daten, die gerade aktuell für eine bestimmte Operation im Computer, zum Beispiel eine Addition, benötigt werden, müssen aus dem Arbeitsspeicher oder dem Cache in einen Speicherbereich verschoben werden, wo sie direkt (physikalisch gesehen) ausgewertet werden können. Die Bausteine, die diesen Speicherbereich bilden, nennen sich Register, und um die soll es heute gehen.

Die bisherigen Betrachtungen zur Arbeitsweise von Computern waren mehr oder weniger zustandslos, das heißt, es wurden keine Daten gespeichert; aufeinanderfolgende Operationen wurden immer unabhängig von den vorherigen durchgeführt. Das ist für das Arbeiten am Computer natürlich höchst hinderlich, da ja die verarbeiteten Daten meist etwas miteinander zu tun haben. Es ist also unbedingt nötig, Daten zu speichern, noch dazu auf eine Art, die es erlaubt, die Daten physikalisch effektiv zum Beispiel an ein Addierwerk weiterzuleiten. Diese Aufgabe übernehmen im Computer die sogenannten Register; das sind Bausteine, die eine Bitkette bestimmter Länge für einige Zeit speichern können. Es gibt dabei – wie immer – unterschiedliche Arten von Registern; welche genau, werden wir später sehen.

Da ein Register eine Bit-Kette speichert, ist es natürlich auch nötig, ein einzelnes Bit speichern zu können. Das Bauelement der Wahl hierfür ist das sogenannte Flipflop (oder auch sperriger: bistabile Kippstufe). Ein Flipflop (kurz: FF) hat – allgemein gesagt – die Aufgabe, ein einzelnes Bit über einen längeren Zeitraum zu speichern. Moderne Flipflops sind in der Regel aus Transistoren aufgebaut (wir erinnern uns) und lassen sich nach den verschiedensten Kriterien unterscheiden.

Eines der einfachsten Flipflops ist das sogenannte ungetaktete RS-Flipflop (RS-FF), welches bereits mit zwei einfachen NAND-Gattern aufgebaut werden kann. “RS” steht für “reset, set” und beschreibt sowohl den Aufbau als auch die Funktionsweise dieses Bauelementes. Das RS-FF besitzt zwei Eingänge, nämlich Set (S) und Reset (R) und zwei Ausgänge, meist als Q und Q bezeichnet. Q und Q sind – wie der Name bereits andeutet – komplementäre Eingänge, das heißt, wenn Q eine logische “1” anzeigt, zeigt Q eine “0” an und umgekehrt (es gibt auch den Fall, dass beide Ausgänge “1” sind, dazu aber gleich noch etwas).

Das RS-FF funktioniert so, dass der Ausgang Q auf den Wert “1” gesetzt wird, wenn am Eingang S (set) eine “1” und an R (reset) eine “0” anliegt. Umgekehrt wird der Ausgang auf “0” gesetzt, wenn an S eine “0” und an R eine “1” anliegt. Sind beide Eingänge auf “0”, so wird der aktuelle Zustand gespeichert – hier liegt die eigentliche Funktionsweise des RS-FF. Lediglich der Zustand, dass beide Eingänge auf “1” gesetzt werden, entspricht nicht der Nutzungsidee, da hier ein logischer Widerspruch vorliegt: gleichzeitiges setzen (set) und löschen (reset) einer Information ist nicht logisch; daher heißt dieser Zustand auch “verbotener Zustand”. Er kann natürlich trotzdem vorkommen, wobei hier beide Ausgänge des Flipflops den Wert “1” anzeigen. Es ergibt sich also folgende Zustandstabelle für das RS-Flipflop (t-1 steht für den zuletzt eingestellten Wert):

1 / 2 / Auf einer Seite lesen

Kommentare (20)

  1. #1 rolak
    Juni 28, 2011

    🙂 Früher war beim Beantworten von ‘wie geht das?’ spätestens dann das Ende des Ernstnehmens erreicht, wenn ich genötigt war, das Wort ‘Flip-Flop’ zu benutzen. Wurde noch schlechter, als die Badelatschen entsprechend umgetauft wurden…

  2. #2 Marcus Frenkel
    Juni 28, 2011

    Ach…ich bin optimistisch, dass die Leser aus lauter Interesse weiter folgen…egal, wie wild es noch wird. 😉

  3. #3 Engywuck
    Juni 28, 2011

    kann es sein, dass so ein Register leicht viele Transistoren benötigt?
    Aus Teil 1 ist ja bekannt, dass ein NAND aus 4 Transistoren besteht, ein NOT aus zweien.
    Das heißt doch, dass so ein primitiver RS-Flipflop schon 8 Transistoren (bzw. 12, wie bei Dir gezeichnet mit nichtinvertierten Eingängen) benötigt, ein D-Latch wie gezeichnet 20.
    Für ein(!) Bit!

    Damit ist dann klar, wieso Register (und letztlich on-die-Cache) recht “teuer” ist…

    Zwei Fragen noch:
    – zu meinen Löterzeiten (early teens, also etwas her) hab ich flipflops aus zwei Bipolartransitoren (plus Widerstände und Lämpchen zur Anzeige) gebaut. Das ist in FET-Technik (oder nur CMOS?) nicht möglich?
    – wieso baust Du im Bild des D-Latch links unten einen NAND rein, wenn der letzlich “nur” als Inverter wirkt?

  4. #4 Marcus Frenkel
    Juni 28, 2011

    Es werden sehr viele Transistoren benötigt, das ist richtig. Nicht umsonst sitzen auf modernen CPUs bis zu mehrere Milliarden Transistoren (z.B. in den Intel-Itanium-Prozessoren).

    Zu den Fragen:

    zu 1.: Die Frage kann ich nicht einmal beantworten. Es wird Gründe geben, warum selbst ein einfaches RS-FF aus relativ vielen Transistoren besteht; entweder, weil es die CMOS-Technik nicht anders hergibt oder weil es anderweitige physikalische Vorteile hat – oder weil es leichter ist, eine CPU mit NANDs zu planen anstatt mit einzelnen Transistoren. 😉
    Vielleicht weiß ein Mitleser eine Antwort darauf – mein Internet gibt es im Moment leider nicht her, dass ich selber schaue.

    zu 2.: Ah…hätte ich wohl doch noch etwas zum D-Latch schreiben müssen. Das D-Latch basiert auf der Annahme, dass zur Benutzung eines Flipflops ein Dateneingang reicht und nicht, wie beim RS-Flipflop, zwei mehr oder weniger komplementäre Eingänge benötigt werden. Daher wird der eine Dateneingang noch einmal invertiert, so dass quasi die RS-FF-Funktionsweise intern wiederhergestellt wird. Wer sich das D-Latch genau anschaut, wird darin auch das RS-FF wiedererkennen – lediglich mit einer vorgeschalteten Stufe, um den Takt noch mit einfließen zu lassen. Der explizite Inverter unten links hat eigentlich keinen speziellen Grund – genauso hätte man den Eingang am nachfolgenden NAND invertieren können. Aber er regt vielleicht zum Nachdenken an. 😉

    Übrigens erkennt man am D-Latch auch gut die negative Eingangs-Logik des RS-FF, da die Ergebnisse der Taktstufe immer noch negiert werden.

  5. #5 michi
    Juni 29, 2011

    Danke! Warte immer schon auf den nächsten Teil.

  6. #6 Engywuck
    Juni 29, 2011

    *hüstel*
    Itanic als “modern” zu bezeichnen… eine Prozessorarchitektur, bei der nun so langsam auch die letzten Softwareproduzenten abspringen, obwohl sie vertraglich gebunden sind..

    Aber nehmen wir doch mal den erst neulich vorgestellten Llano: 4 Rechenkerne zu je 1MB Level-2-Cache, plus Grafikkern. für “grade mal” 1450 Millionen Transistoren laut https://www.3dcenter.org/artikel/launch-analyse-amd-llano
    Bei 20 Transistoren je Bit wären das allein für die 4MB L2-Cache 640 Millionen Transistoren für den Cache. Ohne Taktversorgung, L1, Register und sowas.
    Ja, Cache geht “eng zusammen” auf dem Die wegen der gleichförmigen Strukturen [deshalb auch NAND-Blöcke überall?], aber irgendwie scheint mir das relativ zum realen Chipflächenverbrauch (großzügig geschätzt: 10-15%) doch arg viel (Die-Shot z.B. auf https://semiaccurate.com/2011/06/20/a-llook-at-the-llano-architecture/ )

    Gibt’s für “echten” Cache da effizienteres als für Register? In letzteren ist’s ja fast egal, das sind ja trotz register renaming und solchen Späßen grad mal ein paar hundert (evtl. niedrige tausend) Byte pro Kern.

  7. #7 Engywuck
    Juni 29, 2011

    Nachtrag:
    Ich konnts nicht lassen und hab nachgelesen (bzw. vorgearbeitet, falls Du das demnächst ohnehin bringen wolltest): laut https://en.wikipedia.org/wiki/Static_random-access_memory ist der Cache in Prozessoren SRAM mit 6 Transistoren pro Bit. Klingt vom Platzbedarf her vernünftiger 😀
    Interessant finde ich, dass über dieselben Leitungen sowohl der Zustand geändert als auch dieser ausgelesen wird 😀

  8. #8 rolak
    Juni 29, 2011

    Die Antwort auf Engywucks 1) dürfte darin zu finden sein, daß solche Schaltungen wie die oben in den flashs zu bewundernden gemeinhin den Namen ‘Ersatzschaltbild’ tragen. D.h. es ist möglich, sie mit Standardlogik (~74HC*) nachzubauen und die gewünschte Funktionalität zu erhalten – allerdings haben sie gemeinhin nichts mit der letztendlichen Implementierung zu tun (schöne Beispiele sind unter dem Stichwort ‘Komplexgatter’ zu finden).

    Der (zumindest damals so genannte) bistabile Multivibrator aus nicht nur Engywucks Vergangenheit, zwei gegengekoppelte Inverter, wurde ja mit dem technologischen Übergang (T+R)->(cmos-pair) direkt in die übliche sram-Zelle umgesetzt. Aus/Einkopplung der Daten erfordert (bei komplementären Leitungen) noch zwei abgespeckte Transmission-Gates. Da wegen der benötigten unterschiedlichen Dimensionierung der Ausgangsstufen für Bitleitungstreiber und sram-Inverter nicht direkt mit Teilen aus dem Bastelladen umsetzbar, würden also für die funktional identische Ersatzschaltung ein halber 4011 und ein ganzer 4066 benötigt, was eine enorme Vermehrung der Anzahl der involvierten Transistoren mit sich brächte.

  9. #9 Marcus Frenkel
    Juni 29, 2011

    @Engywuck
    Korrekt recherchiert – Caches sind anders aufgebaut als Register und benötigen daher weniger Transistoren. Trotzdem ist es schon richtig, dass in einem Prozessor sehr viele Transistoren für den Cache benutzt werden – hier eine unseriöse Quelle, genaue Zahlen finde ich leider gerade nicht.

    Aber wenn man sich das Bild eines Core i7 z.B. anschaut, sieht man, dass die Aussage korrekt ist:

    Ganzer Prozessor:
    https://www.legitreviews.com/images/reviews/824/Nehalem_Die_callout.jpg

    Einzelner Core (schematisch):
    https://www.legitreviews.com/images/reviews/824/performance.jpg

    Ich würde schätzen, dass dort mindestens ein Drittel der Chipfläche dem Cache entspricht.

  10. #10 Engywuck
    Juni 29, 2011

    wobei bei Intel-Chips zu beachten ist, dass diese Firma gerne inklusive Caches benutzt, also den Inhalt des L2 im L3 nochmal komplett vorhält. Das vereinfacht die Logik, gerade in Multi-Core-Dies, erfordert aber einfach riesige Chipgrößen bei 4MB L2 und 8MB L3 (Beispiel) würden dann nur noch “echte” 4MB L3 übrigbleiben, der Rest ist identisch zum L2. Der Transistor Count steigt entsprechend….

  11. #11 rolak
    Juni 29, 2011

    Der zitierten unseriösen Quelle ist auch zu entnehmen, daß just das hinterfragte getaktete D-Latch mit schlanken 8 Transistoren aufgebaut ist. Statt (Inverter+4*Nand2)=18.

    Die Nehalem-Schätzung läßt sich mit Pixelzählen bestätigen: ~40% (wobei bei IF/L1 2/3 dem cache zugeschlagen wurden).
    Dort (p15) ist sogar von 50-60% Cache-Flächenanteil die Rede.
    Wenn ich diesem Core2-Beispiel folge, ist die Grobschätzung 6T/Bit mit Vorsicht zu genießen: 2MiB Cache verbraten anscheinend 130Mio Transistoren, also wären noch ca 30% Aufschlag für ‘diverses’ einzukalkulieren, wesentlich mehr, als ich auf Anhieb für Adressdekodierung, Treiber und Latches reserviert hätte. Liegt wohl an der gegenüber ‘normalem’ Speicher erhöhten Logik, aber trotzdem…

  12. #12 Jan von nebenan
    Juni 29, 2011

    Gute Arbeit, Engywuck! Ich hatte mich bislang noch nicht mit SRAM und dergleichen beschäftigt, aber dass nur 6 Transistoren benötigt werden ist wirklich interessant. Zumal die Implementierung auch äußerst geschickt gewählt wurde.

    @Marcus: So langsam wird deine Artikelreihe ja auch für mich interessant. 😉 Ich freue mich auch schon auf die Fortsetzungen, weiter so!

  13. #13 Joe Dramiga
    Juni 30, 2011

    Ich habe beim TED Talk von Kwabena Boahen gelernt, dass Transistoren nicht beliebig klein werden können, weil sonst Fehler in der binären Arithmetik entstehen. Er versucht deshalb versucht einen Computer zu bauen, der wie das menschliche Gehirn rechnet und Daten speichert.

    Kwabena Boahen on a computer that works like the brain

    https://www.ted.com/index.php/talks/kwabena_boahen_on_a_computer_that_works_like_the_brain.html

  14. #14 Marcus Frenkel
    Juni 30, 2011

    @Joe Dramiga

    Was genau trägt die Information zum diskutierten Thema bei?

    PS: Ich habe mir einmal erlaubt, die anderen (identischen) Kommentare von Ihnen zum gleichen Thema zu löschen…

  15. #15 Engywuck
    Juli 1, 2011

    ja, Transistoren können nicht “beliebig klein” werden. Zumindest nicht solche, wie wir sie bisher bauen. Das liegt einfach daran, dass subatomare Transistoren bisher icht erfunden wurden 😉
    Bei einer Strukturbreite von 22nm (Flashspeicher hat das derzeit meines Wissens) sind wir aber immer noch “etwas” oberhalb des kovalenten Radius eines Siliciumatoms (0,111nm).
    Momentan sind daher noch(!) andere Probleme begrenzend: Quantenmechanische Effekte (Tunneleffekt u.a.) zwischen den Leitungen und Bauelementen, Beugungseffekte bei der verwendeten Lithographie, Glattheit des Siliciumwafers in allen Bauschritten, die Hohe Zahl an Einzelschritten bis zum fertigen Produkt, die alle perfekt “sitzen” müssen (einige hundert Schritte mit Genauigkeit im nm-Bereich) etc

    Fehler in der Arithmetik *außer* durch falsche Bauweise sind mir bisher nicht bekannt und das ganze riecht in der von dir zitierten Form nach Crank.
    Dass es andere Methoden als die bisher verwendeten gibt, um Ergebnisse zu “errechnen” steht dabei natürlich außer Frage. Stichworte: clockless computer und massiv parallele Rechner.
    Um aber wirklich “wie ein Gehirn” rechnen zu können müsste es möglich sein, Verbindungen zwischen den Bauelementen je nach Bedarf neu herzustellen, zu intensivieren, zu unterbrechen… So ein Neuron ist ja tendentiell ein multi-input multi-output device mit im Lauf der Zeit variabler Anzahl an Verbindungen. Und evtl. sollte man das Gehirn erstmal besser verstehen, bevor man es nachzubauen versucht 🙂 Mal ganz abgesehen davon, dass ein gehirn ganz andere Beschränkungen hat als ein Rechner. Beweis: berechne mit deinen Milliarden Neuronen die Fourier-transformierte eines eine Sekunde dauernden Eingangssignals im nicht-trivialen Fall. Ein “klassischer” Rechner braucht dazu Bruchteile einer Sekunde…

  16. #16 mi fhèin
    Juli 1, 2011

    Um aber wirklich “wie ein Gehirn” rechnen zu können müsste es möglich sein, Verbindungen zwischen den Bauelementen je nach Bedarf neu herzustellen, zu intensivieren, zu unterbrechen.

    Das gibt’s doch schon. Nennt sich neuronale Netze. M.W. gibt es da sowohl SW- als auch HW-Implementierungen.

  17. #17 rolak
    Juli 1, 2011

    Wenn ich das verlinkte Video richtig verstanden habe, geht es um Anfälligkeit gegenüber (räumlich oder zeitlich) lokalen Ausfällen. Und die ist bei einer klassischen CPU wg des Flaschenhalses ALU drastisch höher als bei einem neuronalen Netz mit seinen möglichen Nebenwegen.
    Der Transistor kam -wenn ich mich recht erinnere (war ja schon gestern ;-)- nur als Marke des einen Endes vom Weg (zeitlich ausreichend stabiler Zustand)=>(stochastischer Zustand) vor, also dem Übergang vom idealen Schalter(man made hardware) zum Ionenkanal(neuron).

  18. #18 Engywuck
    Juli 1, 2011

    neuronale Netze, in Hardware implementiert, können maximal Verbindungen kappen (indem sie die Eingangsrelevanz oder die Ausgabe auf 0 setzen), aber keine neuen Verbindungen bauen, wie dies ein Gehirn kann.

    Abgesehen davon haben neuronale Netze nie auch nur annähernd das gezeigt, was von Ihnen erwartet worden ist. Ja, man kann sie zu vielem gebrauchen, aber nicht, um ein Gehirn damit zu erklären, geschweige denn nachzubauen.

    Im übrigen *kann* man prinzipiell CPUs (relativ) ausfallsicher machen — “einfach” hunderte Prozessorkerne auf einen Chip und dann Ergebnisse mehrfach berechnen und vergleichen. Wenn ein teil ausfällt kann man ja dynamisch die Zuteilung umändern und langsamer rechnen (weniger Parallelität). Macht nur keiner, weil’s weitgehend unsinnig ist. Chips mit hunderten Rechenkernen gibt es allerdings: Grafikkarten sind massiv parallel und im general-purpose-Rechenkernansatz kann z.B. Tileras Tile-100 mit 100 Rechenkernen auf einem Chip aufwarten. Einfach einen Teil der Kerne zu Komparatoren ernennen und auf den Rest die Arbeit verteilen.
    Bei spezialisierten Rechnern, zB. für Banken, gab es schon vor Jahren Prozessoren auf Steckkarten, jeweils zwei davon berechneten dasselbe und wurden überwacht. Bei dauerhaften Fehlern (wenn die beiden also bei Neuberechnung wieder verschiedene Ergebnisse liefern) werden beide abgeschaltet und ein Reservepaar springt ein. Damit geht keine Rechnung verloren, das Ganze ist ausfallsicher. Nur halt “leicht” teuer… 😀

  19. #19 Engywuck
    Juli 11, 2011

    halbwegs zum Thema “Neuronale Netze” passend: https://hardware.slashdot.org/story/11/07/07/1436259/A-Million-Node-Supercomputer
    Die Idee: das gehirn besteht aus Clustern an eng verbundenen Zellen mit langsamen Verbindungen zu Nachbarcustern, also nehmen wir zehntausende CPUs zu jeweils einigen schnell verbundenen Kernen, verbinden diese Cluster torusförmig und hoffen dann, dass wir damit ein kleines Gehirn in Echtzeit analysieren können.

    Selbst *wenn* das funktioniert rechnet das trotzdem noch nicht “wie” ein Gehirn und schon gar nicht wie ein menschliches: das wäre ein hochspezielles Projekt. Ohne auch nur die geringste Ahnung, dass es wirklich klappt. “Wir machen das wie die Natur und schon können wir sie simulieren” ist schon oft schiefgegangen in der Informatik

  20. #20 Marcus Frenkel
    Juli 11, 2011

    Selbst *wenn* das funktioniert rechnet das trotzdem noch nicht “wie” ein Gehirn und schon gar nicht wie ein menschliches

    Richtig. Zumal beim menschlichen Gehirn ja noch viel mehr Signale von außen kommen und wichtig sind, also motorische/sensorische Reize, Hormonausschüttungen usw. usw. Hat ja alles einen Einfluss.

    Interessant ist es trotzdem. Vielleicht kann man kein menschliches Gehirn nachbilden, aber etwas anderes damit erschaffen.