1. Boolesche Schaltkreise
Boolesche Schaltkreise sind ein idealisiertes Modell echter elektronischer Schaltkreise. Als primitive Bausteine haben wir Boolesche Operatoren, auch Gatter (englisch gates) genannt, die mehrere (typischerweise ein oder zwei) Signale zu einem Ausgabe-Signal kombinieren. Die Signale können nur zwei Werte annehmen: wahr/falsch bzw. 1/0 bzw. true/false. Hier sehen Sie die drei üblichsten Gatter:&&
, ||
und !
. Was diese Operatoren
tun, können wir als Wahrheitstabelle darstellen.
Wir listen alle Kombinationen für \(x,y\) auf und schreiben in jede Zeile
auch den Wert, den der Operator ausgibt.
$$
\begin{array}{ll|l}
x & y & x \wedge y \\ \hline
0 & 0 & 0 \\
0 & 1 & 0 \\
1 & 0 & 0 \\
1 & 1 & 1
\end{array}
\qquad \qquad
\begin{array}{ll|l}
x & y & x \vee y \\ \hline
0 & 0 & 0 \\
0 & 1 & 1 \\
1 & 0 & 1 \\
1 & 1 & 1
\end{array}
\qquad \qquad
\begin{array}{l|l}
x & \neg x \\ \hline
0 & 1 \\
1 & 0 \\
\end{array}
$$
Die dritte Zeile der mittleren Tabelle sagt beispielsweise aus, dass
\(1 \vee 0 = 1\) gilt.
Vielleicht wünschen Sie sich noch mehr Gates, zum Beispiel ein if-then-else-Gate mit drei Inputs \(x,y,z\), welches \(y\) ausgibt, wenn \(x\) wahr ist und ansonsten \(z\) ausgibt. So ein Gate können Sie sich einfach aus And, Or, Not bauen:
if
\(x\) then
\(y\) else
\(z\)Jeder Schaltkreis berechnet eine Funktion (formale Definition weiter unten). Informell gesprochen, wenn wir Wahrheitswerte (0/1) in die Input-Gates reinstecken, dann fließen diese durch den Schaltkreis und werden von den AND/OR/NOT-Gates entsprechend ihrer Funktion kombiniert und werden schließlich an den Output-Gates ausgegeben:
- Ein XOR-Gate \(x \oplus y\). Es gibt 1 aus, wenn einer der beiden Inputs 1 ist und der andere 0.
- Ein Majority-Gate \({\rm Maj}(x,y,z)\). Es gibt 1 aus, wenn mindestens zwei seiner Inputs 1 ist.
- Ein \(n\)-faches XOR-Gate
,
-
Ein \(n\)-faches Majority-Gate
\({\rm Maj} (x_1,\dots,x_n)\), welches 1 ausgibt, wenn mehr als
\(n/2\) der Inputs auf 1 stehen. Sie können annehmen, dass \(n\) ungerade
ist, wenn es Ihnen hilft.
Können Sie vermeiden, dass Ihr Schaltkreis riesengroß wird? Kriegen Sie beispielsweise für \(n = 99\) einen Schaltkreis hin, den man realistischerweise herstellen kann?
Je nach Kontext kann es hilfreich sein, Gatter mit beliebig vielen Inputs zuzulassen, beispielsweise
\(x_1 \wedge x_2 \wedge \dots \wedge x_n\) als ein Gate darzustellen:
Schaltkreise, wie wir sie in diesem Kapitel betrachten, sind immer azyklisch. Das heißt insbesondere, das Dinge mit "Feedback-Schleifen" wie Flipflops eben keine Schaltkreis in unserem Sinn sind:
Das Flipflop zeigt ein interessantes Verhalten: wenn \({\rm Reset} = 0, {\rm Set} = 1\) ist, so ist der Ausgabe-Wert des unteren OR-Gates auf jeden Fall 1, und somit ist \(\bar{Q} = 0\); somit sind wiederum beide Input-Werte des oberen OR-Gates 0 und \(Q=1\). Wenn \({\rm Reset} = 1, {\rm Set} = 0\), dann ist analog \(Q = 0, \bar{Q}=1\). Wenn \({\rm Reset} = {\rm Set} = 0\), dann leiten beide OR-Gates einfach die Werte der anderen, von rechts kommenden Kabel durch, und somit gilt \(Q = \neg \bar{Q}\) und \(\bar{Q} = \neg Q\); das heißt, die Werte, die zuvor bestanden, bestehen weiter. Das Flipflop implementiert somit einen 1-Bit-Speicher (die Kombination \({\rm Set} = {\rm Reset} = 1\) würde \(Q = \bar{Q} = 0\) erzeugen und gilt als illegale Eingabe). Ein Flipflop hat somit einen inneren Zustand. Die Schaltkreise in diesem Kapitel haben keinen inneren Zustand: die Werte der Ausgabe-Gates sind vollständig durch die Werte der Input-Gates determiniert. Wir sind nun bereit für eine formale Definition von Schaltkreisen.
Ein Boolescher Schaltkreis ist ein gerichteter, azyklischer Graph (englisch directed acyclic graph, kurz DAG), in welchem jeder Knoten entweder
- ein Input-Gate ist und mit einer Input-Variable oder eine Booleschen Konstant (0 oder 1) beschriftet ist und keine eingehenden Kanten hat (in-degree 0), oder
- mit AND-, OR- oder NOT beschriftet ist,
Oft haben wir es mit Schaltkreisen mit nur einem Output-Gate zu tun; in diesem Falle lassen wir die Beschriftung auch gerne weg, weil sie keine zusätzliche Information bringt. Wenn wir allen Input-Variablen eines Schaltkreises \(C\) einen Wahrheitswert zugewiesen bekommen haben, dann können wir den Schaltkreis von "unten" (Input-Gates) nach "oben" (Output-Gates) auswerten, indem eben jeder mit OR/AND/NOT beschriftete Knoten den ihm zugeordnete Booleschen Operator auswertet. Es ist klar, dass der Schaltkreis \(C\) eine Funktion \(f_C : \{0,1\}^n \rightarrow \{0,1\}^m\) berechnet. Oft schreiben wir einfach \(C : \{0,1\}^n \rightarrow \{0,1\}^m\).
Es ist auch nicht weiter überraschend, dass es Schaltkreise für die gleiche Funktion geben kann (sie haben für die Funktion \(x_1 \wedge \dots \wedge x_n)\) auch bereits drei verschiedene Schaltkreise gesehen, und im Rahmen der obigen Übungsaufgabe wohl auch mehrere Schaltkreise, die das gleiche tun, entwickelt.