%TODO Module soll der Parser in einer "`Schleife"' alle Teilberechnungen an die ALU weiterleiten und zB Zwischenergebnisse speichern? Die ALU könnte dann nur 2 Zahlen addieren/bla.
%Da in der History Zahlen als Character Strings abgelegt sind müssen diese für die ALU in Binärdarstellung umgewandelt werden - und Umgekehrt natürlich!
+\begin{landscape}
\paragraph{VGA}
+siehe Tabelle \ref{tab:vga}.
-TODO: How to control the VGA component ?= schnittstelle + beschreibung des vga moduls?
+\THEAD{vga}{Interfaces f\"ur das VGA Modul}
+vga\_clk & in & 1 & std\_logic & PLL & VGA-Clock \ZE
+vga\_res\_n & in & 1 & std\_logic & PLL & VGA-Reset \ZE
-vorgegeben:
-
-allgemein: sys\_clk (in), sys\_res\_n (in)
+vsync\_n & out & 1 & std\_logic & Bildschirm & Vertikale Synchronisation\ZE
+hsync\_n & out & 1 & std\_logic & Bildschirm & Horizontale Synchronisation\ZE
-zu den hardware pins: vga\_clk (in), vga\_res\_n (in), vsync\_n (out), hsync\_n (out), ? bits r (out), ? bits g (out), ? bits b (out)
+r & out & 3 & std\_logic\_vector & Bildschirm & Ausgabe der Farbe Rot \ZE
+g & out & 3 & std\_logic\_vector & Bildschirm & Ausgabe der Farbe Gr\"un \ZE
+b & out & 2 & std\_logic\_vector & Bildschirm & Ausgabe der Farbe Blau \ZE
-zum modul display: 8 bit command (in), 32 bit command\_data (in), 1 bit free (out)
+command & in & 8 & std\_logic\_vector & Display & Kommando an das VGA Modul \ZE
+command\_data & in & 32 & std\_logic\_vector & Display & Daten f\"ur das Kommando \ZE
+free & in & 1 & std\_logic & Display & Signalisiert Bereitschaft \ZE
+\TEND
\paragraph{PS/2}
zum modul pc-kommunikation: 8 Empfangsbits (out), 1 Received Flag (out), 8 Sendebits (in), 1 Sendflag (in)
-\begin{table}%
-\begin{tabular}{lcr}
-
-\end{tabular}
-\caption{}
-\label{}
-\end{table}
-
\paragraph{Scanner}
TODO
an modul bin/dez-converter: 11*8 bit char (vorzeichen + dezimalstellen; ok, das ist ein overkill...) (in/out), 32 bit binärstellen (in/out), 1 bit do\_deztobin (out), 1 bit do\_bintodez (out), 1 bit bintodez\_done (in), 1 bit deztobin\_done (?) (in)
-zu modul alu: 32 bit operator1 (out), 32 bit operator2 (out), 32 bit result (in), 1 bit do\_calc (out), 1 bit calc\_done (in)
+zu modul alu: enum opcode (out), 32 bit operator1 (out), 32 bit operator2 (out/in), 1 bit do\_calc (out), 1 bit calc\_done (in)
zu modul scanner: 1 bit finnnnnished\_result (out) (selbe signal wie an history modul. kann man das
doppelt nehmen?)
allgemein: sys\_clk (in), sys\_res\_n (in)
-zum parser: 32 bit operator1 (in), 32 bit operator2 (in), 32 bit result (out), 1 bit do\_calc (in), 1 bit calc\_done (out)
+zum parser: enum opcode (in), 32 bit operator1 (in), 32 bit operator2 (in/out), 1 bit do\_calc (in), 1 bit calc\_done (out)
\paragraph{Display}
zum modul rs232: 8 Empfangsbits (in), 1 Received Flag (in), 8 Sendebits (out), 1 Sendflag (out)
zum modul history: 5 bit zeile (2*14+1) (out), 7 bit spalte (71 zeichen - 0 am ende notwendig?) (out), 1 get bit (out), 1 done bit (in), 8 daten bits (in)
+\end{landscape}
\subsubsection{Verhalten der Interfaces}
\includegraphics[width=0.9\textwidth]{sm/scanner.pdf}
\centering
\caption{Statemachine zum Scannen des Inputs der PS/2 Schnittstelle}
-\label{fig:rs232-rs}
+\label{fig:scanner}
\end{figure}
\begin{itemize}
\subsection{History}
\subsection{Parser}
+\begin{figure}[!ht]
+\includegraphics[width=0.9\textwidth]{sm/parser.pdf}
+\centering
+\caption{Statemachine zum Parsen der aktuellen Expression}
+\label{fig:parser}
+\end{figure}
+
+\begin{lstlisting}
+procedure exec() {
+ z := z*s;
+ switch(opp) {
+ case NOP:
+ if(aktop != '\0')
+ c1();
+ break;
+ case '-':
+ z := z * (-1);
+ case '+':
+ c1();
+ break;
+
+ case '/':
+ case '*':
+ if(aktop in ['+','-','\0']) {
+ alu(opp, z, punkt);
+ do_calc = 1;
+ while(calc_done == 0);
+
+ alu(ADD, punkt, strich);
+ punkt = 1;
+ }
+ else if (aktop in ['*','/']) {
+ alu(opp, z, punkt);
+ }
+ break;
+ }
+ do_calc = 1;
+ opp = aktop;
+}
+
+procedure c1() {
+ if(aktop in ['+','-','\0']) {
+ alu(ADD, z, strich);
+ }
+ else if (aktop in ['*','/']) {
+ alu(MUL, z, punkt);
+ }
+}
+\end{lstlisting}
+
+\begin{itemize}
+\item \textbf{idle}: Das Modul ist unt\"atig und wartet auf eine steigende Flanke von \emph{do\_it}.
+
+\item \textbf{read char}: Lokale Variablen werden zur\"uckgesetzt und das n\"achste Zeichen wird vom
+History Modul angefordert.
+
+\item \textbf{sign}: Ggf. wird das Vorzeichen auf '-' gesetzt.
+
+\item \textbf{calc}: Zeichen f\"ur Zeichen wird eingelesen und die Zahl wird daraus berechnet.
+
+\item \textbf{ALU}: Punkt- und Strichrechnungen m\"ussen getrennt behandelt werden, daher ergibt
+sich dieses Konstrukt im Codebeispiel.
+
+\item \textbf{null}: Sonderbehandlung ist n\"otig wenn die Expression mit '\textbackslash 0'
+abgeschlossen wird.
+
+\item \textbf{done}: In diesem Zustand wird das Ergebnis das sich je nach \emph{opp} in
+\emph{strich} oder \emph{punkt} befindet als String in den Ergebnisbuffer des History Modules
+geschrieben und danach wird \emph{finnnnnished\_result} f\"ur einen Zyklus auf high gesetzt.
+
+\item \textbf{error}: Zwecks \"Ubersichtlichkeit wurden die Transitionen zu diesem Zustand
+vernachl\"assigt. Dieser Zustand wird erreicht sobald ein Grammatikfehler oder ein Fehler der ALU
+auftritt. Es wird der String ``Error'' in den Ergebnisbuffer geschrieben und
+\emph{finnnnnished\_result} wird f\"ur einen Zyklus auf high gesetzt.
+\end{itemize}
+
\subsection{Bin/Dez-Converter}
\subsection{ALU}
+opcodes: NOP, ADD, MUL, DIV, DONE (als enum)
\subsection{Display}