Hallo, ich begrüße euch herzlich zur heutigen Übung.
Wir wollen heute nochmal anhand von ein paar Aufgaben den Entwurf und
die Analyse von Schaltwerken behandeln und somit das Thema auch
abschließen.
Bevor ich hier mit der Übung anfange, einige wichtige Ankündigungen,
was Klausuren angeht.
Wie bereits angekündigt, in der ersten Vorlesung werden wir eine
Probeklausur machen.
Das wird am 30.
Januar stattfinden, und zwar um 14 bis 15 Uhr in diesem Hörsaal.
Die Anmeldung im Tutorium, das heißt bitte diese Woche und nächste
Woche, meldet euch bitte im Tutorium an für die Klausur, damit wir
wissen, wie viele Leute überhaupt teilnehmen und entsprechend auch
Klausuren drücken.
Wie gesagt, das ist auf freiwilliger Basis, das heißt ihr müsst die
Klausur nicht schreiben, aber das gibt euch vielleicht einen Eindruck
von der echten Klausur, also von der richtigen Klausur, die am 3.
April stattfindet.
Also nicht wie im Web steht, auf der KIT Webseite, die Klausur, die
Hörsäle für unsere Klausur, laut Informationen, die ich habe, ist am
3.
April und nicht im März, 14 bis 16 Uhr.
Die Anmeldung wird online erfolgen, wird freigeschaltet über die TI
Webseite.
Eine Nachtklausur, das heißt diese Klausur am 3.
April, das ist sozusagen die Hauptklausur für die Informatiker.
Die schreiben beide Teile, Digitale Technik Entwurfsverfahren und
Rechnerorganisation.
Gleichzeitig ist es die Nachtklausur für die
Informationswirtschaftsstudenten, die Rechnerorganisation das letzte
Mal nicht bestanden haben.
Und die Nachtklausur für euch wird wahrscheinlich, die Termine stehen
noch nicht fest, wird wahrscheinlich Ende Juli, also Ende des
Sommersemesters 2013 sein, beziehungsweise Anfang September.
Wie immer werden wir alle Termine auf der TI Homepage bekannt geben.
Gut, gibt es Fragen dazu?
Okay, ja bitte.
Genau, also die Frage war, wie sieht es aus mit den Bonuspunkten.
Das ist die Regelung, die wir, wie ich bereits gesagt habe, in der
ersten Vorlesung getroffen haben.
Es gibt Bonuspunkte auf die Klausur, das heißt, wenn man die Klausur
besteht, dann bekommt man Bonuspunkte anhand von der Leistung bei der
Bearbeitung der Übungsblätter.
Das war Kriterium 1.
Kriterium 2 bekommt man auch Punkte durch die Probeklausur, je nach
Noti haben wir gesagt, natürlich von 0 bis 2 Punkte extra.
Und dieser Bonus, der verhindert also kein Durchfallen der Klausur.
Das heißt, wenn es 40 Punkte notwendig sind zum Bestehen und man hat,
sage ich mal, 3 Punkte Bonus, dann bedeutet das nicht, dass man
besteht, sondern wenn man besteht, dann kann man durch diesen Bonus
die Noti verbessern.
Weitere Fragen?
Ja.
Die alten Klausuren sind auf der Homepage und die neuesten sind aber
nicht da.
Okay, das heißt, du willst die letzten Klausuren auch auf der Webpage
haben.
Das war deine Frage.
Ja, genau, das machen wir.
Okay, gut.
Weitere Fragen?
Es wäre interessant, wenn ihr zum Stoff so viel fragt wie zur Klausur.
Okay, gut, dann fangen wir mal an.
Und zwar Entwurf und Analyse von Schaltwerken.
Und wie bereits mehrfach erwähnt habe, geht es darum hier, dass wir
Schaltungen realisieren mit Gedächtnis.
Das heißt, Schaltungen, die Zustände haben.
Und beim Entwurf von Schaltwerken, sei es asynchronische Schaltwerke
oder synchronische Schaltwerke, ist der erste Schritt, der gemacht
werden muss, dass man die Zustände bestimmt.
Aber das Ziel des Entwurfs ist, man hat zunächst mal vorgegebene
Eigenschaften der Schaltung, definiert durch eine verbale
Aufgabenbeschreibung, Pflichtenheft, Ablaufdiagramme und so weiter und
so fort.
Man hat normierte Bausteine, natürlich das ganze Werkzeug oder Gatter
oder Bausteine, die wir kennengelernt haben zur Realisierung von
Schaltnetzen.
Aber speziell jetzt für Schaltwerke, elementare Schaltwerke mit
bestimmten normierten Verhalten, das sind die Flip-Flops, die Zustände
oder die Zustandsvariablen.
Was wir kennengelernt haben, ist zunächst mal eine Entwurfsmethodik,
bei der es zunächst mal darum geht, aus diesen geforderten
Eigenschaften von der Schaltung, zusammen mit den normierten
Bauelementen, Zustandsspeicher und andere Gatter.
Wir müssen uns erinnern an die erste Vorlesung von Schaltwerken.
Wir haben gesagt, es ist ein Schaltnetz mit Druckkupplungen drin.
Das heißt, in diesem Schaltwerk sind Speicherbausteine beispielsweise,
um Schaltnetzverhalten zu realisieren.
Zusätzlich dazu haben wir hier bei Schaltwerken natürlich die
Zustandsspeicher, die die Zustandsvariablen speichern, also die Flip
-Flops.
Und zusammen aus den beiden sollen wir ein Schaltwerk realisieren.
Und wir haben bereits einige Schaltwerke kennengelernt in der
Rechnerorganisation.
Es ist nicht nur ein Schaltwerk, die akademischen Beispiele, die wir
auf den Übungsblättern usw.
kennenlernen, sondern ich will einen Schritt zurückgehen und zwar an
die Vorlesung der Rechnerorganisation erinnern, speziell Pipelining im
DLX -Prozessor.
Das war die Pipeline und dieses Bild hier zeigt natürlich den
Datenfluss innerhalb dieser Pipeline, zur Erinnerung, dass der
Programmzähler, der Befehlsspeicher wird adressiert anhand von dem
Befehl, wird dekodiert und werden die Operanden bestimmt.
Das sind die Register, die grabt man auf die Register.
Das ist die ALU, die dann in der Execution-Stufe z.B.
eine arithmetisch-logische Operation ausführt und dann adressiert ein
Datum z.B.
bei LADI-Speicherebefehlen in diesem Datenspeicher, der jetzt in der
Writeback -Stufe hier in das Befehlsregister geschrieben wird oder bei
arithmetisch -logischer Operation, das Ergebnis der ALU wird hier auch
in das C-Register geschrieben.
Und wie das Ganze abläuft, wissen wir.
Das sind die fünf Stufen der Befehlsabarbeitung in der DLX-Pipeline.
Das erste war IF, Instruction Fetch.
In der zweiten Stufe Instruction Decode und Operanden Fetch oder
Register Fetch.
In der dritten Stufe die Execution, also die Ausführung der Befehle,
der arithmetisch-logischen Operation bzw.
die Berechnung einer LADI- oder Speichere-Adresse bei LADI
-Speicherebefehlen.
In der vierten Stufe erfolgt der Zugriff auf den Speicher, auf diesen
Datenspeicher hier.
Und in der fünften Stufe, haben wir gesagt, werden Ergebnisse ins C
-Register geschrieben.
Und wir haben ganz stillschweigend gesagt, um diese ganzen Sachen zu
organisieren, haben wir eine Steuerung.
Und diese Steuerung sitzt hier.
Und diese Steuerung natürlich bestimmt hier, was die ALU macht.
Über bestimmte Signale wird entschieden, ob die ALU anhand von dem
Befehl addiert, subtrahiert usw.
Über weitere Signale wird entschieden, ob der Multiplexer hier jetzt
den Eingang oder den Eingang hier durchschaltet.
Über ein weiteres Signal wird entschieden, ob man im Registersatz
liest oder schreibt.
Wenn man ein Ergebnis schreibt, muss man im Registersatz sagen, okay,
jetzt wird hier geschrieben.
Über ein drittes Signal entscheidet man hier bei diesem Multiplexer,
ob der Eingang hier auf den Ausgang durchgeschaltet wird, bei einer
zum Beispiel arithmetisch-logischen Operation, wo es darum geht, die
zwei Register zu addieren und irgendwo hier im Register zu schreiben.
Oder ob der Eingang, das heißt, der auf 32-Bit-Vorzeichen richtig
erweitert, die Offset bei Ladespeicher-Operationen verwendet werden
soll, um zum Beispiel die Adresse eines Operanten hier zu bestimmen.
Oder zum Beispiel hier muss man natürlich sagen, ob man hier liest
oder schreibt in diesem Datenspeicher.
Weitere Signale, Steuersignale für dieses Multiplexer, der sagt, ob
der Eingang, also das Ergebnis der ALU, in ein Register geschrieben
werden soll oder ein Datum aus dem Datenspeicher in das Register
geladen werden soll.
Beziehungsweise hier ein weiteres Signal, wenn es hier lesend auf
diesem Speicher zugegriffen wird.
Dann gibt es natürlich ein Signal, der entscheidet anhand von einem
Vergleich in der ALU.
Das ist der zweite Ausgang der ALU.
Zusammen mit diesem Signal über eine UND-Verknüpfung wird entschieden
hier über diesen Multiplexer, ob der um 4 erhöhte Befehlszähler als
nächster Befehlszähler hier verwendet werden soll oder ob das
berechnete Sprungziel aus diesem Offset hier und aus dem aktuellen
Befehlszähler als Adresse vom nächsten Befehl verwendet werden soll.
Das ist alles Wiederholung, das kennen wir alle.
Deshalb mache ich das so schnell, weil ich gehe davon aus, jeder von
euch beherrscht diese Pipeline.
Worauf ich hinaus will, ist, damit diese Abläufe natürlich auch
entsprechend gesteuert werden, ist diese Steuerung nicht so klein, wie
man das hier sieht, sondern diese Steuerung sieht so aus.
Und wenn wir das Ganze hier mal ein bisschen näher betrachten, das ist
nichts anderes als AutomatinGraph, der eigentlich die Abläufe, der bei
den fünf Stufen der DLX-Pipeline kontrolliert.
Wir haben Eingangssignale und wir haben Ausgangssignale.
Und der Ablauf sieht man hier.
Ich will nicht auf die Details eingehen.
Ich will euch nur zeigen, dass das, was wir hier kennenlernen,
natürlich nicht nur um irgendwelche Sachen zu machen, sondern dass wir
das bereits verwendet haben, oder wird bereits verwendet in heutigen
Prozessoren, zum Beispiel bei der parallelen Befehlsabarbeitung in der
DLX -Pipeline.
Das heißt, man sieht hier, wir sind im Zustand 0.
Das InstructionFetch, das sind hier die Signale und deren Werte.
Dann gehen wir in InstructionDecode, InstructionFetch.
Normalerweise anschließend in Execution, beziehungsweise wenn es bei
R2 Befehle, beziehungsweise bei Memory, bei Ladespeicherbefehlen,
müssen wir die Adressen bestimmen.
Das sind dann die entsprechenden Zustände, die man hier sieht.
Und dann haben wir natürlich hier dedikierte Zustände, die Situationen
oder entsprechende Situationen bei Sprungbefehlen anzeigen.
Die Frage ist, wie entwirft man das?
Nicht unbedingt für diese DLX-Pipeline, diese Schaltwerke, diese
Steuerungen, sondern wir wollen das anhand von einfachen Beispielen.
Ich wollte nur damit verdeutlichen, einmal den Link zwischen den
beiden Vorlesungen und einmal mehr Bezug auf vielleicht für manche von
euch trockenen Stoff, was wir hier in der Vorlesung behandeln.
Und ich hoffe mithilfe von diesem Beispiel, dass ich euch hier mehr
begeistern konnte für das Thema.
Und jetzt gucken wir uns ein paar einfachere Beispiele.
So, wir wollen Schaltwerke entwerfen und die erste Aufgabe, ausgehend
von der verbalen Aufgabenbeschreibung, zu bestimmen, wie viele
Zustände wir brauchen.
Von Hardware, deshalb müssen wir zunächst mal diese Zustände wählen.
Wir brauchen vier Zustände beispielsweise.
Aus diesen Zuständen wissen wir eigentlich, wie viele
Zustandsvariablen wir brauchen, weil wir keine symbolischen Zustände
realisieren können.
Wir müssen die Zustände letztendlich kodieren.
Das ist, was ja die Zustandskodierung für uns leistet.
Wenn wir vier Zustände haben, brauchen wir einen Flip-Flop.
Deshalb müssen wir so wenig wie möglich Zustände haben, damit wir so
wenig wie möglich Flip-Flops verwenden.
Wenn wir die Zustandsvariablen haben, haben wir jetzt die Kreise.
Und der nächste Schritt ist zu bestimmen, wie sind die Zustandswechsel
in diesem Automaten oder wie sollen Zustandswechsel in diesem
Schaltwerk erfolgen.
Das heißt, Wechsel der Zustände.
Und wenn wir das hier haben, dann können wir die sogenannte kodierte
Ablauftabelle erstellen.
Kodierte Ablauftabelle, wir haben Eingabe, wir haben die kodierten
Zustandsvariablen und die gibt uns mit Hilfe von diesen
Zustandsübergängen, die wir hier festgelegt haben, was sind die
Folgezustände.
Der nächste Schritt ist, wenn wir die kodierte Ablauftabelle haben,
wie gesagt, das ist eine Funktionstabelle für die Folgezustände der
Zustandsvariablen, dann können wir für jede Zustandsvariable die
Funktion, die Schaltfunktion aufschreiben.
Das heißt, wir können schon die sogenannten Überführungsfunktionen
oder die Übergangsgleichungen, die beschreiben, wie ist der
Folgezustand anhand von dem aktuellen Zustand und von der Eingabe.
Wenn wir das hier haben, dann wissen wir, okay, das sind unsere
Zustandsübergangsgleichungen.
Der nächste Schritt ist, wie müssen wir diese Zustandsvariablen
speichern, das wissen wir bereits in Flipflops.
Der nächste Schritt ist, wie müssen wir die Flipflops ansteuern, also
was müssen wir an den Eingängen der Flipflops anlegen, damit diese
gewünschten Zustandsübergänge, also Wechsel der Zustände überhaupt
realisiert werden.
Das heißt, welche Flipflops verwende ich, weil die Ansteuerung der
Flipflops hängt ja vom Flipflop-Typ ab.
Wir haben hierzu die Ansteuertabellen kennengelernt und wenn wir das
hier haben, dann können wir die kodierte Ablauftabelle um weitere
Spalten erweitern, dann können wir die Ansteuerung der Flipflops
bestimmen und dann das Schaltwerk realisieren.
Und das wollen wir anhand von ein paar Beispielen hier behandeln.
Vielleicht vorher, damit man wirklich nicht durcheinander kommt mit
dem Ganzen, wenn man das hier hat, Zustände und wie die Zustände
wechseln, dann hat man diese kodierte Ablauftabelle.
Und ab da ist das Schema F.
Klar, man muss natürlich ein paar Sachen wissen, z.B.
wie die Ansteuertabellen der Flipflops sind.
Weil diese kodierte Ablauftabelle ist nichts anderes als folgendes.
Das heißt, wir haben hier eine Tabelle, wir haben hier die Eingabe,
wir haben hier Zustand,
also E von T, das ist ein Vektor, also E1 bis E bla bla und das ist
der Zustand Q von T, das ist auch ein Vektor, also die Dimension von
diesem Vektor ist gleich mit der Anzahl der Zustandsvariablen, also
nicht der Zustände.
Und hier haben wir den Folgenzustand.
Und was wir bereits hier haben, diese Tabelle hier bis jetzt, das sind
natürlich, wie gesagt, vielleicht soll ich das nochmal verdeutlichen,
vielleicht soll ich das doch verdeutlichen, weil manche, ach...
So,
das ist E N bis E 0, Eingabe,
Eingabe, insgesamt E zum Zeitpunkt T.
Das sind die Zustandsvariablen, die haben wir immer Q, keine Ahnung
warum genannt, also Q N bis Q, man muss einen anderen Index nehmen,
damit nicht einer denkt, das sind immer die gleichen.
So, das sind die Zustandsvariablen, Zustandsvariablen,
also insgesamt Q zum Zeitpunkt T und wir haben hier Folgenzustände,
also Q N natürlich bis Q 0,
Folgenzustände und die Gesamtheit will ich hier beschreiben mit Q T
plus 1.
Und was wir hier jetzt haben bereits, sind natürlich mehrere
Schaltfunktionen, die wir realisieren.
Das heißt, anhand von dem hier, was wir bereits haben, können wir die
sogenannten Überführungsfunktionen bestimmen.
Und diese Überführungsfunktionen waren nichts anderes als Q zum
Zeitpunkt T plus 1,
irgendeine Funktion, Omega von Q I zum Zeitpunkt T und natürlich von
der Eingabe E Is zum Zeitpunkt T.
Beziehungsweise, um das richtig zu schreiben, das hängt natürlich von
allen im Allgemeinen ab.
Das heißt, Q I zum Zeitpunkt T ist eine Funktion von den
Zustandsvariablen und von den Eingabevariablen.
Und was macht das hier?
Das macht nichts anderes.
Wir haben die Zustände, also wir wissen die Zustände, deshalb wissen
wir, wie viele Zustandsvariablen wir haben.
Wir wissen hoffentlich, wie viele Eingabevariablen wir haben, ja,
selbstverständlich.
Und dann haben wir die Zustandsübergänge für die einzelnen
Zustandsvariablen und daraus bekommen wir die kodierte Ablauftabelle.
Das sind also mehrere Funktionen.
Q M zum Zeitpunkt T plus 1 ist gleich irgendwas.
Q I zum Zeitpunkt T.
Aber für die Realisierung des Schaltwerkes müssen wir entscheiden,
also müssen wir die Zustandsvariablen irgendwo speichern.
Und wir wissen, pro Zustandsvariable brauchen wir ein Flipflop.
Wenn wir also hier M plus 1 Zustandsvariablen haben in dieser Tabelle,
dann müssen wir die kodierte Ablauftabelle jetzt um Einträge für M
plus 1 Flipflops.
Und diese Einträge, die sagen uns, wie die Flipflops funktionieren.
Das heißt, wir erweitern diese Tabelle hier mit Einträgen, mit den
Ansteuerfunktionen der Flipflops.
Flipflops wissen wir, das sind zwei bei dem RS Flipflop, das sind zwei
bei dem JK Flipflop, das ist eine Eingangsvariable bei dem D Flipflop
und eine bei dem T Flipflop.
Das heißt, je nachdem, welche Flipflops wir haben,
haben wir JM, KM,
welche Spalten in dieser Tabelle, wobei je zwei Spalten, also JM
beziehungsweise KM, sind die Eingänge von dem Flipflop, welches die
Zustandsvariable QM beschreibt.
Wenn wir das hier haben, dann können wir natürlich hier daraus, also
aus diesen roten Teilen, zusammen mit diesen Eingängen hier,
uns natürlich die
Ansteuerung der Flipflops.
Okay, aber eigentlich die Hirnarbeit, was man machen muss, die
Leistung, ist zunächst mal nur diese Zustandsübergänge zu bestimmen,
was man ja anhand von einem Automatengraphen gemacht hat.
Wie bestimme ich hier, was in diesen Spalten hier kommt?
Also ihr müsst euch mal vorstellen, das sind hier natürlich volle
Funktionstabellen, das heißt, man fängt mit 0, 0, 0, 0,
und hier bekommen wir irgendwelche Werte, egal was, 0, 1 und so weiter
und so fort.
Und die Frage ist, wie kommen wir an die Werte, die wir hier
schreiben?
Und dazu, das heißt eigentlich, die Information, die wir gerade
suchen, wenn ich meine Zustände in einem JK-Flipflop speichern will,
und ich habe den Zustandswechsel 0, 0, 0 zu 0, 0, 1 beispielsweise in
der ersten Zeile.
Machen wir mal hier ein Beispiel.
Das heißt, ich bin hier im Zustand 0 und ich will im Zustand 0 hier
bleiben.
Was muss ich hier und da an den Eingängen des zuständigen Flipflops
anlegen, damit ich tatsächlich im Zustand 0 bleibe?
Und diese Informationen liefern uns natürlich die Ansteuertabellen der
Flipflops, weil diese Ansteuertabellen der Flipflops, die geben uns
genau das.
Das heißt, wie müssen wir die Eingänge von den Flipflops beschalten
hier, damit diese Zustandsübergänge erfolgen?
So, und das sieht man hier, die haben wir das letzte Mal hergeleitet.
Das einfachste ist zum Beispiel D, kann man sich sehr gut merken, weil
D ist immer, also ich muss am Eingang von dem D-Flipflop das anlegen,
was ich so als Folgezustand mir wünsche.
Beziehungsweise bei dem T-Flipflop, ich muss eine 1 anlegen, wenn es
zu einem Zustandswechsel kommen soll, ansonsten eine 0 am Eingang
anlegen.
Bei dem RS-Flipflop haben wir hergeleitet, JK-Flipflop auch.
Kann man sich merken, manche Sachen, aber auch wenn man sich das nicht
merken kann, man kann das immer herleiten.
Und zwar einfach aus der Überlegung, dass jedes Flipflop ein
Schaltwerk ist mit zwei Zuständen.
Das sind die Zustände 0 und 1.
Und wir wissen die Funktionen von den Zuständen, also die Funktionen
von den Flipflops.
Setzen, Rücksetzen und die letzte Funktion, wie heißt sie?
Wechseln.
Und wir wissen, unter welchen Kombinationen der Eingangsvariablen
bleiben wir im Zustand 0.
Wir bleiben im Zustand 0,
nicht 1, also J darf nicht 1 sein.
Wir wechseln vom Zustand 0 in Zustand 1, wenn es heißt Setzen.
Und wenn es heißt Wechseln und K 0 und Wechseln ist das die
Kombination, wenn J und K gleich 1 sind.
Das ist die zusätzliche Funktion von dem JK-Flipflop im Vergleich zu
dem RS-Flipflop.
Das heißt insgesamt darf eigentlich J nicht 0 sein.
Wir wechseln zurück vom Zustand 1 in Zustand 0, wenn es Rücksetzen
heißt, beziehungsweise wir dürfen jeder von euch in der Lage sein,
wenn man einen richtigen Automatengrafen für das Schaltwerk hat,
dieses Schaltwerk zu realisieren.
So, das war der
Begriff und die Analyse von synchronen Schaltwerken, welches eine
beliebig lange Dualzahl bitweise von links nach rechts einliest.
Dann haben wir eine Eingabevariable E, die beschreibt die Bits dieser
Dualzahl oder die Stellen der Dualzahl.
Und dieses Schaltwerk soll feststellen, ob die eingelesene Zahl durch
3 teilbar ist oder nicht.
Falls ja, soll am Ausgang eine 1 ausgegeben werden.
Also man hat Glück eigentlich bei dieser Aufgabe, weil man sagt, vom
Anfang an entwerfen sie ein synchrones Schaltwerk.
Er sagt, weil die Zahl beliebig groß sein kann, brauchen wir ein
Schaltwerk.
Hat jemand Widerspruch?
Also du sagst, wir brauchen zunächst mal ein Schaltwerk.
Nein, du sagst, wir brauchen ein Schaltwerk, wenn die Zahl beliebig
groß ist.
Kannst du lauter reden?
Genau, genau.
Habe ich, dann brauche ich kein Schaltwerk dazu.
Das wäre aufwendig wahrscheinlich.
Also ich gebe nur wieder, was er sagt.
Das ist nicht meine Meinung jetzt.
Okay, gibt es weitere Meinungen dazu im Publikum?
Die Frage ist, brauchen wir ein Schaltwerk?
Wenn ja, warum?
Wissen es alle?
Also wer meint, wir brauchen ein Schaltwerk?
Machen wir so, wir müssen langsam.
Ah, da gehen ein paar Hände hoch.
Okay, und wer meint, wir brauchen kein Schaltwerk?
Keiner wahrscheinlich.
Und der Rest?
Die Mehrheit hat keine Meinung.
Diese Passivität.
Genau.
Das ist genau der Punkt.
Wir müssen die Zahl bitweise einlesen.
Also nicht die komplette Zahl.
Zwei.
Aber ich muss mir auch merken,
diese Vorgeschichte, was haben wir bis dahin von dieser unendlich
langen Zahl eingelesen?
Wir dürfen natürlich davon ausgehen, dass das Schaltwerk von außen im
Grundzustand gesetzt wird, bevor eine neue Zahl eingelesen werden
soll.
Das Schaltwerk soll nach jedem eingelesenen Bit genau dann eine andere
Zahl auslösen.
Dazu brauchen wir den Automating Graph, das, was hier gesucht ist.
Und wir sollen hier in dieser Aufgabe die Bedeutung der Zustände
erklären und zahlen theoretische Begründungen für die Übergänge
zwischen den unterschiedlichen Zuständen.
So, die Frage ist, wie viele Zustände haben wir?
Gucken wir uns das mal kurz an.
Wenn ich 0 habe, dann weiß ich, dass ich
eine 0 einlese.
Also ich bin hier bei 0,1 und ich lese die 0 hier.
Wenn ich anschließend die 1 einlese, dann sehen wir, dass ich die Zahl
5 habe.
Natürlich müssen wir hier wissen, wenn ich anschließend hier eine 1
einlese, dann haben wir 16 plus 5.
16 plus 5 ist 21, also restlos durch 3 teilbar, also ein Rest von 0.
Natürlich müssen wir dabei wissen, wenn wir eine 0 einlesen, wir
verschieben die Zahl nach links, also wir multiplizieren mit 2.
Wenn wir eine 1 einlesen, wie hier zum Beispiel in der vierten Zeile,
wie komme ich von 2 auf 5?
Das heißt, wir haben mit 2 multipliziert und eine 1 dazu addiert.
Ist das für euch klar, wie das so funktionieren soll?
Und jetzt die Frage ist, wie viele Zustände brauchen wir eigentlich?
Ja, da meldet sich ein neues Gesicht.
Wir brauchen drei Zustände, sagt er ganz laut.
Warum?
Weil es gibt drei Fälle, Rest 0, Rest 1, Rest 2.
Das ist genau, was passieren kann bei ganzteiliger Division durch 3,
dass der Rest entweder 0 ist oder 1 oder 2.
So, das heißt, wir haben eigentlich das Schwierigste erledigt.
Wir müssen gucken, diese Zustände, wie wechseln sie?
Also wenn ich jetzt eine 0, ich habe eine Zahl, die ist restlos durch
3 teilbar und ich lese eine 1, dann sieht man, dann wechselt man in
den Zustand 1.
Wenn ich im Zustand 1 habe, also eine Zahl mit Rest 1, und dann lese
ich eine 0, dann wechsle ich in den Zustand 2.
Wenn ich eine 1 lese, dann bleibe ich im Zustand 2.
Wenn ich eine 0 lese, dann wechsle ich vom Zustand 2 in den Zustand 1.
Und wenn ich anschließend eine 1 lese, dann wiederum vom Zustand 1 zum
Zustand 2.
Aber das ist natürlich nicht der allgemeine Fall für alle
Möglichkeiten, sondern wir wollen jetzt...
Machen wir eine Fallunterscheidung.
Wir gehen zum Zustand
1.
Das heißt, das ist Rest 0.
Was passiert jetzt, eine Zahl, die 3 durchteilbar ist, ich lese eine
0, das heißt, ich multipliziere die Zahl mit 2, dann habe ich statt 3k
6k, dann habe ich 2z plus 1,
insgesamt ein Rest von 1.
Wenn ich eine 0 lese, das heißt, Ups, das war zu schnell.
Jetzt lese ich eine 0, das heißt, wir multiplizieren z mit 2, dann 1
einlesen, dann kommt 6k plus 2 plus 1, also 6k plus 3.
Und das ist wiederum durch 3 teilbar.
Im dritten Fall, die Zahl hat einen Rest von 2 bei der Division durch
3, das heißt, da können wir schreiben 3k plus 2.
0 einlesen, das heißt, wir multiplizieren alles mit 2, also 3k plus 2,
alles multipliziert mit 2 ergibt 6k plus 4.
Und 6k plus 4 hat bei der Division durch 3 einen Rest von 1.
Und wenn ich eine 1 einlese, dann ist es 2 mal z plus 1, das heißt, 6k
plus 5 und 6k plus 5 hat einen Rest von 2 bei der Division durch 3.
Das heißt, wir haben jetzt alles, was diese Zustandsübergänge angeht,
festgelegt und auch zellentheoretisch begründet.
Jetzt können wir unseren Automatengraf hier hinmalen.
Das heißt, wir haben hier Zustand 0, Zustand 1, Zustand 2.
Und wir wissen, wenn die Zahl durch 3 teilbar ist, Anfangszustand.
Ich markiere in dieser Vorlesung Anfangszustand immer mit 2 Kreisen,
also nicht Endzustand.
Und es bleibt dabei.
Also Z0 ist Anfangszustand und wir lesen jetzt eine 0.
Z0 ist durch 3 teilbar und wenn die Zahl durch 3 teilbar ist, bleibt
beim Einlesen 1 hier.
Und man gibt eine 0 aus.
Im Zustand 1, wenn wir eine 0 einlesen, dann haben wir mit 2
multipliziert.
Wenn wir eine 1 einlesen, dann haben wir keinen Rest oder Rest 0.
Deshalb gehen wir zurück in den Zustand 0 und wir geben auch eine 1
aus.
Wenn wir im Zustand 2 sind und wir lesen eine 0, das heißt, wir
multiplizieren mit 2, dann haben wir einen Rest von 1.
Dann gehen wir zurück in Zustand 1.
Und wenn wir eine 1 einlesen, multiplizieren wir mit 2 und addieren
wir 1.
Das heißt, wir bleiben eigentlich in dem Zustand 2.
Somit haben wir also den Automatengraf mit allen Zustandsübergängen
hier festgelegt.
Und dann können wir jetzt hier mit unserem Entwurfsschema
weitermachen.
Das heißt, der nächste Schritt hier, nachdem wir diese
Zustandsübergänge bestimmt haben, ist die sogenannte Codierte Tabelle
hier.
Die Zustandsvariablen sind notwendig.
Wir haben drei Zustände.
Dann bedeutet das, wir brauchen LD3-Bits oder Zustandsvariablen zur
Speicherung.
Insgesamt also zwei Flipflops.
Und wir müssen sagen, wie wir jetzt diese symbolischen Zustände Z0 bis
Z2 kodieren sollen.
Und wir wissen, bei synchronen Schaltwerken ist diese
Zustandskodierung unkritisch.
Also nicht wie bei asynchronen Schaltwerken, wo eine ungeeignete
Zustandskodierung zu Wettläufen führt.
Das heißt,
wir brauchen zwei Zustandsvariablen, also zwei Bits, also drei
Zustände.
Das ist Zustand, das ist die Eingabe.
Wir haben zwei Zustandsvariablen.
Das sind hier die Folgen.
Das heißt, wir brauchen nur...
und ich lese...
und wir geben eine 1 aus.
Wir müssen an den Stellen Don't-Cares hinlegen.
Und wir wissen, Don't-Cares sind wunderbar, weil wir können diese
Funktionen hier minimieren.
Und diese Don't-Cares, je nachdem wie wir wollen, nutzen, um minimale
Reformen der Funktionen zu realisieren.
Und geben wir eine 0 aus bei 0.
Wenn wir eine 0 lesen, wenn wir eine 1 einlesen, bleiben wir im
Zustand 2, was ja mit 1 1 kodiert ist, und geben wir eine 0 aus.
Das ist unsere kodierte Ablauftabelle.
Und jetzt, diese kodierte Ablauftabelle, man kennt die Funktionen Q1
zum Zeitpunkt t plus 1, Q0 zum Zeitpunkt t plus 1 und A kann man
bereits eingeben anhand der Funktionen der Eingangsvariablen Q1 zum
Zeitpunkt t, Q0 zum Zeitpunkt t und A zum Zeitpunkt t.
Das sind eigentlich drei Schaltfunktionen, die man hier ablesen kann.
Man trägt das Ganze ins KV-Diagramm, drei KV-Diagramme, und dann hat
man die Funktion.
So, jetzt die nächste Frage ist, wir müssen die Flipflops festlegen,
mit denen man dieses Schaltwerk realisiert.
Und das sollen hier JK-Flipflops sein.
Geben Sie die Ansteuergleichungen der Flipflops an.
Und was wir machen müssen, wir müssen natürlich, das ist nach wie vor
unser Automatengraph, wir müssen jetzt diese kodierte Ablauftabelle
erweitern, mit Spalten für die Flipflops, die wir verwenden wollen.
Das heißt, wir müssen jetzt sagen, wir brauchen die Information, wie
müssen die Flipflops beschaltet werden, was kommt an den Eingängen, in
dem Fall der JK-Flipflops, weil wir müssen JK-Flipflops, was kommt an
den Eingängen, damit es hier zu diesem Zustandswechsel kommt.
Und da wir zwei Zustandsvariablen haben, Q1 und Q0, brauchen wir zwei
Flipflops, wie wir bereits gesagt haben.
Und um diese Werte hier zu bestimmen, J1 und K1, müssen wir mithilfe
der sogenannten kodierten Ablauftabelle gucken, was habe ich
eigentlich bei Q1, welchen Zustandswechsel habe ich in Q1.
Das heißt, wir gucken diese Spalte und diese Spalte, Zustand und
Folgezustand der Zustandsvariable Q1.
Wir haben unsere kodierte Ablauftabelle, die sagt uns eigentlich, was
an den Eingängen eingelegt werden soll, wenn es 00, 1, 0, 1, 0, 1, 1,
0, 1, 1 angelegt werden soll.
Das heißt, wir gehen hin, RC-Zeile, 0, 0, bei 0, 0 muss JK, 0, don't
care sein.
Hier auch 00, also das heißt 0, don't care.
Hier wechsle ich von 0 nach 1, von 0 nach 1 ist es 1, don't care, und
hier bleibe ich in 0, das ist 0, don't care.
Das ist 1, don't care, 0, don't care.
Die nächsten Zeilen, da wissen wir nicht, was hier ist, das heißt, das
ist uns egal, und deshalb kommen hier auch don't cares.
In der letzten Zeile wechseln wir von 1 nach 0, das heißt don't care
1, und dann bleiben wir in Zustand 1, das heißt don't care 0, die
tragen wir hier.
Das gleiche müssen wir auch machen für die andere, für die zweite
Zustandsvariable, also für Q0.
Das heißt, wir betrachten Q0 zum Zeitpunkt T und Q0 zum Zeitpunkt T
plus 1.
Das ist unsere...
und wenn nicht, wir können sie herleiten, wie mehrfach gezeigt wurde
in der Vorlesung, aber auch heute, und das können wir auch machen
hier.
Das heißt, eigentlich die Unbekannten bei diesem Entwurf sind auf
jeden Fall, wie wir die Flipflops beschalten wollen und die Ausgabe in
Abhängigkeit von aktuellem Zustand und von Eingabe.
Und jetzt haben wir alles eigentlich, jetzt können wir unser
Schaltwerk entwerfen, wenn wir diese Funktionen für Ausgabe und für
Zustandswechsel bestimmen.
Und wie machen wir das?
Ganz einfach, das sind die vier Funktionen, die wir brauchen.
Natürlich brauchen wir A, die Ausgabe, also fünf Funktionen, wir
tragen J1, K1, J0, K0 und A in KV-Diagramme und wir minimieren sie,
damit wir natürlich Kosten reduzieren.
Das heißt, sieht man, J1 ist gleich, jetzt hier habe ich die Einzelnen
zur Minimierung genutzt, und da sieht man hier diese Don't-Cares, die
wir haben, die sind ja wunderbar, weil da können wir sie nutzen jetzt
hier für die Minimierung.
J1 ist gleich Q0TEQ, K1 ist EQ und J0 ist E und K0 ist nichts anderes
als Q1QE.
Und das fünfte, was wir brauchen, ist ein KV-Diagramm für die Ausgabe,
da tragen wir A und dann haben wir die Gleichung der Ausgaben.
Was bedeutet das eigentlich?
Das bedeutet folgendes, wir wissen, für die Realisierung dieser
Schaltung, wissen wir zunächst mal, dass wir eine Eingangsvariable E
haben.
Das ist die einzige Eingangsvariable, die wir haben.
Wir wissen, wir haben hier eine Ausgangsvariable A und wir wissen, wir
haben drei Zustände, also zwei Flipflops und die sind JK-Flipflops,
flankengesteuerte zum Beispiel JK-Flipflops, Z1, 1J, 1K.
Das sind die Eingänge.
Natürlich haben wir irgendwo hier ein Taktsignal T und das sind die
Eingänge J1 und K1.
Der speichert die Zustandsvariable Q1 und wir wissen, wir haben hier
Q1 immer automatisch am zweiten Ausgang.
Das heißt, die Flipflop 1, weil der speichert die Zustandsvariable 1.
Und wir wissen, dass wir ein zweites Flipflop hier brauchen.
Der wird auch vom gleichen Taktsignal angesteuert.
Der hat zwei Eingänge, wir haben sie mit J0 und K0 hier bezeichnet und
der speichert die Zustandsvariable Q0 und Q0-Quer.
Ihr seid ruhig, das ist meistens ein Zeichen dafür, dass es
interessant ist, was ich erzähle.
Ah, jetzt werden sie lauter.
Okay, das ist Flipflop 0, und zwar deswegen, weil dieses Flipflop die
Zustandsvariable Q0 speichert.
Eigentlich waren das die Eingäben und was wir gerade gemacht haben,
wir haben die Gleichung für A bestimmt, mithilfe von dem KV-Diagramm.
Wir haben die Gleichung für A bestimmt, wir haben die Gleichung für J1
bestimmt, für K1, für J0, für K0.
Und wenn man diese Gleichungen anguckt, das sind alle Funktionen von
E, unserer Eingangsvariable Q0 und Q1.
Und ich habe es so oft erlebt, dass die Leute anfangen nach Q0 und Q1
zu suchen als Eingabenvariable.
Ich glaube nicht, wie oft ich das erlebt habe, dass Leute auch
gescheitert sind, so eine Schaltung zu entwerfen, weil sie nicht
wussten, wo kommen Q0 und Q1 her.
Aber das ist natürlich trivial, weil Q1 und Q0 haben wir hier.
Natürlich speichern diese Q1 und Q0 die Zustände, aber wir haben
deswegen ein Schaltwerk, weil wir bestimmte Rückkopplungen haben.
Das heißt, die stehen hier zur Verfügung, irgendwo als
Eingabenvariable.
So, und wenn ich diese Gleichungen hier habe, dann können wir...
und das werde ich in voller Länge hier machen.
Ich mache das hier weg, zunächst mal weg.
Und dann fangen wir an, J0 ist gleich E.
K1 ist gleich E quer.
Das ist K1, das ist E.
Aha, ich brauche einen Inverter.
J1 ist gleich Q0 E quer.
Aha, Q0 und E quer, das ist eine Unverknüpfung.
Und E quer haben wir gerade hier bestimmt.
Und Q0, wo haben wir Q0?
Q0 ist hier.
Aha.
Ja, Q0 kommt hier.
Und was fehlt noch?
K0.
K0 ist gleich, auch über eine Unverknüpfung, ist gleich E.
Das ist E.
Q1 quer.
Und Q1 quer ist hier.
Das heißt, wir nehmen das so ungefähr.
Dann haben wir das.
Und jetzt haben wir A.
Man sieht, A ist ein bisschen komplizierter.
Das heißt, ich brauche zwei Und-Gatter, um diese zwei Produktthermen
zu realisieren.
Und ich brauche einen Oder-Gatter.
Aber ich mache es trotzdem, obwohl der Platz so eng ist.
Aber ich glaube, es ist sinnvoll, das an der Stelle hier zu machen.
Das heißt, wir haben hier zwei Und-Gatter und
wir haben einen Oder-Gatter.
Und das ist A.
Und das erste ist Q0 quer, E0 quer.
Das ist Q0 quer.
E0 quer, E quer ist das hier.
Und das andere ist E.
E, dann gehen wir mal, wo ist E, wo ist E, wo ist E?
Da ist E.
Und dann Q1 quer.
Q1 quer ist hier.
Q1 quer.
Und Q0, Q0 ist nah hier.
Dann haben wir Q0.
Dann haben wir unser Schaltwerk.
Das ist genau das Schaltwerk, das wir suchen.
Es hat eine Eingangsvariable.
Weg, weg, weg, weg, weg.
Es hat eine Eingangsvariable.
Das ist E.
Hallo.
Es hat eine Eingangsvariable.
Ausgabe.
Und das ist, wie diese Flipflops miteinander beschaltet werden.
Die entsprechenden Zustandsübergänge bekommen.
Wenn man das mehrmals hintereinander malt,
Kreuz oder kreuzquer Überschneidungen.
Das ist hier der Inverter, das Taktgenerator.
Und das ist nochmal hier eigentlich die gleiche Schaltung, die ich
vorher gezeichnet habe.
Gibt es Fragen dazu?
Okay.
So.
Was kommt als nächstes eigentlich?
Wir haben die Schaltung.
Das war, entwerfen Sie ein synchrones Schaltwerk.
Lies eine unendlich lange Zahl.
Dann kommen die Bits eins nach dem anderen hier an E.
Und wenn die bis dahin eingelesene Zahl eins wird, dann leuchtet A.
Und sagt, Hurra, jetzt ist es teilbar.
Jetzt nicht mehr.
Jetzt ja.
Jetzt nicht mehr.
Oder?
Dann sind wir fertig.
Oder was meint ihr?
Was würdet ihr machen, wenn man euch sagt, baut mal einen Roboter.
Der soll das oder das machen.
Ihr schraubt das zusammen, ihr programmiert was und so weiter und dann
gebt ihr mir das und sagt, hier, das ist der Roboter.
Oder?
Ja.
Ja, wir müssen es in CMOS oder irgendwo implementieren.
Aber bevor wir das implementieren, bevor wir Hardware und Zeit
vergeuden, was müssen wir?
Ja.
Ich würde es zunächst mal testen, ob das funktioniert.
Natürlich.
Ja.
Zumindest auf dem Papier.
Ja.
So, das ist eigentlich der letzte Schritt der Entwurf,
den wir jetzt in der Vorlesung nicht behandelt haben, aber den ich
heute trotzdem anhand dieser Aufgabe zeigen will.
Das heißt, wenn man diese Schaltung hier entworfen hat, dann muss man
diese Schaltung testen, ob tatsächlich die gewünschte Funktionalität
da ist.
Und ich habe es mehrfach gesagt, dass bei den integrierten Schaltungen
ein Großteil der Chipfläche nur für Testschaltungen vorgesehen wird.
Das heißt, es sind Testschaltungen, die bleiben ewig auf dem Prozessor
oder so.
Die werden nur einmal verwendet, um die Schaltung zu testen.
Die kosten natürlich viel Platz und die verwendet man nur einmal.
Ja.
Und den Schritt will ich zeigen, nachdem ich euch zeige, wie wir diese
Zustandsübergangsgleichungen hier, J0, K0, J1 und K1, mithilfe von
einer anderen Methode bestimmen können.
Wir haben gesehen, wir haben eine Menge von KV-Diagrammen hier mal
malen müssen, damit wir diese Funktionen bestimmen.
Aber ich will zeigen, dass wir diese Ansteuerfunktionen der Flipflops
mithilfe von Koeffizientenvergleich bestimmen können.
Das heißt, es ging darum, J0, J1, K1 zu
malen, male ich zwei für die Zustandsfolgen der Zustandsvariablen.
Und zwar einmal für Q1, T plus 1 und einmal für Q0, T plus 1.
Und das sind zwei Funktionen der Eingangsvariablen.
Das heißt, ich kann es machen für Q1, T plus 1 und Q0, T plus 1.
So sehen sie aus im KV-Diagramm.
Und ich kann diese Funktion hinschreiben.
Aber wir wissen auch, das sind nichts anderes als
Zustandsübergangsgleichungen.
Also beschreiben uns, was ist der Folgezustand bei bestimmten
Belegungen der Eingänge des Flipflops.
Das heißt, wenn wir ein bisschen nachdenken oder zurückdenken an die
Vorlesung von Montag, wenn wir das hier nehmen, dann ist es nichts
anderes eigentlich als die charakteristische und vergleichen mit der
charakteristischen Gleichung von dem Flipflop, dann können wir die
Ansteuerfunktionen automatisch ablesen.
Das heißt, ich habe hier die charakteristische Gleichung von dem JK
-Flipflop in dem Fall und man sieht hier in den Gleichungen habe ich
irgendwelche Koeffizienten von der negierten Zustandsvariable und
Koeffizienten von der nicht negierten Zustandsvariable.
Also wenn ich diese Zustandsübergangsgleichungen oder
Überführungsfunktionen in eine Form bringe, wo ich einen direkten
Vergleich machen kann, dann kann ich J1, K1, J0, K0 direkt ablesen.
Und das wollen wir hier machen anhand von dem Beispiel.
Das heißt, wenn wir das hier mal nehmen, dann muss das eigentlich
nichts anderes sein als J0, Q0 quer oder K0 quer, Q0.
Wenn man aber die Gleichung hier anguckt, dann sieht man eigentlich,
das ist Q0 quer und das ist Q1 mit zwei Koeffizienten, aber ich habe
ein Term in dieser Gleichung und zwar dieses Q1, bei dem weder Q0 noch
Q0 quer auftaucht.
Aber wir wissen, das ist überhaupt kein Problem für uns, denn wir
können für Q0 t plus 1 folgendes schreiben.
Das ist natürlich Q1 und Q0 oder Q0 quer.
Ich lasse mal die T's hier, damit wir Zeit sparen beim Schreiben.
Q0 quer E oder Q0 E quer.
Und jetzt fasse ich mal zusammen, und zwar hier alle Terme, bei denen
Q0 quer auftaucht, das ist Q1 oder E, Q0 quer.
Oder wir fassen zusammen für Q0, das ist Q1 oder E quer, Q0.
Und das soll gleich sein mit J0, Q0 quer oder K0 quer, Q0.
Und man sieht hier bereits, dass man diese Ansteuerfunktionen ablesen
kann.
Das heißt, daraus folgt, man sieht hier, dass J0 ist gleich E oder Q1
quer und K0 quer ist gleich das hier.
Das heißt eigentlich, J0 ist gleich Q1 oder E und K0 ist gleich dann
Q1 quer E.
Das gleiche können wir hier oben machen, das ist Q1, das muss gleich
sein mit J1 Q1 quer oder K1 quer Q1.
Und wenn wir einen Koeffizientenvergleich hier machen, dann sehen wir,
dass J1 ist gleich
und K1 ist gleich E quer.
Seid ihr glücklich, begeistert, erstaunt?
Okay, fällt euch was auf, für die Leute, die aufgepasst haben die
ganze Zeit?
Gar nichts natürlich.
Vergleichen wir mal diese Ansteuerfunktionen der Flipflops, die wir
hier jetzt bekommen haben, mithilfe von dieser Methode des
Koeffizientenvergleichs, mit dem, was wir vorher mit unserem KV
-Diagramm bekommen haben.
Was haben wir eigentlich bekommen?
Wir haben das hier bekommen.
J0 haben wir E bekommen und hier haben wir E oder Q1.
K0 ist Q1 quer E, J1 ist Q0 E quer und K1 ist E quer.
Also alles eigentlich im grünen Bereich bis auf J0.
Bis auf J0 ist alles identisch, das ist das gleiche Ergebnis.
Aber J0 war hier E und hier ist es E oder Q1.
Hat jemand eine Erklärung?
Wie wollt ihr die Klausur bestehen?
Ihr werdet die Klausur bestehen, da bin ich mir sicher.
Aber hat jemand eine Erklärung?
Hat jemand eine Erklärung, wenn man hier das KV-Diagramm anguckt von
J0?
Als wir das KV-Diagramm genommen haben, haben wir gesagt, J0 ist E.
J0 war E.
Ich finde es so klasse, dieses Semester hier mit der Technik.
Ja, das müssen wir leider löschen.
Also, daraus folgt.
J0 ist gleich E oder Q1.
Und K0 ist gleich, was war K0?
Q1 quer, ja ich kann es hier ablesen eigentlich, E.
Und wenn man das Ganze hier mal schärfer ein bisschen anguckt, dann
sieht man, als wir J0 bestimmt haben, haben wir gesagt, das ist ja E.
Und was hier rauskommt, ist E oder Q1.
Das heißt eigentlich, dieser Bremen-Implikant, der nur aus Don't Cares
besteht, haben wir natürlich im KV-Diagramm nicht aufgenommen bei der
Realisierung, weil das verursacht natürlich unnötige Kosten.
Aber woher soll diese Methode der Koeffizientenvergleich wissen, dass
ich dort Don't Cares habe?
Das heißt, das kann man natürlich hier nicht berücksichtigen, das ist
der einzige Unterschied, den man hier sieht.
So, aber das macht die Sache natürlich nicht falsch, sondern wie man
sieht hier, wenn ich diese Don't Cares zu Einzelverfügung, dann habe
ich nach wie vor das gleiche Verhalten.
So, jetzt will ich kurz den letzten Schritt des Entwurfs hier
erklären, und zwar wie man diese Schaltung testet.
Das heißt, der nächste Schritt oder der nächste Aufgabenteil sagt,
vermutlich haben Sie einen Milliautomaten realisiert.
Haben wir?
Haben wir einen Milliautomaten realisiert?
War es Mili oder Mur, was wir realisiert haben?
Ja, es war Mili, ja.
Genau, weil die Ausgabe vom Zustandeingabe, aber im Automatengraf
haben wir die Ausgaben immer am Pfeil, an den Kanten geschrieben und
nicht in dem...
Okay, stimmt eigentlich.
Zeichnen Sie den zeitlichen Verlauf, das war unser Eingangssignal Q,
wobei mit Q gemeint Q0 und Q1, weil wir haben zwei Zustandsvariablen,
und A für die Folge, also die Dualzahl 010011.
Das heißt, dezimal interpretiert haben wir ein 19.
Wobei jeder Eingabewechsel von E in der Mitte zwischen zwei
Taktflanken stattfindet.
Zeichnen Sie im zeitlichen Verlauf von A diejenigen Zeitintervalle,
also der Ausgangsvariable, innerhalb welcher das Signal von der
spezifizierten Aufgabenstellung abweicht.
Anscheinend, also der Verlauf von dem Ausgangssignal A, anhand dessen
wir feststellen können, ob die bis dahin eingelesene Zahl durch drei
teilbar ist oder nicht, weicht von der Aufgabenstellung.
Also es stimmt nicht immer.
Und deshalb müssen wir angeben, wann können wir mit ruhigem Gewissen
die Information von dem Ausgangssignal A vertrauen oder nehmen und
sagen, ja, das ist eine richtige Information.
Okay, aber zunächst mal zeichnen wir mal diese Verläufe der Signale.
So, wir haben hier ein Taktsignal, wir haben E, E war 0, ganz zurück,
E war 0, dann haben wir eine 1 eingelesen, dann 0, dann 0, dann 1,
dann 1.
0, wir haben in der Mitte von zwei Taktflanken ändert sich die
Eingabe, wie in der Aufgabenstellung angegeben ist.
Also wir haben hier die aktiven Taktflanken sind die ansteigenden
Taktflanken und in der Mitte ändert sich die Eingabe.
Okay,
das ist unser E, wir haben hier eine 0 eingelesen, dann haben wir eine
1 und so weiter und so fort.
Q1, Q0, das sind die Zustandsvariablen, die wir haben.
Wir haben die Gleichungen bestimmt, da können wir einsetzen und
genauso vor,
1, aha, dann die 0, dann die 0, dann 1, dann 1.
Was bedeutet das eigentlich?
Die Zahl war zunächst mal am Anfang durch 3 teilbar, das heißt die
Zahl wird nicht mehr durch 3 teilbar hier, dann muss die Ausgabe sich
ändern, das tut sie hier, aber die Zahl bleibt 1, trotzdem die Ausgabe
geht wiederum auf 1, obwohl ich hier 1 eingelesen habe nach den ersten
zwei Bits.
Das heißt eigentlich, der Sollverlauf von A, das ist wie man hier den
Verlauf von A zum Beispiel zeichnen kann, das ist die Gleichung und da
kann man gucken, wie das hier funktioniert.
Da bekommt man das hier am Oszilloskop zum Beispiel oder am Papier
mithilfe der Gleichung, aber der Sollverlauf von A soll wie folgt
aussehen.
Zunächst mal habe ich eine 0, dann ist die Zahl durch 3 teilbar,
deshalb soll A gleich 1 sein.
Wenn ich die 1 hier lese, dann geht A auf 0, dann lese ich eine 0,
dann habe ich 2, also nicht durch 3 teilbar, dann lese ich eine 0,
dann habe ich 4, auch nicht durch 3 teilbar.
Wenn ich diese 1 hier lese, also wenn E wiederum auf 1 wechselt, dann
habe ich 1, 0, 0, 1, also insgesamt 9.
9 ist durch 3 teilbar, deshalb soll A wiederum auf 1 gehen.
Und wenn ich nochmal die 1 hier lese, also hier in der Mitte, dann
bedeutet das, ich habe 19 und 19 ist nicht durch 3 teilbar, deshalb
soll A wiederum auf 0 zurückgehen.
Der Verlauf von A hier, stimmt nicht überein mit dem Soll-Verlauf.
Das heißt, eigentlich macht die Schaltung nicht immer das, was man
spezifiziert hat oder sich erhofft hat.
Hat jemand von euch eine Erklärung, woran das liegt?
Und wann kann ich auf das Ausgangssignal A mit ruhigem Gewissen
zugreifen?
Also ich bin mir dann sicher, ich habe den richtigen Wert.
Na, wo stimmen eigentlich die Verläufe überein?
Die stimmen hier überein und hier nicht.
Also hier im roten Bereich stimmen sie nicht überein.
Also hier haben wir ein Problem, hier haben wir ein Problem und hier
haben wir ein Problem.
Aber man sieht hier, dass in diesen grünen Bereichen wir immer einen
richtigen Wert von der Ausgabe haben.
Und zwar immer in den Bereichen zwischen Eingabewechsel und
Zustandwechsel.
Also hier wechselt die Eingabe E und hier wechselt der Zustand.
Weil wir gehen von Zustand 0 auf Zustand 1 hier.
Hier an der Stelle wechselt die Eingabe nochmal und hier wechselt der
Zustand.
Vielleicht soll ich das statt mit dem Pointer hier mal...
Also hier haben wir Eingabewechsel und hier haben wir einen
Zustandswechsel.
Hier haben wir wiederum Eingabewechsel und hier wechselt der Zustand.
Hier haben wir Eingabewechsel, man sieht hier in der Mitte, der
wechselt die Eingabe gar nicht.
Und hier haben wir einen Zustandwechsel, weil wir gehen von Zustand 1
auf Zustand 0 zurück.
Und in diesen Bereichen ist das Ausgangssignal immer korrekt.
Kann jemand von euch mir erklären, woran das liegt?
Denkt mal nochmal an den Milliautomaten.
Ja, bitte.
Genau.
Was er gerade gesagt hat, dass die Ausgabe bei den Milliautomaten auf
der Kante ist.
Oder, hast du gesagt?
Was bedeutet das eigentlich?
Wenn
ich noch näher komme, dann falle ich runter.
Du musst lauter reden.
Die Ausgabe hängt sowohl vom Zustand als auch von der Eingabe ab.
Auch von der Eingabe.
Und was bedeutet das?
Ganz genau.
Das heißt eigentlich, Änderungen der Eingabevariablen können
unabhängig vom Takt zu Änderungen der Ausgabe führen.
Asynchron können sie zu Änderungen der Ausgabevariablen führen.
Und das ist, was wir haben.
Aber immer zwischen Eingabewechsel und Zustandwechsel, also immer wenn
wir auf der Kante vom Graphen
im Milliautomaten sind, dann können wir sicher sein, dass die Ausgabe
richtig ist.
Und was bedeutet das?
Wir können immer das Ausgabesignal zwischen Eingabewechsel und
Zustandwechsel abgreifen.
Immer in diesen Bereichen.
Nachdem die Eingabe wechselt und bevor der Zustandwechsel erfolgt, ist
das Ausgangssignal abgegriffen.
Das Ausgangssignal darf nur zwischen dem Wechsel des Eingangssignals
und dem Zustandswechsel abgegriffen werden.
Die nächste Frage ist, das heißt eigentlich, unsere Schaltung
funktioniert, aber wir haben ein paar Bedienungen, wenn wir wissen, ob
wir bis zu 1
haben, und 1 ist nicht restlos durchdrehteilbar.
Oder hier, ich habe 19 und er sagt mir, du hast eine durchdrehteilbare
Zahl, aber ich habe keine.
Also wenn wir diese Nebenbedienung erfüllen, also darauf achten, wenn
wir das Signal abgreifen, dann funktioniert unsere Schaltung.
Die Frage ist, gibt es eine andere Möglichkeit, das Problem zu lösen?
Ah, du hast es gesehen.
Okay,
also ich habe das saubere Wort gehört, und ich denke, du hast gesagt,
du willst einen Moorautomaten realisieren, um dieses Schaltwerk zu
realisieren.
Moorautomaten nehmen, um dieses Schaltwerk zu realisieren.
Und das ist tatsächlich, was Aufgabenteil 6 bearbeitet, um das
Ausgabesignal kontinuierlich abgreifen zu dürfen, also nicht darauf zu
achten, wann ich abgreifen soll, kann man bei dieser Aufgabenstellung
keinen Milliautomaten verwenden.
Mit welchem Automatentypen lässt sich das Problem lösen?
Wir haben nur noch Moor kennengelernt, bei dem die Ausgabe nur vom
Zustand abhängt.
Es gibt natürlich einen speziellen Moorautomaten, bei dem die Ausgabe
identisch mit dem Zustand ist, das ist der sogenannte DefDef-Automat.
Zeichnen Sie das neue Automatengraph ebenfalls mit drei Zuständen,
also mit Moor.
Und wenn man das hier macht, dann sieht man, wie das ist, das heißt im
Zustand 0, die Zahl ist restlos, durch 3 teilbar, hier nicht, und das
sind die Zustandsübergänge, das sind die Verläufe, die wir vorher
bekommen haben.
Und man sieht hier, der Verlauf von A bei einer Realisierung des
Schaltwerks als Moorautomat, man sieht hier, dass der Ausgabewechsel
synchron ist mit der Zustandsänderung.
Also es kann nur dann
ein Ausgabewechsel erfolgen, wenn ich in einen neuen Zustand komme.
Solange ich im Zustand 0 bin, bleibe ich hier.
Wenn ich wechsle von Zustand 0 zu Zustand 1, dann bekomme ich die
Ausgabe 0, aber die Zustandswechsel sind taktsynchron.
Und wir haben gesagt, die Eingabevariable E das heißt eigentlich ist
dieser Wechsel
ein halber Takt verzögert.
Das heißt, man sieht hier, hier lesen wir eine 1 und beim ersten
Schritt lesen wir eine 1, die Zahl wird somit nicht durch 3 teilbar
und das wird am Ausgang bekannt gegeben erst mit der nächsten
ansteigenden Taktflanke.
Das heißt, die Ausgabe geht nicht direkt die Ausgabe geht nicht direkt
hier auf 0, sondern erst mit der nächsten aktiven Taktflanke.
Und das ist, was ich vorher gemeint habe, bei einem Milliautomaten
sieht man, dass diese Ausgabe hier sich ändert immer, kann sich ändern
mit Änderungen der Eingabe, weil die Ausgabe von beiden abhängt, aber
nicht bei nur.
Die Aufgabe ist fertig, gibt es Fragen dazu?
Wir haben noch Zeit, um eine Aufgabe zum Thema Schaltwerkanalyse zu
machen.
Das ist also der umgekehrte Weg.
Schaltwerk ist gegeben, zum Beispiel durch das Schaltbild und wir
sollen eingeben, was macht diese Schaltung?
Wie viele Zustände hat das Schaltwerk?
Dazu müssen wir eine Analyse machen.
Eine solche Analyse bei asynchronen Schaltwerken haben wir gemacht im
Zusammenhang mit dem Entwurf von asynchronem RS-Flip-Flop, wo wir
diese komischen Situationen bei dem Übergang von R gleich S gleich 1
zu 0,0 betrachtet haben, wo wir in der Schaltung die Rückkopplungen
auftrennen und überall dort, wo wir aufgetrennt haben, eine
Zustandsvariable eingefügt haben.
Jetzt wollen wir diese Analyse für synchrone Schaltwerke hier
betrachten.
Das heißt, wir wollen am Ende zu einem Automatengraphen kommen und
hoffen, dass wir anhand von einem Automatengraphen sagen, was die
Schaltung machen kann.
Die Schritte sind die folgenden.
Wenn das Schaltbild angegeben ist, dann kann ich die
Ansteuergleichungen der Flip-Flops schreiben.
Ich muss die kodierte Ablauftabelle auch aufstellen, anhand derer ich
die Zustandsübergänge feststellen kann, um diesen Automatengraphen zu
realisieren.
So viel zur Theorie.
Wir wollen eine Praxis hier, ein Beispiel nehmen.
Und zwar, welche Funktion erfüllt folgendes Schaltwerk.
Wir sehen, das ist ein Schaltwerk, es hat ein Takt-Signal, es hat ein
Ausgabesignal und keine weiteren Eingangssignale, wie man sieht.
Es hat drei Flip-Flops, das sind JK-Flip-Flops, angesteuert von diesem
Takt -Signal, die sind Takt-Flanking gesteuert und ein paar Gatter,
mit denen die Ansteuerfunktionen der Flip-Flops realisiert sind.
Das heißt, wir können feststellen, wir haben drei Zustandsvariablen,
Q0, Q1 und Q2, weil wir drei Flip-Flops haben und wir haben eine
Ausgangsvariable A.
Und wir wissen auch bereits, wenn wir drei Zustandsvariablen haben,
Q2, Q1 und Q0, dass dieses Schaltwerk maximal zwei hoch drei, also
acht Zustände annehmen kann.
Die wollen wir so bezeichnen, also für die Analyse, das soll das Flip
-Flop sein, das Q2 speichert, das ist das Flip-Flop, das Q1 speichert,
das ist das Flip-Flop, das Q0 speichert.
Ich kann hier die Ansteuerung der Flip-Flops lesen.
Das heißt, man sieht hier zum Beispiel diese Eingänge hier, die
Eingänge, das sind natürlich, wenn das hier J0 speichert, dann ist das
J2, das ist K2, das ist J1, das ist K1, das ist J0, das ist K0.
Und dann können wir eigentlich diese Schaltung hier nehmen und können
wir die Ansteuerfunktionen ablesen.
Wenn die die sind, dann sehen wir Q2, ich habe jetzt auf der falschen
Folie geschrieben, Entschuldigung, das ist J2, das ist K2, das ist J1,
das ist K1, das ist J0, das ist K0, dann sehen wir, dass J2 nichts
anderes als Q1, Q0, K2 nichts anderes als Q1 ist und J0 ist gleich Q0
und so weiter und so fort und wir sehen auch, dass A nichts anderes
als Q0 Q1, Q2, das haben wir alles abgelesen jetzt.
Nur ablesen.
Und damit können wir die QDRT-Ablauftabelle hinstellen, weil wir haben
die charakteristische Gleichung der Flip-Flops, also wir haben alle J
jetzt bestimmt, anhand von diesem Bild, wir haben die JI bestimmt und
wenn ich die charakteristische Gleichung hier nehme und einsetze, dann
bekomme ich die Zustandsüberführungs-Gleichungen also für Q, I, T plus
1.
Das machen wir, das heißt, das ist, was wir bestimmt haben, setzen wir
ein, dann bekommen wir folgendes.
Und diese drei Funktionen, Q2 zum Zeitpunkt T plus 1, Q1 und Q0 zum
Zeitpunkt T plus 1, können wir natürlich hier in der QDRT
-Ablauftabelle eintragen und das gleiche machen wir für A.
Und anhand von dieser QDRT-Ablauftabelle sollen wir jetzt feststellen,
was dieses Schaltwerk macht.
Aha, was macht eigentlich dieses Schaltwerk?
Ich habe gesagt, dieses Schaltwerk mit drei Zustandsvariablen kann
maximal acht Zustände speichern.
Wenn wir diese Zustände als dual-codiert hier ansehen, dann haben wir
Zustand 0 bis Zustand 7, die sind hier mit den Nummern auch markiert,
mit 0, 0, 0 bis 1, 1, 1.
Und da sehen wir, wohlgemerkt, unser Schaltwerk hat keine weiteren
Eingabevariablen.
Also wir haben kein E.
Die einzige Eingangsvariable ist das Taktsignal sozusagen.
Wenn wir das hier betrachten, dann sehen wir eigentlich, mit der
ersten Taktflanke, positiven Taktflanke, sind 0 in 0, 0, 1.
Aha, das ist Zustand 1.
Zustand 1 mit der nächsten positiven Taktflanke in 2, Zustand 2 in 3,
3 in 4, 4 und 5, 5 und 6, 6, aha, da gehen wir wiederum in 0.
Warum geht die Geschichte nicht weiter?
Warum nicht 6 in 7?
Aber da sehen wir, die Ausgabe wird auf einmal 1.
Also das ist eigentlich eine Besonderheit.
Wir zählen einfach von 0 bis 6.
Und wenn wir in 6 sind, dann gehen wir wiederum in 0 und geben wir
eine 1 aus.
Was kann man anhand dieser Tabelle ablesen?
Man kann ablesen, dass dieser Zustand 1, 1, 1 nie erreicht wird.
Es kann maximal einmal auftreten, und zwar als Anfangszustand.
Ja, weil ich komme nicht mit Zustand weg.
Dann sieht man, dass er direkt in den Zustand 0 übergeht, und von 0
gehen wir bis 6 und von 6 wieder zu 0 und so weiter und so fort.
Das heißt, wenn wir jetzt diese Zustände nehmen und versuchen daraus,
was man ja ein Modulus 7 Zähler nennt, das heißt, wir haben
danach wiederum in 0.
Also wie unsere digitalen Uhren, die sind
0 bis 59 und dann gehen sie auf 0, also Sekunden und Minuten und so
weiter und so fort.
Und wenn wir versuchen, das hier automatisch aufzuschreiben, dann
können wir sagen, okay, das sieht so aus.
Das ist Zustand 0, dann gehe ich in Zustand 1.
Wohlgemerkt, ich habe überhaupt keine Eingabesignale.
Das ist nur das Tagssignal, was diese Zustandswechsel hier bestimmt.
Ich gehe in 1, ich gehe in 2, 3, 4, 5, 6 und wenn einmal Zustand 7
auftritt, dann geht er direkt in den Zustand 0 und das kann nur der
Fall, kann nur am Anfang, also der Zustand 7 kann nur als
Anfangszustand auftreten und wenn das passiert, dann geht das
Schaltwerk sofort in den Zustand 0 und dann in diesen Zählzyklus.
Okay, so viel dazu.
Gibt es Fragen?
Habt ihr was gelernt?
Echt?
Okay, das freut mich.
Ich glaube, wir müssen heute aufhören.
Ich habe noch eine Aufgabe.
Wollt ihr noch Aufgaben zum Entwurf von Schaltwerken?
Wer sagt Ja?
Weiter spezielle Bausteine behandeln.
Für heute bedanke ich mich für die Aufmerksamkeit und wünsche euch
einen schönen Nachmittag.