\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{graphicx}
%\usepackage{picins}
\usepackage{thmbox}
\parindent0pt
\usepackage[left=1.00cm, right=1.00cm, top=1.00cm, bottom=1.00cm]{geometry}
\begin{document}
	\newtheorem[S,bodystyle=\normalfont]{defi}{Definition}
	\newtheorem[S,bodystyle=\normalfont]{satz}{Satz}
	\newtheorem[S,bodystyle=\normalfont]{bew}{Beweis}
	\renewcommand{\thedefi}{\hspace{-0.5em}}
	\renewcommand{\thesatz}{\hspace{-0.5em}}
	\renewcommand{\thebew}{\hspace{-0.5em}}
	\newtheorem{lol}{}
	\renewcommand{\thelol}{\hspace{-0,5em}}
	\pagestyle{empty}
	\title{Zusammenfassung GTI}
	\author{Eva Dengler}
    \date{Wintersemester 2016/2017}
	\maketitle
	\subsubsection*{Maintaining:}
	Diese Zusammenfassung wird auf \textit{https://gitlab.cs.fau.de/ik15ydit/latexandmore/} maintain't.
    \\\textbf{Generated by texlive: \today}
	\section{Einführung}
	Technische Informatik ist diejenige Disziplin der Informatik,
	die sich mit dem Entwurf von Systemen in Hard- und
	Software beschäftigt.
	\section{Funktion und Struktur}
	\begin{defi}[System]
		wird im Zusammenhang mit natürlichen, technischen und organisatorischen Gebilden mit komplexem Erscheinungsbild eingesetzt.\\
		Fülle an Merkmalen: Grad der Bestimmtheit, Entstehungsweise, örtliche und zeitliche Konzentriertheit, Zeitabhängigkeit\\
		Umfasst stets kleine Anteile - Untersysteme, Komponenten, Module, Bausteine, Elemente $\Rightarrow$ Objekte.\\
		Zwischen den Objekten eines Systems müssen Beziehungen materieller, energetischer und informationeller Natur bestehen. Gesamtheit dieser Beziehungen bildet zusammen mit den Objekten die Struktur des Systems, eine abgeschlossene Einheit. Nur über definierte Schnittstellen kann ein System betreten und verlassen werden.
	\end{defi}
	Darstellung:\\
	externe Sicht für Benutzer: keine Aussagen über interne Realisierung des Systems \\
	interne Sicht nur für den Hersteller und Betreiber: geeignete Beschreibungsmöglichkeit durch Funktion F\\
	Komplexe Systeme werden unterteilt in überschaubare Teilsysteme und einzeln bearbeitet. Einstufige Verfeinerung reicht meist nicht aus, deshalb mehrstufige Verfeinerung. Zwei Möglichkeiten: Top-Down-Prinzip oder Bottom-Up-Prinzip
	\section{Nachricht und Signal}
	\begin{defi}[Information]
		Information ist nicht allgemein definiert, jedoch in der Gemeinsprache als Kenntnis über reale oder gedankliche Sachverhalte und Vorgänge bekannt.\\
		Nachrichten: Weitergabe von Information\\
		Daten: Verarbeitung von Informationen\\
		Zeichen: ein Element aus einer endlichen Menge von Objekten\\
		Alphabet: Zeichenvorrat, zur Darstellung von Information vereinbart\\
		Symbol: Zeichen mit bestimmter Bedeutung\\
		Signal: Die Darstellung von Nachrichten oder Daten mit physikalischen Mitteln
	\end{defi}
	Nur diskrete Signale, kontinuierliche Signale sind physikalisch und messtechnisch nicht möglich
	\begin{defi}[Typen von Signalen]
		Zeitdiskrete Signale: wertkontinuierlich, wobei man diskrete Abtastzeitpunkte hat\\
		Wertdiskrete Signale: zeitkontinuierlich
	\end{defi} 
	In der Digitaltechnik hat man zeitdiskrete und wertdiskrete Signale. Ein Digitalwert repräsentiert immer ein Intervall an Werten. Grenzwerte werden durch undefinierte Bereiche überbrückt.
	\begin{defi}[Binärsignale]
		Signaldarstellung: Auswahl aus zwei Werten\\
		Binärsignal enthält Informationen von 1 Bit. Zur Abstraktion werden die Signale häufig als 0 und 1 bezeichnet.	Da ein einziges Binärsignal nicht reicht, um Informationen weiterzuleiten, setzt man Binärsignale zusammen. Mit n Binärzahlen lassen sich $2^n$ unterschiedliche Kombinationen darstellen
	\end{defi}
	\section{Information und Codierung}
	\subsection{Informationsgehalt}
	\begin{defi}[Informationsgehalt]
		Voraussetzung: Zeichen voneinander unabhängig\\
		$I(x)= ld \dfrac{1}{p(x)} = -ld p(x)$\\
		Zeichen werden quantitativ im Vergleich zu anderen Zeichen oder im Hinblick auf technischen Darstellungsaufwand bewertet (je seltener, desto mehr Information).\\
		1 bit entspricht der elementaren Entscheidung zwischen zwei gleichwahrscheinlichen Möglichkeiten: $p(x) = 0.5$\\
		Für ein Alphabet mit N Zeichen gilt: $\sum\limits_{i=1}^{N} p (x_i) = 1 $
	\end{defi}
	In einer Zeichenfolge mit L Zeichen ist die zu erwartende Häufigkeit eines speziellen Zeichens $x_i: L \cdot p(x_i)$\\
	Aus der zu erwartenden Häufigkeit und dem Informationsgehalt eines Zeichens, kann man den durchschnittlichen Informationsgehalt einer Quelle berechnen.
	\begin{defi}[Entropie]
		Alle beobachteten Zeichen des Typs $x_i$ liefern insgesamt den Informationsgehalt \[L\cdot p(x_i)\cdot I(x_i)=L\cdot p(x_i)\cdot ld \frac{1}{p(x_i)}\]
		Wenn alle N Zeichen des Alphabets zusammen betrachtet werden, ist der durchschnittliche Informationsgehalt der Quelle (H ist Entropie der Quelle):
		\[H=\sum_{i=1}^{N} p(x_i) \cdot ld \dfrac{1}{p(x_i)}\]
	\end{defi}	
	\subsection{Codierung und Fehlerkorrektur}
	\begin{defi}[Codewörter]
		Code ist Vorschrift für eindeutige Zuordnung (Codierung). \\
		Die Zuordnung muss nicht umkehrbar eindeutig sein.\\
		Codewörter sind elementare Einheiten zur Darstellung von Informationen. Die max. Anzahl der Codewörter im Binären ist $2^m$.\\
		Anzahl strukturierter m-stelliger Codewörter mit genau k Einsen: $\binom{m}{k}=\dfrac{m!}{k!\cdot (m-k)!}$
	\end{defi}
	\begin{defi}[Hammingdistanz HD] 
		Seien $CW_i$, $CW_j$ Binärvektoren und $HD_{ij}$ die Anzahl der Stellen, an denen sich $CW_i$ und $CW_j$ unterscheiden. Dann heißt $HD_ij$ die Hammingdistanz zwischen $CW_i$ und $CW_j$.\\
		Die Hammingdistanz zwischen zwei gleich langen Codewörtern gibt also die Anzahl der unterschiedlichen Binärstellen an.
	\end{defi}
	\begin{defi}[Minimale Hammingdistanz $HD_{min}$] 
	Gibt an, wie weit alle Codewörter aus einer Menge mindestens auseinander sind. Somit ist die minimale Hammingdistanz eine entscheidende Eigenschaft eines Codes, um Übertragungsfehler erkennen und korrigieren zu können.
	\end{defi}
	Bei einschrittigen Codes ist die Hammingdistanz zweier benachbarter Codes immer 1, z.B. Gray Code. 
	\subsubsection{Codes für Fehlererkennung/Fehlerkorrektur}
	Fehlerschutz umfasst Fehlererkennung und Fehlerkorrektur. Diese Schutzwirkung wird durch Codierung realisiert.\\
	\\
	Es gibt mehrere Arten von Fehlern: Bitfehler, Burstfehler und Symbolfehler.\\
	Allgemein gilt:	Geeignete Codes können Fehler erkennen und sogar korrigieren. Notwendig ist dabei die Hinzufügung von zusätzlichen/redundanten Informationen bzw. Bits. Es ist wichtig, dass man eine Systematik des Codes festlegt, z.b. minimale Hammingdistanz, Paritätsbits, Blocksicherungsverfahren, Hamming-Codes.\\
	\begin{defi}[Paritätsbit-Prüfverfahren]
	Es wird ein zusätzliches Paritätsbit angehängt. Im Binärwort enthaltene Einsen werden entweder auf gerade oder ungerade Anzahl geprüft und an den Code angehängt. Die Überprüfung erfolgt beim Empfänger.\\
	Das Prinzip der Paritätssicherung ist zweidimensional anwendbar (heißt dann Blocksicherung). Dabei wird die Nachricht in Blöcke von n Codewörtern mit Paritätsbit eingeteilt. Zusätzlich wird am Ende jedes Blocks ein weiteres Codewort eingefügt, das alle Paritätsbits der Spalten enthält.\\
	Bei Auftreten von Einfachfehlern lassen sich dadurch Spalte und Zeile eindeutig ermitteln. Somit sind Einfachfehler korrigierbar und Bündelstörungen sind erkennbar.\\
	\end{defi}
	\subsection{Hamming-Codes}
	Mehrfachfehler korrigieren:
	\begin{satz} [Zusammenhang zwischen $HD_{min}$ und Anzahl erkennbarer / korrigierbarer Fehler]
	a) Sei $X \subseteq \{0,1\}^n$ ein Code mit $HD_{min}(x)=d$, Dann sind bis zu (d-1) Fehler erkennbar\\
	b) Sei $HD_{min}(X)=d=2e + 1$, Dann sind bis zu $e=((d-1)/2)$ Fehler korrigierbar
	\end{satz}
	Die Hammingdistanz kann man anhand eines Prüfbits erweitern, jedoch nicht durch weitere Prüfbits.
	\subsubsection{Konstruktion von Hamming-Codes}
	Stellen $x_i$ und $y_i$ lassen sich gemeinsam in einem Schema darstellen, das der Binärdarstellung ab dem Wert 1 entspricht.\\
	Prüfstellen $y_i$ besitzen nur eine einzige 1 in einer Spalte. \\
	Alle anderen Spalten stellen von rechts die Stellen $x_i$ dar. \\
	Eine Prüfstelle $y_i$ überprüft alle Informationsstellen $x_i$, die in der Zeile, in der $y_i$ den Wert 1 besitzt, selbst eine 1 in der Tabelle haben.\\
	\\
	\includegraphics[width=0.7\linewidth]{hammingcodes}\\
	\\
	Allgemein gilt: \\
	Bei m Informationsstellen $x_i$ werden k Prüfstellen $y_j$ zur Bildung des Hamming-Codes benötigt:\\
	$2^k - k - 1 \geq m$ 
	\subsection{Nachrichtenübertragung und Optimale Codes}
	Ziele bei Nachrichtenübertragung:\\
	$\Rightarrow$ Darstellungsaufwand minimieren, wenig Bits\\
	$\Rightarrow$ Schutz gegen Verfälschungen und typische Fehlerfälle
	\subsubsection{Bündelstörung}
	Problem: längere Auswirkung einer Störung auf ein Signal, dadurch können mehrere Bits nacheinander gestört werden. \\
	Lösung: Scrambling von Datensequenzen
	\begin{center}
	\includegraphics[width=0.5\linewidth]{buendelstoerung}
	\end{center}
	Länger anhaltender Störeinfluss  verfälscht nur Binärstellen von unterschiedlichen Codewörtern\\ 
	$\Rightarrow$ eine Störung mehrerer Bits ist damit erkennbar, denn pro Codewort ist nur 1 Bit verfälscht.
	\subsubsection{Optimale Codes}
	Optimale Codes versuchen, die im Mittel auftretende durchschnittliche Codewortlänge zu minimieren.\\
	Der minimal erreichbare Idealwert ist dabei der durchschnittliche Informationsgehalt des Zeichenvorrats.\\
	Häufig auftretende Buchstaben $\rightarrow$ möglichst kurze Codewörter,\\
	seltene Buchstaben $\rightarrow$ längere Codewörter\\
	\begin{defi}[Präfix-freie Codierung]
	Kein Codewort ist Präfix eines anderen Codewortes, also kein Codewort darf den Beginn eines anderen Codewortes darstellen.
	\end{defi}
	\begin{defi}[Shannon-Fano-Code]
	Zeichenvorrat nach aufsteigender Wahrscheinlichkeit linear sortieren, danach 2 Teilmengen so konstruieren, dass die Summenwahrscheinlichkeiten der beiden Teilmengen möglichst gleich groß sind. Solange wiederholen, bis nur noch 1 Zeichen in resultierenden Teilmengen enthalten ist.
	\end{defi}
	\begin{defi}[Huffman-Code]
	Binärer Codierungsbaum repräsentiert Codewörter mit variabler Bitlänge, präfix-freie Codierung\\
	erzeugt optimalen Code\\
	\\
	Vorgehensweise: 
	\begin{enumerate}
		\item Finde aus sortierter Liste die beiden Zeichen mit niedrigster Auftrittshäufigkeit (=AH)
		\item Verschmelze die Zeichen zu neuem Element, dessen AH die Summe der beiden Einzelwahrscheinlichkeiten zugeordnet wird. Sortiere neues Element in Liste.
		\item Abbruch, wenn nur noch 1 Objekt in Liste übrig
	\end{enumerate}
	\end{defi}
	\newpage
	\subsection{JPEG-Komprimierung}
	\begin{enumerate}
		\item Aufteilung des Bildes in 8x8-Pixelblöcke
		\item Schnelle diskrete Cosinustransformation (FDCT): transformiert Daten aus Ortsbereich in Frequenzbereich.
		\[ F(u,v)=\frac{1}{4} C_u C_v \sum_{x=0}^{7}\sum_{y=0}^{7} f(x,y) \cos \frac{(2y+1)u\pi}{16} \cos\frac{(2x+1)v\pi}{16} \]
		\[C_u, C_v = \frac{1}{\sqrt{2}}\text{ für } u,v=0; 1 \text{ für } u,v=1...7\]
		\item Quantisierung mithilfe einer Quantisierungsmatrix $Q(u,v)$, der eigentlich verlustbehaftete Vorgang in der Codierung. \\
		Ziel: möglichst viele Nullen in die Transformationsmatrix\\
		Ansatz: Menschliche Wahrnehmung viel empfindlicher für kleine Variation in Farbe und Helligkeit als für hochfrequente Schwankungen. \\
		$\Rightarrow$ Quantisierungsfaktoren für niederfrequente Koeffizienten kleiner wählen als für hochfrequente.
		\item Umsortierung der Matrix mittels Zig-Zag-Verfahren, Sequenz mit möglichst langen Nullfolgen \\
		\includegraphics[width=0.7\linewidth]{umsortierung}
		\item Lauflängencodierung  mithilfe der Huffman-Codierung\\
		\includegraphics[width=0.7\linewidth]{lauflaengencodeirung}
	\end{enumerate}
	
	\newpage
	\subsection{Zahlensysteme}
	\begin{defi}[Polyadische Zahlensysteme]
		geben Ziffern ihren Wert in Abhängigkeit von ihrer Stelle innerhalb einer systematischen stellenorientierten Anordnung. \\
		Die Stellen werten entsprechen den Potenzen der Basis R des jeweiligen Zahlensystems.\\
		Aufbau allgemein:
		\[ N= d_{n-1}\cdot R^{n-1}+\dots + d_1\cdot R^1+d_0\cdot R^0 \]
		$N$: Zahl im Zahlensystem\\
		$R$: Basis\\
		$R^i$: Wertigkeit der i-ten Stelle\\
		$d_i$: Ziffer der Stelle i\\
		$Z$: Menge der Ziffern
	\end{defi}
	Bin $\rightarrow$ Hex: 4 Stellen zusammenfassen, Bin $\rightarrow$ Okt: 3 Stellen zusammenfassen\\
	Wenn anderes zum Umrechnen: Division durch Basis R des neuen Systems. Letzter Wert ist vorderste/linkeste Stelle der neuen Zahl in R.\\
	\begin{defi}[BCD-Code (Binary Coded Decimal)]
		Jede Dezimalziffer ist durch 4-Bit Dualzahl dargestellt. \\
		Die nicht verwendeten BCDs werden Pseudotetraden genannt.\\
		Bei Addition muss zu Pseudotetraden und bei jedem Übertrag noch $6_{10}=0110_2$ addiert werden.
	\end{defi}
	\begin{defi}[Gleitkommazahlen]
	Darstellung von Zahlen durch Vorzeichen (1 Bit), Exponent (8 Bit) und Mantisse (23 Bit)\\
	$Zahl = (-1)^V\cdot 2^{E-127}\cdot 1,M$\\
	Vorzeichen: $V=0 \Rightarrow$ positiv, $V=1 \Rightarrow$ negativ\\
	Mantisse: Die Mantisse ist normalisiert, d.h. dass vor dem Komma genau eine 1 steht. Diese wird nicht gespeichert, sondern nur die Nachkommastellen.\\
	Exponent: Der Exponent wird berechnet durch Subtraktion einer Verschiebedistanz (Bias): E-127. Dadurch ist E immer positiv.\\
	\\
	Spezialwerte:\\
	\begin{tabular}{@{}cc|cc}
		Biased Exponent E & Mantisse M & Wert &\\
		$0<E<255$ & M & $(-1)^V\cdot 2^{E-127}\cdot (1,M)$& \\
		255 & $\neq 0$ & ungültiger Wert (NAN)& z.B. Division durch 0\\
		255 & $0$ & $(-1)^V\cdot$ unendlich& Wert außerhalb des Zahlenbereichs\\
		0& $\neq 0$ & $(-1)^V\cdot 2^{-126}\cdot (0,M)$& \\
		0& $0$ & $(-1)^V\cdot 0$& es gibt +0 und -0\\
	\end{tabular}
	\end{defi}
	Umwandlung Dezimal in IEEE:\\
	1. ins Binärsystem umwandeln\\
	2. Zahl normalisieren (1 vorm Komma) und auf 23 Nachkommastellen runden\\
	3. Biased Exponenten bestimmen\\
	4. Vorzeichenbit bestimmen\\
	\\
	Addition:\\
	1. Passe den Exponenten der kleineren Zahl durch Rechtsschieben der Mantisse (implizite 1 nicht vergessen!) an den der größeren Zahl an\\
	2. Addiere/subtrahiere die Mantissen, bilde - wenn nötig - das Zweierkomplement\\
	3. normalisiere das Ergebnis\\
	4. behandle Sonderfälle\\
	$ N_1 + N_2 = 2^{E_1 -Bias}M_1 + 2^{E_2 - Bias}M_2 = 2^{E_1 -Bias}(M_1 + 2^{E_2-E_1}M_2) $\\
	\\
	Multiplikation:\\
	1. Addiere die biased Exponenten, aber einmal den Bias abziehen\\
	2. Multipliziere die Mantissen\\
	3. normalisiere die Mantisse durch p-maliges Rechtsschieben, der Exponent wird um p erhöht\\
	4. berechne das Vorzeichen\\
	$ N_1\cdot N_2 = 2^{E_1+E_2-Bias-Bias}M_1 M_2$
	\begin{defi}[Vorzeichen-Betragsdarstellung]
		Höchstes Bit ist Vorzeichen: 0 = positiv, 1 = negativ\\
		restliche Bits geben Betrag an: 0 bis 7\\
		Zahlenbereich: $+/- (2^{n-1}-1)$\\
		Berechnung des dezimalen Wertes:
		$ N= (-1)^{d_{n-1}}\cdot \sum\limits_{i=0}^{n-2}d_i\cdot 2^i$
		Addition: \\
		gleiches Vorzeichen: Betrag addieren und Vorzeichen übernehmen\\
		ungleiches Vorzeichen: Differenz zw. größerem und kleinerem Betrag und Vorzeichen der Zahl mit höherem Betrag übernehmen
	\end{defi}
	\begin{defi}[1er-Komplement]
		Berechnung des dezimalen Wertes: $ N= d_{n-1}-d_{n-1}\cdot 2^{n-1}+\sum\limits_{i=0}^{n-2}d_i\cdot 2^i$\\
		Um Vorzeichen zu wechseln: bitweise Invertieren\\
		Addition: bei Übertrag das Zwischenergebnis korrigieren durch Addition des Übertrags\\
		2 Darstellungen der Null macht Probleme: falsches Rechnen beim Überschreiten des Wertebereichs
	\end{defi}
	\begin{defi}[2er-Komplement]
		Berechnung des dezimalen Wertes: $n=-(d_{n-1}\cdot 2^{n-1})+\sum\limits_{i=0}^{n-2}d_i\cdot 2^i$\\
		Eine negative Zahl mehr als positive darstellbar.\\
		Statt mit 2 8-Bit Dualzahlen zu subtrahieren, erweitert man mit einer 9-Stelligen Dualzahl:\\
		\includegraphics[width=0.6\linewidth]{Subtrahieren}\\
		Vorzeichen wechseln: bitweises Komplement, dann +1 (von rechts erste 1 festhalten und danach bitweises Komplement)\\
		\includegraphics[width=0.8\linewidth]{ueberlauf}
	\end{defi}
	\begin{center}
		\begin{tabular}{@{}cc}
			1er-Komplement & 2er-Komplement\\
			\includegraphics[width=0.3\linewidth]{1erkomplement}& \includegraphics[width=0.3\linewidth]{2erkomplement}
		\end{tabular}
	\end{center}
	
	\subsection{Codewandlung/Umschaltung}
	Unabhängige Teilsysteme arbeiten oft mit unterschiedlichen Codes. Dafür verwendet man diverse Codewandlungen. \\
	\\
	Codeumschaltung: Codewörter werden mehrfach belegt, durch spezielle Umschaltzeichen änderbar. Ist besonders effizient, wenn eine Gruppe von Zeichen sehr selten oder sehr häufig auftritt.\\
	3 Arten von Codewörtern:\\
	$\Rightarrow$ Spezielle Codewörter, die eine Umschaltung der Zeichengruppe bewirken\\
	$\Rightarrow$Codewörter, deren Bedeutung umgeschaltet wird\\
	$\Rightarrow$Codewörter, die unabhängig von der Umschaltung immer gleich sind\\
	\\
	Zahl der möglichen Codewörter:\\
	(Nutzbare Codewörter) = $2^{\text{Bin-Stellen der Codes}}$ - (gemeins. Zeichen) - (Umschaltzeichen) \\
	(Darstellbare Zeichen) = (Umschaltzeichen) $\cdot$ (Nutzbare Codes) + (gemeins. Zeichen)\\
	Gesucht: Code mit darstellbaren Zeichen $\geq$ Codewörter und minimalen Umschaltzeichen	
	\section{Schaltfunktionen und Schaltalgebra}
	Wie beschreibt man logische Schaltungen? Wie analysiert man logische Schaltungen? Wie realisiert und optimiert man logische Schaltungen?
	\begin{defi}[Schaltfunktion]
		Eine Schaltfunktion lässt sich schreiben als $y=f(X)= f(x_n, ... , x_2, x_1)$ mit $x_n, ... , x_1$ unabhängige Variablen, y abhängige Variable der Funktion.
	\end{defi}
	Häufig gilt: nicht allen Belegungen kann/muss ein Funktionswert zugeordnet werden, sog. Redundanz- oder Freistellen, gekennzeichnet durch - (sog. don't care)\\
	$\Rightarrow$ 3 Teilmengen von Belegungen: Nullstellenmenge, Einsstellenmenge und Redundanzmenge\\
	$\Rightarrow$ Zwei Hauptklassen: vollständig und unvollständig definierte Schaltfunktion\\
	Graphische Darstellung von Funktionen: Funktionstabelle, Binary Decision Diagrams (BDDs)
	\subsection{Normalformtheoreme}
	Mintermfunktion: \\
	$m_j = \mathfrak{x}_n\cdot \mathfrak{x}_{n-1}\cdot ... \cdot \mathfrak{x}_2\cdot \mathfrak{x}_1$\\
	$\mathfrak{x}_i$ ist $x_i$, wenn $x_i$ für j 1 ist, oder \={$x_i$}, wenn $x_i$ für j 0 ist. Einsstellen heraussuchen.\\
	Maxtermfunktion: \\
	$m_j = \mathfrak{x}_n+ \mathfrak{x}_{n-1}+ ... + \mathfrak{x}_2+ \mathfrak{x}_1$\\
	$\mathfrak{x}_i$ ist $x_i$, wenn $x_i$ für j 0 ist, oder $\overline{x_i}$, wenn $x_i$ für j 1 ist.\\
	In Symmetriediagramm Nullstellen suchen und beschreibende x-Werte negieren.\\
	\\
	Konjunktive Normalform:\\
	Veroderung der Eingangsbits soll 0 ergeben, das heißt jedes Bit, das 1 ist, wird verneint (Max-Terme). Alle veroderten Gruppen werden zum Abschluss verundet.
	\[ y=(f_{2^n-1}+ M_{2^n-1})\cdot(f_{2^n-2}+M_{2^n-2})\cdot ...\cdot(f_1+M_1)\cdot (f_0+ M_0)=\prod_{j=0}^{2^n-1}(f_j+M_j)\]
	\\
	Disjunktive Normalform:\\
	Verundung der Eingangsbits soll 1 ergeben, das heißt jedes Bit, das 0 ist, wird negiert (Min-Terme). Alle verundeten Gruppen werden zum Abschluss verodert.
	\[ y=(f_{2^n-1}\cdot m_{2^n-1})+(f_{2^n-2}\cdot m_{2^n-2})+...+(f_1\cdot m_1)+ (f_0\cdot m_0)=\sum_{j=0}^{2^n-1} (f_j\cdot m_j)\]
	Mit den 3 Grundverknüpfungen Konjunktion, Disjunktion und Negation ist es möglich, jede beliebige Schaltfunktion darzustellen. Man sagt auch, [$\cdot$, +, \={ } ] ist ein Basissystem der Schaltalgebra.
	\begin{satz}[Hauptsatz der Schaltalgebra]
		Jede beliebige vollständig definierte Schaltfunktion lässt sich als Disjunktion von Mintermen (Konjunktion von Maxtermen) eindeutig darstellen.\\
		In der Disjunktion (Konjunktion) treten genau diejenigen Minterme (Maxterme) auf, die zu den Einsstellen (Nullstellen) der Schaltfunktion gehören.
	\end{satz}
	Gattersymbole:\\
	\includegraphics[width=0.85\linewidth]{schaltnorm}
	\subsection{Boolesche Algebra}
	\begin{tabular}{@{}ll}
	R1:	& Abgeschlossenheit der Operationen Durchschnitt und Vereinigung:\\
	&$S\cap T\subseteq M, S \cap T \subseteq M$\\
	&$S\cap T\in P(M), S \cap T \in P(M)$\\
	R2:& Die Reihenfolge der beiden Operanden ist ohne Einfluss auf das Ergebnis (Kommutativität):\\
	&$S\cap T = T\cap S, S\cup T = T\cup S$\\
	R3:& Unabhängigkeit von Reihenfolge der Operationen: Distributivität\\
	&$R\cap (S\cup T)=(R\cap S)\cup (R\cap T), R\cup(S\cap T)= (R\cup S)\cap(R\cup T)$\\
	R4:& $S\cap M=S, S\cup \emptyset=S$\\
	R5:& $S\cap C_M(S)=\emptyset, S\cup C_M(S)=M$, wobei C Komplement
	\end{tabular}
	\begin{defi}[Boolesche Algebra]
		BA=[K, T, $\bot$, \={ }, O, I]\\
		mit zwei zweistelligen Verknüpfungen T (TEE) und $\bot$ (RUM), der einstelligen Relation \={ }, den zwei universellen Schranken O und I, und für alle Elemente aus K gelten eine Reihe von Regeln.
	\end{defi}
	\begin{tabular}{@{}ll}
		Satz 1:& Ist P(M) die Potenzmenge einer beliebigen Menge M, so ist das Verknüpfungsgebilde \\
		&[$P(M), \cap, \cup, C_M, \emptyset, M$] stets eine Boolesche Algebra.\\
		Satz 2:& Bei jeder Booleschen Algebra gilt für die Menge K: $|K|= 2^n$\\
	\end{tabular}\\
	\\
	Huntingtonsche Axiome: Verknüfpungsgebilde, dessen einzelne Aussagen nicht beweisbar sind, aus dem aber alle weiteren Regeln ableitbar sind.\\
	Forderung: Widerspruchsfrei, vollständig, Axiome unabhängig\\
	\\
	H1: Abgeschlossenheit: a T b $\in$ K, a $\bot$ b $\in$ K \\
	H2: Kommutativgesetz: a T b = b T a, a $\bot$ b = b $\bot$ a\\
	H3: Distributivgesetz: (a $\bot$ b) T c = (a T c) $\bot$ (b T c), (a T b) $\bot$ c = (a $\bot$ c) T (b $\bot$ c)\\
	H4: Existenz eines neutralen Elements: I T a = a, O $\bot$ a = a\\
	H5: Komplement: a T k = O, a $\bot$ k = I\\
	\\
	\begin{tabular}{@{}ll}
		R5:& a + 0 = a, a $\cdot$ 1 = a,\\
		R6:& a + 1 = 1, a $\cdot$ 0 = 0\\
		R7:& a + a = a, a $\cdot$ a = a\\
		R8:& a + \={a} = 1, a $\cdot$ \={a} = 0\\
		R9:& doppelt negiertes a = a\\
		R10:& a + (b + c) = (a + b) + c, a $\cdot$ (b $\cdot$ c) = (a $\cdot$ b) $\cdot$ c\\
		R11:& a + (a $\cdot$ b) = a, a $\cdot$ (a + b) = a\\
		R12:& ($\overline{a + b}$)= \={a} $\cdot$ \={b}, ($\overline{a \cdot b}$) = \={a} + \={b}
	\end{tabular}
	\subsection{Entwicklungssatz der Schaltalgebra}
	Normalformtheoreme ermöglichen eine eindeutige Darstellung jeder beliebigen Schaltfunktion.\\
	Schaltfunktionen sind allein durch 3 log. Operationen realisierbar (UND, ODER, Negation).\\
	\\
	DNF: besteht aus mehreren disjunktiv verknüpften Termen, die aus konjunktiv verknüpften Literalen bestehen. Listet alle Belegungen die den Funktionswert 1 erzeugen, einzeln auf.\\
	KNF: besteht aus mehreren konjunktiv verknüpften Termen, die aus disjunktiv verknüpften Literalen bestehen. Jeder Term von disjunktiv verknüpften Literalen entspricht einer invertierten Belegung mit Funktionswert 0.\\
	\\
	Der Entwicklungssatz ist eine formale Methode, eine Funktion in eine DNF oder KNF umzuwandeln.\\
	DNF: $f(x_n, ..., x_i, ..., x_1) = [x_i\cdot f(x_n,..., 1, ..., x_1)]+ $\={x}$_i\cdot f(x_n, ..., 0, ..., x_1)$\\
	KNF: $f(x_n, ..., x_i, ..., x_1) = [x_i\cdot f(x_n,..., 0, ..., x_1)]+ $\={x}$_i\cdot f(x_n, ..., 1, ..., x_1)$\\
	Durch Anwendung des Booleschen Entwicklungssatzes erhält man die Darstellung der Schaltfunktion als BDD.\\
	BDDs sind eindeutig für eine gewisse Variablenordnung, daher werden OBDDs verwendet. Mit anderer Ordnung meist andere Größe!\\
	Basierend auf Booleschem Entwicklungssatz hat die Funktion pro Variable zwei Restfunktionen, sog. Kofaktoren.\\
	\begin{defi}[Basissystem der Schaltalgebra]
		Die Normalformtheoreme und der Hauptsatz der Schaltalgebra zeigen die eindeutige Darstellbarkeit beliebiger Schaltfunktionen mittels der 3 Grundverknüpfungen Konjunktion, Disjunktion und Negation. Diese 3 Verknüpfungen bilden ein Basissystem der Schaltalgebra.\\
		Weitere Basissysteme: $[+, $\={\  }$], [\cdot, $\={\  }$], [NAND], [NOR]$
	\end{defi}
	\subsection{Minimierung (Optimierung)}
	Je weniger Terme vorhanden sind bzw. je mehr Literale aus den Termen entfallen, desto geringer ist der Beschreibungsaufwand der schaltalgebraischen Ausdrücke und desto weniger Gatter werden zur schaltungstechnischen Realisierung benötigt (kleinere Fläche, günstiger, höhere Taktrate).\\
	\\
	Bei Minimierung werden Primterme (Terme mit minimaler Anzahl von Literalen, die trotzdem nur Einsstellen (Nullstellen) erfassen) gesucht.\\
	Minimierungsproblem: Auswahl der Primterme, die alle Einsstellen (Nullstellen) überdecken mit minimalen Kosten L(y).\\
	Kostenfunktion L(y): Anzahl an Literalen aller Primterme plus Zahl  verwendeter Terme
	\subsubsection{Nelson-Verfahren}
	Bestimmung der Menge aller Primimplikanten (bzw. Primimplikate)\\
	\begin{tabular}{@{}ll}
	1.& Einsstellenergänzung: Alle Freistellen werden zu Einsstellen verfügt\\
	2.& Nullblocküberdeckung für die Einsstellenergänzung der gegebenen Schaltfunktion\\
	3.& Aufstellen eines schaltalgebraischen Ausdrucks in konjunktiver Form (KF) für Nullblocküberdeckung\\
	4.& aus konjunktiver Form gewünschte disjunktive Form durch Ausdistribuieren u. Umformen bestimmen\\
	5.& Streichen aller im 4. Schritt gefundenen Terme, die nur Freistellen überdecken
	\end{tabular}
	\begin{satz}[Überdeckungsproblem]
		Jedes Minimalpolynom einer Schaltfunktion f besteht ausschließlich aus Primimplikanten von f.\\
		Daher: Ermittlung aller Primterme, dann optimale Auswahl an Primtermen finden \\
		(z.B. Überdeckungstabelle, Petrick-Verfahren)
	\end{satz}
	\subsubsection{Überdeckungstabelle}
	Graphische Auswahl der Primterme: \\
	\begin{tabular}{@{}ll}
		-& Für jeden Primterm wird angegeben, welche Einsstellen er überdeckt sowie dessen Kosten. \\
		& Die Tabelle wird mit Hilfe bestimmter Regeln abgearbeitet (Kernermittlung und Dominanzregel).\\
		-& Kernermittlung: Wenn Einsstelle/Nullstelle nur durch einzigen Primterm abgedeckt wird: \\
		-& Primimplikanten/implikaten $\rightarrow$ Kernimplikant/implikat (auf jeden Fall in die Überdeckungslösung)\\
		-& Spalten von Eins/Nullstellen in der Überdeckungstabelle, die von Kernimplikanten/implikaten abgedeckt \\
		& werden, können gestrichen werden und müssen nicht mehr berücksichtigt werden.
	\end{tabular}
	\\
	\\
	Spaltendominanzregeln:\\
	\begin{tabular}{@{}ll}
		-& Wenn Spalte x alle Terme der Spalte y überdeckt $\Rightarrow$ Spalte mit größeren Anzahl an Termen streichen. \\
		-& Man sagt: x dominiert y und schreibt $x\geq y$. \\
		-& Dominierende Spalten können gestrichen werden.
	\end{tabular}
	\\
	\\
	Zeilendominanzregeln:\\
	\begin{tabular}{@{}ll}
		-& Eine Zeile x wird von y dominiert, wenn Zeile x nur Spalten überdeckt, die auch von einer anderen \\
		& Zeile y überdeckt werden.\\
		-& Wenn nun $x\leq y$ und zusätzlich für die Kosten gilt $c_y \leq c_x$, kann die Zeile x gestrichen werden.\\
		-& Wenn $x\leq y$, jedoch $x<y$ und es existieren keine Zeilen z, welche die restlichen Einsstellen der \\
		& Zeile y überdecken können und weniger als die Differenz $c_y-c_x$ kosten (also $c_y\leq c_x+c_z$), dann kann die \\
		& Zeile x gestrichen werden.\\
		- & Dominierte Zeilen können gestrichen werden.
	\end{tabular}
	\\
	\\
	Lösungsverfahren mit Überdeckungstabelle:\\
	\begin{tabular}{@{}ll}
		-& Kerne bestimmen und Streichen aller überdeckten Spalten\\
		-& Spaltendominanzen finden und dominierende Spalten streichen\\
		-& Zeilendominanzen finden und nach Möglichkeit dominierte Zeilen streichen\\
		-& Ersten 3 Schritte wiederholen, bis Überdeckungstabelle nicht mehr reduziert werden kann
	\end{tabular}
	\subsubsection{Petrick-Verfahren}
	Algebraisches Verfahren zur Bestimmung der kostenminimalen Auswahl von Primimplikanten/implikaten zur Eins/Nullstellenüberdeckung.\\
	Petrick-Verfahren kann auch bei zyklischen Resttabellen verwendet werden!\\
	\\
	Petrick-Ausdruck (PA):\\
	algebraische Beschreibung der Überdeckungsbedingungen.\\
	Für jede Einsstelle enthält der PA einen Term von disjunktiv verknüpften Präsenzvariablen dieser Primterme, die diese Einsstelle überdecken. Diese Terme werden konjunktiv verknüpft zum PA. \\
	Der PA muss immer eins liefern, also muss in jedem Term mind. eine Präsenzvariable den Wert 1 haben. \\
	\includegraphics[width=0.7\linewidth]{pa1}
	\\
	Vereinfachung durch Anwendung der Distributionsregel und Absorptionsregel. Jeder Teilterm des ausmultiplizierten Terms repräsentiert eine mögliche Lösung des Auswahlproblems. Zur Auswahl der optimalen Lösung werden die Kosten der Primterme herangezogen.\\
	\includegraphics[width=0.75\linewidth]{pa2}
	\subsubsection{Quine/McCluskey-Verfahren}
	\begin{tabular}{@{}ll}
	1.& Bildung der Disjunktiven Normalform (alle Freistellen werden zu 1 gewählt und mitberücksichtigt)\\
	2.& Fasse die Implikanten zu Klassen $Q_{i,j}$ zusammen ($i$: Anzahl der Literale, $j$ Anzahl neg. Lit.)\\
	3.& Implikanten benachbarter Klassen $Q_{i,j}$ und $Q_{i,j-1}$ durch Anwendung des Distributibgesetzes zu \\
	& neuer Klasse $Q_{i-1,j-1}$. Zusammengefasste Terme der Klassen $Q_{i,j}$ und $Q_{i,j-1}$ werden markiert.\\
	4.& Alle nicht markierten Terme sind Primimplikanten.  \\
	5.& Überdeckt ein Primimplikant nur Elemente der Redundanzmenge, so wird er verworfen.
	\end{tabular}
	\subsubsection{Minimierung am Symmetriediagramm}
	Graphische Methode mit Ausnutzung der Symmetrierelationen: sukzessive Bildung von Blöcken aus Einsstellen und Freistellen durch Spiegelung von kleineren Blöcken an allen möglichen Symmetrielinien. \\
	Dabei entstehen Blöcke oder Primeins/Primnullblöcke (max. zusammengefasste Blöcke von Einsstellen / Nullstellen mit - wenn nötig - Freistellen.).\\
	\\
	Disjunktive Minimalform (DMF): Primeinsblöcke spezifizieren Primterme der DMF (Primimplikanten)\\
	Konjunktive Minimalform (KMF): Primnullblöcke spezifizieren Primterme der KMF (Primimplikate)\\
	\\
	Methode selbst:\\
	Auswahl der Kerne, also von Blöcken, die allein eine Stelle überdecken. Wenn noch nicht alle Stellen überdeckt: Auswahl weiterer Primimplikanten/implikaten notwendig.
	\\
	\\
	Zusammenfassung:\\
	Bestimmung der Primimplikanten: \\
	Symmetrie-Diagramme, Nelson-Verfahren (graphisch), Quine/McCluskey-Verfahren (tabellarisch)\\
	kostenminimale Auswahl der Primimplikanten: \\
	Symmetrie-Diagramme (graphisch), Überdeckungstabelle (tabellarisch), Petrick-Verfahren (algebraisch)

	\section{Bausteine der Digitaltechnik}
	\subsection{Schalter und Gatter}
	Binäres Signal als einfachstes Digitalsignal.\\
	zwei Möglichkeiten der Zuordnung:\\
	positive Logik: L = 0, H = 1\\
	negative Logik: L = 1, H = 0\\
	\\
	Bei zeitlicher Änderung der Spannung entstehen Zeitintervalle, in denen diese entweder in den Intervallen H, L oder im undefinierten Bereich liegen.\\ Unterscheidung zw. logischem und physikalischen Signalverlauf ist notwendig und wichtig.
	\subsubsection{Binäre Schalter}
	Transistor:\\
	elektronischer Schalter (ohne mechanische Bewegung)\\
	Steuerleitung manipuliert die Leitfähigkeit zw. Elektroden\\
	Ein-Zustand: geringer Innenwiderstand zw. Elektroden\\
	Aus-Zustand: hoher Innenwiderstand\\
	\\
	Vier Grundtypen von Transistoren: \\
	\includegraphics[width=0.5\linewidth]{transistor1}
	\includegraphics[width=0.5\linewidth]{transistor2}
	MOS: Metal Oxid Semiconductor\\
	Man benötigt beide Typen: NMOS lässt sich mit Schließer vergleichen, PMOS mit Öffner\\
	\\
	Logische Operationen lassen sich mit Transistoren über Parallel- und Reihenschaltung realisieren, das Prinzip basiert lediglich auf elektrisch steuerbaren Schaltern.\\
	Hauptsatz der Schaltalgebra zeigte die Darstellbarkeit beliebiger Funktionen mit beliebig vielen Variablen unter Einsatz weniger ausgewählter Basisoperationen. Wenn sich diese technisch umsetzen lassen, steht der Realisierung nichts mehr im Wege. Solche Basisschaltungen werden als Schaltglieder oder Gatter bezeichnet.\\
	\\
	Darstellung der Schaltzeichen nach der neuen Norm (DIN 40900):\\
	\includegraphics[width=0.5\linewidth]{gatter} \includegraphics[width=0.5\linewidth]{gatter2}
	\subsubsection{Realisierung des Inverters}
	\begin{tabular}{@{}l|l}
	Einschalterprinzip:& Zweischalterprinzip:\\
	\includegraphics[width=0.4\linewidth]{inverter1}& \includegraphics[width=0.4\linewidth]{inverter2}\\
	Nachteil: im Schaltungszustand $U_X=H$ fließt  & Zwei Schalter so geschaltet, dass nie beide gleichzeitig \\
	konstant ein Strom. Dieser Strom sowie Pegel & geschlossen sind. Dadurch kein konstanter Stromfluss.\\
	L und H über den Widerstand R reguliert.& \\
	NMOS-Schaltungen& CMOS-Schaltungen: Transistoren im oberen Teil PMOS\\
	(Negative Metal-Oxyd-Semiconductor)& im unteren NMOS, duale Schaltung der beiden\\
	\end{tabular}
	\subsubsection{Realisierung NOR/NAND}
	Einschalterprinzip:\\
	Parallelschaltung, Reihenschaltung: NOR oder NAND abhängig von Logikzuordnung\\
	Sind einfach zu realisieren, deshalb hohe technische Bedeutung\\
	\\
	Zweischalterprinzip:\\
	Die Serienschaltung/Parallelschaltung im oberen Zweig ist die duale Schaltung zur Parallelschaltung / Serienschaltung mit inversen Schaltern im unteren. \\ 
	$\Rightarrow$ PUN und PDN als duale (komplementäre) Netze:\\
	PUN ist oben, PDN ist unten.\\
	CMOS-Technologie basiert auf komplementären Netzen (Pull-Up/Pull-Down-Netz)\\
	Ist der Ausgang der Funktion gleich 1, schaltet das PUN-Netz den Ausgang auf $U_B$ (häufig engl. $V_{DD}$).\\
	Ist der Ausgang hingegen gleich 0, schaltet das PDN-Netz den Ausgang aus Masse (häufig engl. $V_{SS}$).\\
	PUN-Netze: PMOS-Transistoren, PDN-Netze: NMOS-Transistoren\\
	Da außer zu Schaltzeitpunkten keine direkte Verbindung zw. $V_{DD}$ und $V_{SS}$ besteht, wird während des Schaltens sehr wenig Energie verbraucht.\\
	\\
	\begin{tabular}{@{}l|ll}
		& NMOS& PMOS\\\hline
		Serienschaltung: & \includegraphics[width=0.12\linewidth]{nmos1} &\includegraphics[width=0.12\linewidth]{pmos1}\\
		& A AND B& \={A} AND \={B}\\
		Parallelschaltung: & \includegraphics[width=0.12\linewidth]{nmos2} & \includegraphics[width=0.12\linewidth]{pmos2}\\
		& A OR B &\={A} OR \={B}\\
		& schließt, wenn Gate auf high & öffnet, wenn Gate auf high
	\end{tabular}\\
	\\
	Anbindung an Axiome der Schaltalgebra: Realisierung der Konjunktion, Disjunktion und Negation
	\subsection{Einführung in CMOS-Technologie}
	Querschnitt der CMOS-Materialschichten:\\
	\includegraphics[width=0.7\linewidth]{querschnitt}\\
	CMOS-Entwurfsregeln: \\
	Regeln für Prozessmasken, veränderbare Designparameter\\
	kein Energieverbrauch in festem Schaltzustand, Stromfluss nur während der Schaltvorgänge\\
	Symmetrisches Schaltverhalten: gleiche Anstiegs- und Fallzeiten bei geeigneter Transistordimensionierung\\
	Heute: bis zu 8 Metallschichten
	\subsection{CMOS-Gatterschaltungen}
	\includegraphics[width=0.5\linewidth]{inverter3}\\
	Inverter besteht aus einem NMOS und einem PMOS\\
	Ist $V_{in}$ auf high, öffnet NMOS und $V_{mos}$ wird auf GND gezogen, PMOS sperrt\\
	Ist $V_{in}$ auf low, sperrt NMOS, PMOS leitet, $V_{out}$ wird daher auf $V_{DD}$ gezogen.\\
	Strom zwischen $V_{DD}$ und GND kann durch die Transistoren nur in der Umschaltphase fließen.\\
	\\
	\begin{tabular}{@{}llll}
		NAND-Gatter&\ \ &\ \ & NOR-Gatter\\
		\includegraphics[width=0.45\linewidth]{nand}& & & \includegraphics[width=0.45\linewidth]{nor}\\
	\end{tabular}\\
	Bisher: im PUN nur negierte Ausdrücke, im PDN nur nicht negierte Literale\\
	$\Rightarrow$ Schaltfunktionen besitzen Literale in sowohl negierter als auch nicht negierter Form\\
	Lösung: Ein negiertes (nichtnegiertes) Literal muss im PDN (PUN) entweder als weiterer (zusätzlicher) Eingang zur Verfügung stehen oder mit einem Inverter erzeugt werden
	\subsection{Schaltnetze}
	In der Regel bestehen logische Ausdrücke aus mehr als einem Operator. \\
	Aus den logischen Ausdrücken kann unmittelbar eine Konstruktionsvorschrift für Digitalschaltungen erstellt werden (Strukturvorschrift bzw. Strukturausdruck).\\
	Stufenzahl: maximale Anzahl von Schaltgliedern von Eingängen zum Ausgang ohne Inverter\\
	Schaltnetze sind Schaltungen, die unmittelbar einem Strukturausdruck entsprechen. Dabei hängen die Ausgänge nur von den Signalen an den Eingängen ab.
	\begin{defi}[Schaltnetz]
		Ein Schaltnetz ist eine Digitalschaltung, in der es für jede mögliche Kombination von digitalen Signalen an den Eingängen genau eine Kombination von digitalen Signalen an den Ausgängen gibt.
	\end{defi}
	\begin{tabular}{@{}ll}
		-& Umsetzung der verbalen Aufgabenstelllung in eine formale Form, z.B. in eine Funktionstabelle\\
		-& Bildung einer Normalform, Bildung einer vollständigen Blocküberdeckung\\
		-& Bildung einer Minimalform\\
		-& Umformung in das gewählte Basissystem\\
		-& Umformen in den Strukturausdruck\\
		-& Umsetzen in das entsprechende Schaltnetz
	\end{tabular}\\
	\\
	Allgemein: Hardwaretechnische Realisierung von Schaltnetzen.\\
	Anwendung schaltalgebraischer Regeln auf logische Ausdrücke erlaubt vielfältige Formen für Schaltnetze. Dabei entstehen komplexe Schaltnetze mit unübersichtlichen und schwierigen Verhältnissen.\\
	Jetzt: Übersichtliche Methode zur schnellen und kostengünstigen Realisierung von Schaltnetzen in Form integrierter Schaltungen (ICs)\newpage
	Grundprinzip: \\
	Weglassen/Hinzufügen von Signalverbindungen in universell nutzbaren Hardwarestrukturen.\\
	Unterscheidung in 2 Klassen: \\
	Min/Maxterm-orientiert (basierend auf D/KNF) oder blockorientiert (basierend auf D/KMF)\\
	\\
	Normalformorientierte Strukturen: DNF
	\begin{itemize}
		\item ULA (Universal Logic Array)\\
		besteht aus $2^n$ UND-Schaltgliedern zur Realisierung jeden Minterms in der 1. Stufe\\
		einem oder mehreren ODER-Schaltgliedern in der 2. Stufe\\
		Personalisierung: in 1. Stufe durch konjunktive Verknüfung der Minterme mit 1 oder 0
		\item ROM (Read Only Memory)\\
		besteht aus $2^n$ UND-Schaltgliedern in der 1. Stufe\\
		einem oder mehreren ODER-Schaltgliedern in der 2. Stufe\\
		Personalisierung: in 2. Stufe durch Weglassen/Hinzufügen von Mintermen
	\end{itemize}
	Blockorientierte Strukturen: DMF
	\begin{itemize}
		\item PAL (Programmable Array Logic)\\
		besteht i.a. aus weniger als $2^n$ UND-Schaltgliedern in der 1. Stufe\\
		einem oder mehreren ODER-Schaltgliedern in der 2. Stufe\\
		Personalisierung: in der 1. Stufe durch Festlegung der Primterme
		\item PLA (Programmable Logic Array)\\
		Aufbau ähnlich zu PALs, jedoch flexibler in der 2. Stufe\\
		beide Matrizen sind programmierbar\\
		Vorteil: mehrfache Ausnutzung von Primtermen
	\end{itemize}
	\includegraphics[width=1\linewidth]{ula}
	\subsection{Digitale Speicherbausteine}
	Digitale Schaltungen bestehen im Allgemeinen aus einem oder mehreren Rückkopplungspfaden von Schaltnetzen mit Speicherelementen.\\
	Schaltwerk = Schaltnetze + Speicherelemente\\
	\\
	2 Typen von sequentiellen Schaltkreisen:\\
	synchron: Ausgänge ändern sich zu festgelegten Zeitpunkten $\rightarrow$ Takt + Speicherelemente\\
	asynchron: Ausgänge ändern sich zu beliebigen Zeitpunkten\\
	\\
	pegelgesteuerte Speicherelemente (Latches, dt. Schnappschloss) werden mit Pegeln angesteuert\\
	- Pegel auf HIGH $\Rightarrow$ Speicherelement ist aktiviert\\
	- Pegel auf LOW $\Rightarrow$ Speicherelement ist deaktiviert\\
	flankengesteuerte Speicherelemente (Flipflops):\\
	- steigende Flanke: aktiviert, wenn Übergang v. 0 nach 1, sonst deaktiviert\\
	- fallende Flanke: aktiviert, wenn Übergang v. 1 nach 0, sonst deaktiviert
	\subsubsection{Latches}
	Active-HIGH RS-Latch: SET-Zustand S=HIGH und R=LOW, RESET-Zustand S=LOW und R=HIGH\\
	\hspace*{10mm}HOLD-Zustand: S=LOW und R=LOW, ungültig: S=HIGH, R=HIGH\\
	Active-LOW RS-Latch: SET-Zustand S=LOW und R=HIGH, RESET-Zustand S=HIGH und R=LOW\\
	\hspace*{10mm}HOLD-Zustand: S=HIGH, R=HIGH, ungültig: S=LOW und R=LOW\\
	\includegraphics[width=1\linewidth]{activehigh}\\
	Getaktetes RS-Latch: zusätzlicher Takt-Eingang T\\
	Getaktetes D-Latch: ungültiger Zustand wird eliminiert\\
	\includegraphics[width=1\linewidth]{getakt}
	\subsubsection{Flipflops}
	Flankenerkennungsschaltkreis:\\
	\includegraphics[width=0.5\linewidth]{flanken}\\
	\\
	JK-Flipflop:\\
	\includegraphics[width=0.8\linewidth]{jkflipflop}\\
	keine ungültigen Zustände!\\
	\\
	Toggle-Flipflop (T-Flipflop): gebildet durch Zusammenschalten der J- und K-Eingänge\\
	T=LOW: Zustand halten, T=HIGH: Zustand wechseln\\
	Anwendung: Frequenzteiler \\
	\includegraphics[width=0.5\linewidth]{frequenzteiler}\\
	\\
	Master-Slave-Flipflop:\\
	Master ist aktiviert bei steigender Flanke, Slave ist aktiviert bei fallender Flanke\\
	$\rightarrow$ vollständige Entkopplung des Ausgangs vom Eingang\\
	\includegraphics[width=0.9\linewidth]{masterslave}
	\subsection{Speicher}
	Drei Arten:\\
	- Statische Speicher: kleine, schnelle Speicher für Zwischenergebnisse (Flipflops)\\
	- Dynamische Speicher: größere, mäßig schnelle Speicher für gr. Datenmengen (Ladungsspeichereffekte)\\
	- Massenspeicher: große, langsame Speicher für große Datenmengen (magnetische Effekte)\\
	\\
	Merkmale von Digitalspeichern:\\
	\begin{tabular}{@{}lll}
		-& Organisation:& Gruppierung mehrerer Bits zu einem Wort und mehrerer Worte zu Blöcken\\
		-& Zugriffsmethode:& Random Access Memory (RAM)\\
		&& Sequential Access Memory (SAM)\\
		-& Art des Zugriffs:& Read/Write Memory\\
		&& Read Only Memory (ROM)\\
		&& Write Once, Read Many (WORM)\\
		&& Programmable Read Only Memory (PROM)\\
		&& Erasable PROM (EPROM)\\
		&& Electrically EPROM (EEPROM)\\
		-& Datenspeicherung: & Grad der Flüchtigkeit\\
		&& Ladungsspeicher (benötigen Refreshs)\\
		&& Rückkopplungsspeicher (stetige Energiezufuhr)\\
		&& Speicher mit fixierten Ladungsträgern\\
		-& Schaltungstechnik:& können auf vielfältige Weise realisiert werden\\
		-& Technologie:& bestimmt Größe, Geschwindigkeit, Kosten, Zuverlässigkeit etc.
	\end{tabular}
	\subsubsection{Register}
	Verbund von Flipflops: gemeinsamer Takt und Rücksetzmöglichkeiten\\
	\includegraphics[width=0.3\linewidth]{register}\includegraphics[width=0.5\linewidth]{schieberegister}\includegraphics[width=0.2\linewidth]{schieberegister1}\\
	Schieberegister werden verwendet, um Datenbitgruppen von räumlichen Folgen in eine zeitliche umzuwandeln (Parallel/Serienwandlung oder Serien/Parallelwandlung).\\
	Parallel/Serienwandlung: Daten werden parallel in Register geladen. Danach seriell in zeitl. Reihenfolge ausgegeben.\\
	Serien/Parallelwandlung: Daten werden in zeitl. Folge in das Register geschoben, danach gebündelt ausgelesen.\\
	\\
	Register werden zur Speicherung von Operanden/Konstanten eingesetzt. Einzelne Register sind datentechn. nicht miteinander gekoppelt. Die Auswahl eines Registers erfolgt über Selektionsleitungen.\\
	\includegraphics[width=\linewidth]{registerfeld}\\
	\includegraphics[width=\linewidth]{regischda}
	\subsubsection{Spezielle Schaltnetze}
	\textbf{Multiplexer und Demultiplexer}\\ \includegraphics[width=0.7\linewidth]{multi}\\
	Verbindungen zw. Systemgruppen sind platz- und kostenintensiv. Deshalb serielle Übertragung.\\
	\\
	\textbf{Pufferspeicher, FIFO:}
	Auf der Eingangsseite eingeschriebenes Wort wird solange zum Ausgang vorgeschoben, bis dieser erreicht wird oder ein belegter Platz erreicht wird. Das Signal Voll zeigt an, ob alle Plätze im FIFO belegt sind und weiteres Schreiben möglich ist, das Signal Leer zeigt an, ob das FIFO leer ist. Wird ein Wort ausgelesen, rücken alle dahinterliegenden Worte um eine Position vor.\\
	\\
	\textbf{Stapelspeicher, LIFO:}
	Das zuletzt gespeicherte Datenwort (PUSH) wird zuerst auf dem LIFO ausgelesen (POP).\\
	\\
	\textbf{Arbeitsspeicher:}
	sind im Allgemeinen wortorganisiert. Der Schreib-/Lese-Vorgang geschieht durch Angabe von Adressen, die über einen Dekoder zu einer
	Leitungsselektion führen. Unter einer Kapazität K oder der Speichergröße eines Speichers wird das Produkt K = n · 2k verstanden.\\
	Aus schaltungstechnischen oder technologischen Gründen wird meist eine Form der Speichermatrix angestrebt, welche dem Quadrat möglichst nahe kommt. Dadurch werden meist mehr als ein Datenwort in ein Speicherwort untergebracht. Es bedarf daher eines zweiten Dekoders (Spaltendekoder), um das entsprechende Datenwort im Speicherwort zu identifizieren.
	\newpage
	\section{Automaten und Schaltwerke}
	Ein Automat ist eine Einheit AT, bei der eine zeitliche Folge (Darstellung durch Ordnungsindex t) von Elementen des Eingabealphabets E in eine zeitliche Folge von Elementen des Ausgabealphabets A abgebildet wird:\\
	\includegraphics[width=0.55\linewidth]{auto1}\includegraphics[width=0.45\linewidth]{auto2}\\
	Nachteil dieses Konzeptes: Speicherung von $\alpha$ Eingabeelementen erforderlich, um $a^t$ zu berechnen.\\
	Erhalt eines neuen Elements $\rightarrow$ ältestes Element $e^{t-\alpha}$ entfällt aus Folge mit Länge $(\alpha +1)$\\
	Abbildung der Folge $e^{t-1} ... e^{t-\alpha}$ auf ein neues Alphabet von Zuständen $S = \{ s_1, s_2, ... , s_w \}$ mit geringerer Mächtigkeit: $( e^{t-1} ... e^{t-\alpha}) \rightarrow s$, mit $|E|^\alpha \leq |S|$\\
	Unter Beachtung der zeitlichen Reihung erhält man nun $\lambda$ als Ausgabefunktion des Automaten AT $a^t = \lambda ( e^t, s^t )$\\
	Bei Eingabe eines neuen Eingabeelements $E_g^t$ ergibt sich unter Berücksichtigung des aktuellen Zustands	(sogenannte 'Historie der Eingaben') ein neuer Zustand mit $\delta$ als Überführungsfunktion	$s^{t+1} = \delta ( e^t, s^t )$.\\
	\\
	rekursive Anordnung für die Bestimmung des neuen Zustandes. Der Speicher nimmt den momentanen Zustand st auf, der neue Zustand st+1 muss zum richtigen Zeitpunkt übernommen werden.\\
	Wichtige Typklassen von Automaten im Zusammenhang mit Digitalschaltungen: endliche, diskrete und deterministische Automaten\\
	1. Mealy-Automat mit $a^t = \lambda ( e^t, s^t )$ als allgemeinster Fall\\
	2. Moore-Automat mit $a^t = \lambda ( s^t )$, Ausgabe hängt allein vom Zustand ab\\
	3. Medwedew-Automat mit $a^t = s^t$, als Ausgabe dient der Zustand selbst\\
	\includegraphics[width=1\linewidth]{auto3}\\
	\\
	\textbf{Automatengraphen}: Knoten repräsentieren Zustände, Kanten Zustandsübergänge. Beide Elemente des Graphen werden mit Attributen	versehen, die sich auf Eingangs- und Ausgangselemente	beziehen.\\
	\textbf{Automatentafeln}: Bilden des kartesischen Produktes aus Eingabe- und
	Zustandsmenge. An Kreuzungsstellen werden beim Mealy-Automaten der jeweilige Folgezustand und die Ausgabe, beim Moore-Automaten nur der Folgezustand eingetragen.\\
	\includegraphics[width=1\linewidth]{auto5}
	\newpage
	\subsection{Schaltwerke}
	\textbf{Vorgehensweise beim Entwurf:}\\
	1. Schritt: Definition und Kodierung der Ein- und Ausgabevariablen\\
	2. Schritt: Wahl des Automatentyps und Erstellen der Automatentafel/graphs	gemäß Aufgabenstellung\\
	3. Schritt: Zustandskodierung\\
	4. Schritt: Wahl des Flipflop-Typs und Aufstellen der	Ansteuerfunktionen\\
	5. Schritt: Entwurf des Schaltnetzes für die Überführungsfunktion auf der Basis der Ansteuerfunktionen\\
	6. Schritt: Entwurf des Schaltnetzes für die Ausgabefunktion\\
	7. Schritt: Eventuell Umformung der logischen Ausdrücke in geeignete Strukturausdrücke\\
	8. Schritt: Umsetzen in das Schaltbild des Schaltwerkes
	
	
	\section{Rechnerarithmetik}
	\subsection{Addition}
	Halbaddierer summieren die beiden Eingangsbits $a_i$ und $b_i$ und legen die Summe auf den Ausgang $s_i$. Zusätzlich wird ein Übertragsbit $c_{i+1}$ erzeugt. Volladdierer besitzen zusätzlich einen Übertragseingang und sind somit in der Lage, vorhergehende Stellen in die Berechnung einzubeziehen.\\
	n-Bit Ripple-Carry-Addierer hat sehr langen kritischen Pfad und eine Laufzeit von 2n Gattern.\\
	\includegraphics[width=1\linewidth]{addierer}\\
	Carry-Look-Ahead-Addierer (CLA): Berechnung der Überträge geschieht parallel. 2 neue Signale: $g_i$ und $p_i$\\
	$s_i = a_i \cdot b_i$ und $p_i = a_i \oplus b_i \ \ \Rightarrow s_i = p_i \oplus c_i,\ \ \  c_{i+1} = g_i + c_i p_i$\\
	\includegraphics[width=0.78\linewidth]{cla}
	\newpage
	Subtrahierer für 2er-Komplement-Zahlen (Addierer für k=0, Subtrahierer für k=1)\\
	\includegraphics[width=0.6\linewidth]{sub}
	\subsection{Multiplizierer}
	Array-Multiplizierer: hoher Hardwareaufwand, sehr lange Laufzeit\\
	\includegraphics[width=0.8\linewidth]{arraymult}\\
	Verringerung des Hardwareaufwandes durch schrittweise Addition und Schieben nach links
	\subsection{Division}
	Aus dem Dividenden A und dem Divisor B werden der Quotient Q und der Rest R berechnet. Durch die Vorschriften $A = Q \times B + R$ und $0\leq R < B$ werden R und Q eindeutig festgelegt.\\
	Da bei der Multiplikation ein doppelt langes Produkt anfallen kann, wird für A meist eine Ganzzahl doppelter Genauigkeit ($2 \cdot l$ Bits) zugelassen, für B, Q, R dagegen	meist nur Ganzzahlen einfacher Genauigkeit.\\
	Q muss klein genug sein, um in einem Register einfacher	Länge Platz zu finden. Es muss also die Bedingung $A < 2^l \cdot B$ erfüllt sein, sonst kommt es zu einem Überlauf.\\
	\textbf{Restoring Division}: in jedem Schritt wird versuchsweise eine Subtraktion ausgeführt und bei negativem Rest rückgängig gemacht.\\
	\textbf{Non-performing Division}: der Partialrest wird nur dann durhc die Differenz ersetzt, wenn diese nichtnegativ war.\\
	\textbf{Non-restoring Division}: nach einer Subtraktion wird mit einem eventuell entstehenden negativen Rest weitergearbeitet. Statt Subtraktionen werden in diesem Fall Additionen vorgenommen, bis der Partialrest dadurch wieder nichtnegativ geworden ist. Endet das Verfahren mit einem negativen Partialrest, muss daraus durch einen Korrekturschritt der entsprechende positive Rest berechnet werden.\\
	\includegraphics[width=0.9\linewidth]{arraydiv}
	\section{Hardwarebeschreibung, -simulation und -synthese}
	Vorteile von VHDL:\\
	- Standard: einheitliche Schnittstelle zwischen Werkzeugen und Firmen\\
	- Portabilität: Entwürfe können durch verschiedene Synthesewerkzeuge optimiert und durch verschiedene Analysewerkzeuge simuliert werden\\
	- Technologie- und Firmenunabhängigkeit: Wechsel des Technologiepartners leicht möglich\\
	- Unterstützung durch DOD (US Department of Defense): große Überlebenswahrscheinlichkeit\\
	- Starke Modellierungsmöglichkeiten: Entwurf parametrisierter Schaltungen möglich, z.B. Prozessor mit Bitbreite n\\
	- Wiederverwendbarkeit\\
	\\
	Wie wird VHDL eingesetzt?\\
	- Beschreibung des gewünschten Verhaltens auf hoher Abstraktionsebene\\
	- Modellierungssprache\\
	- Dokumentierungssprache\\
	- Simulationssprache: Testen der Spezifikation durch Simulation des Modells\\
	- Synthesesprache: automatische Synthese für Zielarchitekturen wie Field-Programmable Gate Arrays (FPGAs)\\
	\\
	Aufbau einer VHDL-Beschreibung:\\
	\includegraphics[width=0.5\linewidth]{vhdl}\\
	\\
	Bezeichner: darf nicht mit Zahl oder Sonderzeichen beginnen und keine 2 Unterstriche hintereinander haben. VHDL unterscheidet nicht zwischen Groß- und Kleinschreibung.\\
	\\
	if-Abfrage:\\
	if condition then\\
	\hspace*{5mm}sequence\_of\_statements\\
	\{ elsif condition then\\
	\hspace*{5mm}sequence\_of\_statements \}\\
	$[$ else sequence\_of\_statements $]$\\
	end if;\\
	\\
	case-Anweisung:\\
	case expression is\\
	\hspace*{5mm}when choice =$>$\\
	\hspace*{10mm}sequence\_of\_statements\\
	\hspace*{5mm}\{ when choice =$>$\\
	\hspace*{10mm}sequence\_of\_statements \}\\
	\hspace*{5mm}$[$ when others =$>$\\
	\hspace*{10mm}sequence\_of\_statements $]$\\
	end case;\\
	\\
	\textbf{Bereitstellung von Bibliotheken:}\\
	library IEEE;\\
	use IEEE.std\_logic\_1164.all;\\
	use IEEE.std\_logic\_misc.all;\\
	use IEEE.std\_logic\_arith.all;\\
	use IEEE.std\_logic\_components.all;\\
	\\
	\textbf{Entities:} beschreibt die Schnittstelle eines Moduls.\\
	Die port\_liste ist eine Liste der Ein- und Ausgänge (identifier : PORT\_MODUS Datentyp)\\
	ENTITY half\_adder IS\\
	\hspace*{5mm}PORT(\\
	\hspace*{10mm}i\_x : IN bit;\\
	\hspace*{10mm}i\_y : IN bit;\\
	\hspace*{10mm}i\_enable : IN bit;\\
	\hspace*{10mm}o\_carry : OUT bit;\\
	\hspace*{10mm}o\_result : OUT bit\\
	\hspace*{5mm});\\
	END half\_adder;\\
	\\
	\textbf{Architecture:} beschreibt den inneren Aufbau und die Funktion eines Moduls\\
	1. Datenflussbeschreibung: eignet sich für reinkombinatorische, ungetaktete Logik. \\
	\hspace*{5mm}Durch ausschließliche Verwendung nebenläufiger Signale möglich.\\
	2. Verhaltensbeschreibung: keine reinen Logikgleichungen, sondern Verhalten wird auf algorithmischer \\
	\hspace*{5mm}Ebene beschrieben. Im Allgemeinen übersichtlicher und weniger fehlerträchtig. \\
	\hspace*{5mm}Durch Verwendung von Prozessen möglich.\\
	3. Strukturbeschreibung: Hierarchisches Design aus Komponenten, die durch eigene VHDL-Module	\\
	\hspace*{5mm} beschrieben sind. Im Wesentlichen Umsetzung eines Schaltplans/Blockdiagramms:	Instanziierung der \\
	\hspace*{5mm}Komponenten und Verdrahtung\\
	\newpage
	ARCHITECTURE architecture\_name OF entity\_name IS\\
	-- Deklaration nur intern genutzter Signale\\
	BEGIN\\
	-- Body aus nebenläufigen Prozessen und Anweisungen\\
	\hspace*{5mm}Prozess (PROCESS): enthält sequentielle Anweisungen, z.B.\\
	\hspace*{5mm}process (i\_enable, i\_x, i\_y) is \ \ \ --- Sensitivitätsliste, enthält Signale, die das Ergebnis beeinflussen\\
	\hspace*{10mm}begin\\
	\hspace*{15mm} -- sequentielle Abarbeitung der Befehle -- \\
	\hspace*{5mm}end process;\\
	\hspace*{5mm}Prozess (PROCESS): enthält sequentielle Anweisungen\\
	\hspace*{5mm}nebenläufige Anweisung (concurrent statement);\\
	\hspace*{5mm}nebenläufige Anweisung (concurrent statement);\\
	\hspace*{5mm}nebenläufige Anweisung (concurrent statement);\\
	END [ARCHITECTURE] architecture\_name;\\
	\\
	\\
	Komponenten einarbeiten:\\
	architecture structure of full\_adder is\\
	\hspace*{5mm}component half\_adder\\
	\hspace*{10mm}port (i\_x, i\_y, i\_enable: in std\_logic;\\
	\hspace*{15mm}o\_result, o\_carry: out std\_logic );\\
	\hspace*{5mm}end component;\\
	\hspace*{5mm}signal c1, s1, c2 : std\_logic;\\
	begin\\
	\hspace*{5mm}HA1: half\_adder port map (\\
	\hspace*{10mm}i\_x $=>$ a, i\_y $=>$b, i\_enable $=>$ i\_enable, o\_result $=>$ s1, o\_carry $=>$ c1);\\
	\hspace*{5mm}HA2: half\_adder port map (s1, cin, i\_enable, sum, c2);\\
	\hspace*{5mm}cout $<=$ c1 or c2;\\
	end architecture structure;\\
	\\
	\\
	VHDL-Operatoren:\\
	- Logische Operatoren: and, or, nand, nor, xor\\
	- Relationale Operatoren: =, /=, $<$, $<$=, $>$, $>$=\\
	- Addition und Konkatenation: +, -, \&\\
	- Vorzeichen: +, -\\
	- Multiplikation: *, /, mod, rem\\
	- Exponent, Absolutbetrag, Komplement: **, abs, not\\
	\\
	Arrays:\\
	\includegraphics[width=1\linewidth]{array}\\
	Rechnungen auf std\_logic\_vector sind zu vermeiden, da teilweise gar nicht synthetisierbar.
	\subsection*{Konstanten, Variablen, Signale}
	Konstanten: der Wert einer Konstante kann nicht verändert werden.\\
	Variablen unterscheiden sich nicht von Variablen anderer höheren Programmiersprachen und  werden im Rahmen von Zwischenrechnungen verwendet. Eine Variable hat kein Gegenstück in der Hardware!\\
	Zuweisung einer Variable: target\_variable := value\_expression;\\
	Variablen werden in Prozessen / Unterprogrammen deklariert und sind auch nur da sichtbar. \\
	Variablen werden zum Abspeichern temporärer Werte benutzt.\\
	Wertzuweisung bei Variablen erfolgt sofort, wenn die Variablenzuweisung ausgeführt wird.\\
	Signale sind in anderen Programmiersprachen nicht zu finden. Ein Signal kann man als verbindende physikalische Leitung bzw. als Register	ansehen.\\
	Zuweisung eines Signals: target\_signal $<=$ value\_expression;\\
	Signale können nicht in Prozessen / Unterprogrammen deklariert werden.\\
	Signale stehen üblicherweise für Verbindungen oder Register in der Hardware.\\
	Wertzuweisung bei Signalen erfolgt nicht sofort, wenn die Signalzuweisung	ausgeführt wird.\\
	- Die Signalzuweisung aktualisiert den Signaltreiber.\\
	- Der Signaltreiber gibt die Information an die Signale erst an das	Signal weiter, wenn der Prozess \\
	\hspace*{3mm}angehalten hat.
	\subsection*{Automaten}
	Taktsteuerung:
	\includegraphics[width=0.7\linewidth]{steuerung}\\
	\includegraphics[width=1\linewidth]{pegelflanke}
	Definition der Zustandsmenge eines Automaten durch einen benutzerdefinierten Typ empfehlenswert, denn die Kodierung hat einen erheblichen Einfluss auf die Geschwindigkeit, die Störungsstabilität und die Fläche der synthetisierten Schaltung\\
	type my\_type is (S0, S1, S2);\\
	\\
	\textbf{Verzögerung und Zeit}:\\
	1. träge Verzögerung (inertial delay), output $<$= NOT input AFTER 10 ns;\\
	\hspace*{5mm}erlaubt dem Benutzer, die Verzögerungszeit eines Gatters oder einer Operation anzugeben, und \\
	\hspace*{5mm}absorbiert Eingangssignale, die kürzer sind als die spezifzierte Verzögerungszeit\\
	2. nichtträge Verzögerung (transport delay), output $<$= TRANSPORT NOT input AFTER 10 ns;\\
	\hspace*{5mm}gibt alle Eingangsimpulse weiter
	
	


	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
\end{document}
