Flipflops sind nicht-getaktete einfache Schaltwerke, die als wiederbeschreibbarer Speicher für ein Bit eingesetzt werden. Man unterscheidet sie in zwei Aspekten:
(1) Nach der Art, wie das Bit gesetzt bzw. gelöscht wird:
R-S-Flipflop, J-K-Flipflop, D-Flipflop
(2) Ob (und wie) ein Eingang als "Takt" verwendet wird:
R-S-Latch, Pegel-Steuerung, Flanken-Steuerung
Man beachte, dass Flipflops immer nicht-getaktete Schaltwerke sind, weil die Rückkopplung nur Verzögerungen enthält. Der "Takt" ist aus Sicht des Flipflops ein Eingang des Schaltwerkes, und zwar jener, der bei Einsatz des Flipflops als Takt-gesteuertes Zeitglied in einem getakteten Schaltwerk der Takt dieses getakteten Schaltwerks ist.
Nachfolgend sind für die wichtigsten Typen jeweils das Zustandsdiagramm und die Flusstafel sowie ein typisches Signalspiel und das Schaltbild einer typischen Realisierung angegeben.
Pegel-gesteuertes R-S-Flipflop
Der einfachste Flipfloptyp ist das R-S-Flipflop (auch S-R-Flipflop oder NOR-Basis-Flipflop). Das folgende Bild zeigt das Moore-Modell inklusive der logischen Verknüpfungen:
drawnorffmoore % Moore-Modell
Dem Modell entnimmt man die schaltalgebraischen Ausdrücke für die beiden Zustandsbits:
z1next = Q = NOR(z2, R)) = ~(z2|R) z2next = Q' = NOR(z1, S)) = ~(z1|S)
Hieraus ergibt sich die Flusstafel:
Zustand Zustand- | Input-Index: 1 2 3 4 |
---|---|
Z1,Z2 Index | Bitmuster S,R: 00 01 11 10 |
00 1 | Folgezustand 11(3) 01(2) 00(1) 10(4) |
01 2 | Folgezustand 01(2) 01(2) 00(1) 00(1) |
11 3 | Folgezustand 00(1) 00(1) 00(1) 00(1) |
10 4 | Folgezustand 10(4) 00(1) 00(1) 10(4) |
Die Zustands-Indices tragen wir in die Matrix utab ein und geben in zcod und xcod die Binärcodierung für die jeweiligen Indices an. In xnam notieren wir noch die üblichen Bezeichnungen für die Eingänge in der Reihenfolge, die wir für die Bits der Codierung vorgesehen haben:
demofsm( ... [ 3 2 1 4 ; 2 2 1 1 ; 1 1 1 1 ; 4 1 1 4 ],... % Übergangstabelle {'00';'01';'11';'10'},... % Zusatndscodierung 2,... % Index des Anfangszustands 1,... % Schaltwertyp: nicht getaktet {'00';'01';'11';'10'},... % Inputcodierung 'S,R'... % Bezeichner der Inputs )
Ein typisches Signalspiel zeigt:
drawsigsnorff( {ceil(3*rand); ceil(3*rand)} )
Rufen Sie dies mehrfach auf, da der Anfangszustand und die Verzögerungen zufällig gewählt werden.
Das Schaltbild des NOR-Basis-Flipflops ist:
drawnorff % Schaltbild
Taktpegel-gesteuertes R-S-Flipflop
Aus dem Schaltbild
drawprsff % Schaltbild
entnimmt man die schaltalgebraischen Ausdrücke für die beiden Zustandsbits:
z1next = Q = NOR(z2, AND(R, C)) = ~(z2|(R&C)) z2next = Q' = NOR(z1, AND(S, C)) = ~(z1|(S&C))
Hieraus ergibt sich die Flusstafel:
Zustand Zustand- | Input-Index: 1 2 3 4 5 6 7 8 |
---|---|
Z1,Z2 Index | Bitmuster S,R,C:000 001 010 011 100 101 110 111 |
00 1 | Folgezustand 11(3) 11(3) 11(3) 01(2) 11(3) 10(4) 11(3) 00(1) |
01 2 | Folgezustand 01(2) 01(2) 01(2) 01(2) 01(2) 00(1) 01(2) 00(1) |
11 3 | Folgezustand 00(1) 00(1) 00(1) 00(1) 00(1) 00(1) 00(1) 00(1) |
10 4 | Folgezustand 10(4) 10(4) 10(4) 00(1) 10(4) 10(4) 10(4) 00(1) |
Die Zustands-Indices tragen wir in die Matrix utab ein und geben in zcod und xcod die Binärcodierung für die jeweiligen Indices an. In xnam notieren wir noch die üblichen Bezeichnungen für die Eingänge in der Reihenfolge, die wir für die Bits der Codierung vorgesehen haben:
demofsm( ... [3 3 3 2 3 4 3 1 ; ... 2 2 2 2 2 1 2 1 ; ... % Flusstafel 1 1 1 1 1 1 1 1 ; ... 4 4 4 1 4 4 4 1 ], ... {'00';'01';'11';'10'},... % Zustandscodierung 2 , ... % Index des Anfangszustands 1 , ... % Schaltwertyp: nicht getaktet {'000';'001';'010';'011';'100';'101';'110';'111'},... % Inputcodierung 'S,R,C' ... % Bezeichner der Inputs )
Ein typisches Signalspiel zeigt:
drawsigsprs
Rufen Sie dies mehrfach auf, da der Anfangszustand und die Verzögerungen zufällig gewählt werden.
Taktpegel-gesteuertes D-Flipflop
Wie bei den beiden vorangegangenen Flipfloptypen gehen wir aus von einem Schaltbild. Wir nehmen dabei ein anderes als das im vorigen Abschnitt hergeleitete Earle-Latch:
drawtpdff
Dem Schaltbild entnimmt man die schaltalgebraischen Ausdrücke für die beiden im Bild überkreuz laufenden Zustandsbits:
z1next = Q = NAND(z2, NAND(C,D)) = ~(z2&~(C&D)) z2next = Q' = NAND(z1, NAND(C, NAND(C,D))) = ~(z1&~(C&~(C&D)))
Hieraus ergibt sich die Flusstafel:
Zustand Zustand- | Input-Index: 1 2 3 4 |
---|---|
Z1,Z2 Index | Bitmuster D,C: 00 01 11 10 |
00 1 | Folgezustand 11(3) 11(3) 11(3) 11(3) |
01 2 | Folgezustand 01(2) 01(2) 11(3) 01(2) |
11 3 | Folgezustand 00(1) 01(2) 10(4) 00(1) |
10 4 | Folgezustand 10(4) 11(3) 10(4) 10(4) |
Die Zustands-Indices tragen wir in die Matrix utab ein und geben in zcod und xcod die Binärcodierung für die jeweiligen Indices an. In xnam notieren wir noch die üblichen Bezeichnungen für die Eingänge in der Reihenfolge, die wir für die Bits der Codierung vorgesehen haben:
demofsm( ... [3 3 3 3; 2 2 3 2; 1 2 4 1; 4 3 4 4],... % Flusstafel {'00';'01';'11';'10'},... % Zustandscodierung 2 , ... % Index des Anfangszustands 1 , ... % Schaltwertyp: nicht getaktet {'00';'01';'11';'10'},... % Inputcodierung 'D,C' ... % Bezeichner der Inputs )
Wir testen das Flipflop mit dem selben Input wie beim Earle-Latch:
drawsigscmp
Diese Form des D-Latches wird häufig verwendet. Man muss jedoch beachten, dass der Q'-Ausgang einen statischen 1-Hasard aufweist.
Übungsaufgabe: Wodurch wird der Hasard des Q'-Ausgangs verursacht und kann man ihn beseitigen?
Rückflanken-gesteuertes D-Flipflop
Wie bei den beiden vorangegangenen Flipfloptypen gehen wir aus von einem Schaltbild. Wir nehmen dabei ein anderes als das im Abschnitt 10.3 hergeleitete:
drawetdff('-',1)
Dem Schaltbild entnimmt man die schaltalgebraischen Ausdrücke für die vier im Bild angegebenen Zustandsbits:
z1next = NOR(z2, C, NOR(z1, D) z2next = NOR(C, NOR(z2, NOR(z1, D))) z3 = NOR(z2, z4) z4 = NOR(z1, z3)
Hieraus ergibt sich die Flusstafel, die in diesem Fall mithilfe der Funktion binexp2flusstafel automatisch erstellt wird:
delta = {'~(z2|C|~(z1|D))';'~(C|~(z2|~(z1|D)))';'~(z2|z4)';'~(z1|z3)'}; incod = {'D=0; C=0;'; 'D=0; C=1;'; 'D=1; C=1;'; 'D=1; C=0;'}; utab = binexp2flusstafel(delta,incod)
Damit ergibt sich das Zustandsdiagramm und die Graphik der Flusstafel:
zcod = {'0000';'0001';'0010';'0011';'0100';'0101';'0110';'0111'}; zcod = cat(1,zcod,{'1000';'1001';'1010';'1011';'1100';'1101';'1110';'1111'}); xcod = {'00';'01';'11';'10'}; xnam = 'D,C'; demofsm(utab,zcod,2,1,xcod,xnam)
Dies als Parameter eingetragen ergibt:
demofsm(... binexp2flusstafel(... {'~(z2|C|~(z1|D))';'~(C|~(z2|~(z1|D)))';'~(z2|z4)';'~(z1|z3)'},... {'D=0; C=0;'; 'D=0; C=1;'; 'D=1; C=1;'; 'D=1; C=0;'} ... ),... {'0000';'0001';'0010';'0011';'0100';'0101';'0110';'0111';... '1000';'1001';'1010';'1011';'1100';'1101';'1110';'1111'},... 2,... 1,... {'00';'01';'11';'10'},... 'D,C' ... )
Hier sollte man einige typische Signalfolgen durchspielen. Der Ausgang Q ist z3, also das dritte Bit der Zustandscodierung.
Wir testen das Flipflop ebenfalls mit vorgegebenen Inputsignalen:
drawsigsetdff
Vorderflanken-gesteuertes D-Flipflop
Durch Vergleich des folgenden Schaltbildes mit dem des rückflankengesteuerten Flipflops erkennt man, dass diese Typen gleich sind bis auf Inversion aller Variablen. Daher sind im Schaltbild NAND- und NOR-Verknüpfungsglieder gegeneinander getauscht:
drawetdff('+')
Zweiflankengesteuertes-Flipflop
Auch für diesen Typ geben wir eine übliche Realisierungsform als Schaltbild an:
draw2etdff
Es sei dem Leser als Übungsaufgabe überlassen, die Rückführungen als Zustandsvariable zu definieren und die schaltalgebraischen Ausdrücke für die Überführungsfunktion zu bestimmen. Wegen der grossen Zahl theoretisch möglicher Zustände (64) ist das automatisch generierte Zustandsdiagramm schon sehr unübersichtlich. Das Zustandsdiagramm lässt sich aber nach dem im Abschnitt 10.3 beschriebenen Verfahren reduzieren auf eines mit nur 6 Zuständen. Es ist nachfolgend dargestellt:
demofsm(... [2 1 1 2; 2 1 3 2; 5 3 3 5; 5 4 4 5; 5 6 4 5; 2 6 6 2],... {'D';'A';'F';'C';'B';'E'},... 1,... 1,... {'00';'01';'11';'10'}... )
J-K-Flipflop
J-K-Flipflops sind Taktflanken-gesteuerte universelle Flipflops, die man durch die beiden Eingänge J und K wie folgt benutzen kann:
J | K | Funktion | |||
---|---|---|---|---|---|
0 | 0 | keine Reaktion auf das Taktsignal | |||
0 | 1 | Rücksetzen | |||
1 | 0 | Setzen (wie | S=1, R=0 beim S-R-Flipflop) | ||
1 | 1 | Wechsel | 0 → 1 | bzw. | 1 → 0 |
Häufig findet man auch J-K'-Flipflops, bei denen also das K-Signal invertiert eingegeben wird.
J-K-Flipflops kann man auffassen als sehr einfache getaktete Schaltwerke mit einem gewöhnlichen D-Flipflop als Zeitglied. Das folgende Bild zeigt das Modell:
drawjkff
Die Bedeutung der J-K-Flipflops als Standard-Bausteine hat mit der Integration grösserer Systeme auf Mikrochips abgenommen, weil man dort beim Entwurf jeweils die geeigneten Flipflops einsetzt und dadurch Chipfläche einsparen kann.