Informatik V-Teil 2, Kap. 3, SS 99 3. Kombinatorische Logik 3.1 Grundfunktionen und Grundgesetze 3.1.1 Boolesche Funktionen Für eine Einführung in die mathematische Logik existiert eine Spezialvorlesung in der Mathematik. Wir wollen uns deshalb an dieser Stelle auf eine Einführung in die zweiwertige Boolesche Algebra und die entsprechende Logik beschränken. Hier sollen die Regeln und Gesetze vorgestellt werden, welche technisch von direkter Bedeutung sind. In der Digitaltechnik wird bis auf wenige, relativ unbedeutende Ausnahmen fast nur zweiwertige Logik verwendet. Eine Variable kann also nur die logischen Werte "0" und "1" einnehmen. Diese Zustände werden auf zwei Spannungspegel "high" (H) und "low" (L) abgebildet. Technisch wird der "1" -Pegel meistens mit der positiveren Spannung assoziiert, man spricht dann von positiver Logik. Es gibt aber auch Ausnahmen, wo die negativere Spannung als logischer "high"-Wert interpretiert wird. Manchmal werden die Zustände auch mit "L" (low) für "0" und "H" (high) für "1" bezeichnet. Die logischen Grundoperationen sind: − die UND - Funktion, meistens mit dem Zeichen " ∧ " oder auch mit "*" gekennzeichnet. Oft wird hier aber (wie bei der Multiplikation) das Verknüpfungszeichen weggelassen. − die OR - Funktion, meistens mit dem Zeichen" ∨ ", oft aber auch noch mit "+" gekennzeichnet − die Negation, meistens mit dem Symbol "¬ " oder mit einem Strich über der Variablen gekennzeichnet. Die Zeichen "+" für das logische ODER und "*" für das logische UND führen oft zu Verwechslungen, wenn man nicht genau weiß, ob eine binäre Variable als binäre Zahl oder als Boolesche Variable zu sehen ist. Wir wollen uns hier deshalb eine möglichst eindeutige Schreibweise angewöhnen. Man kann alle logischen Operationen zwischen zwei Booleschen Variablen auf UND, ODER und Negation zurückführen. Es ist, wie in der Aussagenlogik dargestellt, sogar möglich, nur entweder AND oder OR in Kombination mit der Negation zu verwenden. Da die Boolesche Algebra die Grundlage technischer Prozesse der Digitaltechnik ist, die mittels einfacher Schalter aufgebaut werden, bezeichnet man sie auch als "Schaltalgebra". Natürlich kann man zwischen 2 oder mehr zweiwertigen Variablen noch weitere Relationen definieren. Man kann nämlich zwischen zwei Booleschen Variablen tatsächlich 16 Verknüpfungen definieren, die allerdings in der technischen Praxis dann fast ausschließlich aus den logischen Grundfunktionen abgeleitet werden. Diese Grundfunktionen kann man zunächst über entsprechende Wertetabellen, sogenannten Wahrheitstabellen definieren. Für die Funktionen mit zwei Eingangsvariablen x und y und der Ausgangsvariablen z sollen die Wahrheitstabellen für die Grundfunktionen dargestellt werden. Natürlich sind die Grundfunktionen UND und OR auch für beliebig viele Eingänge definiert. Für die UND(AND) - Funktion gilt: Eingänge Ausgang 1 Informatik V-Teil 2, Kap. 3, SS 99 x 0 0 1 1 y 0 1 0 1 z=x∧ y 0 0 0 1 Der Ausgang hat nur dann den Wert "1", wenn alle Eingänge auf "1" sind. Als daraus abgeleitete Grundfunktion läßt sich die NAND-Funktion definieren, die sich praktisch meistens einfacher realisieren läßt: Eingänge x y 0 0 1 0 0 1 1 1 Ausgang ______ z = ¬ (x ∧ y) = (x ∧ y) 1 1 1 0 Dies ist die negierte AND-Funktion. Der Ausgang ist nur dann "0", wenn alle Eingänge auf "1" sind. Die ODER (OR)-Funktion wird wie folgt definiert: Eingänge x y 0 0 0 1 1 0 1 1 Ausgänge z=x∨y 0 1 1 1 Hier ist also ein Ausgang auf "1", wenn mindestens ein Eingang auf "1" ist. Praktisch ebenso wichtig ist die negierte OR oder NOR - Funktion: Eingänge x y 0 0 0 1 1 0 1 1 Ausgänge _____ z = ¬ (x ∨ y) = (x ∨ y) 1 0 0 0 Aus den Tafeln kann man folgende Grundregeln ableiten: 0∨0=0 1∧ 1=1 0∨1=1∨0=1 1∧ 0=0∧ 1=0 Es gilt das kommutative Gesetz: Konjunktion (UND-Verknüpfung): a ∧ b = b ∧ a Disjunktion (ODER-Verknüpfung): a ∨ b = b ∨ a Das assoziative Gesetz bestimmt die Zusammenfassung der Operanden bei mehr als zwei Eingangsvariablen (X1, X2, X3): 2 Informatik V-Teil 2, Kap. 3, SS 99 Konjunktion: X1 ∧ X2 ∧ X3 = X1 ∧ (X2 ∧ X3) = (X1 ∧ X2) ∧ X3 Disjunktion: X1 ∨ X2 ∨ X3 = X1 ∨ (X2 ∨ X3) = (X1 ∨ X2) ∨ X3 Auch die Gültigkeit des aus der "gewöhnlichen" Algebra bekannten distributiven Gesetzes kann nachgewiesen werden: 1. Distributives Gesetz: X1 ∧ (X2 ∨ X3) = (X1 ∧ X2) ∨ (X1 ∧ X3) 2. Distributives Gesetz: X1 ∨ (X2 ∧ X3) = (X1 ∨ X2) ∧ (X1 ∨ X3) Man kann bezüglich der UND und der ODER -Verknüpfung neutrale Elemente definieren. Wenn a eine Boolesche Variable ist, so gilt: a∧ 1=a a∨0=a Für die Komplementbildung gilt: _ a∨a=1 _ a∧ a=0 Wichtig für die Minimierung und Optimierung logischer Funktionen sind die Gesetze von De Morgan: 1. De Morgansches Gesetz: ________________ __ __ __ X1 ∧ X2 ∧ ....∧ Xn = X1 ∨ X2 ∨.....∨ Xn 2. De Morgansches Gesetz: ________________ __ __ ___ X1 ∨ X2 ∨..... ∨ Xn = X1 ∧ X2 ∧ ......∧ .Xn Als Shannonsches Gesetz kann man die Regeln von De Morgan auch allgemeiner fassen: __________________ _ __ ___ f (X1,X2,........, Xn ; ∧ , ∨) = f (X1, X2, ......., Xn ; ∨, ∧ ) Darüber hinaus gibt es weitere nützliche Regeln, mit deren Hilfe man Boolesche Funktionen vereinfachen kann. Man könnte diese unter dem Begriff "Kürzungsregeln" zusammenfassen. Regel 1: X1 ∨ (X1 ∧ X2) = X1 Regel 2: X1 ∧ (X1 ∨ X2) = X1 __ Regel 3: X1 ∨ (X1 ∧ X2) = X1 ∨ X2 __ Regel 4: X1 ∧ (X1 ∨ X2 ) = X1 ∧ X2 __ Regel 5: (X1 ∧ X2) ∨ (X1 ∧ X2) = X1 __ 3 Informatik V-Teil 2, Kap. 3, SS 99 Regel 6: (X1 ∨ X2) ∧ (X1 ∨ X2) = X1 3.1.2 Binäre Verknüpfungsfunktionen Wir haben bereits im letzten Unterpunkt angesprochen, daß man insgesamt 16 verschiedene Verknüpfungen zwischen 2 logischen Variablen definieren kann. Wie in der Digitaltechnik oft üblich, bezeichnen wir die Eingangsvariablen mit a und b und die Ausgangsvariable mit Y und einem Index i. Verknüpfung Funktionswert für a0 1 0 1 b0 0 1 1 Bezeichnung Y0 = 0 0 0 0 0 Nullfunktion / Null Y1 = a ∧ b _ Y2 = a ∧ b 0 0 0 1 Konjunktion, UND-Verknüpfung 0 0 1 0 Inhibition, Ausschluß Y3 = b 0 0 1 1 Identität, Tautologie _ Y4 = a ∧ b 0 1 0 0 Inhibition, Ausschluß Y5 = a 0 1 0 1 Identität, Tautologie _ _ Y6 = (a ∧ b ) ∨ (a ∧ b) 0 1 1 0 Antivalenz, Exklusiv Oder Y7 = a ∨ b Disjunktion, ODER-Verknüpfung 0 1 1 1 ____ _ _ Y8 = a ∨ b = a ∧ b 1 0 0 0 _ _ Y9 = (a ∧ b) ∨ (a ∧ b) 1 0 0 1 Peirce-Verknüpfung, NOR a ↔ b Äquivalenz _ Y10 = a 1 0 1 0 _ Y11 = a ∨ b = a → b 1 0 1 1 _ Y12 = b _ Y13 = b ∨ a = b → a _____ _ _ Y14 = a ∧ b = a ∨ b ¬ a, a' Negation Implikation, wenn - dann 1 1 0 0 ¬ b, b' Negation 1 1 0 1 Implikation 1 1 1 0 Sheffer-Funktion, NAND-Verknüpfung Y15 = 1 1 1 1 1 Eins-Funktion, Einheit Technisch wird man mit vorhandenen Grundbauelementen alle diese Funktion mehr oder weniger gut darstellen können. Wir haben zunächst die AND und die OR-Funktion sowie die Negation eingeführt. Mit AND oder OR jeweils plus der Negierung lassen sich alle anderen Funktionen 4 Informatik V-Teil 2, Kap. 3, SS 99 darstellen. Günstig ist auch, dass für AND und OR das kommutative, das assiozative und das distributive Gesetz gelten. Auch sind AND und OR für beliebig viele Eingangsvariable definiert. Ein Blick in die Elektronik zeigt allerdings, daß sich am einfachsten die NAND und die NOR Funktion realisieren lassen, je nach der gewählten Schaltungstechnik (z. B. NAND in TTL-Logik, NOR in ECL-Logik, NAND und NOR in CMOS-Logik). Tatsächlich genügt sogar eine dieser beiden Funktionen, um alle anderen Funktionen darzustellen. Für 2 Eingangsvariable entsprechen NAND und NOR dem sogenannten Sheffer- bzw. PeirceOperator. NAND und NOR können auch mehrstellig sein. Baut man eine Logik auf diesen Operatoren auf, so muß man sich vorsehen: Das Assoziativgesetz gilt nicht mehr. Die Antivalenz- und die Äquivalenzfunktion (auch XOR bzw. XNOR genannt) erfüllen wieder das Assoziativgesetz. Beide sind auch mehrstellig definiert: Das Ergebnis einer Äquivalenzfunktion (XNOR) ist genau dann 1, wenn die Anzahl der Nullen im Argument gerade ist. Das Ergebis der Antivalenzfunktion (XOR) ist genau dann 1, wenn die Anzahl der Einsen im Argument ungerade ist. 3.1.2 Normalformen Boolescher Gleichungen Will man mit logischen Schaltungen solch halbwegs sinnvolle Objekte wie Computer bauen, so ist eine einfache und übersichtliche Darstellung logischer Funktionen notwendig. Für die Darstellung logischer Funktionen in der Praxis benutzt man vorwiegend die AND- und die OR-Funktion in einer besonderen Verknüpfung. Als Normalform einer Booleschen Funktion gilt eine Darstellung, bei der nur Negation, konjunktive und disjunktive logische Verknüpfungen vorkommen. Eine besondere Bedeutung dabei spielen sogenannte Minterme und Maxterme. Ein Minterm ist die konjunktive Verknüpfung aller Eingangsvariablen, wobei jede Eingangsvariable in negierter oder nicht-negierter Form vorkommen muß. Für eine Boolesche Funktion mit den Eingangswerten A, B, C gibt es insgesamt 8 mögliche Minterme: __ __ _ _ _ _ _ __ __ A ∧ B C, A ∧ B ∧ C, A ∧ B ∧ C, A ∧ B ∧ C, A ∧ B ∧ C, A ∧ B ∧ C, A ∧ B ∧ C, _ _ _ A ∧ B ∧ C. Ein Maxterm dagegen ist die disjunktive Verknüpfung aller Eingangsvariablen, wobei jede Eingangsvariable in negierter oder nicht-negierter Form vorkommen muß. Die möglichen Maxterme für drei Eingangsvariablen A, B, C sind: __ _ __ _ _ _ _ A ∨ B ∨ C, A ∨ B ∨ C, A ∨ B ∨ C, A ∨ B ∨ C, A ∨ B ∨ C, A ∨ B ∨ C, _ _ _ _ _ A ∨ B ∨ C, A ∨ B ∨ C Die sogenannte Normalform einer Booleschen Gleichung erhält man entweder durch die disjunktive Verknüpfung von Mintermen als sogenannte "disjunktive Normalform" oder als konjunktive Verknüpfung von Maxtermen als sogenannte "konjuktive Normalform". 5 Informatik V-Teil 2, Kap. 3, SS 99 Für den Entwurf digitaler Schaltungen geht man meistens von der disjunktiven Normalform aus. Über die Shannon-Formel kann man die konjunktive und die disjunktive Normalform ineinander umwandeln. Zur Aufstellung der Normalform geht man von der Wahrheitstabelle aus. Beispiel: 0 1 2 3 4 5 6 7 X1 0 0 0 0 1 1 1 1 X2 0 0 1 1 0 0 1 1 X3 0 1 0 1 0 1 0 1 Y 0 1 1 0 1 0 0 0 Damit erhält man folgende disjunktive Normalform: __ __ __ __ __ __ Y = X1 X2 X3 ∨ X1 X2 X3 ∨ X1 X2 X3 Die Funktion erhält also bei den obigen Mintermen den logischen Wert 1. Wenn die Wertetabelle mehr Minterme enthält, bei denen Y = 1 wird als solche, bei denen Y = 0 wird, so ist es günstiger, die Normalform für Y = 0 , also _ Y = 1 aufzustellen. An dieser Stelle soll nur erwähnt werden, daß man insbesondere die disjunktive Normalform technisch verwendet, um bei einer vorgegebenen Wertetabelle die Logik-Schaltung zu finden, welche diese Logik mit minimalem Aufwand realisiert. 3.2 Grundelemente Wir wollen nachfolgend die Grundelemente kombinatorischer Logik behandeln. Eine Logik ist dann kombinatorisch, wenn sie keine speichernden Schaltelemente enthält. Dies bedeutet auch, daß (bis auf unvermeidbare Rückwirkungen der Grundelemente wie Transistoren) keine Rückkopplungen vorkommen. Eine Zustandsänderung am Eingang eines kombinatorischen Blocks wird also, so die logische Funktion dies zuläßt, stets in eine Zustandsänderung am Ausgang umgesetzt. In Rechnern heutiger Generation wird fast ausschließlich 2-wertige Logik verwendet, obwohl Logiken beliebig hoher Ordnung mathematisch darstellbar sind. Beschrieben werden kombinatorische Schaltungen z. B. durch 2-wertige Boolesche Logik. Die zulässigen Zustände sind "0" oder "low" und "1" oder "high". Bemerkung: 6 Informatik V-Teil 2, Kap. 3, SS 99 In Logik-Simulatoren werden oft noch die Zustände "X" (kann stehen für "unbekannt" oder "beliebig" und "R" für "steigende Zustandsänderung" und "F" für "fallende Zustandsänderung" benötigt. Grundelemente kombinatorischer Logik sind die Funktionen: − "UND" mit dem Funktionszeichen * oder, zur Unterscheidung von der Multiplikation ∧ , − "ODER" mit dem Funktionszeichen + oder, zur Unterscheidung von der Addition ∨, − "Negierung" mit dem Funktionszeichen ' oder Querstrich über der Variablen. Logik-Funktionen sind nicht mit arithmetischen Funktionen zu verwechseln. Es gibt aber Bezüge: Für eine einzelne Bitstelle entspricht die "ODER"- Verknüpfung der Addition, die "UND"Verknüpfung der Multiplikation. Achtung: Zuweilen wird in der Schreibweise von Gleichungen bei der Multiplikation bzw. der UNDVerknüpfung der Punkt oder Stern weggelassen! Eine weitere sehr häufig verwendete logische "Makro"-Funktion ist die Exklusiv-Oder-Funktion (XOR) bzw. deren Negierung (XNOR). Sie läßt sich auf unterschiedliche Weise aus den Grundfunktionen kombinieren. Logik-Elemente spielen in Rechnern natürlich die dominierende Rolle: Einmal sind komplexere arithmetische Einheiten (Addierer, Subtrahierer) und andere Funktionsblöcke (Coder, Decoder, Multiplexer, Demultiplexer), die in Rechnern als MakroBausteine verwendet werden, oft aus Logik-Bausteinen aufgebaut. Auch sequentielle Schaltungselemente enthalten logische Bausteine, dann aber mit Rückkopplungen. Die Beschreibung von Logik geschieht für Grundelemente und oft auch für komplexe Funktionsblöcke oft durch logische Wertetabellen, meistens als Wahrheitstabellen bezeichnet.. Beispiele: AND-Gatter Eingänge x y Ausgang out x y OR-Gatter Eingänge Ausgang x y out x & out y 0 1 0 1 0 0 1 1 >1 0 0 0 1 out 0 0 1 0 0 1 1 1 0 1 1 1 Aus technologischen Gründen werden die Grundgatter in realen Schaltungen oft als invertierende Gatter realisiert , d. h. als NAND und NOR. Eingänge Ausgang Eingänge 7 Ausgang Informatik V-Teil 2, Kap. 3, SS 99 NAND-Gatter x y out x y & NOR-Gatter x y out x out y 0 0 1 0 0 1 1 1 >1 1 1 1 0 out 0 1 0 0 0 1 1 1 0 0 1 0 Eine wesentliche Eigenschaft ist hier schon sichtbar: Alle Eingänge eines Gatters, und das können für die Grundfunktionen auch mehrere (3, 4, 6 fach AND, OR, NAND, NOR sind durchaus üblich) sein, sind logisch äquivalent. Man kann sie also beliebig miteinander vertauschen. Praktisch gilt das nicht ganz: Bei z. B. einem 6- fach NAND-Gatter in CMOS-Technik wird es stets etwas "langsamere" und "schnellere" Eingänge geben. Das heißt, ich kann für eine L-H oder H-L- Zustandsänderung am Gatter-Ausgang durchaus unterschiedliche Verzögerungszeiten erhalten, je nachdem, über welchen der 6 Eingänge die Umschaltung des logischen Zustandes vorgenommen wird. ! Der Vollständigkeit halber sei auch die "fast" Grundfunktion exklusiv OR (XOR im Englischen) aufgeführt. Auch deren Negierung, das XNOR, tritt häufig auf: Gatter XOR Eingänge x y Ausgang out x y XNOR Eingänge x y Ausgang out x =1 out y 0 1 0 1 0 0 1 1 0 1 1 0 =1 out 0 1 0 1 0 0 1 1 1 0 0 1 Es ist anzumerken, daß XOR und XNOR eigentlich nur für 2 Eingänge definiert sind, während die Grundfunktionen beliebig viele Eingänge haben dürfen (theoretisch, praktisch gibt es Grenzen). XOR und XNOR haben eine große praktische Bedeutung: Sie zeigen nämlich an, ob die Eingangsbits gleich oder verschieden sind und sind damit sowohl bei Bit-Vergleichsoperationen als auch in Addierern vorzüglich einsetzbar. Mit dem XOR hat man, bis auf den Übertrag, auch fast schon eine einfache Arithmetik-Schaltung, den Addierer, realisiert. Für "richtige" Addierer-Schaltungen ist die Behandlung von Überträgen zu ergänzen. Wahrheitstabellen der obigen Art werden auch für komplexe Kombinatoriken verwendet. Eine andere Art der Beschreibung sind die Booleschen Gleichungen. 3.3 Realisierung von Logik und Eigenschaften realer Bauelemente 8 Informatik V-Teil 2, Kap. 3, SS 99 3.3.1 Realisierungen Logische and arithmetische Schaltungen werden in Rechnern in unterschiedlichsten Ausführungen benötigt. Man unterscheidet zunächst einstufige und mehrstufige Logik. Für komplexe Logik-Funktionen werden mehrere Stufen benötigt. In der graphischen Darstellung komplexerer logischer Funktionen werden Invertierungen oft nicht als separate Elmente dargestellt, sondern als Kreise an den Logik-Funktionen. Die nachfolgende Abbildung zeigt also die Funktion __ out = x * y x & y out Abb. 3.1: Logik-Symbol mit Invertierung am Eingang x1 x2 x3 x4 & >1 & Y x5 x6 x7 x8 & & Abb. 3.2: Zweistufige kombinatorische Logik-Schaltung aubauend auf die disjunktiven Normalform x1 x2 x3 x4 x5 x6 x7 x8 >1 >1 & Y >1 >1 Abb. 3.3: Zweistufige kombinatorische Logikschaltung aufbauend auf die konjunktive Normalform Auch die Darstellung noch komplexerer Logik-Funktionen, z. B. in zweistufiger Darstellung aufgrund disjunktiver oder konjunktiver Normalfomen ist möglich. Die Realisierung kann ganz unterschiedlich erfolgen: 9 Informatik V-Teil 2, Kap. 3, SS 99 a. Aufbau aus logischen Grundgattern Dies ist zweifellos die "einfachste" und allgemeinste Methode, da man Logik-Beschreibungen quasi direkt und ohne wesentliche Einschränkungen umsetzen kann. Sie ist jedoch nicht unbedingt auch die effektivste. Sie eignet sich besonders dann, wenn logische Netze mit vielen Eingängen und nur einem bis wenigen Ausgängen benötigt werden. b. Aufbau aus Komplexgattern In der nMOS- und der CMOS-Technologie kann man einstufige Transistorschaltungen entwerfen, welche mehrstufige logische Funktionen umsetzen. Damit spart man in der Regel Bauelemente (Transistoren) ein, meistens sind diese Komplexgatter-Realisierungen aber langsamer als die aus Einzelgattern. c. Reguläre Makros Eine weitere Realisierungsmöglichkeit bieten reguläre Makros, z. B. sogenannte "Programmable Logic Arrays" (PLAs). Man hat im wesentlichen nur eine zweistufige Logik, aber dabei fast gleich viele Ausgänge wie Eingänge. PLAs und vergleichbare Methoden eignen sich also dann, wenn eine Logik geringer Tiefe, aber großer Breite (viele Ein-und Ausgänge) benötigt wird. d. Leitungsstrukturen In der "normalen" (z. B. CMOS-) Schaltungstechnik ist es verboten, Gatterausgänge direkt zusammenzuschalten. In der Technik der bipolaren Logik ist dies aber unter Umständen möglich. Dann kann, wie z. B. in der TTL-Technik, ein auf 'low" liegender Gatterausgang den Ausgangsstrom eines auf "high" liegenden, angeschlossenen anderen Ausgangs aufnehmen. Der Ausgang wird logisch "low". Er bekommt nur dann den Spannungwert "high", wenn beide treibenden Gatter am Ausgang auf "high" sind. Dies wäre dann ein "wired-AND". Entsprechend kann man auch "wiredOR" Funktionen realisieren.In der CMOS-Schaltungstechnik sind solche Methoden allerdings explizit verboten, z. B., weil sie zu erhöhter Leistungsaufnahme und schlechter Testbarkeit der Schaltungen führen. e. Memories Es gibt tatsächlich Methoden, ein Logik über ein Memory zu realisieren. Dazu wird aus der Logik-Funktion eine Adresse generiert, und man schaut dann nach, ob in der entsprechenden Speicherzelle eine "0" oder "1" steht. Dies ist eine Möglichkeit, programmierbare Logik-Bausteine zu realisieren. Die tatsächliche Implementierung einer Logik wird stark von der verwendeten SchaltkreisTechnologie abhängen. In den meisten Technologien (z. B. CMOS) sind NAND und NOR-Gatter einstufig zu realisieren, ANDs und ORs benötigen 2 Stufen. Deshalb wird der Realisierung durch NANDs und NORs der Vorzug gegeben, wobei NANDs wegen der in CMOS meist schnelleren n-Kanal-Transistoren generell günstiger sind. (Als Erinnerung: In CMOS-Technik sind die p-Kanal-Transistoren bei gleicher Leitfähigkeit und gleicher Kanallänge etwa dreimal breiter als die n-Kanal-Transistoren). Ebenfalls ein Problem ist die Realisierung von Gattern mit sehr hohem Fan-in: Bei einstufiger Realisierung würde z. B. ein 8-fach NAND durch den sogenannten "Substrateffekt" in CMOS-Technik sehr langsam. Dann ist eine mehrstufige Realisierung aus Gattern mit niedrigem Fanin schneller. In der Regel werden deshalb den Anzahl nach mehr Gatter als "unbedingt erforderlich" für die Realisierung der Logik-Funktion eingesetzt. 3.3.2 Verhalten und Charakterisierung realer Schaltungen 10 Informatik V-Teil 2, Kap. 3, SS 99 Reale Logik-Bausteine sind nicht allein durch ihre Wertetabelle gekennzeichnet. Insbesondere ist von Bedeutung, in welcher Zeit sie bei welcher Belastung den Spannungspegel am Ausgang von logisch "high" nach "low" und umgekehrt ändern können. Logische Pegel U/V 4 "high" ( 1 ) 3 undefiniert 2 1 "low" ( 0 ) Abb. 3.4: Spannungen und "logische"Pegel Für jede spezielle Schaltkreis-Technologie, bei der einzelne Gatter als "Bauelemente" zur Realisierung von Logik-Schaltungen erhältlich sind (TTL, ECL, CMOS) sind "logische" Spannungspegel definiert. So wird eine Spannung unterhalb eines bestimmten "low" - Grenzwertes am Eingang eines Gatters von diesem als eine logische "0" interpretiert werden. Andererseits wird eine Spannung oberhalb eines "high"-Grenzwertes stets als logische "1" angesehen werden. Für dazwischenliegende Spannungen ist die Interpretation unsicher. In integrierten CMOS-Schaltungen wird man Spannungen unter 1,5 V sicher als logisch "0", über 4,5 V sicher als "high" annehmen können, sofern in der Schaltung weder Entwurfsfehler noch Defekte aus der Fertigung vorliegen. Pegel und Schaltzeiten Jedes logische Schaltelement benötigt eine gewisse Zeit, um auf Spannungsänderungen am Eingang zu reagieren. Diese Reaktion ist abhängig von der Frequenz und der Form des Eingangssignals. Zunächst muß ein Eingangssignal für eine ausreichend lange Zeit anliegen, beliebig kurze Spannungspulse werden ggf. ohne eine Reaktion des Gatters "geschluckt". Außerdem muß das Signal einen bestimmten Spannungpegel, die sogenannte "Schwellenspannung" Us erreichen, damit das angesteuerte Logik-Gatter umschalten kann. Diese Schwellenspannung liegt bei symmetrisch aufgebauten Gatterstrukturen (z. B. CMOS) etwa in der Mitte zwischen dem "high"- und dem "low"-Spannungspegel. Dies ist kein Grundgesetz, bei unsymmetrisch aufgebauten Gattern kann sich dieser Umschaltpegel durchaus zu höheren oder niedrigeren Spannungen verschieben. U Uhigh Us Umschaltspannung Uh Spannungshub U low t Abb. 3.5: Form digitaler Signale 11 Informatik V-Teil 2, Kap. 3, SS 99 Digitale Schaltungen sind in hohem Maße nicht-linear. Die Transistoren eines Gatters sind in der Lage, bereits eine relativ kleine Eingangsspannung auf den Endwert des Ausgangssignals zu verstärken. Das darüber hinaus vorhandene Potential zur Signalverstärkung wird genutzt, um am Schaltungsausgang möglichst steile Flanken im Signalverlauf zu erhalten. U Uh 0,9 Uh tr tf 0,1 Uh t Abb. 3.6: Anstiegs- und Abfallzeiten digitaler Signale Ein Charakrteristikum von digitalen Signalen, wie sie von Gatter-Schaltungen erzeigt werden, sind die Anstiegs- und die Abfallzeiten tr und tf. Sie sind nicht nur von den Eigenschaften des jeweiligen Gatters selbst abhängig, sondern auch von der Belastung am Gatterausgang, dem sogenannten "FanOut". Werden im Gatter selbst breitere Transistoren, die beim Umschalten mehr Strom führen, verwendet, so wird der Schaltvorgang schneller, gleichzeitig steigt aber auch die Verlustleistung der Schaltung. Im Normalfall wird ein Gatter so ausgelegt, daß es eine Belastung durch zwei normierte Eingangslasten, d. h. zwei normale Gatter-Eingänge treiben kann, also ein sogenanntes "Fan-Out" von 2 besitzt. Bei höherem Fan-Out vergrößern sich entweder Anstiegs- und Abfallzeiten, oder es müssen Gatter mit höherer Treiberfähigkeit verwendet werden, die z. B. ein Fan-out von vier zulassen. Ein einfaches Grundgatter (z. B. NAND) belastet normalerweise seinen Treiber mit einer "Normallast", man sagt auch, es hat ein "Fan-in" von 1. Andere Bausteine können für treibende Gatter durchaus eine höhere Belastung darstellen, also ein "Fan-in" von 2, 3 oder 4 haben. x y x y >1 & out out fan-in 1 fan-out 3 x y >1 out fan-in 1 fan-in 1 Treiber fan-out 6 Abb. 3.7: Logik-Netzwerk mit Fan-In und Fan-Out In jedem Fall muß bei der Auswahl der Elemente von Digitalschaltungen gewährleistet sein, daß für jeden Verbindungspunkt zwischen Gattern die vorhandene Last, das ist die Summe der angeschlossenen Fan-in-Werte den Wert des zulässigen Fan-Outs nicht übersteigt. 12 Informatik V-Teil 2, Kap. 3, SS 99 U Uh out in out 0,9 Uh 0,5 Uh tdr 0,1 Uh tdf out in in t Abb. 3.7: Gatter-Verzögerungszeiten Die durch die internen Verzögerungen hervorgerufenen Laufzeiten in Gattern beziehen sich auf die Durchgänge der Eingangs- bzw. Ausgangspegel durch den Wert des halben Spannungshubes. Damit gehen auch Anstiegs- und Abfallzeiten indirekt in die Gatter-Verzögerungszeiten ein. Gatter-Laufzeiten in den heute üblichen CMOS-Technologien liegen in der Regel unter einer Nanosekunde ( 10**-9 s). Laufzeiten um 100 ps sind mit bipolaren Logiken seit längerem erreicht worden und werden auf ICs inzwischen auch von CMOS-Schaltungen erreicht. Dies hat den Effekt, daß die wesentlichen Verzögerungen auf ICs (wie früher schon auf den Platinen) nicht mehr durch die aktiven Schaltelemente, sondern durch die Signallaufzeiten auf den Verbindungsleitungen bedingt sind. Bisher nicht ausführlich behandelt wurde der Aspekt der Störsicherheit und der sogenannte "Störabstand" in digitalen Schaltungen. Spannung Nutzsignal Uh "Glitch" Uth Störungen Ul t Abb. 3.8: Nutz-und Störsignale in digitalen Schaltungen Abb. 3.8 soll die Realität der Signals in digitalen Systemen andeuten. Dem "reinen" Nutzsignal auf einer Leitung sind fast immer erhebliche parasitäre Störsignale überlagert. Während in analogen Systemen die Höhe der Spannung direkt für die zu übertragende Information maßgeblich ist, hat man in digitalen Systemen genau diese Abhängigkeit weitgehend aufgebrochen. Das Ergebnis ist die charakteristisch hohe Festigkeit digitaler Signalverarbeitung gegenüber Störungen. Diese kann durch fehlertolerante Übertragungsverfahren nochmals wesentlich verbessert werden. Von wesentlicher bedeutung für die Störfestigkeit digitaler Schaltungen ist sowohl der logische "Swing", das ist die Spannungsdifferenz zwischen High- und Low-Pegel. Bei digitalen CMOSSchaltungen mit 5 V Versorgungsspannung liegt er bei nahezu 5 V. Neuere CMOS-Schaltungen, die mit 3,5 oder gar 1,5 V Versorgungsspannung betrieben werden, haben eine entsprechend geringere Störfestigkeit. 13 Informatik V-Teil 2, Kap. 3, SS 99 In digitalen Schaltungen ergeben sich typischerweise auch Störungen, die aus kurzen Impulsen mit hoher Spannung bestehen ("Glitches", "Spikes"). Sehr kurze Impulse werden teilweise von den betroffenen Gattern quasi ignoriert, wenn nämlich die mit dem Puls verbundene elektrische Ladung nicht ausreicht, die Eingangskapazität des Gatters aufzuladen oder zu entladen. Typischerweise sind natürlich schnellere Gatter auch anfälliger gegen solche Störspitzen. Den Störspannungsabstand bei digitalen Schaltungen sind für den statischen Fall durch die sensitiven Pegel an Gatter-Eingängen und Gatter-Ausgängen bestimmt. Gatterausgang Gattereingang Uout VDD VDD H-Pegel H-Pegel Uohmin Sh Uihmin Uilmax Sl Uolmax L-Pegel L-Pegel Abb. 3.9: Statische Störabstände Abb. 3.9 zeigt die für den statischen Störabstand, das heißt die maximal tolerierbare Höhe statischer (langsamer) Störsignale maßgeblichen Spannungen. Das treibende Gatter hat als obere Grenze des low-Pegels die Spannungs Uolmax. Auch bei Überlagerung mit Störsignalen muß ein angesteuertes zweites Gatter diesen Wert noch als eindeutig "low" erkennen. Die als noch "low" erkannte minimale Spannung des angesteuerten Gatters Uilmax muß also höher liegen. Der Unterschied zwischen diesen Spannungen ist der statische Störabstand Sl für den Low-Pegel. Auf der anderen Seite muß das treibende Gatter eine minimale Spannung für den High-Pegel Uohmin bereitstellen, die höher ist als der minimal vom angesteuerten Gatter als "high" erkannte Wert Uihmin. Der Abstand ist der High-Störabstand Sh. Bei Gattern der bipolaren Logik (TTL) betragen die Abstände Sl = 0,4 V und Sh = 0,4 V. Der dynamische Störabstand für Spannungsspitzen ist abhängig von Amplitude und Dauer der Störung und läßt sich ggf. graphisch aus charakteristischen Kurven ermitteln. 3.4 Logik-Minimierung 3.4.1 Übersicht Oft wird man für eine spezielle logische Funktion die optimale Boolesche Gleichung direkt "erdenken und hinschreiben können", z. B. ausgehend von einer Zustandstabelle. Neben der "handgestrickten" Logik gibt es heute Methoden und Werkzeuge zur Logik-Synthese. Ist eine formale logische Beschreibung (durch Boolesche Gleichungen oder eine Zustandstabelle) gegeben, so kann diese in eine strukturelle Beschreibung auf der Ebene der logischen Gatter, eine sogenannte Gatter-Netzliste, umgesetzt werden. 14 Informatik V-Teil 2, Kap. 3, SS 99 Eine wichtige Aufgabe bei dieser Umsetzung ist die Minimierung der Funktion. Dies bedeutet in der Regel, daß eine gegebene logische Funktion so umzuformen ist, daß die Realisierung keine Redundanzen mehr aufweist, also mit der minimal möglichen Anzahl logischer Grundfunktionen und Bauelemente auskommt. Diese logische Minimierung dient mehreren Zwecken: 1. Minimierung der Aufwandes an Hardware für die Realisierung einer Schaltung, was meistens auch minimale Kosten (z. B. an Chip-Fläche und Stromverbrauch) beinhaltet. 2. Minimierung der Schaltzeiten. In der Regel ist die logisch minimale Funktion auch nahe an der schnellsten Realsisierung. 3. Testbarkeit: Aktive Redundanzen in einer Schaltung führt zu untestbaren Teilen der Logik. Erläuterung zu 3.: Bei "handentworfenen" Schaltungen in TTL-Technik, also mit diskreter Realisierung, war es lange üblich, redundante Logik einzuführen, um unerwünschte dynamische Schaltungszustände (Glitsches, Hazards) zu vermeiden. Fällt nun ein solches "redundantes" Gatter aus, so erfüllt die Schaltung ihre Funktion trotzdem noch. Ein Prüfverfahren für statische Fehler kann also den Ausfall nicht entdecken. Der jetzt auftretende "Glitch" wird oft an den Ausgängen der Schaltung nicht sichtbar sein, kann aber sehr wohl zu einem unvorhersehbaren "Ab- und -zu- Versagen" der Schaltung führen. Man unterscheidet mehrere systematische Ansätze zur Logik-Minimierung: 1. Minimierung mittels der Booleschen Algebra. Darunter versteht man mehr oder weniger systematische Umformungen nach den Regeln der Boolschen Algebra zur Reduzierung der Variablen. Dieses Verfahren eignet sich für Gleichungen mit bis zu etwa vier Variablen. 2. Algorithmische Verfahren Verfahren dieser Art sind für die Behandlung auf dem Digitalrechner besonders geeignet. Am bekanntesten ist das Verfahren nach Quine-McCluskey. Die Anzahl der Eingangsvariablen darf fast beliebig groß sein. Man unterscheidet zwischen Verfahren, welche sich zur Minimierung zweistufiger Logik eignen und solchen, welche beliebige Logik-Funktionen mimimieren können. Bekannte algorithmische Verfahren und Werkzeuge (z. B. ESPRESSO der University f California, Berkeley) haben dann Probleme, wenn Logik mit vielen Eingängen und mehreren Ausgängen optimiert werden muß. 3. Graphische Verfahren Für die Minimierung kleinerer Logiken "von Hand" haben sich graphische Verfahren als gut brauchbar erwiesen. Beispiele sind das Venn-Diagramm und das Verfahren nach Veitch-Karnaugh. Letzteres eignet sich für die Minimierung von Logik-Funktionen mit bis zu 5 Eingangsvariablen. Die Minimierung komplexer Logik mit mehreren Ausgängen ist ein algorithmisch sehr komplexes Problem. Bekannte Methoden und Verfahren liefern mehr oder weniger brauchbare Näherungslösungen, aber kaum exakte Optimierungen. Dies gilt auch für die kommerziell erhältlichen Werkzeuge, z. B. der Fa. SYNOPSYS. Das zur Zeit wohl verbreitetste Programmpaket zur Logik-Optimierung ist ESPRESSO der University of California, Berkeley. 15 Informatik V-Teil 2, Kap. 3, SS 99 Seit ca. 1993 existieren erste Arbeiten, welche Methoden und Algorithmen, die ursprünglich für die automatische Prüfmustergenerierung entwickelt wurden, auch zur Logik-Optimierung verwenden. Gegenüber ESPRESSO wird teilweise eine weitere Kompaktierung bis zu 20% erreicht. 3.4.2 Das Karnaugh-Diagramm Diese graphische Methode zur Minimierung logischer Funktionen wurde zunächst von Veitch entwickelt und dann von Karnaugh vereinfacht. Sie wird heute oft auch als "Veitch-KarnaughMethode" bezeichnet. Das dazu gehörende Diagramm wird meistens als "KV-Diagramm" bezeichnet. Das KV-Diagramm ist im Prinzip eine graphische Darstellung der Wahrheitstabelle in Form eines Schachbrett-artig unterteilten Rechtecks. Jedes Feld in diesem Rechteck enstpricht einem Minterm. Die Anordnung erfolgt so, daß horizontal und vertikal benachbarte Felder sich jeweils nur in einer Variablen unterscheiden. Wahrheitstabelle 0 1 2 3 X1 X2 0 0 1 1 0 1 0 1 KV - Diagramm X2 Minterm X1 X1 X1 X1 X2 X2 X2 X2 X1 X1 X2 3 2 1 0 Abb. 3.10: Wahrheitstabelle und KV-Diagramm für 2 Eingangsvariable Nachfolgend die Grundregeln zum Aufstellen der disjunktiven Minimalform und des KV-Diagramms: 1. Ausgehend von der Wahrheitstabelle wird die Zahl der Eingangsvariablen ermittelt und danach das entsprechende KV-Diagramm aufgestellt. Die logischen Variablen werden am Rand des KVDiagramms in fortlaufender Reihenfolge angeordnet. Man beginnt mit der Variablen, die in der Wahrheitstabelle rechts steht (z. B. weil sie die niedrigste Wertikeit hat) am oberen Rand und beschriftet das KV-Diagramm entgegen dem Uhrzeigersinn. 2. Anhand der Wahrheitstabelle (oder alternativ aus logischen Gleichungen) werden die Werte der Ausgangsvariablen für alle Kombinationen der Eingangsvariablen ermittelt und in die Felder des KV-Diagramms eingetragen. Die logischen Werte können "0", "1" und "*" oder "X" sein. Letztere Zeichen gelten für "beliebig", "unbestimmt" oder "redundant". 3. Benachbarte 1-Felder werden zu einem Block zusammengezogen, wobei redundante Felder beliebig eingezogen werden dürfen. Ein Block enthält stets 2**n Felder. 4. Zwei Blöcke, die sich nur in einer Variablen unterscheiden, sind ebenfalls benachbart. Man kann sie zu einem größeren Block zusammenfassen. 5. Ein 1-Feld oder X-Feld darf in mehrere Blöcke integriert sein. 6. Jeder Block wird durch eine konjunktive Verknüpfung (UND) der Eingangsvariablen beschrieben. Wenn der Term für einen größtmöglichen Block gefunden wurde, so ist dieser nicht mehr zu vereinfachen. Er wird als Prim-Implikant bezeichnet. 7. Die logische Gleichung ergibt sich als disjunktive (ODER-) Verknüpfung der konjunktiven Terme. 16 Informatik V-Teil 2, Kap. 3, SS 99 8. Die logische Gleichung wird nur dann minimal, wenn die Blöcke so groß wie möglich sind und die Anzahl der Blöcke minimal wird. Man kann statt mit der positiven disjunktiven Minimalform auch mit der negativen Version arbeiten. Man faßt dann alle Felder und Blöcke zusammen, die den Ausgangswert 0 oder "X" ergeben. Mit der Shannon-Regel kann diese Form dann einfach in die positive konjunktive Minimalform umgewandelt werden. Abb. 3. 11 zeigt ein einfaches Beispiel mit 2 Variablen. KV - Diagramm Wahrheitstabelle 0 1 2 3 X1 X2 0 0 1 1 0 1 0 1 X2 Y X1 1 0 1 0 X1 3 1 0 0 X2 2 1 1 0 Abb. 3.11: Beispiel: Wahrheitstabelle und KV-Diagramm für eine Logik-Funktion mit 2 Eingangsvariablen Aus der Wahrheitstabelle läßt sich die normierte Logikfunktion direkt ableiten: __ __ ___ Y = X1 X2 + X1 X2 Die Vereinfachung mittels des KV-Diagramms liefert als Ausgangsfunktion: __ Y = X2 Auch für einen Satz von drei Eingangsvariablen ist das Verfahren noch recht übersichtlich. Die Wahrheitstabelle mit den Mintermen und die Struktur des KV-Diagramms zeigt Abb. 3. 12. Wahrheitstabelle X1 X2 X3 Minterm 0 0 0 0 X1 X2 X3 1 0 0 1 X1 X2 X3 X2 2 0 1 0 X1 X2 X3 X2 3 0 1 1 X1 X2 X3 4 1 0 0 X1 X2 X3 5 1 0 1 X1 X2 X3 6 1 1 0 X1 X2 X3 7 1 1 1 X1 X2 X3 X3 X3 3 7 6 2 1 5 4 0 X1 X1 X1 X1 Abb. 3.12: Wahrheitstabelle und KV-Diagramm (Schema) für 3 Eingangsvariable Die Anwendung für ein Beispiel mit drei Eingangsvariablen zeigt Abb. 3.13. Hier soll eine Logik mit zwei Ausgängen (Y1 bzw. Y2) minimiert werden. 17 Informatik V-Teil 2, Kap. 3, SS 99 KV-Diagramm für Y1 Wahrheitstabelle X3 X1 X2 X3 Y1 Y2 X2 0 0 0 0 1 1 X2 1 0 0 1 1 1 2 0 1 0 1 1 3 0 1 1 0 0 4 1 0 0 0 * 5 1 0 1 0 * 6 1 1 0 0 0 7 1 1 1 0 0 * redundante Terme 3 1 0 1 X1 X3 0 7 0 5 0 6 X1 0 4 1 2 1 0 X1 X1 KV-Diagramm für Y2 X3 X2 X2 3 1 0 1 X1 X3 0 7 * 5 X1 6 4 0 * X1 2 0 1 1 X1 Abb. 3.13: Logik-Minimierung für ein Netzwerk mit drei Eingangsvariablen und 2 Ausgängen Der Wert des Ausgangs Y2 ist für die Zustände 4 und 5 nicht definiert, also beliebig. Die Ausgangsfunktion für die erste Variable kann direkt aus der Wahrheitstabelle abgelesen werden: __ __ __ __ __ __ __ Y1 = X1 X2 X3 + X1 X2 X3 + X1 X2 X3 Wie das KV-Diagramm für Y1 zeigt, können Zusammenfassungen zu Blöcken auch über die Grenzen des KV-Diagramms hinaus erfolgen. Unter Ausnutzung der Freiheiten durch die Redundanz kann gewählt werden, daß Y2 = Y1 sein soll. Mittels des KV-Diagramms für Y1 lassen sich die Felder 0 und 2 sowie 1 und 0 zu je einem Block zusammenfassen. Damit erhält man: __ __ __ __ Y1 = X1 X2 + X1 X3 Faßt man alternativ die Null-Felder zusammen, so wird: __ __________ Y1 = X1 + X2 X3 oder Y1 = X1 + X2 X3 In diesem Fall ist also die Darstellung über die negierte Form günstiger. Für den zweiten Ausgang wird (Abb. 3. 14) ein eigenes KV-Diagramm aufgestellt. Setzt man die undefinierten Werte in den Feldern 4 und 5 auf "1", so läßt sich neben dem Block aus den Feldern 2 und o ein weiterer Block aus 1,5,4,0 bilden. Damit erhält man die Ausgangsgleichung: __ __ __ Y2 = X2 + X1 X3 Alternativ kann man auch die Null-Felder unter Berücksichtigung der Redundanzen zusammenfassen: ___________ Y2 = X1 + X2 X3 18 Informatik V-Teil 2, Kap. 3, SS 99 Für die technische Realisierung sind beide Alternativen gleich günstig. Mit insgesamt vier Eingangsvariablen läßt sich das KV-Diagramm auch noch relativ übersichtlich gestalten: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 X1 X2 X3 X4 Minterm 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 X1 X1 X1 X1 X1 X1 X1 X1 X1 X1 X1 X1 X1 X1 X1 X1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X2 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 X3 X4 X4 X4 X4 X4 X4 X4 X4 X4 X4 X4 X4 X4 X4 X4 X4 X4 X4 X1 X3 X3 3 7 6 2 11 15 14 10 9 13 12 8 5 4 0 X1 X1 1 X2 X2 X2 Abb. 3.14: Struktur des KV-Diagramms für 4 Eingangsvariable Entsprechend den 16 möglichen Mintermen enthält das KV-Diagramm 16 Felder. Ein praktisches Beispiel ist in Abb. 3.15 gegeben. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 X1 X2 X3 X4 Y1 Y2 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 * 0 0 0 0 * * 1 1 * 0 0 * 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 K1V - Diagramm für Y1 X4 0 X3 3 0 7 1 11 9 0 0 0 1 0 0 X2 X2 X1 0 8 0 4 X1 1 10 12 5 1 2 14 13 1 0 6 15 0 X3 X4 1 X1 0 X2 Abb. 3.15: Beispiel für KV-Diagramm mit 4 Eingangsvariablen Auch hier kann man wieder die disjunktive Normalform anhand der Wahrheitstabelle direkt hinschreiben: __ __ __ __ __ __ __ __ __ __ __ __ __ Y1 = X1 X2 X3 X4 + X1 X2 X3 X4 + X1 X2 X3 X4 + X1 X2 X3 X4 + X1 X2 X3 X4 Unter Ausnutzung der redundanten Terme könnte man Y2 = Y1 setzen. Das KV-Diagramm für Y1 zeigt, daß man die 1-Felder in drei Blöcke zusammenfassen kann. Dann wird die Minimalform: 19 Informatik V-Teil 2, Kap. 3, SS 99 ___ ___ __ __ __ __ Y1 = X2 X3 X4 + X1 X2 X3 + X1 X2 X3 Alternativ zum Block aus den Feldern 2 und 10 kann man auch einen Block aus 2 und 0 bilden, die Ergebnisse sind gleichwertig. Durch Zusammenfassung der Null-Felder kann man eine negierte disjunktive Normalform erhalten: ____________________ __ __ Y1 = X2 + X1 X3 + X1 X3 X4 Hier liefert die negierte disjunktive Normalform die besseren Ergebnisse. Mittels des Shannon-Theorems kann man natürlich auch hier eine Umwandlung in die konjuktive Normalform vornehmen. Die separat vorgenommene Minimierung für den Ausgang Y2 zeigt, daß man hier unter Ausnutzung der "dont cares" zwei Gruppen von jeweils 8 Elementen bilden kann. KV-Diagramm für Y2 X4 X4 * X3 3 0 7 1 11 * 15 * X3 9 * X2 X1 * 8 0 4 X1 1 10 12 0 5 X2 0 0 1 1 2 14 13 1 0 6 1 X1 0 X2 Abb. 3.16: KV-Diagramm für vier Eingangsvariable __ Damit ergibt sich als maximale Vereinfachung: Y2 = X2 Mit vier Eingangsvariablen hat das KV-Diagramm noch recht "benutzbar" ausgesehen. Definiert ist es aber grundsätzlich auch für eine noch größere Zahl n von Eingangsvariablen, auch wenn damit die Zahl der Zustände mit 2**n ansteigt. Die Verhältnisse für 5 Eingangsvariable sind in Abb. 3.17 dargestellt: 20 Informatik V-Teil 2, Kap. 3, SS 99 X1 X2 X3 X4 X5 0 1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 u s w . bis 1 1 1 31 M in t e r m e 0 0 1 1 0 1 0 1 X1 X1 X1 X1 1 1 X1 X2 X3 X4 X5 X1 X1 X4 X3 X3 X3 X3 X5 X5 X5 X5 X5 3 7 23 19 18 22 6 2 11 15 31 27 26 30 14 10 9 13 29 25 24 28 12 8 1 5 21 17 16 20 4 0 X3 X4 X4 X4 X4 X1 X5 X4 X2 X2 X2 X2 X3 X3 X3 X2 X2 X2 X3 Abb. 3.17: Wahrheitstabelle (gekürzt) und KV-Diagramm für 5 Eingangsvariable Entsprechend den 32 möglichen Mintermen enthält das KV-Diagramm 32 Felder. An einer Seite ist nun die "Schachtelung" von zwei Eingangsvariablen notwendig. 4 5 6 7 16 24 X1 X2 X3 X4 X5 Y 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 0 1 0 1 0 1 0 0 1 0 Rest X1 0 0 1 1 0 0 0 1 0 1 0 0 X1 X1 X5 X4 3 11 X4 9 1 0 0 0 0 X3 7 1 15 13 5 0 0 1 23 31 29 21 X3 X5 0 0 0 0 19 27 25 17 0 0 0 0 18 26 24 16 X3 0 0 1 1 22 30 28 20 0 0 0 0 6 14 12 4 X3 1 0 0 1 2 10 8 0 0 X2 0 X2 0 0 X2 X3 Abb. 3.18: Beispiel: Wahrheitstabelle und KV-Diagramm mit 5 Eingangsvariablen Durch die Zusammenfassung der 1-Felder mit Hilfe des KV-Diagramms erhält man hier die reduzierte Normalform: ___ __ __ __ __ Y = X1 X2 X3 + X1 X3 X4 X5 Auch die Zusammenfassung der Null-Felder liefert wieder eine Minimalform: ___________________________________ __ __ __ Y = X1 X3 + X1 X2 + X1 X3 + X1 X5 + X1 X4 In diesem Fall ist die aus den 1-Feldern gwonnene Minimalform die günstigere. 21 Informatik V-Teil 2, Kap. 3, SS 99 Diese Beispiele sollen zeigen, daß die Minimierung logischer Funktionen nur für kleine Schaltungen ein "manuell" durchführbarer Vorgang ist. Für große Schaltungen sind algorithmische Methoden unverzichtbar. 3.4.3 Das Verfahren nach Quine-McCluskey Dieses zunächst von Quine vorgeschlagene und von Mc Cluskey verbesserte Verfahren ist auch dann noch anwendbar, wenn graphische Methoden wie das KV-Diagramm wegen zu hoher Anzahl der Variablen an Übersichtlichkeit verlieren und nicht mehr handhabbar sind. Das Verfahren besteht aus 2 Teilen: Zunächst werden in einem erschöpfenden Verfahren alle Terme, die als Kandidaten für die vereinfachte Funktion in Betracht kommen, ausgewählt. Diese Terme werden als Prim-Implikanten bezeichnet. Beispiel: Gegeben sei die folgende vereinfachte Wahrheitstabelle für vier Eingangsvariable einer logischen Funktion F(w,x,y,z). Ausgangspunkt ist wieder die disjunktive Normalform mit der Numerierung der Terme, wie sie auch für das KV-Diagramm verwendet wurde (entsprechend ihrem dezimalen Wert). Es werden nur die Eingangsbelegungen dargestellt, welche eine "1" am Schaltungsausgang erzeugen sollen: (a) (b) Term No. w x y z komb. 0 0 0 0 0 ja 1 2 0 0 0 0 ja ja 0 1 1 0 8 1 0 0 0 ja 10 1 0 1 0 ja 11 14 1 0 1 1 1 1 1 0 ja ja 15 1 1 1 ja 1 (c) w x y z komb. Terme 0,1 0,2 0 0 0 0 0 - 0 ja 0,8 - 0 2, 10 8, 10 - 0 1 0 10, 11 10, 14 1 1 11, 15 14, 15 1 - 1 1 ja 1 1 1 1 ja 0 0 ja 1 0 ja - 0 ja w x y z 0,2,8,10 0,8,2,10 - 0 - 0 - 0 - 0 10,11,14,15 1 - 1 10,14,11,15 1 - 1 - 0 1 - ja 0 - 1 ja Abb. 3. 19: Quine-McCluskey-Schema zur Ermittlung der Prim-Implikanten Zunächst werden alle Minterme danach sortiert, wie viele 1 -Stellen in ihnen vorkommen (a). Jeweils zwei Minterme, die sich nur in einer Stelle unterscheiden, können kombiniert werden. Die Bitstelle, an der der Unterscheid auftritt, wird mit " - " versehen. Man vergleicht dazu alle Elemente aus einer Sektion mit allen der darunterliegenden. Diese Terme werden in einem entsprechenden neuen Schema (b) sortiert. In unserem Fall können aus der Liste in (a) alle Terme kombiniert werden und werden entsprechend annotiert. Das Scheme (b) ist nach demselben Gesichtpunkt "Zahl der 1Werte" sortiert wie (a). Der Versuch, Terme mit Unterschied in nur einer Stelle zu kombinieren, wird nun mit (b) fortgesetzt. Zunächst fällt der Term "0 0 0 - " als nicht mehr kombinierbar auf. Alle anderen Terme können nochmals kombiniert werden und bilden das Schema (c). 22 Informatik V-Teil 2, Kap. 3, SS 99 Eine weitere Vereinfachung ist dann nicht mehr möglich. Deshalb wird das Schema für diesen Fall mit (c) abgeschlossen. Der eine Term aus (b) und alle Term aus (c) sind Prim-Implikanten. Dies sind also: 000-0-0 1-1Die Terme in (c) treten zweimal auf, man wird sie bei der Bestimmung der Minimalform aber nur einmal angeben. Damit ist hier als Minimalform der Schaltung direkt angebbar: F = w' x' y' + x' z' + w y Hier haben wir den Fall, daß die Summe der gefundenen Prim-Implikanten direkt die Minimalform ergibt. Die wird im allemeinen Fall so nicht funktionieren, man muß sich im zweiten Schritt aus den gefundenen Prim-Implikanten noch die Minimalform ermitteln. Im nächsten Beispiel, das für eine andere Funktiuon mit ebenfalls vier Eingangsvariablen gilt, bringt die erste Stufe der Minimierung eine größere Zahl von Prim-Implikanten: Binärstellen w x y z - 0 0 1 0 1 - 1 11 0 0 1 1 1 - Term 1 0 1 1 - x' y' z w' x z' w' x y xyz wyz w x' Abb. 3. 20: Tabelle von Prim-Implikanten für Selektion Eine Verknüpfung all dieser Primimplikanten würde eine korrekte Logik-Funktion ergeben, die aber noch nicht minimal ist. Minterme PrimImplikanten x' y' z 1,9 w' x z' 4,6 w' x y 6,7 xyz 7, 15 1 4 6 7 8 x 9 10 15 x x x x x x x w y z 11,15 w x' 8,9,10,11 11 x x x x x Markierte Spalten: Minterm nur durch einen Prim-Implikanten erfaßt Unterstrichen: Essentielle Prim-Implikanten Abb. 3.21: Schema zur Auswahl der essentiellen Prim-Implikanten 23 x Informatik V-Teil 2, Kap. 3, SS 99 Abb. 3.21 zeigt das zur Auswahl der Prim-Implikanten für die minimale Normalform verwendete Schema. Horizontal aufgetragen werden die Minterme, vertikal dagegen die ermittelten Prim-Implikanten (PIs) Im ersten Schritt wird nun markiert, wo ein Minterm durch einen Prim-Implikanten abgedeckt wird. Im zweiten Schritt ist dann zu ermitteln, welche Minterme durch genau einen der vorhandenen PrimImplikanten erfaßt werden. Das entspricht im Schema Spalten, die nur ein Kreuz haben. Wenn ein Minterm nur durch genau einen Prim-Implikanten überdeckt ist, dann muß dieser Prim-Implikant notwendigerweise in der Logikfunktion erscheinen. Man nennt solche PIs "essentielle PIs". Mit diesem Schritt sind die essentiellen PIs ermittelt. Minterme PrimImplikanten x' y' z 1,9 1 4 7 8 x 9 10 11 15 x w' x z' 4,6 x w' x y 6,7 xyz 6 x x 7, 15 x x x w y z 11,15 x w x' 8,9,10,11 x x x x x Von den essentiellen Prim-Implikanten erfaßt: Abb. 3.22: Überdeckung durch die essentiellen Prim-Implikanten Im vierten Schritt ist dann zu untersuchen, welche der verbleibenden Minterme, die durch mehrere PIs abgedeckt werden können, durch die essentiellen PIs schon erfaßt sind. Im Beispiel sind nur die Minterme 7 und 15 nicht erfaßt. Es müssen also weitere Minterme gefunden werden. Im vorliegenden Fall überdeckt der PI x y z gerade die Minterme 7 und 15. Damit besteht sinnvollerweise die minimale Logikfunktion aus den essentiellen PIs plus diesem PI. Damit steht als Ergebnis fest: F = x' y' z + w' x z' + w x' + xyz Man kann dieses Schema in gleicher Weise auch auf die konjunktive Normalform anwenden. Sollen Logik-Tabellen minimiert werden, die "dont care"-Werte erhalten, so werden diese bei der Suche nach den Primimplikanten mit verwendet und können dort direkt zur Vereinfachung beitragen. Bei der Tabelle zu Ermittlung der essentiellen PIs erscheinen diese Werte dann nicht mehr. 3.4.4 Andere Verfahren Sowohl das KV-Diagramm als auch das Quine-McClskey-Verfahren benötigen als Eingangs-funktion eine konjunktive oder disjunktive Minimalform. Diese im allgemeinen Fall aus eine Logik-Gleichung zu gewinnen, kann durchaus aufwendig sein. Für Logiken, die mehr als zweistufig werden müssen, funktioniert das Verfahren gar nicht. Beide Verfahren liefern als Ausgang zunächst auch nur die Minimierung für eine Ausgangsvariable. Bei Logiken mit mehreren Ausgängen muß man das Verfahren entsprechend mehrfach ausführen. 24 Informatik V-Teil 2, Kap. 3, SS 99 Die gemeinsame Verwendung von Termen für beide Ausgänge ist dann möglich, erfordert aber zusätzliche "Handarbeit". Es existieren weitere Verfahren zur Logik-Minimierung auch für Funktionen mit größerer logischer Tiefe, die allerdings nicht deterministisch zu der minimalen Logik führen (z. B. im Programmpaket ESPRESSO der University of California, Berkeley). Trotz vieler Arbeiten in den letzten Jahren ist die Logik-Minimierung auch heute noch ein aktuelles Forschungsgebiet. 3.5 Kombinatorische Makros 3.5.1 Übersicht Bei Aufgaben des Schaltungs- und Systementwurfs wird man nicht immer von der Ebene der Transistoren oder der Gatter aus beginnen, sondern mit komplexeren Bausteinen für arithmetische und logische Grundfunktionen arbeiten wollen. Wenn diese speichernde Eigenschaften haben, wird man sie zur sequentiellen Logik rechnen. Aber auch rein kombinatorische Makros sind sinnvoll. Für logische Funktionen wird man einmal komplexere Verknüpfungsmöglichkeiten als Einzelgatter haben wollen. Darüber hinaus wird man häufig Codier- und Decodierbausteine benötigen. Für arithmetische Operationen sind Addierer, Subtrahierer, ggf. auch Multiplizierer von Bedeutung. Für Kontroll-Funktionen sind Multiplexer und Demultiplexer von großer Bedeutung. 3.5.2 Äquivalente Logik-Realisierungen Der Übersichtlichkeit halber neigt ein menschlicher Logik-Entwickler dazu, seine Schaltungen aus nicht-invertierenden Logik-Elementen auzubauen. Die meisten Realisierungen von Logik-Funktionen beruhen aber auf Technologien, bei denen invertierende Funktionen (NAND, NOR) mit einer einstufigen Transistorschaltung realisierbar sind, während nicht-invertierende Funktionen (AND, OR) zusätzlich einen Inverter benötigen. Folglich sind NAND und NOR mit weniger Transistoren und deshalb auf geringerem Raum und mit schnelleren Schaltzeiten realisierbar. Darüber hinaus gibt es Technologien, die vorzugsweise die Realisierung aus NANDs oder NORs unterstützen. Deshalb sind für die Implementierung von Logik in hochintegrierten Schaltungen Techniken interessant, welche eine beliebige Konvertierung von Logik auf unterschiedliche Basis-Funktionen zulassen. Grundlage solcher Techniken ist die Regel nach de Morgan. (Abb. 3. 23). >1 & äquivalent (de Morgan) >1 & entspricht Abb. 3.23: Logische Äquivalenzen 25 Informatik V-Teil 2, Kap. 3, SS 99 Algorithmen, mit deren Hilfe eine AND - OR-Logik in eine NAND-NOR-Logik ungewandelt werden kann, sind bekannt Vorgestellt werden soll hier eine Methode, welche auf der Basis des logischen Netzes eine solche Umwandlung erlaubt. Zunächst kann man an beiden Enden einer Verbindung zwischen zwei logischen Bausteinen je einen Inverter einfügen, ohne daß sich die Logikfunktion ändert. Entsprechen ist es natürlich auch möglich, bei einer Logik-Konvertierung zwei aneinander angrenzende Inverter zu eliminieren. Nach de Morgan kann man dann aus einem AND mit Invertierungen an den Eingängen ein NOR erzeugen, aus einem OR mit invertierten Eingängen ein NAND. Bei weiterer Verfolgung dieses Prinzips kann man dann auch die Ersatzschaltungen für AND und OR aus NOR bzw NAND mit zusätzlich invertierten Eingängen angeben (Abb. 3. 24). & >1 & äquivalent >1 äquivalent >1 & Abb. 3.24: Substitution von AND und OR durch NAND, NOR und Inverter In Schaltungen ergeben sich dann zum Beispiel folgende Kompensationsmöglichkeiten (Abb. 3.25): & & & > 1 entspricht & & > 1 > 1 > 1 & entspricht > 1 > 1 Abb. 3. 25: Konvertierung von Schaltnetzen von nicht-invertierenden zu invertierenden Gatter-Bausteinen Damit sind im allgmeinen die Umwandlungen von Gatter-Netzen ohne große Problem möglich. Ein praktisches Beispiel ist in Abb. 3. 26 für die Konvertierung eines Netzwerks mit AND und R-Gattern in eines mit NANDs angegeben. Das Verfahren gilt natürlich auch für Gatter mit mehr als zwei Eingängen. In dieser Weise läßt es natürlich nur für kombinatorische Schaltungen, also solche ohne interne Rückkopplung anwenden! 1. Ausgangsschaltung C D E A B' 3. "Kürzen" der Inverter & >1 & C D E' A' B >1 2. Substitution der ANDs / ORs AND C D E A B' & OR & & & & & AND & & OR Abb. 3.26: Konvertierung von einer AND-OR-Realisierung zu einer NAND-NORRealisierung 26 Informatik V-Teil 2, Kap. 3, SS 99 Ein andere Problem bilden Gatter mit hohem Fan-In. Es ist in den meisten Technologien nicht günstig, z. B. ein Gatter mit 8 Eingängen einstufig zu realisieren. Ein solches Gatter würde z. B. in CMOS-Technik wegen des sogenannten Substrateffekts und wegen großer interner Kapazitäten nur recht langsam umschalten. In der Praxis wird man deshalb Gatter mit vielen Eingängen nicht einstufig aufbauen, sondern in Form einer mehrstufigen Logik, die aus Gattern mit einer geringeren Zahl von Eingängen aufgebaut ist, realisieren. Abb. 3.27 zeigt als Beispiel die Realisierung eines AND-Gatters mit 8 Eingängen durch NANDs, NORs und Inverter. langsam schnell schneller & & >1 & & & & & noch schneller & >1 & >1 & & . Abb. 3.27: Realisierung eines 8-fach AND-Gatters durch mehrstufige Logik Welche Art der Realisierung am günstigsten ist, wird stark von der jeweiligen Technologie (bipolar, CMOS) abhängen. Während hier eine einfache, an sich einstufig realisierbare Logik-Funktion mehrstufig implementiert wurde, ist es durch Verwendung sogenannter Komplexgatter in CMOSTechnologie auch möglich, zwei- und sogar mehrstufige Logik-Funktionen einstufig zu realisieren. In manchen Technologien war zeitweise auch die Verwendung von sogenannten Pass- Transistoren oder, in CMOS-Technik, Transmission-Gates recht beliebt. Diese Technik soll im nächsten Abschnitt kurz vorgestellt werden. 3.6.3 XOR (Exklusiv-ODER) und Äquivalenzfunktion Die ersten logischen Makros haben wir bereits kennengelernt, es waren die Exlusiv-ODER funktion (XOR) und deren Invertierung, die XNOR-Funktion. Nachfolgend sei nochmals die Wahrheitstabelle für das XOR angegeben, wenn x und y die Eingäng sind und out der Ausgang ist. Die Negierung des XOR wird auch als Aquivalenz-Funktion bezeichnet. x y xor equiv. (xnor) ---------------------------------------------------0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 1 Es gilt also: x (xor) y = x y' + x' y 27 Informatik V-Teil 2, Kap. 3, SS 99 Die dazu komplementäre Funktion ist die Äquivalenzfunktion: x (equ) y = x y + x' y' (nachfolgend auch als XNOR bezeichnet) Diese Funktionen sind komplementär und generell auch für mehr als nur 2 Eingänge definiert. Es gelten zum Beispiel das kommutative und das assoziative Gesetz. Man kann dann z. B angeben, daß gilt: (A xor B) xor C = A xor (B xor C) = A xor B xor C Zum Beispiel gilt auch: (A exor B exor C)' = A exor B equ C (A equ B equ C)' = A equ B exor C Allgemein kann man angeben, daß bei der EXOR-Funktion der Ausgang 1 wird, wenn verschiedene Eingagswerte anliegen, sie wird 0, wenn die Eingangswerte an allen Eingängen gleich sind. Für die Äquivalenz-Funktion (xnor) gilt genau der inverse Fall. xor und xnor werden in der Praxis nur selten mit mehr als 2 Eingängen realisiert und eingesetzt, weil der Schaltungsaufwand relativ hoch ist. Die Realisierung dieser Funktion ist durch mehrstufige Gatter-Schaltungen möglich. Abb. 3.28 zeigt die Implementierung einer XOR-Funktion durch 4 NAND-Gatter. In CMOS-Technik wird jedes dieser NAND-Gatter aus 4 Transistoren aufgebaut, man benötigt also 16 Transistoren. & x y 0101 & 1011 1110 & 0110 out 0011 & 1101 Abb. 3.28: Realisierung einer XOR-Schaltung mit vier NAND-Gattern Die CMOS-Technik läßt es zu, bei Verwendung sogenannter "Transmission Gates" für die LogikRealisierung in erheblichem Umfang Transistoren einzusparen. Eine solche Transistorschaltung zeigt Abb. 3.29. VDD x y out GND Abb. 3.29: XOR-Schaltung mit Transmission Gates 28 Informatik V-Teil 2, Kap. 3, SS 99 Solche Implementierungen in CMOS-Technologie sind sehr effizient bezüglich der benötigten Fläche. Nachteile bestehen bezüglich der Testbarkeit solcher Schaltungen. XOR-Funktionen lassen sich hervorragend verwenden, um in digitalen Systemen die Paritätchecks durchzuführen. Ein Paritätsgenerator ist eine Schaltung, die für ein Code-Wort das Paritätsbit erzeugt. Ein Paritätschecker ist eine Schaltung, welche mit Hilfe des übertragenen Paritätsbits die Parität überprüft. Als Beispiel nehmen wir an, daß für einen 3-Bit-Code eine ungerade (odd) Parität gewählt wurde. Die Anzahl der 1- Stellen im Code-Wort, erweitert um das Paritätsbit, muß immer ungerade sein. 3 -B it- C o d e x y z P a r .-B it 0 0 0 1 0 0 1 0 0 1 0 0 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 1 1 1 1 0 Abb. 3.30: Wahrheitstabelle für Parity-Bit-Generierung (3-Bit odd) Das Paritätsbit läßt sich unter Verwendung der xor - und der xnor -Funktion recht einfach erzeugen: P = x xor y equ z, was gleichwertig ist zu: P = x equ y xor z Es genügen also ein xor - und ein xnor-Gatter mit jeweils 2 Eingängen zur Realisierung. Die Wahrheitstabelle für den Parity-Check ist etwas komplexer: 3-Bit- Code x 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 y 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 z 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 Parity error Par.-Bit 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 Check 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 Abb. 3.31: Wahrheitstabelle für Parity-Check 29 Informatik V-Teil 2, Kap. 3, SS 99 Der Parity-Checker läßt sich mit xnors (equ-Funktion) realisieren: C = x xnor y xnor z xnor P Die Realisierungen der Schaltungen zeigt Abb. 3. 32. x y z x y P >>11 >>11 >>11 C >>11 z P Parity-Bit-Generator >>11 Parity-Bit-Checker Abb. 3.32: Realisierung von Parity Generator und Parity Checker mit XOR- und XNORSchaltungen 3.5.4 Arithmetische Makros Zu den wichtigsten Bausteinen digitaler Schaltungen gehören arithmetische Bausteine, welche die Grundperationen Addition und Subtraktion unterstützen. Die Subtraktion wird dabei meistens auf eine Kombination aus Addition und Komplementbildung zurückgeführt. Wir haben das XOR schon als eine Art Addierer kennengelernt. Wir benötigen aber noch eine Erweiterung: Das Element muß neben den beiden Eingängen x und y und dem Ausgang S, der die Summe ausgibt, einen weiteren Ausgang C besitzen, welcher das "Carry"-Bit für den Überlauf angibt. Eingänge x Ausgänge y S C 0 0 0 0 1 0 1 0 0 1 1 0 1 1 0 1 Abb. 3. 33: Wahrheitstabelle eines Halbaddierers Die logischen Gleichungen für den Halbaddierer lauten also: S = x' y + x y', C=xy Alternative Möglichkeiten zur Implementierung des Halbaddierers sind in Abb. 3.34 dargestellt. 30 Informatik V-Teil 2, Kap. 3, SS 99 x & y' x y S >>11 x' y & x y & x' y' & C S >>11 x y >>11 S & x' y' >>11 x y & x y >>11 C x' >>11 & S C y' & C x y S >>11 & C Abb. 3.34: Implementierungen eines Halbaddierers Natürlich kann man den Halbaddierer auch aus NANDs und NORs aufbauen, wenn diese als Grundgatter günstig zur Verfügung stehen. Die Implementierung über das XOR ist besonders günstig, wenn das XOR als effizient aufgebautes Komplexgatter zur Verfügung steht. Für reale Additionsaufgaben reicht der Halbaddierer noch nicht aus, weil er in einer Rechenwerk mit mehreren Bitstellen den Carry-Übertrag einer vorherigen Stufe nicht aufnehmen kann. Der Volladdierer besitzt deshalb drei Eingänge: x, y, z und die Ausgänge S (sum) und C (carry). Eingänge Ausgänge y z S C 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 0 1 0 1 0 1 1 1 0 0 1 0 1 1 0 1 1 1 1 1 1 x Abb. 3.35: Wahrheitstabelle des Volladdierers Der "Summe"-Ausgang ist auf "high", wenn ein oder drei Eingänge auf high sind. Der CarryAusgang ist auf high, wenn mehr als ein Eingang auf high ist. In diesem Fall haben wir zwei verschiedene Interpretationen für die Eingangsvariablen: Es können einmal arithmetische Variablen sein, die addiert werden sollen, man kann sie aber zum Entwurf der Logik auch als logische Variablen betrachten, auf welche die Regeln der Booleschen Logik anwendbar sind. 31 Informatik V-Teil 2, Kap. 3, SS 99 Unter Verwendung der disjunktiven Normalform mit Mintermen kann man den Volladdierer wie folgt logisch beschreiben: S = x' y' z + x' y z' + x y' z' + x y z C = xy + xz + yz Entsprechend diesen Gleichungen kann die Implementierung durch Gatter erfolgen (Abb. 3.36). x´ y' z & x & y x´ y z' & x y' z' & x y z & S >1 x z & y z & >>11 C Abb. 3.36: Implementierung eines Volladdierers entsprechend den Booleschen Gleichungen Eine alternative, ziemlich gebräuchliche Implementierung des Volladdierers verwendet zwei Halbaddierer und ein OR-Gatter. x y >>11 & S >>11 & C >>11 z Abb. 3.37: Volladdierer aus zwei Halbaddierern mit XORs und OR-Gatter Die Äquivalenz dieser Implementierung kann auch nachgewiesen werden: S = z (xor) (x (xor) y) = z' (x y' + x' y) + z (x y' + x' y)' ..= z' (x y' + x' y) + z (x y + x' y') . = x y' z' + x' y z' + x y z + x' y' z Der Carry-Ausgang wird: C = z (x y' + x' y) + x y = x y' z + x' y z + x y 32 Informatik V-Teil 2, Kap. 3, SS 99 Für Addierwerke mit mehreren Bit-Stellen müssen stets mehrere Volladdierer kaskadiert werden. Ein Problem dabei wird, daß bei n- Bit Tiefe ein Carry-Bit der ersten Stufe den Ausgang der n-ten Stufe direkt beeinflussen kann, also eigentlich die n-te Stufe (das höherwertige Bit) stets auf alle Ergebnisse niederwertiger Bit-Stufen warten muß. Reale Addierwerke wird man deshalb mit sogenannanter "Carry-Lookadead-Logik" ausrüsten, welche die Berechnung wesentlich beschleunigen kann. Subtrahierer kann man, alternativ zur Realisierung durch Komplementbildung und Addition, auch direkt realisieren. Ganz äquivalent zu Halbaddierern und Volladdierern gibt es auch HalbSubtrahierer und Voll-Subtrahierer. Notwendig ist der Übertrag eines negativen Carry-Bits. Der Minuend sei x, der Subtrahend y. Wenn x >= y gilt, so kommen die drei Fälle in Betracht: 1-1=0 1-0=1 0-0=0 Das Ergebnis steht jeweils im Differenzbit D. Ist dagegen x < y, so müssen von der nächsthöheren Bit-Stelle 2 geborgt werden, wovon 1 abzuziehen ist. Das Differenzbit wird auch dann 1, gleichzeitig wird ein negativer Übertrag B eingetragen. Abb. 3.38 zeigt die Wahrheitstabelle des Halb-Subtrahierers. Eingänge x Ausgänge y B D 0 0 0 0 1 0 0 1 0 1 1 1 1 1 0 0 Abb. 3.38: Wahrheitstabelle eines Halb-Subtrahierers Man kann daraus die Boolschen Gleichungen für die Ausgänge direkt ablesen: D = x' y * x y' B = x' y Erstaunlicherweise ist die Funktion D dieselbe wie die für S beim Halbaddierer. Man kann also auch dieselbe Implementierung dafür wählen. Für den Voll-Subtrahierer muß eine dritte Eingangsvariable z berücksichtigt werden, die einen negativen Übertrag darstellt. 33 Informatik V-Teil 2, Kap. 3, SS 99 Eingänge x Ausgänge y z B 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 0 1 1 0 0 0 0 1 1 1 0 1 1 1 1 1 D 0 Abb. 3.39: Wahrheitstabelle des Voll-Subtrahierers Für die Differenz erhält man in der Normalform: D = x' y' z + x' y z' + x y' z' + x y z B = x' y + x' z + y z Wieder entspricht die Wahrheitstabelle für den Voll-Subtrahierer bezüglich des Differenz-Ausgangs D genau dem S-(Summe) Ausgang des Voll-Addierers. Der Ausgang B entspricht dem des Ausgangs C im Voll-Addierer, nur ist die Variable x invertiert. Man kann also nur durch Invertierung eines einzigen Signals aus einem Addierer für eine Bit-Stufe einen Subtrahierer erzeugen! Zusätzlich ist natürlich bei Addierwerken für die Propagierung des negativen Übertrags zu sorgen. Auch Multiplizierer und Dividierer sind als kombinatorische Schaltungen realisierbar. Dabei wird wo immer möglich ausgenutzt, daß im binären Zahlensystem eine Multiplikation mit zwei einer Bit-ShiftOperation nach links, eine Division durch zwei einer Bit-Shift-Operation nach rechts entspricht. Kombinatorische Multiplizierer und Dividierer für große Bit-Breiten werden zu sehr aufwendigen Makros. 3.5.5 Mehrstufige Addierer Wir haben bereits das Problem des Übertrages in arithmetischen Schaltungen kurz diskutiert. An dieser Stufe soll beispielhaft ein mehrstufiger schneller Addierer vorgestellt werden. Ai Bi Pi >>11 & Si >>11 Gi & C i+1 >>11 Ci Abb. 3.39: Addierer-Stufe 34 Informatik V-Teil 2, Kap. 3, SS 99 Wir können (Abb. 3. 39) die Signale in einer i-ten Stufe eines mehrstufigen Addieres wie folgt beschreiben: Pi = Ai exor Bi Gi = Ai * Bi Die Summen-und Carry-Bits sind wie folgt beschreibbar: Si = Pi xor Ci C i+1 = Gi + Pi*Ci Gi wird das "carry generate" -Signal genannt. Es produziert ein Carry-Bit am Ausgang, wenn Ai und Bi beide high sind, ungeachtet des einkommenden Carry-Sugnals. Pi wird als "carry propoagate"bezeichnet. Bei einer Betrachtung mehrerer Stufen kann man nun substituieren: C2 = G1 + P1*C1 C3 = G2 + P2*C2 = G2 + P2*(G1 + P1*C1) = G2 + P2G1 + P2P1C1 C4 = G3 + P3*G3 = G3 + P3*G2 + P3*P2*G1 + P3*P2*P1*C1 Der logische Ausdruck für C4 ist hier in seiner disjunktiven Normalform gegeben. Er kann damit durch eine zweistufige Logik mit einer AND-Verknüpfung, gefolgt durch eine ODER-Verknüpfung, realisiert werden. Abb. 3.40 zeigt das Bild eines Netzwerkes, das in einem hier 3-stufigen parallelen Addierer die Carry-Bits im "look ahead"-Verfahren erzeugt und damit wesentliche Beschleungungseffekte erzielen kann. Ein solcher Addierer wird dann als "Carry-Lookahead-Addierer" bezeichnet. & & P3 >1 C4 >1 C3 >1 C2 & G3 & P2 & G2 P1 & G1 C1 Abb. 3. 40: Carry-Lookahead-Netzwerk 35 Informatik V-Teil 2, Kap. 3, SS 99 Der Aufbau des mehrstufigen Carry-Lookahead-Addierers ist in Abb. 3.41 dargestellt. B4 >1 P4 A4 C5 Lookahead- & G4 >1 P3 & G3 >1 P2 & G2 C5 P4 >1 C4 S4 Generator B3 P3 A3 C3 >1 S3 >1 S2 >1 S1 B2 P2 A2 C2 B1 >1 P1 & G1 P1 A1 C1 Abb. 3.41: Addierer mit Carry-Lookahead-Generator Das in Abb. 3.40 gezeigte Netzwerk deutet bereits an, daß mit zunehmemder Zahl der Stufen der Aufwand für das Look-Ahead-Netzwerk stark zunimmt. Der Carry-Lookahead-Addierer wird also z. B. für ein 16 Bit- oder 32 Bit-Rechenwerk eine teure Investition sein. Aus diesem Grund sind im Lauf der Zeit weitere Addierer-Typen entwickelt worden (z. B. RippleCarry), die bei geringerem Implementierungsaufwand ebenfalls eine erhebliche Beschleunigung des Carry-Übertrags bewirken. 3.5.6 Multiplexer und Demultiplexer In größeren digitalen Schaltungen häufig verwendete Bausteine sind Multiplexer und Demultplexer. Bausteine dieser Art werden in digitalen Systemen benötigt , um gezielt den Datenfluß durch bestimmte Kanäle zu steuern. Multiplexer Demultiplexer Ausgang Eingänge A Ausgänge Eingang Y Y1 Y2 X B Y3 Y4 C D S1 S2 Steuersignale S1 S2 Steuersignale Abb. 3.42: Multiplexer und Demultiplexer Abb. 3.42 zeigt den prinzipiellen Aufbau: Im Multiplexer (Mux) wird, abhängig von einem Steuersignal, wahlweise nur einer von n Eingagskanälen logisch mit dem einzigen Ausgang verbunden. Entsprechend werden im Demultiplexer (Demux) die Werte eines Eingangs wahlweise mit n verschiedenen Ausgängen verbunden. 36 Informatik V-Teil 2, Kap. 3, SS 99 Dabei ist die Kopplung bzw. Entkopplung nur logisch zu verstehen. Für eine physikalische Entkopplung (z. B. für wahlweisen Bus-Zugriff) wird man in jedem Fall eine andere Konstruktion wie z. B. ein Transmission Gate) benötigen. Adr. S1 S2 S2 S1 Y MUX & S1 A 0 0 0 A S2 S1 & 0 1 B 2 1 0 C S2 S1 & 3 1 1 D S2 S1 & 1 out >1 B 1 0 S2 }G03 Y A B C D C D Logik - Funktion: Y = S1' * S2' * A + S1' * S2 * B + S1 * S2' * C + S1 * S2 * D Abb. 3.43: Multiplexer Die Wahrheitstabelle und das Logik-Diagramm für den Multiplexer sind in Abb. 3.43 dargestellt. Für den Beispielfall mit vier Eingängen und einem Ausgang wird ein 2-Bit-Steuersignal benötigt. Die Schaltung ist durch eine zweistufige AND-OR-Logik entsprechend der disjunktiven Normalform implementierbar. Entsprechend benötigt der Demultiplexer mit einem Eingang (X) und wahlweise vier Ausgängen ebenfalls eine 2-Bit-Adresse (Abb. 3. 44). Die Logik ist einstufig implementierbar. X = Dateneingang Adr. 0 S1 S2 0 Y1 Y2 Y3 Y4 0 X 0 0 0 1 0 1 0 X 0 0 2 1 0 0 0 X 0 3 1 1 0 0 0 X Logikfunktionen S1 S2 S1 S1 S2 S2 Y2 & X S1 S2 Y3 & X S1 S2 0 } G 1 3 0 X Y1 = S1' * S2' * X Y2 = S1' * S2 * X Y1 & Y4 X 0 Y1 1 Y2 2 Y3 3 Y4 & X Y3 = S1 * S2' * X Y4 = S1 * S2 * X Abb. 3.44: Demultiplexer Im deutschen Normenkatalog für Schaltzeichen existieren spezielle Symbole für Mux und Demux, welche Daten- und Steuereingänge kennzeichnen. 3.5.7 Code-Konverter, Codierer, Decodierer Häufig benötigte kombinatorische Schaltungen sind solche, die innerhalb des Rechners eine Codierung in eine andere umrechnen. 37 Informatik V-Teil 2, Kap. 3, SS 99 Ein typisches Beispiel wäre die Umrechnung von Zahlenwerten im BCD-Code z. B. in den Excess-3Code. Nachfolgend ist die Wahrheitstabelle für die Umrechnung ausgeführt (Abb. 3.45). Input BCD A B 0 0 0 0 0 0 0 0 1 1 Output Excess-3 C 0 0 0 0 1 1 1 1 0 0 D 0 0 1 1 0 0 1 1 0 0 w 0 1 0 1 0 1 0 1 0 1 x 0 0 0 0 0 1 1 1 1 1 y 0 1 1 1 1 0 0 0 0 1 z 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 0 Abb. 3.45: Wahrheitstabelle für die BCD- zu Excess-3-Wandlung Die Schaltung besitzt entsprechend den 4 Bit-Stellen im Code jeweils vier Eingänge und Ausgänge. Es werden aber nicht alle möglichen Kombinationen der vier Eingangsvariablen benötigt, man erhält also "don't care"- Werte. Für die vier Ausgangsvariablen w, x, y, z werden entsprechend vier separate KV-Diagramme benötigt: C C 1 C 1 B A C 1 1 1 1 B A 1 1 B X X X B X X A X X X A 1 X D X D B 1 D X D B X D D y = CD + C' D' z = D' Abb. 3.46 a: KV-Diagramme für die Ausgänge y und z des BCD zu excess-3-Konverters C C C 1 1 1 B A C B A 1 1 1 1 B B X X X 1 X X D x = B'C + B'D + BC'D' X X 1 1 X X A A D X X B D D D X B D W = A + BC + BD Abb. 3.46b: KV-Diagramme für die Ausgänge w und x des BCD- zu excess-3-Konverters 38 Informatik V-Teil 2, Kap. 3, SS 99 Aus der einzelnen Minimierung der Ausgangsvariablen ergeben sich folgende Gleichungen: z = D' y = CD + C'D' = CD + (C + D)' x = B'C + B' D + B C' D' = B'(C + D) + B C' D' = B' (C + D) + B (C + D') w = A + BC + BD = A + B(C + D) z D >1 & y C >1 >1 & x B & >1 & w A Abb. 3. 47: Implementierung des Konverters mir ANDs, ORs und Invertern Durch Umformungen wird man versuchen zu erreichen, daß in allen Gleichungen mehrere gleiche Terme vorkommen. Damit können Logik-Elemente für mehrere Ausgänge gleichzeitig genutzt werde. Hier kann man das OR-Gatter mit dem Ausgang (C + D) für drei Ausgänge nutzen. Das Beispiel zeigt auch die Grenzen der Logik-Optimierung mittels des KV-Diagramms: Bei Netzen mit mehreren Ausgängen wird die Minimierung unabhängig für jede Variable einzeln durchgeführt, die nachfolgende Optimierung geschieht heuristisch "von Hand". Damit ist nicht gewährleistet, daß die insgesamt minimale Logik gefunden wurde. Da man in realen Technologien invertierende Gatter günstiger als nicht-invertierende Gatter aufbauen kann, wird die reale Schaltung nochmals anders aussehen: z D & >1 y C >1 >1 & x B & >1 w & A Abb. 3. 48a: Code-Konverter, Ersatz der ANDs durch NANDs 39 Informatik V-Teil 2, Kap. 3, SS 99 z D & & y C >1 & & x B & & w & A Abb. 3.48 b: Ersatz von NORs durch NANDs und "Kürzen" der Inverter Die Konvertierung erfolgt in 2 Schritten: Zunächst werden (Abb, 3.48a) die AND-Gatter durch NANDs bei Einfügung weiterer Inverter ersetzt. Im zweiten Schritt erfolgt eine Wandlung von ORs mit invertierten Eingängen in NANDs und das "Kürzen" überflüssiger Inverter. Die Komplexität der Schaltung ändert sich hier kaum. Ein Decoder ist eine Schaltung, welche einen binären Code von n Bits auf maximal 2**n Ausgänge verteilt. Entsprechend ist ein Encoder eine Schaltung, die maximal 2**n Eingänge auf einen binären Code mit n Bits umsetzt. Beide Funktionen werden in der Digitaltechnik häufig verwendet. 2**n 2**n n n Encoder Decoder Abb. 3.49: Encoder und Decoder Als Beispiel sei zunächst ein BCD-zu-Dezimal-Decoder mit 3 Eingängen und 8 Ausgängen betrachtet. Eingänge x y z 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 Ausgänge D0 D1 D2 D3 D4 D5 D6 D7 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 Abb. 3.50: BCD-zu-Dezimal-Decoder 40 Informatik V-Teil 2, Kap. 3, SS 99 Der Decoder ist in dieser Form einfach und mittels einer relativ regulären Struktur implementierbar (Abb. 3.51). Allerdings wird man in den meisten Fällen mit den hier verfügbaren 8 dezimalen Werten nicht zufrieden sein. Es wird ein weiteres Eingangsbit (w) benötigt, um die Dekodierung für die dezimalen Ziffern 0 bis 9 zu kmplettieren. Stellt man das zugehörige KV-Diagramm auf (Abb. 3.51), so ist festzustellen, daß nicht benötigte Wertekombinationen am Eingang auftreten. y y D0 D1 D2 D3 D4 D5 D7 D6 y W y X X X D9 X X W D8 z y X z z Abb. 3.51: KV-Diagramm für den BCD-zu-Dezimal-Decoder Diese kann man entweder als "don't cares" auch zur Vereinfachung der Logik verwenden. Damit reduziert sich die Zahl der Eingangsvariablen bei einigen Gattern erheblich (Abb. 3. 52). & D0 = w' x' y' z' & D1 = w' x' y' z & D2 = x' y z' & D3 = x' y z & D4 = x y' z' & D5 = x y' z & D6 = x y z' & D7 = x y z & D8 = w z' & D9 = w z Abb. 3.52: Logik-Schaltbild des BCD-zu-Dezimal-Decoders in minimaler Form Es ist aber auch sinnvoll, das in der korrekt arbeitenden Schaltung nicht auftretende Erscheinen solcher Kombinationen als Fehlerzustand zu erkennen und abzufangen. 41 Informatik V-Teil 2, Kap. 3, SS 99 Eingänge w x y z 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 0 1 1 0 1 0 1 0 1 Ausgänge D0 D1 D2 D3 D4 D5 D6 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 D7 D8 D9 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 Abb. 3.51: Ergänzende Wahrheitstabelle für 4 Eingangsvariablen: nicht zulässige Kombinationen Man könnte z. B. alle Ausgangsvariablen zu null werden lassen, wenn eine dieser Eingangskombinationen auftritt. Dazu würden zusätzlich 10 4-fach AND-Gatter benötigt. Bemerkenswert ist, daß ein Decoder stets die 2**n Minterme von n Eingangsvariablen produziert. Da man jede logische Funktion durch eine Veroderung solcher Minterme darstellen kann, eignet sich eine Decoder mit nachgeschalteten ODER-Gattern auch zur Implementierung von Logik-Funktionen auf der Basis der Minterme. So könnte man z. B. einen Voll-Addierer (mit drei Eingängen) aus einem Decodierer und zwei ORGattern aufbauen (Abb. 3.52). Decoder werden kommerziell als integrierte MSI-Bausteine (Medium-Scale-Integration) angeboten. Encoder sind relativ einfach aus OR-Gattern aufzubauen. Abb. 3.53 zeigt die Schaltung eines Oktalzu-binär-Encoders. D0 D1 x = D4 + D5 + D6 + D7 >1 D2 D3 D4 y = D2 + D3 + D6 + D7 >1 D5 D6 D7 z = D1 + D3 + D5 + D7 >1 Abb. 3. 53: Oktal- zu- binär Encoder Als MSI-Bausteine werden sogenannte "Priority-Encoder" angeboten. Bei diesen besteht eine Gewichtung der Eingänge. Z. B. würde eine "1" bei D7 am höchsten bewertet, eine "1" an einem anderen Eingang entsprechend niedriger. Der Priority-Encoder würde dann den Ausgangswert erzeugen, der dem höchstwertigen auf "1" liegenden Eingang entspricht. 3.5.8 Kombinatorische Rechnerbaugruppen Die größten in Rechnern vorkommenden kombinatorischen Baugruppen sind Addierwerke, Arithmetisch-Logische Einheiten (ALUs) und Multiplizierer. Wir werden sie in dieser Vorlesung an anderer Stelle behandeln. 42