[Kapitel] Inhalte der letzten Stunde ergänzt

* Thema: Rechner und Rechnen
This commit is contained in:
Andre Meyering 2017-10-16 18:50:52 +02:00
parent 506a2beb9e
commit b19c50633b
2 changed files with 385 additions and 5 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

View file

@ -98,12 +98,392 @@ In \autoref{fig:neumann_architektur} wird die von-Neumann-Architektur vereinfach
\end{figure}
\subsection{Harvard-Architektur}
Die Harvard-Architektur ist ähnlich der von-Neumann-Architektur, besitzt aber anstatt eines gemeinsamen, zwei getrennte Speicherwerke für Nutzdaten und für Programmcode. Zusätzlich kann noch ein optionales zweites Eingabewerk existieren, welches nur für den Programmcode vorhanden ist. Das Speicher- und Eingabewerk für den Programmcode wird über einen zweiten Bus angebunden. \newline
Dadurch ist eine klare physikalische Trennung von Programmcode und Nutzdaten möglich.
Die Harvard-Architektur ist ähnlich der von-Neumann-Architektur, besitzt aber anstatt eines gemeinsamen, zwei getrennte Speicherwerke für Nutzdaten und Programmcode. Zusätzlich kann noch ein optionales zweites Eingabewerk existieren, welches nur für den Programmcode vorhanden ist. Das Speicher- und Eingabewerk für den Programmcode wird über einen zweiten Bus angebunden. \newline
Dadurch ist eine klare physikalische Trennung von Programmcode und Nutzdaten möglich. \autoref{fig:harvard_architektur} zeigt die Harvard-Architektur und wie sich diese von der von-Neumann-Architektur unterscheidet.
\begin{figure}[ht]
\centering
\includegraphics[width=8cm]{Bilder/Harvard-architektur.png}
\begin{tikzpicture}
% 2. Bus-System
\draw[red] (-1, 2) rectangle ++(3.5, 1);
\node[red] at (0.75, 2.5) {2. Bus System};
\draw[red] (0.5, 2) -- ++(0, -0.5);
\draw[red] (-1, 3.5) rectangle ++(3.5, 1.25);
\node[red, text width=3.2cm] at (0.75, 4.1) {2. Speicherwerk für Programmcode};
\draw[red] (0.5, 3.5) -- ++(0, -0.5);
\draw[red, dashed] (-4, 3.5) rectangle ++(2.5, 1.25);
\node[red, text width=2.5cm] at (-2.5, 4.1) {2. Eingabe- werk};
\draw[red, dashed] (-2.75, 3.5) |- ++(1.75, -1);
\node[red] at (-2.2, 2.2) {optional};
% CPU
\draw (-2, -1.5) rectangle ++(4,3);
\node at (0, 1) {Zentraleinheit (CPU)};
\draw (-1.75, -1.25) rectangle ++(1.5,1.5);
\node [text width=1.25cm] at (-1.05, -0.45) (RW) {Rechen- werk};
\draw (0.25, -1.25) rectangle ++(1.5,1.5);
\node[text width=1.25cm] at ([xshift=2.1cm]RW) (SW) {Steuer- werk};
% Bus-System
\draw (0, -1.5) -- (0, -2.5);
\draw (-2, -2.5) rectangle ++(4, -1);
\node at (0, -3) {Bus-System};
% Ein-/Ausgabe
\draw (-2.5, -4.5) rectangle ++(2,-2);
\draw (0.5, -4.5) rectangle ++(2,-2);
\node[text width=1.8cm] at (-1.4, -5.4) {Ein-/ Ausgabe- werk};
\node[text width=1.8cm] at (1.6, -5.4) {Speicher-werk \textcolor{red}{ für Daten}};
\draw (-1.5, -4.5) -- ++(0,1);
\draw (1.5, -4.5) -- ++(0,1);
% Info Box
\draw[fill=black] (3, -5) rectangle ++(0.4,0.4);
\draw[fill=red] (3, -6) rectangle ++(0.4,0.4);
\node at (5.8,-4.8) {von-Neumann-Architektur};
\node at (5.3,-5.8) {Harvard-Architektur};
\end{tikzpicture}
\caption{Vereinfachte Darstellung der Harvard-Architektur}
\label{fig:harvard_architektur}
\end{figure}
\subsection{Vergleich}
\autoref{tbl:vergleich_vn_hv} auf Seite~\pageref{tbl:vergleich_vn_hv} vergleicht die von-Neumann-Architektur mit der Harvard-Architektur.
\begin{table}[h]
\hspace*{-7mm}
\begin{tabular}{cp{7.6cm}|cp{7.6cm}}
& \textbf{von-Neumann-Architektur} & & \textbf{Harvard-Architektur} \\
\midrule
$\ominus$ & Virenanfälligkeit: Nutzdaten können als Programm ausgeführt werden
& $\oplus$ & nahezu immun gegen unabsichtlichen Virenbefall
\\
$\oplus$ & universelle Programmierbarkeit \newline (\zB Compiler-Ausgabe wird als Programme ausgeführt)
& $\oplus$ & keine (unbeabsichtigten oder ungewollten) Änderungen an der Betriebssoftware möglich
\\
$\oplus$ & flexible Speicheraufteilung zwischen Programmcode und Daten
& $\ominus$ & komplexer und teurer (durch 2 Bus und ggf. 2 Eingabewerke)
\\
$\ominus$ & möglicher Flaschenhals Bus \& Speicherwerk
& $\ominus$ & schwer update-fähig
\\
$\oplus$ & kostengünstig
& $\oplus$ & bessere Performance möglich durch gleichzeitigen Zugriff auf beide Speicherwerke
\\
&
& $\ominus$ & ohne zweites Eingabewerk keine Möglichkeit anderen Programmcode auszuführen.
\\
&
& $\ominus$ & unflexible Aufteilung des Speichers, wenn das eine Speicherwerk voll ist, kann das andere Speicherwerk nicht genutzt werden.
\\
\end{tabular}
\hspace*{-7mm}
\begin{tabular}{cp{7.6cm}|cp{7.6cm}}
\multicolumn{4}{c}{\textbf{Einsatz}} \\
\midrule
\textbullet & übliche PC-Architektur -- \enquote{Universal-PC}
& \textbullet & \enquote{embedded systems} (\zB in Waschmaschinen, KFZ-Elektronik, etc.)
\\
&
& \textbullet & Smartphones \& Co.
\\
&
& \textbullet & Bestandteile von PCs: BIOS, CPU-Cache in modernen CPUs (Trennung in Cache für Programmcode und Nutzdaten), NX-Flag (Non-Executable) im Hauptspeicher
\end{tabular}
\caption{Vergleich der von-Neumann- und Harvard-Architektur}
\label{tbl:vergleich_vn_hv}
\end{table}
\chapter{Rechenwerk / Rechnen in Hardware}
\textsf{\textbf{Grundlagen: Addition}}
\columnratio{0.25}
\begin{paracol}{2}
\begin{tabular}{l|c@{\,}c@{\,}c@{\,}c@{\,}c@{\,}}
& & 4 & 7 & 1 & 1 \\
& + & 0 & 8 & 1 & 5 \\
Übertrag & 0 & 1 & 0 & 0 & \\
\hline
& & 5 & 5 & 2 & 6
\end{tabular}
\switchcolumn
Addition von mehrstelligen Zahlen wird reduziert auf die Addition von zwei (oder drei) einstelligen Zahlen (bzw. Ziffern) zu einer einstelligen Zahl sowie einem einstelligen Übertrag, also einer zweistelligen Zahl als Ergebnis.
$\Rightarrow$ genauso im Binärsystem
\end{paracol}
\section{Schaltnetzsysnthese}
\subsection{Wiederholung/Grundlegendes}
\begin{description}
\item[Schaltwerk] „Hat ein Gedächtnis“, da eine Rückkopplung vorliegt
\item[Schaltnetz] Kann nur die derzeitigen Eingangsdaten verarbeiten, da keine Rückkopplung vorliegt
\item[Vollkonjunktion/Minterm] \texttt{UND}-Verknüpfung aller vorkommenden Variablen entweder in negierter oder nicht-negierter Form
\item[\acf{DNF}] Eine Disjunktion (\texttt{ODER}-Verknüpfung) von Konjunktionstermen (\texttt{UND}-Verknüpfungen).
\item[\acf{DMF}] Ist die minimale Darstellung einer Ausgabefunktion und damit eine Vereinfachung einer \acs{DNF}
\end{description}
\subsection{Halbaddierer}
Addition von zwei einstelligen Binärzahlen $a$ und $b$ zu einer zweistelligen Binärzahl $c_{out}s$ (Übertrag und Summe). Schaltsymbol und Schaltnetz des Halbaddierer werden in \autoref{fig:halbaddierer} dargestellt.
Die folgende Tabelle zeigt den Gedankenweg, wie ein Halbaddierer funktioniert.
\begin{center}
\begin{tabular}{c|cc|ccc|c}
Nr. & $b$ & $a$ & $c_{out}$ & $s$ & Minterm & \acs{DNF} \\ \midrule
0 & 0 & 0 & 0 & 0 & & \\
1 & 0 & 1 & 0 & 1 & $\overline{b}a$ & $c_{out} = ba$ \\
2 & 1 & 0 & 0 & 1 & $b\overline{a}$ & $s=\overline{b}a \vee b\overline{a}$ \\
3 & 1 & 1 & 1 & 0 & $ba$ & $\Rightarrow$ beides gleichzeitig auch \acs{DMF}
\end{tabular}
\end{center}
\begin{figure}[ht]
\centering
\begin{tikzpicture}[font=\sffamily, circuit logic IEC, large circuit symbols,
knoten/.style={circle,fill,draw,inner sep=0pt,minimum size=1.5mm}]
\node at (3,5.9) {Schaltnetz};
\node at (1,5.5) (B) {b};
\node at (1.5,5.5) (A) {a};
\node[and gate, inputs={nn}] at (3,4.5) (PORT1) {};
\node[and gate, inputs={in}] at (3,3) (PORT2) {};
\node[and gate, inputs={ni}] at (3,1.5) (PORT3) {};
\node[or gate, inputs={nn}] at (5,1.675) (PORT5) {};
% -| nutzt nur eine Koordinate
\draw (A) |- (PORT1.input 1); \node[knoten] at (PORT1.input 1 -| A) {};
\draw (A) |- (PORT2.input 1); \node[knoten] at (PORT2.input 1 -| A) {};
\draw (A) |- (PORT3.input 1);
\draw (B) |- (PORT1.input 2); \node[knoten] at (PORT1.input 2 -| B) {};
\draw (B) |- (PORT2.input 2); \node[knoten] at (PORT2.input 2 -| B) {};
\draw (B) |- (PORT3.input 2);
\draw (PORT2.output) -- ([xshift=5mm]PORT2.output) |- (PORT5.input 1);
\draw (PORT3.output) -- ([xshift=5mm]PORT3.output) |- (PORT5.input 2);
\draw (PORT5.output) -- ([xshift=8mm]PORT5.output);
\node[right=of PORT5.output] {$s$};
\draw (PORT1.output) -- (PORT1.output) |- ++(1,0);
\node[right=of PORT1.output] {$c_{out}$};
\end{tikzpicture}
\begin{tikzpicture}[font=\sffamily, circuit logic IEC, large circuit symbols,
knoten/.style={circle,fill,draw,inner sep=0pt,minimum size=1.5mm}]
\node at (2.5,6.8) {Schaltnetz vereinfacht};
\node at (1,5.5) (B) {b};
\node at (1.5,5.5) (A) {a};
\node[and gate, inputs={nn}] at (3,4.5) (PORT1) {};
\node[xor gate, inputs={nn}] at (3,3) (PORT2) {};
% -| nutzt nur eine Koordinate
\draw (A) |- (PORT1.input 1); \node[knoten] at (PORT1.input 1 -| A) {};
\draw (A) |- (PORT2.input 1); \node[knoten] at (PORT2.input 1 -| A) {};
\draw (B) |- (PORT1.input 2); \node[knoten] at (PORT1.input 2 -| B) {};
\draw (B) |- (PORT2.input 2); \node[knoten] at (PORT2.input 2 -| B) {};
\draw (PORT2.output) -- ([xshift=8mm]PORT2.output);
\node[right=of PORT2.output] {$s$};
\draw (PORT1.output) -- (PORT1.output) |- ++(1,0);
\node[right=of PORT1.output] {$c_{out}$};
\node at (0,2) {}; % Nur fürs positionieren
\end{tikzpicture}
\begin{tikzpicture}[font=\sffamily]
\node at (-0.25,2.5) {Schaltsymbol};
\draw (-1, -1) rectangle ++(1.5,1.5);
\node[] at (-0.25,-0.25) (HA) {HA};
\node[] at ($(HA)+(1.6,0.5)$) (cout) {$c_{out}$};
\node[] at ($(HA)+(1.4,-0.5)$) (s) {$s$};
\node[] at ($(HA)+(-1.4,0.5)$) (b) {$b$};
\node[] at ($(HA)+(-1.4,-0.5)$) (a) {$a$};
\draw (-1, 0.25) -- ++(-0.4,0);
\draw (-1, -0.75) -- ++(-0.4,0);
\draw (0.5, 0.25) -- ++(0.4,0);
\draw (0.5, -0.75) -- ++(0.4,0);
\node at (0,-2.3) {}; % Nur fürs positionieren
\end{tikzpicture}
\caption{Halbaddierer -- Schaltnetz und Schaltsymbol}
\label{fig:halbaddierer}
\end{figure}
\subsection{Volladdierer}
Addition von drei einstelligen Binärzahlen $a$, $b$ und $c_{in}$ zu einer zweistelligen Binärzahl $c_{out}s$ (Übertrag und Summe). Schaltsymbol und Schaltnetz des Volladdierer werden in \autoref{fig:volladdierer} dargestellt.
\begin{figure}[h!]
\centering
\begin{tikzpicture}[font=\sffamily]
\node at (4,1.5) {Schaltnetz};
\node[] at (0,0.75) (a) {$a$};
\node[] at (0,0) (b) {$b$};
\node[] at (0,-0.75) (c) {$c_{in}$};
% HA 1
\draw (1, -0.3) rectangle ++(1.5,1.5);
\node[] at (1.75,0.45) (HA1) {HA};
\draw (a) -- ($(a)+(1, 0)$);
\draw ($(a)+(2.5,0)$) -- ++(3.5,0);
\draw (b) -- ($(b)+(1, 0)$);
\node at ($(a)+(3,0.15)$) {$c_{out_1}$};
\node at ($(b)+(2.8,-0.24)$) {$s_1$};
% HA 2
\draw (3.5, -1.2) rectangle ++(1.5,1.5);
\node[] at (4.25,-0.45) (HA2) {HA};
\draw ($(b)+(2.5,0)$) -- ++(1,0);
\draw (c) -- ++(3.5,0);
\node at ($(b)+(5.5,-0.24)$) {$c_{out_2}$};
\node at ($(c)+(5.3,-0.24)$) {$s_2$};
% HA 3
\draw (6, -0.3) rectangle ++(1.5,1.5);
\node[font=\large] at (6.75,0.4) (HA2) {$\geq1$};
\draw ($(b)+(5,0)$) -- ++(1,0);
\draw ($(c)+(5,0)$) -- ++(3,0);
\node at ($(c)+(8.5,0)$) {$s$};
\draw ($(b)+(7.5,0)$) -- ++(0.5,0);
\node at ($(b)+(8.5,0)$) {$c_{out}$};
\end{tikzpicture}
\begin{tikzpicture}[font=\sffamily]
\node at (-0.25,1.1) {Schaltsymbol};
\draw (-1, -1) rectangle ++(1.5,1.5);
\node[] at (-0.25,-0.25) (VA) {VA};
\node[] at ($(VA)+(1.6,0.5)$) (cout) {$c_{out}$};
\node[] at ($(VA)+(1.4,-0.5)$) (s) {$s$};
\node[] at ($(VA)+(-1.4,0.5)$) (c) {$c_{in}$};
\node[] at ($(VA)+(-1.4,0)$) (b) {$b$};
\node[] at ($(VA)+(-1.4,-0.5)$) (a) {$a$};
\draw (0.5, 0.25) -- ++(0.4,0);
\draw (0.5, -0.75) -- ++(0.4,0);
\draw (-1, 0.25) -- ++(-0.4,0);
\draw (-1, -0.25) -- ++(-0.4,0);
\draw (-1, -0.75) -- ++(-0.4,0);
\node at (0,-1.5) {}; % Nur fürs positionieren
\end{tikzpicture}
\caption{Volladdierer -- Schaltnetz und Schaltsymbol}
\label{fig:volladdierer}
\end{figure}
\textit{Hinweis:} Für die Verknüpfung von $c_{out_1}$ und $c_{out_2}$ zu $c_{out}$ wäre eigentlich ein \texttt{XOR} notwendig. Da aber der Fall $c_{out_1} = c_{out_2} = 1$ (also beiden Eingänge des \texttt{XOR} \enquote{1}) nie auftritt, reicht ein einfaches \texttt{OR}.
\subsection{Paralleladdierer (4-Bit-Ripple-Carry-Paralleladdierer RC-PA)}
Der \acs{RC-PA} ist ein mehrstelliger Addierer für Binärzahlen. In den folgenden Beispielen ist er ein Addierer vierstelliger Binärzahlen $a_3a_2a_1a_0$ und $b_3b_2b_1b_0$. Das Ergebnis ist $s_4s_3s_2s_1s_0$ und somit eine 5-stellige Zahl.
\autoref{fig:paralleladdierer} zeigt das Schaltnetz und Schaltsymbol eines Paralleladdierers.
\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.75,1.7) -- (\a*3 + 0.75,1);
\draw (\a*3 + 0.75,1.7) -- (\a*3 + 1.25,1.7) -- (\a*3 + 1.5,-1.5)
-- (\a*3 + 2.5,-1.5) -- (\a*3 + 2.5,-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}
\vspace{1cm}
\begin{tikzpicture}[font=\sffamily]
\draw[black, thick] (0,0) rectangle (10,2);
\foreach \a in {0,...,3} {
\node at (\a + 1,3) {$a_\a$};
\draw (\a + 1,2.7) -- (\a + 1,2);
\node at (\a + 6,3) {$b_\a$};
\draw (\a + 6,2.7) -- (\a + 6,2);
}
\foreach \a in {0,...,4} {
\node at (\a*2 + 1,-1) {$s_\a$};
\draw (\a*2 + 1,-0.7) -- (\a*2 + 1,0);
}
\node[font=\huge\sffamily] at (5, 1) {4-Bit-RC-PA};
\end{tikzpicture}
\caption{Paralleladdierer -- Schaltnetz und Schaltsymbol}
\label{fig:paralleladdierer}
\end{figure}
\textit{Hinweis:} Ein $n$-Bit \acs{RC-PA} ist ein Schaltnetz, kein Schaltwerk. Eine zeichnerische Anordnung mit Verbindungen nur nach unten ist nämlich möglich.
\textsf{\textbf{Schaltungsanalyse:}} \newline
Bestimmung des \enquote{Aufwands}. Aufwand kann sein:
\begin{itemize}[noitemsep]
\item \enquote{Hardware-Aufwand} (in Transistoren)
\item Zeitaufwand
\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}).
\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
\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)$
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.