statemachine: parser und noch ein paar kleiner fixes
authorBernhard Urban <lewurm@gmail.com>
Wed, 24 Mar 2010 00:33:19 +0000 (01:33 +0100)
committerBernhard Urban <lewurm@gmail.com>
Wed, 24 Mar 2010 00:35:15 +0000 (01:35 +0100)
@ALU:
syntax: <opcode, operand1, operand2>
wobei operand2 gleichzeitig der output ist (AT&T style \o/)
ausserdem ist ein enum praktisch fuer opcodes (haben wir heute in
der VO gelernt)

spec/sm/parser.pdf [new file with mode: 0644]
spec/sm/parser.tex [new file with mode: 0644]
spec/sm/rs232-rs.pdf
spec/sm/scanner.pdf
spec/sm/scanner.tex
spec/spec.tex

diff --git a/spec/sm/parser.pdf b/spec/sm/parser.pdf
new file mode 100644 (file)
index 0000000..85a7061
Binary files /dev/null and b/spec/sm/parser.pdf differ
diff --git a/spec/sm/parser.tex b/spec/sm/parser.tex
new file mode 100644 (file)
index 0000000..20589c3
--- /dev/null
@@ -0,0 +1,83 @@
+\documentclass{minimal}
+\pagestyle{empty}
+
+\usepackage{pstricks}
+\usepackage{pst-node}
+
+\begin{document}
+
+\begin{psmatrix}[mnode=oval, colsep=1.91cm, rowsep=1cm]
+[mnode=R,name=vars]{\shortstack[l]{bool s=F,first=T;\\int z:=0, c,\\\, strich:=0, punkt:=1;\\opcode
+op,opn;}} &
+[name=calc]{\shortstack{\textbf{calc}\\z:=z*10\\+(c-'0');}} &
+[name=null]{\shortstack{\textbf{null}\\op:=DONE;}} \\
+%%
+[mnode=R,name=res]{sys\_res} &
+[name=sign]{\shortstack{\textbf{sign}\\s:=true;}} &
+[name=alu1]{
+       \shortstack{
+               \textbf{ALU1}\\
+               \shortstack[l]{
+                       if(first)\{\\
+                               \, alu(ADD,z*s,strich);\\
+                               \, first:=false;\\
+                       \} else\{\\
+                               \, alu(opd,z*s,strich);\\
+                       \}\\
+                       do\_calc=1;\\
+                       opn=op;
+               }
+       }
+} \\
+%%
+[name=idle]{\shortstack{\textbf{idle}}} &
+[name=read]{\shortstack{\textbf{read char}\\z:=0;\\s:=false;}} &
+[name=alu2]{
+       \shortstack{
+               \textbf{ALU2}\\
+               \shortstack[l]{
+                       if(first)\{\\
+                               \, alu(MUL,z*s,punkt);\\
+                               \, first:=false;\\
+                       \} else\{\\
+                               \, alu(opd,z*s,punkt);\\
+                       \}\\
+                       do\_calc=1;\\
+                       opn=op;
+               }
+       }
+} \\
+%%
+[mnode=R,name=void]{} &
+[name=err]{\shortstack{\textbf{error}}} &
+[name=done]{\shortstack{\textbf{done}}} \\
+\end{psmatrix}
+
+\psset{arrows=->, shortput=nab}
+
+\ncline[linestyle=dotted]{res}{idle}
+\ncline[linestyle=dotted]{void}{err}
+\ncarc[arcangle=10]{done}{idle}
+\ncarc[arcangle=0]{err}{idle}
+
+\ncarc[arcangle=0]{idle}{read}\ncput*[npos=.50]{do\_it$\uparrow$}
+
+\ncarc[arcangle=0]{read}{sign}\ncput*[npos=.50]{'-'}
+\ncarc[arcangle=0]{sign}{calc}
+\ncarc[arcangle=35]{read}{calc}\ncput*[npos=.35]{c = '0'\dots{}'9'}
+\nccircle[angle=0]{calc}{.8cm}\ncput*{c = '0'\dots{}'9'}
+
+\ncarc[arcangle=15]{calc}{alu1}\ncput*[npos=.50]{op = '+','-'}
+\ncarc[arcangle=-5]{calc}{alu2}\ncput*[npos=.30]{op = '*','/'}
+
+\ncarc[arcangle=0]{calc}{null}\ncput*[npos=.50]{'\textbackslash 0'}
+
+\ncarc[arcangle=0]{null}{alu1}\ncput*[npos=.50]{opd in ['+','-']}
+\ncarc[arcangle=48]{null}{alu2}\ncput*[npos=.80]{opd in ['*','/']}
+
+\ncarc[arcangle=0]{alu1}{read}\ncput*[npos=.50]{calc\_done$\uparrow$}
+\ncarc[arcangle=20]{alu2}{read}\ncput*[npos=.50]{calc\_done$\uparrow$}
+
+\ncarc[arcangle=80]{alu1}{done}\ncput*[npos=.50]{op == DONE}
+\ncarc[arcangle=-60]{alu2}{done}\ncput*[npos=.66]{op == DONE}
+\end{document}
index 20510768b8f980a38eca438d587f8bf835f416a8..89b21857a5f03be4c3c4395ac7323de17f53e7bc 100644 (file)
Binary files a/spec/sm/rs232-rs.pdf and b/spec/sm/rs232-rs.pdf differ
index 2662ad0c24f2eb7300618e2662d3237bc8582187..04c8586fc78d88814dad591dc07b378624b9742b 100644 (file)
Binary files a/spec/sm/scanner.pdf and b/spec/sm/scanner.pdf differ
index ff4307b6380708ce9e4260edac9419a77e1fe2da..24b26cecf39d6bf82e0e99d237a3a43efcd478d9 100644 (file)
@@ -6,8 +6,8 @@
 
 \begin{document}
 
-\begin{psmatrix}[mnode=circle, colsep=3cm, rowsep=2cm]
-[mnode=R,name=res]{sys\_res} &
+\begin{psmatrix}[mnode=oval, colsep=3cm, rowsep=2cm]
+[mnode=R,name=res]{sys\_res\_n} &
 [name=idle]{\shortstack{\textbf{idle}\\bs = 0\\take=0\\do\_it=0}} &
 [name=take]{\shortstack{\textbf{\"ubernehmen}\\take = 1\\char = $b_0$}} \\
 %%
index d1cf16d4fa532884ef35dfbffd597c3dcc28a41e..1d8bb580895712af0e36d7e91a94919897fe15b0 100644 (file)
@@ -230,7 +230,7 @@ zu modul history: 5 bit zeile (2*14+1) (out), 7 bit spalte (71 zeichen - 0 am en
 
 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?)
@@ -253,7 +253,7 @@ TODO
 
 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}
 
@@ -336,7 +336,7 @@ wie schauen interne strukturen aus? (speicher, logische bloecke, parallele proze
 \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}
@@ -357,10 +357,44 @@ Modul wird dadurch getriggert das anliegende Zeichen in den Buffer zu \"ubernehm
 \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{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{ALU1/2}: Punkt- und Strichrechnungen m\"ussen getrennt behandelt werden, daher ergibt
+sich dieses Konstrukt.
+
+\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{opd} 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, SUB, MUL, DIV, DONE (als enum)
 
 \subsection{Display}