diff --git a/Bilder/Serielladdierer.png b/Bilder/Serielladdierer.png new file mode 100644 index 0000000..d8cc3d5 Binary files /dev/null and b/Bilder/Serielladdierer.png differ diff --git a/Bilder/Serielladdierer_2.png b/Bilder/Serielladdierer_2.png new file mode 100644 index 0000000..5a536c1 Binary files /dev/null and b/Bilder/Serielladdierer_2.png differ diff --git a/Bilder/casc_cla_pa.png b/Bilder/casc_cla_pa.png new file mode 100644 index 0000000..07d4126 Binary files /dev/null and b/Bilder/casc_cla_pa.png differ diff --git a/Kapitel/02_Rechner.tex b/Kapitel/02_Rechner.tex index 839db7b..0b159f2 100644 --- a/Kapitel/02_Rechner.tex +++ b/Kapitel/02_Rechner.tex @@ -474,16 +474,168 @@ Bestimmung des \enquote{Aufwands}. Aufwand kann sein: \end{itemize} \textsf{\textbf{Warum Zeitaufwand?}} \newline -Es wird der Zeitaufwand betrachtet, da Gatter Schaltzeiten haben, typischerweise \circa{10 Pikosekunden}. Insgesamt werden bei einem Signaldurchgang auf dem \acs{IC} sehr viele Gatter durchlaufen. Damit sind die Schaltzeiten um Größenordnungen größer als die reine Laufzeit der Signale auf dem Leiter angegeben (letztere wird vernachlässigt, Zeitverzögerung wird in \enquote{Anzahl Gatterlaufzeiten}/\acs{GLZ}). +Es wird der Zeitaufwand betrachtet, da Gatter Schaltzeiten haben, typischerweise \circa{10 Pikosekunden}. Insgesamt werden bei einem Signaldurchgang auf dem \acs{IC} sehr viele Gatter durchlaufen. Damit sind die Schaltzeiten um Größenordnungen größer als die reine Laufzeit der Signale auf dem Leiter angegeben (letztere wird vernachlässigt, Zeitverzögerung wird in \enquote{Anzahl \acfp{GLZ}}). -\textsf{\textbf{Hardwareaufwand des 4~Bit RC-PA}} \newline -für \acs{HA}: 2 Transistoren für $c_{out}$ und 6 Transistoren für s $\Rightarrow$ 8 Transistoren \newline -für \acs{VA}: 2 HA und 2 Transistoren für $c_{out}$ $\Rightarrow$ $2\cdot8+2=18$ Transistoren +\textsf{\textbf{Hardwareaufwand des 4~Bit RC-PA}} + +\noindent\begin{tabular}{@{}ll} + für \acs{HA}: 2 Transistoren für $c_{out}$ und 6 Transistoren für s & $\Rightarrow$ 8 Transistoren \\ + für \acs{VA}: 2 HA und 2 Transistoren für $c_{out}$ & $\Rightarrow$ $2\cdot8+2=18$ Transistoren +\end{tabular} \textit{Benötigt werden:} \newline -1 HA = 8 Transistoren \newline -$(n-1)$ VA = $(n-1) \cdot 18~\text{Transistoren} = (18n-18) \text{Transistoren}$ - -$\Rightarrow$ insgesamt: 8 + 18n - 18 = 18n - 10 Transistoren = $O(n)$ +1 HA = 8 Transistoren \textit{plus} +$(n-1)$ VA = $(n-1) \cdot 18~\text{Transistoren} = (18n-18) \text{Transistoren}$ \newline +\quad $\Rightarrow$ insgesamt also: 8 + (18n - 18) = 18n - 10 Transistoren = $O(n)$ Dies heißt, dass der \acs{HW}-Aufwand linear mit der Breite der Summanden steigt. Dies ist gut, denn besseres (also weniger Aufwand) ist kaum zu erwarten. + +\textsf{\textbf{Zeitaufwand des 4~Bit RC-PA}} \newline +für \acs{HA}: max. 2 Gatterlaufzeiten (\enquote{Tiefe 2}, siehe \autoref{fig:halbaddierer}) \newline +für \acs{VA}: max. 4 Gatterlaufzeiten + +Beim \acs{RC-PA} liegen die einzelnen $s_i$ nach unterschiedlicher Zeit an. \newline +$s_i$ wird nach $(i+1)\cdot 2$ \acs{GLZ} erreicht. Das längste $s_i$ ist bei $n$~Bit-RC-PA $i=n-1$ und damit ergibt sich ein Zeitaufwand bei $n$-Bit-\acs{RC-PA} von $2n$\acs{GLZ}! + +Dies ist ein schlechter Zeitaufwand bei einem Paralleladdierer! Zu erwarten wäre $O(1)$. + +\textit{Auswirkung}: Beim Wechsel von 32- auf 64-Bit-CPU hätte sich die Taktfrequenz halbiert. Daraus lässt sich folgern, dass kein 64-Bit-\acs{RC-PA} in der CPU verbaut ist. + +\begin{Hinweis} + Anmerkung zum \acs{RC-PA}: Die $2n$ \acs{GLZ} Zeitaufwand werden nur im \enquote{schlimmsten Fall} bei einer ununterbrochene Kette von $c_{out}$-Ausgängen, welche sich \textbf{alle} im Laufe der Berechnung von 0 auf 1 ändern, erreicht. + + Diese Zeit muss aber trotzdem abgewartet werden. +\end{Hinweis} + +\subsection{Paralleladdierer (4-Bit-Carry-Look-Ahead-Paralleladdierer CLA-PA)} +Idee: Der $c_{in}$-Eingang wird nicht von vorausgehenden \acs{VA} (oder \acs{HA}) übernommen, sondern durch ein \enquote{magisches CLA-Schaltnetz} nachberechnet. Genauer: Für die Berechnung von $c_{in}$ müssen alle Eingänge $a_j, b_j, j < i$ berücksichtigt werden. + +\begin{figure}[ht] + \centering + \begin{tikzpicture}[font=\sffamily] + \foreach \a in {0,...,3} { + % Calculate the index + \def\b{{\pgfmathparse{3-\a} % Evaluate the expression + \pgfmathprintnumber[ % Print the result + fixed, + fixed zerofill, + precision=0 + ]{\pgfmathresult}}} + + \node at (\a*3 - 0.75,2) {$a_{\b}$}; + \draw (\a*3 - 0.75,1.7) -- (\a*3 - 0.75,1); + \node at (\a*3,2) {$b_\b$}; + \draw (\a*3,1.7) -- (\a*3,1); + + \draw[black, thick] (-1 + \a*3,-1) rectangle (\a*3 + 1,1); + + \ifnum\a<3 + \draw (\a*3 + 0.55,2.2) rectangle (\a*3 + 0.95,1.7); + \node at (\a*3 + 0.75,1.9) {?}; + \node at (\a*3 + 1.2,1.4) {$c_{in_\b}$}; + \draw (\a*3 + 0.75,1.7) -- (\a*3 + 0.75,1); + \node[font=\huge\sffamily] at (\a*3, 0) {VA}; + \fi + \ifnum\a>2 + \node[font=\huge\sffamily] at (\a*3, 0) {HA}; + \fi + + \node at (\a*3 + 0.25,-2) {$s_\b$}; + \draw (\a*3 + 0.25,-1.7) -- (\a*3 + 0.25,-1); + } + \node at (-0.5,-2) {$s_4$}; + \node[font=\small\sffamily] at (-1,-2.5) {\enquote{Überlauf}}; + \draw (-0.5,-1.7) -- (-0.5,-1); + \end{tikzpicture} + \caption{CLA-Paralleladdierer -- Schaltnetz}% und Schaltsymbol} + \label{fig:paralleladdierer_cla} +\end{figure} + +Aber wie sieht das Schaltnetz (und die boolesche Formel) für die Berechnung von $c_{in_i}$ aus? +\begin{align*} + \text{\acs{HA}}:~ c_{out} & = a\wedge b & \\ + s_{out} & = a\overline{b}\vee\overline{a}b & \\ + \text{\acs{VA}}:~ c_{out} & = (a\wedge b)\vee(c_{in}\wedge(a\overline{b}\vee\overline{a}b)) & \\ + & & \\ + c_{in_1} = c_{out_0} & = a_0\wedge b_0 & \textit{\qquad \acs{HA}} \\ + c_{in_2} = c_{out_1} & = (a_1\wedge b_1)\vee(\textcolor{Blue}{c_{in_1}} \wedge (a_1\overline{b}_1\vee\overline{a}_1b_1)) & \textit{\acs{VA}} \\ + & =(a_0\wedge b_1)\vee(\textcolor{Blue}{a_0\wedge b_0} \wedge(a_1\overline{b}_1\vee\overline{a}_1b_1)) & \textit{Einsetzen} \\ + c_{in_3} = c_{out_2} & = (a_2\wedge b_2)\vee(\textcolor{OliveGreen}{c_{in_2}} \wedge(a_2\overline{b}_2\vee\overline{a}_2b_2)) & \textit{\acs{VA}} \\ + & = (a_2\wedge b_2)\vee \textcolor{OliveGreen}{((a_0\wedge b_1)\vee(a_0\wedge b_0\wedge(a_1\overline{b}_1\vee\overline{a}_1b_1))} \wedge & \textit{Einsetzen} \\ + & \hspace{4mm} (a_2\overline{b}_2\vee\overline{a}_2b_2)) & \\ + \cdots & & +\end{align*}\todo{Überprüfen, ob korrekt aufgeschrieben.} + +Aber: Für die Berechnung der $c_{in_i}$ kann jeweils eine \acs{DNF}, \acs{DMF} oder jede andere DxF (wie auch eine KxF) verwendet werden. \newline +$\Rightarrow$ diese haben jeweils nur genau (bzw. maximal) 2~\acs{GLZ} Zeitaufwand. + +Insgesamt hat jedes $s_i$ beim \acs{CLA-PA} genau 6~\acs{GLZ} Zeitaufwand (außer $s_0$ 2~\acs{GLZ}, $s_1$ 5~\acs{GLZ}). + +$\Rightarrow$ konstanter Zeitaufwand $O(1)$ + +\textsf{\textbf{Hardwareaufwand des 4~Bit CLA-PA}} \newline +Aufwand für $c_{in_i}$-Berechnung: Annahme Schaltnetz wäre Realisierung der \acs{DNF}.\newline +für $c_{in_i}$ gibt es insgesamt $2i$ Eingänge\newline +$\Rightarrow$ insgesamt max $2^{2i}$ verschiedene Vollkonjunktionen, welche in der \acs{DNF} auftreten können.\newline +Jede dieser Vollkonjunktionen wird mit $2i$ Transistoren realisiert.\newline +$\Rightarrow$ falls alle Vollkonjunktionen verwendet werden müssten, wäre der Hardwareaufwand $2^{2i}\cdot 2i$ Transistoren. + +In der Realität werden natürlich nicht alle Vollkonjunktionen benötigt, sondern ein (vermutlich halbwegs konstanter) Anteil $0 < k < i$. + +$\Rightarrow$ damit ist der Aufwand für $c_{in_i} = O(i\cdot4^i) = O(i\cdot2^i)$ +damit ist der Aufwand für $n$-Bit-\acs{CLA-PA}: $O(n^2\cdot2^n)$ + +Der Hardwareaufwand steigt beim $n$-Bit-\acs{CLA-PA} überexponentiell mit $n$. +Beim Wechsel von $32$-Bit auf 64-Bit-\acs{CLA-PA} wäre der halb-billionenfache Aufwand an Transistoren nötig gewesen. \textit{Das ist viel zu viel}. % Der Hardwareaufwand von 64~Bit im Gegensatz zu 32~Bit wäre viel zu groß und damit wird auch dieser Paralleladdierer nicht in der CPU verwendet. + +\begin{tabular}{@{}l@{}c@{}c@{}l} + Bei $n=4$: \quad $4^2\cdot 2^4=$~ & $16\cdot 16$~ $=$ & $256$ & ~Transistoren \\ + Bei $n=8$: \quad $8^2\cdot 2^8=$~ & $64\cdot 256=$ & ~ \circa{$16384$} & ~Transistoren (64-fache von $n=4$) +\end{tabular}\todo{Vergleichen: Siehe Notizen, etc.} + +Addierer für 32-Bit: Aufsplitten in acht 4-Bit-\acs{CLA-PA} + +\begin{figure}[h!] + \centering + \includegraphics[width=13cm]{Bilder/casc_cla_pa.png} + \caption{Kaskadierbare 4-Bit-CLA-PA} + \label{fig:casc_cla_ca} +\end{figure}\todo{Als Tikz übernehmen} + +$\Rightarrow$ hintereinander geschaltet nach RC-Prinzip \newline +$\Rightarrow$ damit ist das $n$ der nicht-\acs{CLA-PA} noch klein $\Rightarrow$ erträglicher Hardwareaufwand + + +\subsection{Serielladdierer} +\textit{Idee}: Angelehnt an die Verfahrensweise des Menschen sollen die Stellen der beiden Summanden nacheinander (und nicht gleichzeitig) addiert werden. Dadurch wird nur \textbf{ein} \acs{VA} und mehrere \acf{SR} nötig. Daher ist der \acf{SA} ein Schaltwerk, kein Schaltnetz! \autoref{fig:serielladdierer} zeigt das Schaltwerk eines Serielladdierer. + +\begin{figure}[h!] + \centering + \includegraphics[width=13cm]{Bilder/Serielladdierer.png} + \caption{Serielladdierer} + \label{fig:serielladdierer} +\end{figure}\todo{Als Tikz übernehmen} + +\textsf{\textbf{Zeitaufwand ($N$-Bit-SA})}: $n$ Taktzyklen $\Rightarrow$ $O(n)$ + +Ist dies wie beim \acs{RC-PA}? \newline +Jein, denn 1 Taktzyklus ist deutlich mehr als doppelt solang wie die Berechnung des \acs{VA} (Sicherheitsmargen!).\newline +(\zB 1 Taktzyklus > \circa{10}\acs{GLZ}) \newline +$\Rightarrow$ fünffache Berechnungszeit des \acs{RC-PA} + +\textsf{\textbf{Hardwareaufwand ($N$-Bit-SA})} + +1 \acs{VA}: 18 Transistoren \newline +2 \acs{D-FF}. $2\cdot 6=12$ Transistoren. Siehe Grafik rechts: +3. $n$-Bit-\acs{SR}: Siehe Grafik links +Takterzeugung (im folgenden nicht näher betrachtet) +\begin{figure}[h!] + \centering + \includegraphics[width=15cm]{Bilder/Serielladdierer_2.png} + \caption{Schieberegister und D-Flip-Flop} + \label{fig:serielladdierer_2} +\end{figure} + +\begin{Achtung} + Die Takterzeugung muss in der Klausur für den \acl{SA} auf jeden Fall genannt werden, auch wenn er hier nicht weiter betrachtet wird! +\end{Achtung} diff --git a/Rechnerarchitektur_Roethig_Skript_AM.tex b/Rechnerarchitektur_Roethig_Skript_AM.tex index 50ac97b..b3d4194 100644 --- a/Rechnerarchitektur_Roethig_Skript_AM.tex +++ b/Rechnerarchitektur_Roethig_Skript_AM.tex @@ -16,7 +16,7 @@ \title{\Was} \begin{document} - \selectlanguage{ngerman} + \selectlanguage{ngerman} \newcounter{savepage} % Counter resetten \pagenumbering{Roman} % große, römische Seitenzahlen @@ -29,8 +29,7 @@ \setcounter{savepage}{\value{page}} % Neuer Counter \pagenumbering{arabic} % Normale Arabische Zahlen - - + % Mitschriften \input{Kapitel/00_Vorwort.tex} \input{Kapitel/01_Einstieg.tex} @@ -40,17 +39,22 @@ \chapter{Abkürzungsverzeichnis} \begin{acronym}[xxxxxx] + \acro{CLA-PA}{Carry-Look-Ahead-Paralleladdierer} \acro{CPU}{central processing unit} + \acro{D-FF}{D-Flip-Flop} \acro{DMF}{Disjunktive Minimalform} \acro{DNF}{Disjunktive Normalform} \acro{IC}{Integrated Circuit} \acro{GLZ}{Gatterlaufzeit} + \acrodefplural{GLZ}[GLZs]{Gatterlaufzeiten} \acro{HA}{Halbaddierer} \acro{HW}{Hardware} \acro{RC-PA}{Ripple-Carry-Paralleladdierer} + \acro{SA}{Serielladdierer} + \acro{SR}{Schieberegister} \acro{VA}{Volladdierer} \end{acronym} - + \newpage \listoffigures % Abbildungsverzeichnis \newpage