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):
Wie so oft ist ein Bild (noch dazu eines, auf dem man herumklicken kann) weitaus aussagekräftiger als eine textuelle Beschreibung; hier also noch das interaktive Schaltbild eines einfachen RS-Flipflops (wir erinnern uns: der kleine Kreis direkt am Ein- oder Ausgang eines Gatters zeigt an, dass der entsprechende Wert negiert wird*):
Der Nachteil des RS-Flipflops ist, dass es ungetaktet arbeitet, das heißt, dass jede Änderung an den Eingängen sofort eine Änderung der Ausgänge nach sich zieht. Dieses Verhalten ist aber in der Regel nicht erwünscht, erst recht nicht bei Computern, die ja immer getaktet arbeiten. Getaktet heißt einfach, dass Operationen (wie die Addition oder das Speichern von Bits) nicht zu beliebigen Zeitpunkten stattfinden, sondern gebunden an einen regelmäßigen Takt (der entspricht der Gigahertz-Zahl, mit welcher für Computer immer so schön geworben wird).
Es gibt zahlreiche Flipflop-Varianten, welche ein getaktetes Verhalten aufweisen – selbst das bereits vorgestellte RS-FF lässt sich in ein sogenanntes taktpegelgesteuertes Flipflop umwandeln. Der Vielfalt halber aber zeige ich hier jedoch einen anderen Flipflop-Typ, welcher als Grundlage für weitere Bauteile dienen wird, vor allem auch, da RS-Flipflops den Nachteil haben, dass sie immer 2 Eingänge – Set und Reset – benötigen, wo doch in der Theorie ein einziger reichen würde. Daher wurden die sogenannten D-Flipflops entwickelt, welche mit einem Eingang D für die Daten auskommen. An einen zweiten Eingang C (für englisch “clock”) wird der sogenannte Takt angelegt – das ist eine konstante Folge von 0-1-Werten, die wie ein Metronom (tick-links, tick-rechts, tink-links, tick-rechts) die Zeit angeben. Der an D liegende Wert soll nur im Einklang mit dem Takt übernommen werden.
Hier lassen sich wiederum zwei verschiedene Möglichkeiten unterscheiden. D-Flipflops, die den Wert von D so lange auf den Ausgang Q abbilden, wie der Clock-Eingang C auf “1” gesetzt ist, werden taktzustandsgesteuerte oder transparente Flipflops (transparent, weil der D-Eingang sofort auf den Q-Ausgang abgebildet wird) genannt; im englischen Raum spricht man zur Unterscheidung hier nicht von Flipflops, sondern von Latches. Die zweite Möglichkeit besteht darin, den Eingangswert von D nur genau in dem Moment zu übernehmen, in dem an C eine positive Taktflanke anliegt, das heißt, wenn der Wert an C von “0” auf “1” wechselt; im englischen Raum sind das die eigentlichen D-Flipflops. Das folgende Schaltbild zeigt ein D-Latch; die zugehörige Schalttabelle spare ich mir diesmal, die kann ja anhand der Schaltung selbst hergeleitet werden:
An dieser Stelle müsste jetzt eigentlich die Erklärung folgen, wie denn ein D-Flipflop nun genau aussieht und wie man ein Register (das Ding, das ganze Bitketten speichert) aus Flipflops aufbaut. Da der Artikel aber schon viel länger geworden ist, als geplant, kommt hier erst einmal ein Schnitt und das Versprechen, dass die fehlenden Erklärungen im nächsten Artikel nachgereicht werden.
*Kennern wird auffallen, dass die Eingänge der beiden NAND-Gatter in der Schaltung invertiert und die Eingänge S und R in der bei RS-Flipflops sonst vielleicht unüblichen nicht-negativen Logik benutzt werden. Der Grund hierfür ist ganz einfach: so notiert ist das RS-FF leichter zu verstehen als in der Variante mit negierten Eingangssignalen.
Kommentare (20)