Herzlich willkommen zur 15.
Vorlesung.
Wir wollen uns heute mit verschiedenen Flip-Flop-Arten beschäftigen
und falls wir soweit kommen, nochmal den Serienaddierer betrachten.
RS-Flip-Flop kennt ihr ja schon, zumindest das asynchrone RS-Flip
-Flop.
Und wir haben festgestellt, dass bei asynchronen Schaltwerken Probleme
auftreten, die wir beheben können, wenn wir bei asynchronen
Schaltwerken einen zentralen Takt benutzen.
Wir hatten ja kritische Zustandsübergänge betrachtet und bei
Synchronen funktioniert das so, dass sich die Eingabenbelegungen
stabilisieren, bevor ein neuer Zustand eingenommen wird.
Das heißt, dieses Problem wird dadurch behoben.
Dafür benötigen wir allerdings taktische Zustandsspeicher und diese
Zustandsspeicher, wie ihr auch schon kennt, implementieren wir durch
verschiedene Arten von Flip-Flops.
Und wir wollen jetzt hier die verschiedenen Flip-Flop-Typen nochmal
anschauen und ein bisschen genau betrachten.
Anfangen tun wir mit dem RS-Flip-Flop.
Das kennen wir ja schon, das asynchrone zumindest.
Wir haben zwei Eingänge, einmal R und einmal S.
Die Interpretation sieht so aus, dass... Ist die Akustik okay
eigentlich?
Zu laut?
Zu leise?
Gut.
Wie sieht es hinten aus?
Einwandfrei.
Also Interpretation sieht so aus, dass R für Reset steht, S für Set.
Wenn ich jetzt die Eingabebelegung RS00 habe, dann habe ich die
Funktion Speichern, das heißt der interne Zustand meines Flip-Flops
wird gespeichert, er wird nicht verändert.
Wenn ich S gleich 1 habe und R gleich 0, dann setze ich, also habe ich
einen Set-Aufruf, ich setze den Zustand auf 1, das heißt mein
Folgezustand ist unabhängig vom vorherigen Zustand, die 1.
Und genauso, wenn ich ein R1 habe und S0 habe, setze ich zurück,
resette ich den Zustand auf die 0.
Wir haben hier diese rückgekoppelte Schaltung betrachtet und das
Schaltsymbol dieses asynchronen RS-Flip-Flops sehen wir hier rechts
unten.
Hier sehen wir RS-Eingänge, einmal Q, den Ausgang, und einmal den
negierten Ausgang, nicht Q.
Behalten haben wir schon beschrieben.
Hier noch mal zum Nachlesen.
Das Einzige, was wir jetzt noch nicht gesagt hatten, aber was ihr auch
schon zigmal gehört habt bestimmt, ist, dass wir eine verbotene
Eingabebelegung haben, R und S gleichzeitig auf 1, die haben wir
nämlich vorher nicht betrachtet.
Wenn diese Eingabe stattfindet, dann ist das Verhalten des Flip-Flops
unvorhersehbar, deswegen verbieten wir das einfach
und wollen dann P und Q.
Q und Q nicht eigentlich, beziehungsweise wenn wir jetzt das Q nicht
als P bezeichnen, dann haben wir hier zwei Ausgaben des Flip-Flops,
die komplementär sind.
Wir betrachten jetzt das pegelig gesteuerte RS-Latch, das RS-Flip-Flop
und dafür werden wir ein Taktsignal einführen, welches bei Inaktivität
die Änderung der Zustandsvariablen verhindert.
Und das kann man ganz leicht implementieren, indem man die
verschiedenen Eingänge mit diesem Taktsignal verundet.
Das heißt, wir haben hier S und Takt an den Eingang S unseres Flip
-Flops, wir haben R und Takt an den Eingang R unseres RS-Flip-Flops.
Das heißt, wenn mein T auf 0 wechselt, also wenn ich eine Low-Phase
meines Taktes habe, dann werden automatisch R und S auf 0 gezwungen
und 00, die Eingangsbelegung kennen wir ja schon, die steht ja für die
Funktion Speichern, das heißt der interne Zustand des RS-Flip-Flops
wird gespeichert, also nicht verändert.
Und dementsprechend wirken sich dann die Änderungen an kleinen S und
kleinen R nicht auf das RS-Flip-Flop aus.
Habe ich dann ein T gleich 1, dann übernehme ich quasi hier das R oder
das S, was jeweils anliegt, an den kleinen Eingängen und leite die
dann weiter an das große SR.
Das Schallsymbol sehen wir jetzt rechts unten.
Im Vergleich zum vorherigen hat sich jetzt etwas geändert.
Wir haben einmal ein T dazu bekommen und wir haben hier die
Bezeichnungen statt S und R haben wir jetzt 1S und 1R und zusätzlich
haben wir ein C1 beim Takt, C für Clock aus dem Englischen und 1 zeigt
uns hier die Abhängigkeiten.
Wie sieht es genau aus mit diesen Abhängigkeiten?
Diese Ziffer 1 an den Eingängen bedeutet, dass sie in der Wirksamkeit
von diesem C abhängen und das 1 nach dem C bedeutet, dass dieses Clock
Auswirkungen hat auf dieses S und R.
Also zusammengefasst, wenn ein Eingang die Abhängigkeit verursacht, so
folgt die Ziffer auf die Variable wie beim C und wird sie beeinflusst
von einem anderen Eingang, so geht sie der Variablen voraus.
Dann haben wir Ansteuertabellen betrachtet.
Wenn wir synchronische Haltwerke entwerfen wollen, dann kennen wir ja
meistens die Zustände und die Folgezustände, in welche wir übergehen
wollen.
Was wir suchen, sind die Ansteuervariablen für die verschiedenen Flip
Flops, die hier für Zustandsspeicher stehen und die Werte dieser
Ansteuervariablen können wir leicht aus der Ansteuertabelle der
verschiedenen Flip Flops bestimmen.
Diese lassen sich leicht aus den Ansteuertabellen der Flip Flops
schließen und wir können uns hier ein Beispiel anschauen, wenn wir die
Ansteuertabelle eines RS Flip Flops herleiten wollen, haben wir zwei
Zustände.
Wir haben einmal den Zustand 0 und einmal 1, repräsentativ für die
interne Variable, die gespeichert wird, also für den internen Bitwert,
den das RS Flip Flop speichert.
Und wir haben hier eine Tabelle aufgestellt mit aktuellem Zustand auf
der linken Seite und dem Folgezustand auf der rechten Seite und hier
haben wir unsere Ansteuervariablen R und S jeweils zum Zeitpunkt T.
Und jetzt wollen wir wissen, was passiert, wenn ich zum Beispiel im
Zustand 0 bin und ich möchte im Zustand 0 bleiben.
Ich habe zwei Möglichkeiten, wie ich das bewerkstelligen kann.
Zum einen kann ich den Wert 0 speichern, das heißt, ich kann den
aktuellen Zustand meines Flip Flops beibehalten.
Das mache ich mit der Eingangsbelegung 00 oder ich kann sagen, ich
möchte, egal was für einen aktuellen Zustand ich momentan in meinem RS
Flip Flop gespeichert habe, zurücksetzen.
Das bewerkstellige ich mit einem R gleich 1 und S gleich 0.
Zusammenfassend kann ich sagen, solange S gleich 0 ist, spielt das R
keine Rolle.
Das heißt, R kann 0 oder 1 sein, in dem Fall also ein Don't Care sein.
Das heißt, mit der Eingabebelegung Don't Care 0 würde ich auf alle
Fälle im Zustand 0 bleiben.
Also starten im Zustand 0 und als Folgezustand im Zustand 0 haben.
Das heißt, hier trage ich meine Don't Care 0 ein.
Was passiert jetzt, wenn ich vom Zustand 0 in den Zustand 1 wechseln
will?
Da gibt es nur eine Möglichkeit.
Ich kann dem Flip Flop sagen, er soll bitte das Bit setzen und das
mache ich mit meiner 01, also mit Eingangsbelegung Set.
Und hier habe ich die 01, die trage ich dann hier in meiner Tabelle
ein.
Genauso, wenn ich von der 1 auf die 0 will, muss ich zurücksetzen,
also Resetten und das Bewerkstatten legt sich dann auch mit 1, 0 für
Reset und auch das kann ich eintragen in 1, 0.
Wenn ich jetzt im Zustand 1 bin und ich möchte im Zustand 1 bleiben,
habe ich wieder zwei Möglichkeiten.
Genauso wie beim ersten Zustand kann ich sagen, entweder ich bleibe in
meinem Zustand 1, also Speichern, oder ich setze die 1 als Zustand.
Beide Fälle sind 00, 01.
Das heißt, hier kann ich das S wieder zusammenfassen als ein Don't
-Care und ich bekomme hier die Eingangsbelegung 0 Don't-Care und trage
das auch hier ein.
So, das rechts unten nennt sich Ansteuertabelle für das Flipflop.
Das heißt, wie muss ich das Flipflop ansteuern, um von einem gegebenen
Zustand in einen Folgezustand zu gelangen.
Ansteuertabelle des Asynchron RS Flipflops kennt ihr schon, sieht
eigentlich genauso aus.
Wir hatten hier nur tatsächlich die Voraussetzung gesetzt, dass keine
unerlaubten Eingabebelegungen auftreten dürfen.
Und bei Asynchron wisst ihr ja, dass es ein bisschen komplizierter
ist, weil vor allem, wenn ich einen Wechsel habe zum Beispiel von 01
auf 10, dann habe ich abhängig von der Schaltgeschwindigkeit, also der
Änderungsgeschwindigkeit, was sich zuerst ändert, welche
Eingabevariante sich zuerst ändert, kann ich tatsächlich in diesen
unerlaubten Zustand gelangen.
Zusammengefasst hatten wir gesagt, für diese verbotene
Eingabebelegung, dass wir eine Nebenbedingung haben, die heißt R und S
ist gleich 0.
Solange diese Nebenbedingung erfüllt ist, sind wir sicher.
Das heißt, da kann nichts passieren.
Wir kommen nicht in diese verbotene Eingabebelegung.
Und wenn ich jetzt meinen RS-Flipflop betrachte, wie kann ich das
bewerkstelligen?
Ich könnte zum Beispiel einen neuen Eingang erzeugen, den nennen wir
jetzt Eingang D, und führe diesen Eingang D negiert zu meinem R
-Eingang.
Somit gewährleiste ich, dass wenn D1 ist, ist S1 und R gleich 0.
Wenn D0 ist, ist S0 und R gleich 1.
Das garantiert mir, dass diese Nebenbedingung immer erfüllt ist.
Funktioniert natürlich auch nur, weil wir hier synchron sind.
Das heißt, wir haben hier einen Takt und zu diesen bestimmten
Taktzeiten muss natürlich diese Eingabebelegung stabil anliegen.
Ansonsten habe ich genau das gleiche Problem wie beim Asynchron.
Wenn ich jetzt einen blauen Kasten drum herum mache und ein neues
Schaltsymbol für diese Schaltung definiere, dann reden wir von einem
sogenannten D-Latch aus einem D-Flipflop und hier sehen wir einmal den
Takt als Eingabe C1 und einmal 1D, abhängig vom Takt, den D-Eingang
und Ausgabe sind wieder Q und nicht Q.
Wie sieht die Funktionstabelle meines D-Latches aus?
Wir können uns das jetzt folgern.
Wir haben ja ein RS-Flipflop, das heißt, das D wird ja an mein S
weitergeleitet und das negierte D wird an mein R weitergeleitet.
Das heißt, bin ich im Zustand 0 und habe ein D gleich 0, dann ist mein
Set -Eingang 0 und mein Reset-Eingang ist 1.
Das heißt, wenn D 0 ist, habe ich immer die Reset-Bedingung.
Ich setze immer zurück auf 0.
Das heißt, mein Folgezustand ist die 0.
Genauso bei Zustand 1 habe ich bei D gleich 0 wieder dieses Reset.
Das heißt, ich gehe über in den Folgezustand 0, habe ich auf D gleich
1, also habe ich hier bei D gleich eine 1, ist ja mein Set-Eingang
gesetzt und mein Reset-Eingang ist negiert, also die 0.
Das heißt, mein Folgezustand ist dann auch hier die 1.
Auch bei Zustand 1 mit dem D gleich 1 bin ich auch im Folgezustand 1.
Was sagt uns das über das Verhalten?
Wir sehen hier eigentlich, dass der Folgezustand immer genau meinem
Eingabewert entspricht.
Das heißt, egal was mein Zustand ist, ich übernehme einfach den
Eingabezustand als Folgezustand.
Wie können wir jetzt die Ansteuertabelle daraus bekommen?
Also das ist die Funktionstabelle.
Wir haben hier die Eingabebelegung.
Daraus folgt dann, wie ich von einem bestimmten Zustand in den
nächsten komme und wir wollen jetzt die Ansteuertabelle haben.
Das heißt, wir wollen wissen, wenn ich einen Zustand habe und ich
möchte in einen bestimmten Folgezustand, wie muss ich meinen Flipflop
beschalten oder wie muss ich meine Eingabebelegung verändern.
Und das können wir hier ganz einfach machen, indem wir die Spalten
tauschen zunächst.
Also wir ziehen Qt und Qt plus 1 nach vorne und
zusätzlich muss ich dann hier die Zeile 2 und Zeile 3 auch nochmal
tauschen.
Das heißt, ich ziehe die Zeile 3 nach vorne, damit ich hier einfach
die Durchnummerierung überleistet habe.
Folglich ist es hier nur eine paar Mutationen und ich sehe dann, ich
habe hier aus meiner Funktionstabelle meine Ansteuertabelle für das D
-Flipflop gewonnen.
Dazu Fragen?
Keine?
Schaltsymbol haben wir gesagt, sieht so aus.
D-Flipflop, D-Eingang, Takteingang, Q und nicht Q als Ausgabe.
Wenn wir jetzt ein Impulsdiagramm betrachten, also wie sehe dann das
Verhalten meines D-Flipflops aus bei einer bestimmten Eingabebelegung
und einem bestimmten Takt, dann habe ich hier einmal den Takt, wie man
das also kennt und markiert hier sind die gelben Bereiche, wo der Takt
null ist.
Das heißt, das sind die Bereiche, wo das Flipflop nicht reagiert auf
die Eingabe, also deaktiviert wird.
Habe ich jetzt eine Eingabenbelegung, die so aussieht, also das lege
ich jetzt an D an, eine kurze Impulsierung im weißen Bereich des
Taktes, noch einen Impuls und noch mal einen Impuls im gelben Bereich.
Dann kann ich sagen, sieht das Ausgabesignal genau so aus, das heißt,
in dem weißen Bereich werden die anliegenden Eingabebelegungen
übernommen, in unserem Fall sind es zwei Impulse und wenn der Takt
null ist, also das Flipflop quasi deaktiviert ist, dann wird nur der
aktuelle Zustand des Flipflops beibehalten.
Das heißt, jegliche Eingaben hier werden ignoriert und haben dann auch
keine Auswirkungen auf meinen Ausgang.
Das hier nennen wir ein pegelgesteuertes D-Flipflop, das heißt, immer
wenn der Pegel meines Taktes hoch ist, reagiert das Flipflop.
Immer wenn der Pegel niedrig ist, also low ist, ist das Flipflop
gesperrt und hält einfach nur den Zustand, den es aktuell hat, bei und
reagiert nicht auf Eingabedaten.
Was wir jetzt noch machen können, ist ein taktflankengesteuertes D
-Flipflop.
Das heißt, wir wollen jetzt nicht mehr nur reagieren, wenn der Takt
high ist, also auf 1 ist, sondern wir wollen reagieren, wenn der Takt
wechselt.
Also bei einem Wechsel von 0 nach 1 habe ich eine Taktflanke, in dem
Fall von 0,1 reden wir von einer Aufwärtsflanke und einer
Abwärtsflanke, wenn wir von 1 nach 0 gehen.
Um das zu implementieren, benutzen wir zwei D-Flipflops, die wir
hintereinander schalten.
Wir reden hier von einem Master-Slave-Flipflop, weil das erste das
Masterledge ist und das zweite das Slaveledge.
Ich hatte letztes Semester, glaube ich, die gleiche Vorlesung gehalten
und habe dann gesagt, Master-Slave wurde, glaube ich, meines Wissens
nach abgeschafft.
Ich habe es dann nochmal gegoogelt, dann war es immer noch Master
-Slave.
Ich war der Meinung, es hätte man jetzt geändert.
Also, Master-Slave-System, wie sieht das aus?
Ich habe hier einen D-Flipflop, ich habe da einen D-Flipflop und ich
habe hier einen Takteingang.
Dieser Takteingang wird einmal negiert zum ersten geführt und nicht
negiert zum zweiten Flipflop.
Wenn ich jetzt Q1 betrachte, ist es hier mein Zwischenergebnis.
Q1 ist die Ausgabe meines Master-Ledges und Q ist die Ausgabe meines
Slave -Ledges.
Was passiert jetzt?
Wenn der Takt 0 ist, sperrt das zweite Flipflop.
Das erste negiert den Takt, das heißt, der Takt 0 wird zu 1 und 1
heißt, für das erste Flipflop übernimmt bitte alles, was bei D
anliegt.
Also, solange T 0 ist, wird alles, was hier als Eingabe anliegt, als
Zustand in diesen Master-Ledge übernommen.
Wenn ich jetzt wechsle von 0 auf 1, dann fängt an, meinen ersten
Flipflop zu sperren.
Das heißt, jegliche Veränderungen an D werden ignoriert, haben wir
hier schon mal gesehen.
Solange es bei 0 ist, beziehungsweise das erste Flipflop ist ja dann
bei 1, werden alle Veränderungen übernommen.
Sobald der Takt wieder auf 0 geht, ignorieren wir die Eingaben.
Das heißt, hier durch die Negation ist es natürlich wieder umgedreht.
Das heißt, bei T 0 öffnet er hier die Pforten und bei T 1 sperrt
dieses Flipflop.
Bei einem Wechsel von 0 nach 1 wird jetzt hier der aktuelle Zustand
gehalten, wird aber hier bei Q 1 angelegt.
Und das zweite Flipflop, das jetzt gesperrt war, übernimmt jetzt auf
einmal diesen gespeicherten Zustand und reicht ihn dann weiter an Q.
Das heißt, diese Konstellation reagiert dann nur, wenn der Takt von 0
auf 1 wechselt, also ein aufwärtstaktgeflanktes.
Hier nochmal die Funktionsweise beschrieben zum Nachlesen.
Wie sieht das Schaltsymbol aus?
Wenn wir Taktflanken haben, wollen wir hier ein Dreieck beim
Takteingang spezifizieren.
Wenn wir mit negativen Taktflanken, also mit einem
abwärtstaktgeflankten Flipflop arbeiten wollen, haben wir hier nochmal
ein Negationszeichen vor dem T, also einen Kreis für die Negation.
So weit so klar?
Fragen?
Erstmal ja.
Also ich gehe kurz nachher nochmal drauf ein, was natürlich nicht
alles idealisiert ist, aber idealisiert würde es tatsächlich so
funktionieren.
Also ein flankengesteuertes D-Flipflop, Schaltsymbol haben wir gesagt,
sieht jetzt so aus mit diesem Dreieck.
Angenommen, das ist jetzt mein Takt im Impulstdiagramm und das ist
meine Eingabe.
Jetzt habe ich meine Auftaktflanken markiert als rot.
Hier geht die Flanke immer nach oben und das sind genau die
Zeitpunkte, wo mein D-Flipflop die Eingabevariable übernimmt als
seinen eigenen Zustand.
Das heißt, ich kann jegliches vorne dran und danach kann ich alles
ignorieren.
Ich betrachte tatsächlich nur zu diesem Zeitpunkt, was liegt hier
stabil an.
Also es ist wichtig, dass etwas stabil anliegt.
Problematisch wäre es, wenn zum Beispiel jetzt D genau an dieser
Stelle wechseln würde.
Was würde man dann machen?
Normalerweise, wir machen das immer so, wir interpretieren dann immer
das, was vorher dran lag, weil ein Wechsel dauert immer ein bisschen
länger.
Kurz demonstrieren, was passieren würde, wenn wir so etwas haben.
Dann würde man hier die Null annehmen als Eingabevariable.
Weil, wie der Kollege schon gesagt hat, ist ja nicht ideal.
Normalerweise würde das so verlaufen.
Ich greife ein bisschen vor.
Wir übernehmen jetzt immer, wenn hier die Auftaktflanke ist,
übernehmen wir den Eingang.
Das heißt, wenn unsere Ausgabe oder der interne Zustand zunächst Null
war, übernehmen wir hier die 1.
Das ist mein Ausgabewechsel zu 1.
Jeglicher Wechsel hier wird komplett ignoriert, bis wir zur nächsten
Auftaktflanke kommen.
Hier habe ich meine Auftaktflanke.
Das heißt, hier betrachte ich dann, was ist meine Eingabebelegung bei
D.
Die ist Null.
Das heißt, hier muss ich dann wechseln auf die Null und somit habe ich
dann mein Ausgabesignal.
Wenn
das Ganze so toll funktioniert mit dem D-Flipflop, wieso mache ich das
nicht mit dem RS-Flipflop?
Mit dem RS-Flipflop würde genau das so nicht funktionieren.
Wir können uns den Grund nochmal anschauen, was passiert, wenn wir
hier, also was erwarten wir hier, wenn wir sagen, wir wollen das mit
dem RS-Flipflop implementieren.
Wir erwarten ja, dass immer zu der Auftaktflanke der aktuelle Zustand
von R und S übernommen wird und angewendet wird auf den internen
Zustand.
R und S gleich Null bedeutet in unserem Fall safe, also behalte deinen
aktuellen Zustand bei.
Und normalerweise bei einer ursprünglichen Ausgabe von Q gleich 1
würde das heißen, hier sollte die 1 weiterhin anliegen.
In der gleichen Konstruktion mit diesem RS-Flipflop funktioniert das
aber nicht.
Warum?
Wenn wir jetzt Q1 haben und während T0 kurzzeitig R auf 1 geht, das
sehen wir hier in diesem Impuls, dann haben wir hier kurzfristig eine
Belegung von R gleich 1 und S gleich Null.
Das heißt, ich sende das Kommando Reset an meinen RS-Flipflop.
Das Reset kommt hier direkt an, weil mein T ja Null ist, das heißt
hier ein C1 von T gleich 1 ankommt.
Das heißt, alles was hier ankommt, wird verarbeitet.
Das Flipflop wird angewiesen, den internen Zustand zurückzusetzen auf
die Null.
Das sehen wir hier.
Q1 wechselt auf Null.
Wenn der Takt jetzt kippt von Null auf 1, wird dieses Flipflop
gesperrt.
Das heißt, ich habe hier anliegend eine Null.
Diese Null geht an meinen Set-Eingang und das Komplementäre von Null,
also die 1 an meinen Reset-Eingang.
Das heißt, hier wird wieder zurückgesetzt und meine Ausgabe wechselt
dann letztendlich von der 1 auf die Null.
Also, das funktioniert nicht mit dem RS.
Mit dem D-Flipflop hat es gut funktioniert, mit dem RS hat es jetzt
nicht funktioniert.
Zusammenfassend, D-Flipflops sind am einfachsten zu realisierenden
flackengestörten Speicherelemente und die haben einen sehr geringen
Flächenbedarf, weswegen sie bei integrierten Schaltungen sehr häufig
verwendet werden.
Wie kann man Schaltwerke mit D-Flipflops bauen?
Man hat zwei Teile.
Einmal den linken Teil mit den Flipflops, das sind meine
Zustandsspeicher.
Auf der rechten Seite habe ich ein Schaltnetz.
Die Ausgaben meiner Flipflops werden in das Schaltnetz gespeist,
werden dort verarbeitet und dieses Schaltnetz produziert dann eine
Ausgabe, die als Eingabe für das Flipflop, für die Flipflop-Reihe
hier, für die D-Flipflops dient, aber erst im nächsten Takt.
Und das Ganze funktioniert tatsächlich nur, weil wir diesen Takt
haben, weil das Ganze synchron ist.
Und das Schaltnetz hier hat Zeit, sich zu stabilisieren, also die
Ausgaben der D-Flipflops zu verarbeiten, weiterzuleiten an die D
-Flipflops und erst bei einer 0.1.
Flanke werden diese Änderungen in die D-Flipflops übernommen.
Das haben wir alles schon gesagt, ein bisschen was für euch zum
Nachlesen.
Wir können jetzt synchrone Schaltungen, aber nicht nur mit
flankengesteuerten Flipflops, sondern auch mit pegelgesteuerten
Flipflops, mit diesen Latches, aufbauen.
Dazu muss man aber das Schaltnetz ein bisschen aufteilen.
Sieht dann so aus, dass wir hier zwei Teile haben, einmal den oberen,
einmal den unteren Teil.
Wir haben hier ein Schaltnetz 1 und ein Schaltnetz 2.
Alles, was vom Schaltnetz 2 ausgegeben wird, dient als Eingang für die
Latches mit T2, also die mit dem Takt 2 gesteuert werden.
Und alles, was das Schaltnetz 1 produziert, dient als Eingang für die
Latches, die vom T1 gespeist werden.
Das heißt, wir benötigen hier einen Zwei-Phasen-Takt.
Wir haben immer T1 und T2 als Takt.
Und hier ist natürlich auch wichtig, also nochmal zum Nachlesen, ist
wichtig, dass wenn T2 offen ist, dass T1 gesperrt ist und wenn T1
offen ist, T2 gesperrt ist.
Weil wir sonst eine Konstellation haben, die eigentlich genau dem
entspricht, was wir verweilen wollen, nämlich dem Asynchronen.
Wie sieht das Ganze aus?
Ich habe hier meinen Zwei-Phasen-Takt, T1 und T2, und hier muss ich
immer darauf achten, dass immer nur einer der beiden Takte ein High
hat.
Deswegen sieht man hier, wenn man das markiert, gibt es immer Phasen,
wo T2 hoch ist, T1 hoch ist, T2 hoch ist, T1 hoch ist.
Also, beide Takte sind nie gleichzeitig High.
Das heißt, es gibt immer einen Zeitbereich, wo beide Null sind und das
ist der Zeitbereich, wo sich das Schaltnetz oder die beiden
Schaltnetze stabilisieren können und die Eingaben, die von den
entsprechenden Flipflops kommen, verarbeiten können.
Das haben wir schon gesagt, wenn die gleichzeitig aktiv sind, würde
eine Rückkopplung entstehen und wir haben dann genau das, was wir bei
den Asynchronschaltwerken haben.
Zusatzbetrachtung.
Das Flipflop ist nur zu einem genau festgelegten Zeitpunkt der Flanke
0.1 entriegelt.
Jetzt kommen wir zu dem, was du gesagt hast.
In der Realität sieht es so aus, dass wir natürlich nicht ideal von 0
auf 1 wechseln, sondern wir haben einen Übergang.
Und wenn wir jetzt sicherstellen wollen, dass es tatsächlich so
funktioniert, wie wir uns das wünschen, also dass es idealisiert, wie
beim Idealisierten funktioniert, dann müssen wir auch sicherstellen,
dass wir einen bestimmten Zeitbereich haben um die Taktflanke herum,
wo sich die Eingabebelegungen nicht verändern.
Hier sehen wir den realen Takt.
Idealerweise, was wir uns gerne wünschen, ist natürlich das hier.
Ein sofortiger Wechsel.
Wie gesagt, in der Realität passiert das nicht.
Wir haben hier einen langsamen Wechsel, einen ansteigenden Wechsel und
deswegen definieren wir hier zwei Bereiche.
Einmal die Setup-Time, also den Bereich vor dem Wechsel.
Das ist die Vorbereitungszeit und das ist das Zeitintervall, in dem
das anliegende Signal vor der Taktflanke mindestens stabil sein muss.
Und wir haben die Hold-Time, das ist die Haltezeit, also die Zeit nach
dem Wechsel, in der genauso das Eingangssignal stabil sein muss.
Zusammen ergibt das Ganze das Empfindlichkeitsintervall des Flip-Flops
und hier muss natürlich gewährleistet sein, dass in diesem Intervall
keine Veränderungen stattfinden.
Was passiert, wenn dieses Empfindlichkeitsintervall zu groß ist?
Wir werden sehen, so heute nicht mehr wahrscheinlich, aber in der
Übung vielleicht in der nächsten oder in den nächsten Vorlesungen,
dass wenn man Flip-Flops hintereinander schaltet, was man machen kann,
dass wir dann tatsächlich Probleme bekommen, weil das Signal des
ersten Flip-Flops noch nicht stabil anliegt oder die Veränderung im
ersten Flip-Flop noch nicht stabil an das zweite Flip-Flop
weitergereicht werden kann.
Wie kann man das lösen?
Man löst es mit zwei flankengesteuerten Flip-Flops.
Was bedeutet das genau?
Wir haben ja im Takt zwei Flanken, einmal die Aufwärtsflanke und
einmal die Abwärtsflanke.
Und was wir jetzt machen wollen ist, wir wollen in der ersten
Taktflanke die Eingabebelegung übernehmen, intern im Flip-Flop
verarbeiten und das resultierende Ergebnis erst bei der
Abwärtstaktflanke weitergeben.
Dadurch haben wir gewährleistet, dass ein bestimmtes Eingabesignal
stabil ankommt und wir dieses verarbeiten können, aber dann auch
stabil ans nächste Flip-Flop weitergeben können.
Problem dabei ist natürlich, dass wir eine kleine Verzögerung
reinbekommen und diese Verzögerung beträgt ganz genau einen halben
Takt.
Wie kann man das Ganze implementieren?
Wer an euch erinnert, wir haben gesagt, das Pegelgesteuerte D-Flip
-Flop haben wir aus zwei D-Flip-Flops, das Taktflankengesteuerte Flip
-Flop haben wir aus zwei Pegelgesteuerten D-Flip-Flops, D-Ledges
gebaut und hier benutzen wir einfach drei Stück.
Das heißt, das Taktflankensignal kommt hier an bei einem Wechsel von
0, 1.
Also das erste wird mit dem negativen Takt gefüttert, das zweite D
-Ledge mit dem positiven und das dritte wieder mit dem negativen.
Wenn ich jetzt eine Aufwärtstaktflanke habe von 0 nach 1, wird das
Datum hier übernommen, hier ausgegeben und erst bei der
Abwärtstaktflanke wird das hier wieder weitergegeben.
Das heißt, ich bekomme einen halben Taktzyklus Verzögerung rein, das
wollen wir hier kennzeichnen mit diesem Zeichen, was einer halben
Taktflanke entspricht.
Also geradeaus nach rechts und einmal runter.
Und das symbolisiert hier an der rechten Seite quasi in unserem
Schaltsymbol, dass wir diese Verzögerung von einem halben Takt haben.
So, wie sieht das Schaltsymbol aus?
Haben wir schon gesagt, Impulsdiagramm, einmal der Takt und einmal
unsere Eingabe.
Markiert ist jetzt einmal rot meine Aufwärtstaktflanke und einmal blau
die negative Taktflanke.
Das Verhalten sieht jetzt so aus, dass bei rot die Veränderung
übernommen wird, aber erst bei blau ausgegeben wird.
Genau an diesen Stellen übernehme ich den Inhalt meiner
Eingabebelegung und genau an diesen Stellen wirkt sich das an der
Ausgabe aus.
Sprich, ich betrachte an dieser Stelle mein D, D ist hier 1, das heißt
der Zustand meines D-Flip-Flops müsste von 0 auf 1 wechseln, wechselt
sich aber erst bei der blauen.
Genauso hier, ich habe hier den Zustand 0, also die Eingabe 0, müsste
hier mein Zustand auf 0 wechseln von 1, kann das aber erst im nächsten
Taktzyklus machen.
Okay, soweit so klar?
Fragen dazu?
Keine?
Wunderbar.
Machen wir weiter mit dem JK-Flip-Flop.
Wir haben ja gesagt, ich glaube schon fünfmal mindestens, dass bei RS
1 verboten ist und wir wollen jetzt dieses Problem umgehen, indem wir
ein anderes Flip-Flop konstruieren, was genau diese Eingabebelegung
benutzt, um was anderes zu machen.
Wir haben ja die Funktionen speichern, setzen und zurücksetzen und wir
wollen jetzt zusätzlich bei der Kombination RS gleich 1
komplementieren.
Das heißt, der Inhalt soll gekippt werden, wenn eine 1 der aktuelle
Zustand war, soll eine 1 draus werden.
Dazu definieren wir das JK-Flip-Flop, einmal mit dem J und einmal mit
dem K-Eingang und wir können uns das merken, warum JK.
Wir haben einmal J für Jump und einmal K für Kill.
Also einmal springt es nach oben, quasi mein Setz-Eingang und einmal
lösche ich meinen Inhalt, Kill.
Wir können natürlich dieses Verhalten durch die Zusatzbeschaltung
bekannter Flip-Flops erreichen.
Erstmal, wie sieht die Ansteuerung so eines Flip-Flops aus?
Wir haben gesagt, wir haben hier unsere Zustände Q jeweils 0 und 1,
wir haben die Eingangsbelegungen J und K, wir haben den Folgezustand
Qt plus 1.
Jetzt wollen wir genau diese Funktion implementieren.
Also JK gleich 0, genauso wie beim RS-Flip-Flop als Speichern, 0,1
genauso wie beim RS-Flip-Flop als Rücksetzen, 1,0 als Setzen und 1,1
als Zustand wechseln.
Also Qt plus 1 ist einmal Qt, Qt plus 1 ist gleich 0, gleich 1 und
einmal die Negation vom aktuellen Zustand Qt.
Jetzt tragen wir das hier ein auf der linken Seite.
Einmal sagen wir okay, wir sind im Anfangszustand 0, also Qt ist 0.
Ich habe JK gleich 0,0.
Wenn Qt gleich 0 ist, ist mein Folgezustand auch 0.
Bin ich im Zustand 0 und habe eine 0,1, dann setze ich zurück.
Das heißt, mein Endzustand ist wieder die 0.
Bin ich im Zustand 0 und mache ein 1,0.
Als ich setze den Zustand, bin ich auf der 1.
Und bei 0 will ich mit der 1,1 wechseln.
Das heißt, ich komme von der 0 auf die 1.
Genauso wie ich mit der 1 bin, kann ich hier den aktuellen Zustand
speichern, ist die 1.
Ich kann resetten, ist die 0.
Ich kann setzen, ist die 1.
Und ich kann den internen Zustand wechseln, komme ich von der 1 auf
die 0.
Okay, soweit sollte das klar sein?
Kein Problem, oder?
Wer hat damit Probleme?
Gut, dann schrauben wir die Schwierigkeit ein bisschen höher.
Wir wollen jetzt dieses Flipflop mit einem D-Flipflop implementieren.
Das heißt, wir betrachten jetzt, wie müsste ich einen D-Flipflop
ansteuern, um genau dieses Verhalten zu erreichen.
Dazu betrachte ich einmal meinen Anfangszustand Qt und den
Folgezustand Qt plus 1 und füge eine neue Spalte hinzu, die die
Eingabebelegung meines neuen Flipflops entspricht.
In unserem Fall ein D-Flipflop und stelle dann fest, ich brauche, um
von 0 auf die 0 zu kommen, eine Eingabebelegung von 0 auf D, von 0 auf
0 eine 0, 0 auf 1 eine 1.
Also im Grunde nehme ich diese Spalte hier und kopiere sie dahin.
Funktioniert natürlich nur beim D-Flipflop, beim ES würde es ein
bisschen anders funktionieren.
So, dann kann ich sagen, wie müsste dann mein D als Schaltfunktion
realisiert sein, in Abhängigkeit von Qt, J und K.
Ich komme dann hier auf diesen Term.
Das kann ich machen mit dem KV-Diagramm, das kann ich machen, wenn ich
es ganz oft schon gemacht habe und es direkt sehe, oder man rechnet es
einfach algebraisch aus.
Ja, verschiedene Möglichkeiten.
Also, zusammenfassend, links haben wir alle möglichen Kombinationen
des aktuellen Zustands Qt und den Eingabevariablen J und K.
Rechts haben wir den Folgezustand und die daraus resultierenden
Ansteuerwerte meines neuen Flipflops.
Wie gesagt, in unserem Fall das D-Flipflop.
Und wir wollen die Ansteuervariable D aus den Variablen Q, J und K
erzeugen.
Qt in dem Fall.
Und das mache ich dann, indem ich hier minimiere und ich komme dann
hier auf die Funktion Qt und nicht K oder nicht Qt und J.
So, wie sieht die Implementierung aus?
Ich habe hier ein Schaltnetz, das sieht genau so aus.
Ich habe hier mein Q als Eingabe, ich habe hier das Nicht-K als
Eingabe, das entspricht diesem Term hier.
Ich verunde das.
Ich habe auf der rechten Seite Nicht-Q und J.
Hol ich mir von hier, das ist mein Nicht-Q, das ist mein J, verunde
das beide und das Ergebnis von beiden wird geodert und dient als
Eingabe in meinem D-Flipflop.
Zusätzlich zu einem Takt-Symbol kann ich jetzt hier wieder so einen
schönen blauen Rahmen drumherum machen und habe dann hier eine
Implementierung des JK-Flipflops mit einem D-Flipflop erreicht.
Schaltsymbol soll so aussehen, also J und K als Eingaben, hier meine
Taktflanke und wie gewöhnlich Q und Nicht-Q als Ausgabe.
So, nehmen wir es wieder weg.
Wie kriege ich jetzt meine Ansteuertabelle für meinen JK-Flipflop?
Das kann ich aus meiner verkürzten Funktionstabelle erreichen, das
heißt ich habe hier mein JK, habe hier meine Funktion, die jeweils
erreicht wird, kann daraus dann diese Tabelle ausfüllen, das heißt ich
schaue, wie komme ich denn von meinem Zustand Qt auf den folgenden
Zustand Qt plus 1, das erreiche ich hier mit 0, don't care, wie komme
ich von der 0 auf die 1, mit 1, don't care, don't care 1 und don't
care 0.
Bisschen detaillierter betrachtet, interner Zustand wie bei jedem
Flipflop sind zwei Zustände, einmal 0 und 1, hier unsere Tabelle, die
wir eigentlich ausfüllen wollen, dann was für Möglichkeiten habe ich,
also genauso wie vorhin beim RS-Flipflop, was für Möglichkeiten habe
ich, wenn ich im Zustand 0 bin, im Zustand 0 zu bleiben?
Ich kann einmal speichern und einmal rücksetzen, das ist quasi genau
das gleiche wie beim RS-Flipflop, nur hier haben wir jetzt die
Eingabebelegungen J und K und ich kann es erreichen mit jeweils 0, 0
und 0, 1, das heißt hier kann ich das 0 und die 1 des Ks
zusammenfassen zu einem don't care, das heißt ich lande dann hier bei
einem 0, don't care und 0, don't care ist dann das, was ich dann hier
eintragen muss.
Von 0 nach 1 habe ich jetzt eine Möglichkeit mehr als beim RS
-Flipflop, ich habe nämlich beim RS-Flipflop nur die Möglichkeit
gehabt zu setzen.
Ich konnte ein Set machen von 0 auf 1, also ich setze direkt eine 1 in
meinen Speicher, hier kann ich sagen, ich will noch wechseln, also ich
wechsle den internen Zustand, ich kippe das Bit von 0 auf die 1, hier
entspricht das dann dem Fall 1, 0 und 1, 1, hier kann ich wieder das K
zusammenfassen zu einem don't care und lande dann bei einem 1, don't
care, trage ich dann hier in meiner zweiten Zeile ein.
Rückwärts genauso, hier kann ich auch wieder rücksetzen und wechseln,
auch wieder eine Eingabebelegung mehr als beim RS-Flipflop und
resultiert in einem don't care 1, was dann hier in die dritte Zeile
kommt und letztendlich der vierte Übergang ist genauso wie beim RS
-Flipflop, einmal speichern und einmal setzen, auch hier kann ich
wieder zusammenfassen, kommen wir auf die don't care 0.
Also so entsteht die Tabelle und diese Tabelle nennen wir die Ansteuer
-Tabelle.
Erstmal vielleicht dazu fragen, wer hat es nicht verstanden?
Alle haben es verstanden, super.
Gut, dann machen wir weiter.
Wir haben die synchronen Eingänge betrachtet, das sind hier unser 1j
und 1k.
Zusätzlich zu diesen synchronen Eingängen können wir noch asynchrone
Eingänge haben.
In unserem Fall wollen wir zum Beispiel ein R definieren, daran zu
erkennen, dass hier keine 1 weder davor noch dahinter ist und dieses R
soll ein Reset sein.
Und zwar wollen wir nämlich das Flipflop auf den Ausgangszustand
zurücksetzen, das heißt wir wollen den internen Zustand auf die 0
setzen und das passiert hier asynchron.
Wenn wir uns jetzt hier die... mal gucken, ob da eine Animation drin
ist...
ist eine drin.
Wenn wir uns hier das Inputs-Diagramm anschauen, haben wir hier den
Takt, ich reagiere hier immer auf den Auftakt, also hier sind meine
Flanken.
Ignoriere ich zuerst meinen Reset-Eingang, wie würde mein
Ausgabesignal aussehen?
Ich habe genau an dieser Stelle einen J1 K0, das heißt ich setze hier
meinen Ausgang, das heißt hier müsste es hochgehen bis hier hin.
An dieser Stelle habe ich einen J0 K0, entspricht meinem Speichern,
also ich behalte meinen internen Wert bei.
Hier habe ich einen Wechsel, Jump1 und Kill1, also hier switche ich
meine Ausgabe.
Und an der letzten Stelle habe ich hier ein K gleich 1 und Wert gleich
0, das heißt ich kille.
Ich setze hier wieder zurück auf die 0, würde dann hier auf der 0
bleiben.
Was passiert jetzt aber, wenn ich den Reset-Eingang betrachte?
Mein Reset-Eingang, wohlgemerkt, ist hier asynchron, das heißt er
reagiert hier auch ohne Taktflanke.
Und sobald jetzt hier Reset getriggert, setzt mein Flipflop zurück und
geht bei der 0 weiter.
Jetzt habe ich an dieser Stelle aber gesagt, normalerweise würde ich
von 1 auf 0 wechseln, weil mein Flipflop hier sagt 1 1, also switch.
Das heißt hier müsste ich hochgehen, würde dann bei der 1 bleiben und
hier würde ich dann wieder auf die 0 zurückgehen.
Und genau so sieht das Ergebnis aus.
Fragen dazu?
Asynchroner Reset-Eingang.
Wofür brauche ich den?
Einmal brauche ich ihn natürlich beim Initialisieren meines
Schaltwerkes, weil wenn ich mein Schaltwerk anwerfe, dann ist er in
einem undefinierten Zustand.
Und wenn ich in einem undefinierten Zustand starte, dann kann alles
mögliche passieren.
Abhängig natürlich vom Flipflop, das ich jetzt habe.
Zum anderen haben wir hier die Bezeichnung, aber das habe ich schon
gesagt glaube ich, dass wir hier daran erkennen, dass hier keine 1
wieder davor noch dahinter ist, dass es sich hier um einen asynchronen
Eingang handelt.
So, dann wollen wir zum letzten Flipflop, das T-Flipflop.
T für Toggle, also Kippen.
Und dieses T-Flipflop besitzt nur einen Eingang.
Und dieser eine Eingang soll, wenn er gesetzt ist, dafür sorgen, dass
mein interner Zustand kippt, also sich verändert.
Also, habe ich eine interne 1, kippe ich auf die 0, habe ich eine
interne 0, kippe ich auf die 1.
Habe ich dann die 0 als Eingang, das ist vielleicht noch wichtig, also
dieses Kippen ist nur, wenn ich hier eine 1 an meinem Eingang habe,
habe ich eine 0 an meinem Eingang, so wird natürlich der interne
Zustand beibehalten.
Implementierung ist recht einfach, weil wir jetzt das JK-Flipflop
schon kennengelernt haben und in dem JK-Flipflop haben wir genau diese
Funktion auch schon implementiert.
Wir haben gesagt, wenn J und K gleich 1 sind, dann soll gekippt
werden, wenn J und K gleich 0 sind, dann soll der interne Zustand
beibehalten werden.
Das heißt, ich kann jetzt hier eine Eingangsvariable definieren, die
ich an J und auch an K durchreiche.
Das heißt, wenn jetzt hier eine 1 anliegt, dann liegt eine 1 an J und
eine 1 an K an, das heißt, mein Flipflop wird angewiesen, den Zustand
zu wechseln.
Liegt hier eine 0 an E an, so ist eine 0 an J und eine 0 an K, das
heißt, das Flipflop wird hier angewiesen, den internen Zustand
beizubehalten.
So sieht mein Schaltbild aus, von meinem T-Flipflop, synchrones T
-Flipflop natürlich, hier mit einer Taktflankensteuerung, einmal mit T
für den Takt und einmal E für Eingabe, könnte man natürlich auch T als
Eingabe nennen.
Funktionstabelle ist recht einfach, ich habe hier Eingabe 0 und 1, bei
0 wird gespeichert, bei 1 wird der Zustand invertiert.
Das Problem hier ist natürlich, dass ich jetzt keinerlei
Anfangszustand definiert habe, das heißt, ich kann dem Flipflop nicht
sagen, es soll den Zustand 0 annehmen.
Ich kann auch nicht sagen, er soll den Zustand 1 annehmen, ich kann
nur sagen, ändere deinen Zustand.
Das heißt, nur mit dem Eingang E ist ein Rücksetzen nicht möglich.
Das bedeutet aber auch zusätzlich, dass ich jetzt hier einen weiteren
Rücksetzeingang benötige, und zwar sowas wie den Reset-Eingang, den
wir uns vorhin angeschaut haben beim JK-Flipflop.
Ansteuertabelle des T-Flipflops, haben wir gesagt, hier Folgezustand
und hier habe ich meine Eingabe, also mit welcher Eingabe erreiche ich
diesen Zustandswechsel.
Und das ist recht einfach, wenn ich hier gleich bin, habe ich eine 0,
wenn sich hier der Zustand wechselt, habe ich jeweils eine 1.
Und wenn 1,1 ist, habe ich auch wieder den gleichen Zustand, das
heißt, ich bleibe dann hier wieder bei einer 0.
Zusammenfassend haben wir jetzt vier neue Flipflops kennengelernt,
oder drei neue und eins ein bisschen spezieller.
Erst einmal das RS-Flipflop, das Asynchrone, das kannten wir ja schon,
haben wir hier gesagt, dass R gleich S gleich 1 ist verboten, das
sechste Mal glaube ich jetzt.
Daraus haben wir aber auch dieses RS-Latch abgeleitet, also den
pegelgesteuerten RS-Flipflop.
Dann haben wir das D-Flipflop kennengelernt, den D-Latch, den
pegelgesteuerten, wo wir gesagt haben, man kann es bauen aus einem RS
-Flipflop, wenn wir hier R und S negiert anschließen, dann haben wir
einen D-Flipflop, dadurch wird dieses Verbot aufgehoben.
Wir haben auch gesagt, um dieses Verbot zu umgehen, haben wir beim JK
-Flipflop die Möglichkeit, diese verbotene Eingabebelegung zu
verändern und daraus eine neue Funktion zu basteln, das wäre hier
kippen.
Und dann haben wir noch das T-Flipflop kennengelernt, wo wir gesagt
haben, es hat nur einen Eingang und kippt immer nur den internen
Zustand.
Okay, ich glaube, hier nochmal das wichtigste Hilfsmittel, was man
hier braucht, sind tatsächlich die Ansteuertabellen der verschiedenen
Flipflops.
Also RS, was passiert?
Wie komme ich von einem gegebenen Anfangszustand in den Folgezustand?
Was muss ich an den jeweiligen Flipflops als Eingabebelegung anlegen,
um genau diesen Zustandsübergang zu erreichen?
Einmal für das RS-Flipflop, für das JK-Flipflop, für das D-Flipflop
und das T-Flipflop.
Das könnt ihr auswendig lernen, das könnt ihr euch herleiten, wenn ihr
verstanden habt, wie die Flipflops funktionieren, wenn ihr euch die
Kürzel gemerkt habt, also R für Reset, S für Set, könnt ihr euch das
sofort herleiten.
Wenn ihr JK euch gemerkt habt mit Jump und Kill, könnt ihr euch das
auch herleiten.
Wenn ihr beim D-Flipflop euch gemerkt habt, dass es für Data steht
vielleicht, also übernehmt das Datenwort vom Eingang, dann kann man es
sich auch sofort herleiten und T-Flipflop mit Toggle sollte auch recht
trivial sein.
Egal, wie ihr es macht, diese Anstellentabellen solltet ihr können,
weil ohne diese Tabellen können wir dann die bestimmten Aufgaben, die
wir jetzt nachher nochmal kurz anschauen werden, nicht lösen.
Das heißt, das ist ein ganz wichtiges Lösungsmittel für euch.
So, dazu Fragen?
Keine Fragen, sehr schön.
Dann machen wir weiter, liegen gut in der Zeit.
Wir betrachten jetzt den Entwurf synchroner Schaltwerke.
Wie stellt man Automatengrafen auf?
Wie stellt man die Automatentafel auf?
Was für eine Zustandscodierung wählt man?
Wie baut man die Ausgabe- und Übergangsschaltnetze?
Und wir wollen das Ganze später mit einem Folgenerkenner
demonstrieren.
Aber zunächst einmal wollen wir das Ganze an einem Beispiel erläutern,
und zwar am Beispiel des Serienaddierers.
Was ist ein Serienaddierer?
Ein Serienaddierer addiert zwei beliebig lange Dualzahlen
stellenweise.
Dazu fängt die Addition mit der niederwertigsten Stelle an, also mit
der Stelle der niedrigsten Wertigkeit.
Ich stelle euch einen Bitstream vor von 0.1.1.1.0.0.0.1, irgendwas
unter zwei Bitstreams.
Und wir wollen jetzt wie bei der normalen Addition von hinten anfangen
und jeweils die einzelnen Stellen zusammen addieren und daraus dann
eine Summe generieren.
Dazu ist natürlich wichtig, wie bei der normalen Addition auch, dass
man den Übertrag beachtet.
Das heißt, wenn ich 0.0 addiere, kommt 0 raus, wenn ich 1.0 addiere,
kommt der 1 raus.
Wenn ich aber 1.1 addiere, bekomme ich eine 0 und habe den einen
Übertrag, den ich übernehmen muss, auf die nächste Stelle.
Die Zahlen kommen bitweise an und in jedem Taktschritt bekommen wir
eine Stelle.
Und die Ausgabe soll auch bitweise erfolgen.
Dabei soll zu jedem Zeitpunkt die Ausgabe der Summe der bisherigen
Eingabefolgen entsprechen, ohne dass man diesen Übertrag beachtet.
Ich gehe nochmal ein bisschen detaillierter darauf ein gleich.
Zunächst mal wollen wir den Automatengrafen aufstellen.
Dazu definieren wir unsere zwei Eingabevariablen in Folge.
Einmal x als unsere erste Zahl, einmal y als die zweite Zahl und wir
wollen die Ausgabe s produzieren, was der Summe entsprechen soll.
Was brauchen wir jetzt in jedem Additionsschritt?
Wir brauchen eigentlich als Vorgeschichte lediglich den Übertrag aus
der vorherigen Addition.
Alles andere interessiert uns nicht.
Aus dem Übertrag und den zwei Stellen meines Bitstreams kann ich dann
hier sofort die Summe berechnen und kann dann nochmal den Übertrag
erzeugen, den ich für die nächste Stelle weitergebe.
Das heißt, wir brauchen nur zwei Zustände.
Wir brauchen einmal den Zustand Ü für Übertrag oder wie Tamim sagen
würde, U-Umlaut und wir haben den K-Ü für kein Umlaut.
Kein Umlaut, kein Übertrag natürlich.
Also Ü für Übertrag und K für kein Übertrag.
Das sind unsere zwei Zustände, die wir benötigen.
Wie sieht das Blockschaltbild meines Serienaddierers aus?
Ich habe hier einmal XT, also zum Zeitpunkt T habe ich eine Eingabe
für X, zum Zeitpunkt T habe ich eine Eingabe für Y.
Ich produziere zum gleichen Zeitpunkt die Summe daraus und ich
produziere hier meinen Übertrag aus der Summe.
Und ich muss natürlich diesen Übertrag mir merken für den nächsten
Additionsschritt.
Das heißt, dieses ZT plus 1 geht dann weiter und wird im nächsten
Schritt als ZT wieder in dieses Addier-Schaltennetz gespeist.
Das heißt, hier haben wir unser Schaltennetz und hier gibt es dann
unser Flipflop, unser Schaltwerk, was genau dieses Speichern des
Zustandes für uns übernimmt.
Wie sieht der Automatengraph aus?
Wir haben hier zunächst mal mit einem Mili-Schaltwerk das Ganze
implementiert.
Warum?
Weil unsere Ausgabe, also die Summe, von der Eingabe abhängt.
Also abhängig von dem, was mein Eingabestream mir sagt, produziere ich
eine andere Ausgabe und das kann ich natürlich hier nur mit einem Mili
-Schaltwerk machen.
Und in unserer Interpretation, dass wir sagen, unsere zwei Zustände
unterscheiden sich, K für keinen Übertrag und Ö für Übertrag, muss ich
dann natürlich auch ein Mili-Schaltwerk benutzen.
Automatengraph sieht so aus.
Also hier die Legende, wir haben hier unseren Startzustand, kein
Übertrag.
Logischerweise, wenn ich anfange zu addieren, habe ich zunächst mal
keinen Übertrag.
Ich habe hier meine Übergangspfeile, die jeweils dem X und dem Y
entsprechen und dann noch eine Summe produzieren.
Also, zwei Kreise, mein Startzustand, K, Ü.
Wenn ich in K, Ü bin und ich bekomme jetzt eine 0, 0, dann addiere ich
die 0 und die 0, produziere als Ausgabe eine 0 und ich habe keinen
Übertrag für die nächste Addition.
Das heißt, ich bleibe in meinem K, Ü.
Habe ich eine 0 und die 1, addiere ich die 0 und die 1, komme ich
binär auf die 1, produziere als Ausgabe eine 1 und habe wieder keinen
Übertrag.
Das heißt, ich bleibe hier wieder im gleichen Zustand.
1, 0, genauso.
Ich habe als Summe 1, also meine Ausgabe ist die 1 und mein
Folgezustand ist immer noch kein Übertragszustand.
Erst wenn ich die 1 und die 1 addiere, produziere ich hier die Summe
0, weil 1 plus 1 binär die 1, 0 ist.
Das heißt, hier ist meine Summe 0 und ich gehe in den Zustand Ü über
für Übertrag.
Und zwar ist es die 1, die ich vorne dran hatte.
Wenn ich jetzt in diesem Zustand Ü, sieht meine Addition ein bisschen
anders aus.
Ich muss beide Variablen addieren und ich muss zusätzlich nochmal eine
1 drauf addieren, weil ich muss ja den Übertrag aus der vorherigen
Addition mit betrachten.
Das heißt, ich habe hier eine 1 plus 0 plus 1 und auf die 1, 0.
1, 0 bedeutet 0 als Ausgabe und 1 als Übertrag.
Das heißt, ich bleibe im gleichen Zustand.
Ich habe eine 1 plus 1 plus 0, ist wieder die 1, 0.
Selbe Geschichte.
Ich habe hier eine 1 plus 1 plus 1, ist binär die 1, 1.
Das heißt, ich produziere die hintere Stelle, die 1, als Ausgabe und
bleibe wieder in meinem Übertrag.
Nur wenn ich die Eingabebelegung 0, 0 habe, habe ich hier 1 plus 0
plus 0, habe das Ergebnis 1 und erzeuge diesmal aber keinen Übertrag.
Das heißt, hier muss ich dann meinen Zustand von Ü nach KÜ wechseln.
Okay?
Hat es jeder verstanden?
Wer hat es nicht verstanden?
Gut, leider.
Nächster Schritt.
Wir wollen die Automatentafel aufstellen.
Dazu betrachten wir unseren Automaten-Graphen, den wir hier erzeugt
haben und haben hier die Vorlage für unsere Automatentafel.
Links haben wir unsere Zustände KÜ und Ü.
Auf der rechten Seite haben wir in den jeweiligen Spalten haben wir
einmal den Folgezustand Z plus und S als Ausgabe.
Also das wollen wir hier drin haben.
Und wir haben hier die Eingabebelegung XY.
Also...
Angenommen, ich bin in meinem Zustand KÜ.
Ich habe die Eingabebelegung XY00.
Also das ist genau dieser Fall hier.
Dann ist mein Folgezustand KÜ und meine Ausgabe ist 0.
Bin ich im Zustand kein Übertrag, habe die Eingabebelegung 01.
Diese Zeile hier.
Dann produziere ich die Ausgabe 1 und bleibe im Folgezustand KÜ.
Das heißt, ich habe hier KÜ Strich 1.
1, 0.
Genauso.
Ich habe die Ausgabe 1, bleibe in meinem Folgezustand KÜ und bei 1, 1
habe ich den Wechsel in den Zustand Ü.
Das heißt, mein Folgezustand hier ist Ü und meine Ausgabe ist 0.
Okay?
Wer hat das nicht verstanden?
Wer kennt das schon?
1, 2.
Okay.
Also für den Rest ist es neu.
Machen wir weiter.
Ich bin im Zustand Ü, habe die Eingabebelegung 00.
Das heißt, hier habe ich einen Wechsel auf KÜ und meine Ausgabe ist 1.
Und hier bei den anderen drei Fällen habe ich jeweils die Ausgabe 001
und ich bleibe im Folgezustand Ü.
Also 001 und der Folgezustand ist jeweils Ü.
Ihr solltet das hier kennen aus Asynchronschaltwerken.
Bei Asynchronschaltwerken haben wir hier die stabilen Zustände
definiert.
Wir haben gesagt, bei einer bestimmten Eingabebelegung, wenn der
Folgezustand gleich dem aktuellen Zustand ist, dann reden wir hier von
stabilen Zuständen.
Falls ihr euch erinnert, es sah so aus, dass man hier gesagt hat, man
macht hier Kreise.
Wer kann sich daran erinnern?
Okay, immerhin ein paar mehr.
Gut, warum machen wir das jetzt hier nicht?
Weil wir das nicht brauchen, weil wir hier mit synchronen Schaltwerken
arbeiten.
Und wir gehen davon aus, dass unsere Eingabebelegung jedes Mal stabil
anliegt, wenn unser Taktzyklus sich ändert.
Das heißt, hier müssen wir tatsächlich nicht mehr die aktuellen
Zustände, die Folgezustände oder die aktuellen Zustände betrachten und
hier instabile oder stabile Übergänge betrachten.
Wahl der Zustandscodierung.
Ihr erinnert euch, glaube ich, auch, das wurde schon besprochen bei
den asynchronen Schaltwerken.
Wir haben gesagt, bei den asynchronen Schaltwerken ist die Wahl der
Zustandscodierung sehr, sehr kritisch.
Weil abhängig von dieser Zustandscodierung kann mein Schaltwerk
funktionieren oder nicht funktionieren.
Wenn ich in diese Loop komme, dass ich von einem instabilen Zustand in
den nächsten instabilen Zustand springe, kann es sein, dass mein
Schaltwerk überhaupt nicht funktioniert.
Das heißt, die Wahl der Zustandscodierung ist bei asynchronen
Schaltwerken sehr, sehr kritisch.
Bei synchronen Schaltwerken ist sie unkritisch.
Aus den gleichen Gründen, die wir vorhin genannt haben.
Es funktioniert grundsätzlich mit jeder eindeutigen Zustandscodierung.
Also hier sehr wichtig, dass wir hier eindeutig sind.
Allerdings können wir durch die Wahl einer guten Zustandscodierung den
Schaltungsaufwand ein wenig reduzieren.
Allgemein haben wir gesagt, für K-Zustände ist die minimale Anzahl der
Flip -Flops der Obergrenze des Logarithms Duales bei einer Zustände K.
Was heißt das?
Das heißt, wenn ich zwei Zustände habe, brauche ich einen Flip-Flop.
Wenn ich vier Zustände habe, brauche ich zwei Flip-Flops.
Bei acht brauche ich drei und so weiter.
Was brauche ich bei zwölf?
Vier.
Was brauche ich bei sechzehn?
Auch vier.
Weil, Obergrenze.
In unserem Fall für den Serienadderer ist die Zustandscodierung
trivial, weil wir nur zwei Zustände haben.
Das heißt, für zwei Zustände brauche ich nur einen Flip-Flop und ich
brauche also nur eine Zustandsvariable.
In unserem Fall nennen wir diese Zustandsvariable Ü für Übertrag und
definieren, dass Ü null ist, wenn kein Übertrag ist und Ü eins ist,
falls ein Übertrag existiert.
Die Ausgabe in Übergangsschaltnetze.
Was machen wir hier?
Wir setzen erstmal die Zustandscodierung in unsere Automatentafel ein
und dann wollen wir die codierte Ablauftabelle des Schaltwerkes
nochmal betrachten.
Das heißt, das war unsere Automatentafel, die wir vorhin hergeleitet
haben aus unserem Automatengrafen.
Hier wollen wir jetzt unsere Zustandscodierung entsprechend einsetzen.
Das heißt, statt KÜ schreibe ich jetzt 0 und statt Ü schreibe ich
jetzt 1.
Dann habe ich hier auf der rechten Seite meine codierte Ablauftabelle
und will hier für jede Kombination von aktuellem Zustand und
Eingabebelegung einen Folgezustand und die Ausgabe generieren.
Die kann ich quasi aus der Tabelle ablesen.
Das heißt, wenn ich hier im Zustand Ü0 bin, bin ich in der ersten
Zeile, habe ich hier eine Eingabebelegung von X und Y gleich 0,0 bin
ich in der ersten Spalte.
Das heißt, mein Folgezustand ist 0, ist mein ÜT plus 1 und meine
Ausgabe ist S, ist hier auf der rechten Seite auch 0.
Betrachte ich die zweite Zeile, habe ich hier den Zustand 0, habe X
und Y jeweils 0,1 als Eingabe.
Das heißt, ich bin in der zweiten Spalte.
Mein Folgezustand ist die 0, mein ÜT plus 1 ist 0, meine Ausgabe ist
die 1.
Soweit ist klar, glaube ich.
Das macht man dann für die ganze Automatentafel.
Hier ist natürlich interessant, wir haben gesagt, wir haben ja die
Zustandscodierung eingesetzt, das heißt, überall wo mein aktueller
Zustand 0 ist, entspricht eigentlich meinem Zustand KÜ für keinen
Übertrag.
Überall wo mein ÜT 1 ist, entspricht eigentlich dem Zustand Ü für
Übertrag.
Soweit so klar?
Nächster Schritt.
Wir können hier schon vielleicht zunächst mal Anmerkungen.
Aus dieser codierten Ablauftabelle, also aus dem hier,
kann man bereits Funktionsausdrücke für die Ausgabe Schaltnetze
ableiten.
Das heißt, unsere S, also unsere Ausgabe S, können wir hier schon
direkt erzeugen.
Das ist nichts anderes als eine Funktion, die am Anfang des Semesters
mit KV-Diagrammen zum Beispiel gelöst hat.
Wir können, für die Erzeugung der Überführungsfunktion, brauchen wir
zuerst mal den Typ des Flipflops, den wir verwenden wollen.
Das heißt, wir wollen wissen, wie will ich denn überhaupt meinen
Serienadderer implementieren.
Ich könnte einen JK-Flipflop, einen D-Flipflop, T-Flipflop oder auch
einen RS-Flipflop benutzen.
Hier muss ich mich festlegen.
Abhängig davon, welchen Flipflop-Typ ich hier wähle, muss man
natürlich auch die Ansteuerung anders machen.
Und natürlich, die Wahl des Flipflops beeinflusst die Größe der
Überführungsschaltnetze.
Und auch eine Güte der Zustandskodierung kann erst bestimmt werden,
wenn wir den Flipflop-Typ kennen.
Wir wollen hier das Ganze mit einem JK-Flipflop realisieren.
Wir erinnern uns, das ist die Ansteuertabelle eines JK-Flipflops.
Das sind meine Anfangszustände, meine Folgezustände und das sind die
Belegungen des JK-Flipflops, die ich anlegen muss, um genau diese
Funktion zu erreichen.
Wir gehen zurück auf die kodierte Ablauftabelle.
Also das ist genau das, was ihr auf dem vorherigen Folien gehabt habt.
Der Fokus liegt jetzt hier auf meinem Zustand UT und im Folgezustand
UT plus 1.
Da wir gesagt haben, wir wollen einen JK-Flipflop verwenden, brauche
ich hier meine Ansteuerleitungen für meinen JK-Flipflop, also einmal J
und K.
Und ich muss jetzt für jede Zeile bestimmen, wie gelange ich von
meinem aktuellen Zustand UT
auf den Folgezustand UT plus 1.
Dafür brauche ich meine Ansteuertabelle.
Das heißt, ich betrachte jetzt, wie komme ich von 0 nach 0.
Und das ist in diesem Fall ein Null-Don't-Care.
Das heißt, ich kann hier ein Null-Don't-Care eintragen.
Wie komme ich von...
Das kennen wir schon, das kennen wir auch schon.
Das Erste, wo es sich ändert, ist hier von 0 auf 1.
Also Null-Don't-Care, Null-Don't-Care, Null-Don't-Care.
Wenn ich von 0 auf die 1 will, wenn ich von 0 auf die 1 will,
betrachte ich hier diese Zeile und merke, ich brauche ein J1 und ein K
-Don't -Care.
Also 1-Don't-Care.
Dann habe ich hier ein 1-0 und schließlich ein 1-1.
Und dann der Rest bleibt auf 1-1.
Das heißt, ich habe hier ein Don't-Care-1 als nächstes und danach ein
Don't -Care-0 für den Rest der Tabelle.
Soweit so klar?
Wer hat das nicht verstanden?
Ich bin im Übungsmodus, ich frage euch immer noch, ob ihr das
verstanden habt.
Aber ihr könnt ruhig einwerfen, falls euch das zu schnell geht oder
falls euch irgendwas nicht klar ist.
Dann könnt ihr ruhig unterbrechen.
Ich glaube, das ist die vorletzte Folie, wenn ich mich recht erinnere.
Der nächste Schritt ist, dass man tatsächlich diese Funktion
herleitet.
Das heißt, wir nehmen jetzt J als Ausgabe der Funktion von Ü, X und Y.
Das Ü, X und Y habe ich in meinem KV-Diagramm und habe hier mein J
eingetragen.
Die großen X hier sind meine Don't-Cares.
Ich mache das Gleiche hier für J, einmal für K.
Also komplementär auf der rechten Seite hier Don't-Cares, auf der
linken Seite hier Don't-Cares.
Hier habe ich die Funktionswerte.
Das S haben wir gesagt, das konnten wir schon direkt machen, bevor wir
überhaupt das J und K bestimmt haben, konnten wir schon die
Funktionsgleichung für S bestimmen, beziehungsweise die Min-Therme für
das S bestimmen und in unser KV-Diagramm eintragen.
Der nächste Schritt ist jetzt einfach, dass wir sagen, wir optimieren.
Wir suchen unsere Premium-Likanten, können einmal hier diesen Block
zusammenfassen, können für das K einmal diesen Block zusammenfassen.
Für das S gibt es leider nicht so eine tolle Möglichkeit.
Hier hat man tatsächlich nur die einzelnen Min-Therme, die man
zusammenfassen muss.
Bisschen tief.
Und daraus ergibt sich dann tatsächlich einmal hier, für das J ein Y
und X, für das K ein Nicht-Y, Nicht-X, also Nicht-X, jeweils T für den
Zeitpunkt T.
Könnte man jetzt hier aber auch erstmal weglassen.
Und für das S hätte man natürlich die einzelnen Min-Therme, vier
Stück, die dann jeweils diesen Min-Thermen hier entsprechen.
Zusammenfassend kann man hier auch sagen, das ist ein Äquivalenz
-Therm, also wenn X äquivalent ist zu Y oder äquivalent ist zu Ü, also
wenn alle drei gleich sind, dann hat man hier eine Eins-Belegung.
So, jetzt haben wir die Funktions- Funktionen haben wir jetzt bestimmt
für J, K und S.
Und der letzte Schritt ist tatsächlich die Implementierung.
Wenn wir uns die Implementierung anschauen, haben wir einmal
hier unsere Ausgabe S als ein Verodern von vier Thermen.
Das ist unser Oder.
Das sind die vier Uns, die da reinlaufen.
Dann haben wir hier X, Nicht-Y, Ü zum Beispiel.
Das ist Nicht-X, das hier ist Nicht-Ü und das hier ist Y.
Also Nicht-X, Nicht-Ü und Y.
War das richtig?
Ja, das ist dieser Term hier.
Und das sind die vier einzelnen Imimplikanten oder Min-Thermen in
diesem Fall.
Für die Ansteuerung J unseres Flip-Flops hier haben wir X und Y.
Das heißt, ich habe hier ein Und von X, Y und X.
Und ich habe hier für das K einmal Nicht-X und einmal Nicht-Y.
Also hier das Schaltnetz, hier unser Flip-Flop und hier die
Rückleitung zu dem Schaltnetz selber.
Genau.
Was man hier jetzt noch machen kann, ist die Initialisierung mit dem
invertierten asynchronen Reset-Eingang.
Hier zu sehen an dem Kreis.
Und dass es invertiert ist, das signalisiert man dadurch, dass man
hier über dem Initialisierungseingang die Negation drüber laufen hat.
Und hier natürlich der Takt.
Und damit hat man dann N-Serien-Addierer realisiert.
Fragen dazu?
Keine?
Super.
Dann sind wir, glaube ich, durch.
Ich bedanke mich und bis zum nächsten Mal.