statemachine: alu (nix aufregendes)
[hwmod.git] / spec / spec.tex
1 \documentclass[12pt,a4paper,titlepage,oneside]{article}
2 %\documentclass[12pt,a4paper,titlepage,oneside]{report}
3
4 \usepackage{ProtocolHeader}
5
6 \begin{document}
7 \MakeTitleAndTOC
8
9 %\chapter %for use with report class
10 \section
11 {Einleitung}
12
13 Es ist ein einfacher Taschenrechner, der die Grundrechnungsarten Addition, Subtraktion,
14 Multiplikation und Division beherrscht, auf einem FPGA Board zu realisieren. Dabei soll als Eingabegerät eine PS/2
15 Tastatur beziehungsweise als Ausgabegerät ein VGA Monitor dienen. Als zusätzliches Feature soll eine
16 History eingebaut werden, sodass vergangene Berechnungen angezeigt werden
17 können. Außerdem besteht die Möglichkeit diese History per RS232-Schnittstelle zu
18 exportieren bzw. importieren.
19
20 \section{Requirement Spezifikation}
21
22 %TODO: in der Angabe steht nix von einer extrigen Requirement Spezifikation neben der High Level Beschreibung, aber im Template und Auf den Folien ist es als 3. Punkt neben High- und Low Level Spec noch erwähnt.
23 %
24 %Die Subsections sind vielleicht ein kleiner Overshoot.
25
26
27 \subsection{Eingabe}
28
29 \req{Der Taschenrechner soll eine Eingabe bestehend aus den Ziffern '0'-'9', Leerzeichen ' ', '+', '-', '*' und '/' ausrechnen können}
30
31 \req{Der Syntax für so eine Eingabe - eine \textbf{Expression} - sieht folgendermaßen aus:
32
33 DIGIT = '0' \textbar '1' \textbar '2' \textbar '3' \textbar '4' \textbar '5' \textbar '6' \textbar '7' \textbar '8' \textbar '9' ;
34
35 UNSIGNED = DIGIT \{ DIGIT \} ;
36
37 OPERAND = ['-'] UNSIGNED ;
38
39 OPERATOR = '+' \textbar '-' \textbar '*' \textbar '/' ;
40
41 EXPRESSION = OPERAND \{ OPERATOR OPERAND \} ;
42 }
43
44 \req{Dabei soll Punkt- vor Strichrechnung gelten}
45
46 \req{Die Zahlen dürfen im Zahlenbereich eines signed long liegen ($-2^{31}$ bis $2^{31}-1$)}
47
48 \req{Die Eingabe darf aus 70 Zeichen bestehen}
49
50 \req{Die Eingabe erfolgt über eine PS/2-Tastatur, 'Enter' schließt die Eingabe ab und berechnet das Ergebnis, 'Backspace' löscht das zuletzt eingegebene Zeichen}
51
52 \subsection{Ausgabe}
53
54 \req{Die Anzeige der Ein- und Ausgaben erfolgt über einen VGA Monitor.}
55
56 \req{Es wird pro Zeile eine Eingabe oder Ausgabe angezeigt. Die aktuelle Eingabezeile befindet sich zuoberst, darunter das Ergebnis der vorigen Rechnung, darunter die Eingabe der vorigen Rechnung und so weiter}
57
58 \req{Auf die in zuvor angegebene Methode sollen zusätzlich zur aktuellen Eingabezeile die letzten 14 Ein- und Ausgaben dargestellt werden}
59
60 \subsection{History}
61
62 \req{Die letzten 50 Ein- und Ausgaben korrekter Eingaben werden als History im Speicher gehalten}
63
64 \req{Die History soll über RS232, auf Anfrage vom PC, oder bei Betätigen eines Buttons am Development Board, zum PC gesendet werden}
65
66
67 \section{High-Level Design Description}
68
69 \begin{figure}[!ht]
70 \includegraphics[width=\textwidth]{Architektur.png}
71 \centering
72 \caption{Die Architektur des Taschenrechners}
73 \label{fig:arch}
74 \end{figure}
75
76 In Abbildung \ref{fig:arch} ist der Aufbau des Taschenrechners zu sehen. Der Taschenrechner besteht aus folgenden Modulen:
77
78 %\subsection{Module}
79
80 \begin{itemize}
81 \item \textbf{VGA} - Zeichenweises Ansprechen des Monitors
82 \item \textbf{Display} - Liest einzelne Zeichen aus der History aus und leitet diese an das VGA Modul weiter, um sie in der entsprechenden Zeile anzeigen zu lassen
83 \item \textbf{RS232} - Senden und Empfangen von Nachrichten vom/zum PC über die serielle Schnittstelle % TODO. baudrate? kodierung? (8N1?)
84 \item \textbf{PC-Kommunikation} - Auf eine vom PC eintreffende Bufferübermittlungsanforderung oder ein Drücken des entsprechenden Board-Buttons, liest es Zeichen für Zeichen aus dem History Modul aus und leitet es an das RS232 Modul weiter
85 \item \textbf{PS/2} - Empfangen von Keyboard-Eingaben als Scancodes
86 \item \textbf{Scanner} - Empfängt die Scan-Codes vom PS/2 Modul und leitet nur für die Eingabezeile erlaubte Zeichen dekodiert in das CP850 Format an die History weiter, bei einem empfangenen Enter wird der Beginn der Berechnung an das Parser Modul signalisiert
87 \item \textbf{Parser} - Wertet die Eingabezeile der History aus und liefert als Antwort entweder
88 einen Fehler zurück oder gibt die einzelnen Berechnungen von je zwei Zahlen an die ALU weiter, die
89 vom History Modul ausgelesenen zusammenhängenden Dezimalstellen werden intern umgerechnet, das
90 Berechnungs-Endergebnis wird jedoch wieder in einzelne Charakter umgerechnet und in der History gespeichert
91 \item \textbf{ALU} - Führt die tatsächlichen Berechnungen von Addition, Subtraktion, Multiplikation und Division durch
92 \item \textbf{History} - Verwaltung des dahinterliegenden Buffers von vergangenen Berechnungen und der aktuellen Eingabezeile, bei Aktualisierung der aktuellen Eingabezeile und bei Empfang eines Ergebnisses vom Parser Modul signalisiert es das an das Display Modul
93 \end{itemize}
94
95 %\subsection{Interfaces}
96
97 \subsection{Externe Interfaces}
98
99 \subsubsection{Physikalische Interfaces}
100
101 %TODO die pins sind wahrscheilich gefragt
102 %wie ist das mit dem clock? externe ungenaue clock + interne pll oder wie?
103
104 Interface zum key pad
105
106 Interfaces zu VGA, PS/2, RS232
107
108 Reset und Clock!
109
110 Active Low oder Active High
111
112 das ist mir noch nicht ganz klar was die da wollen. was meinen die z.b. mit ``interfaces
113 to VGA'' unter ``physical interfaces'' (seite 10 in der exercise.pdf)
114
115 ``physikalisch'' im sinne der VHDL entity? oder doch den physischen stecker?
116 Ersteres wuerde ich unter Logisches Interface verstehen.
117
118 \begin{landscape}
119 \subsubsection{Logische Interfaces der Module}
120
121 \paragraph{VGA}
122 \THEAD
123 vga\_clk & in & 1 & std\_logic & PLL & VGA-Clock \ZE
124 vga\_res\_n & in & 1 & std\_logic & PLL & VGA-Reset \ZE
125
126 vsync\_n & out & 1 & std\_logic & Bildschirm & Vertikale Synchronisation\ZE
127 hsync\_n & out & 1 & std\_logic & Bildschirm & Horizontale Synchronisation\ZE
128
129 r & out & 3 & std\_logic\_vector & Bildschirm & Ausgabe der Farbe Rot \ZE
130 g & out & 3 & std\_logic\_vector & Bildschirm & Ausgabe der Farbe Gr\"un \ZE
131 b & out & 2 & std\_logic\_vector & Bildschirm & Ausgabe der Farbe Blau \ZE
132
133 command & in & 8 & std\_logic\_vector & Display & Kommando an das VGA Modul \ZE
134 command\_data & in & 32 & std\_logic\_vector & Display & Daten f\"ur das Kommando \ZE
135 free & out & 1 & std\_logic & Display & Signalisiert Bereitschaft \ZE
136 \TEND
137
138
139 \paragraph{Display}
140 %Liest einzelne Zeichen aus der History aus und leitet diese an das VGA Modul weiter, um sie in der entsprechenden Zeile anzeigen zu lassen
141 \THEAD
142 new\_eingabe & in & 1 & std\_logic & History & Fordert History auf die Eingabe auszulesen \ZE
143 new\_result & in & 1 & std\_logic & History & Fordert History auf das Ergebnis auszulesen \ZE
144 zeile & out & 5 & std\_logic\_vector & History & Zeilenadressierung ($2 * 15$ Zeilen $=30$) \ZE
145 spalte & out & 7 & std\_logic\_vector & History & Spaltenadressierung (71 Ziechen inklusive \textbackslash 0) \ZE
146 get & out & 1 & std\_logic & History & Signalisiert Speicheranforderung \ZE
147 done & in & 1 & std\_logic & History & Signalisiert dass Daten anliegen \ZE
148 char & in & 8 & character & History & enth\"alt angeforderne Daten \ZE
149
150 command & out & 8 & std\_logic\_vector & VGA & Kommando an das VGA Modul \ZE
151 command\_data & out & 32 & std\_logic\_vector & VGA & Daten f\"ur das Kommando \ZE
152 free & in & 1 & std\_logic & VGA & Signalisiert Bereitschaft \ZE
153 \TEND
154
155
156 \paragraph{RS232}
157 %Senden und Empfangen von Nachrichten vom/zum PC über die serielle Schnittstelle
158 \THEAD
159 rxd & in & 1 & std\_logic & PC & Sendeleitung der seriellen \"Ubertragung \ZE
160 txd & out & 1 & std\_logic & PC & Empfangsleitung der seriellen \"Ubertragung \ZE
161
162 rx\_data & out & 8 & std\_logic\_vector & PC-Kommunikation & Datenfeld f\"ur das Empfangen \ZE
163 rx\_new & out & 1 & std\_logic & PC-Kommunikation & Signalisiert ein neu empfangendes Byte \ZE
164
165 tx\_data & out & 8 & std\_logic\_vector & PC-Kommunikation & Datenfeld f\"ur das \"Ubertragen \ZE
166 tx\_new & out & 1 & std\_logic & PC-Kommunikation & Signalisiert dass das anliegende Byte gesendet werden soll \ZE
167 \TEND
168
169
170 \paragraph{PC-Kommunikation}
171 %Auf eine vom PC eintreffende Bufferübermittlungsanforderung oder ein Drücken des entsprechenden Board-Buttons, liest es Zeichen für Zeichen aus dem History Modul aus und leitet es an das RS232 Modul weiter
172 \THEAD
173 btn & in & 1 & std\_logic & externer Button & zum Triggern der RS232 Kommunikation \ZE
174
175 rx\_data & in & 8 & std\_logic\_vector & RS232 & Datenfeld f\"ur das Empfangen \ZE
176 rx\_new & in & 1 & std\_logic & RS232 & Signalisiert ein neu empfangendes Byte \ZE
177 tx\_data & in & 8 & std\_logic\_vector & RS232 & Datenfeld f\"ur das \"Ubertragen \ZE
178 tx\_new & in & 1 & std\_logic & RS232 & Signalisiert dass das anliegende Byte gesendet werden soll \ZE
179
180 zeile & out & 7 & std\_logic\_vector & History & Zeilenadressierung (50 * 2 Zeilen = 100)\ZE
181 spalte & out & 7 & std\_logic\_vector & History & Spaltenadressierung (71 Zeichen inklusive \textbackslash 0) \ZE
182 get & out & 1 & std\_logic & History & Signalisiert Speicheranforderung \ZE
183 done & in & 1 & std\_logic & History & Signalisiert dass Daten anliegen \ZE
184 char & in & 8 & character & History & enth\"alt angeforderne Daten \ZE
185 \TEND
186
187
188 \paragraph{PS/2}
189 \THEAD
190 new\_data & out & 1 & std\_logic\_vector & Scanner & Signalisiert neuen Scancode \ZE
191 data & out & 8 & std\_logic\_vector & Scanner & Scancode laut Codepage 850 \ZE
192
193 ps2\_clk & inout & 1 & std\_logic & Tastatur & Clockleitung zum Keyboard \ZE
194 ps2\_data & inout & 1 & std\_logic & Tastatur & Datenleitung zum Keyboard \ZE
195 \TEND
196
197
198 \paragraph{Scanner}
199 %Empfängt die Scan-Codes vom PS/2 Modul und leitet nur für die Eingabezeile erlaubte Zeichen dekodiert in das CP850 Format an die History weiter, bei einem empfangenen Enter wird der Beginn der Berechnung an das Parser Modul signalisiert
200 \THEAD
201 new\_data & in & 1 & std\_logic\_vector & PS/2 & Signalisiert neuen Scancode \ZE
202 data & in & 8 & std\_logic\_vector & PS/2 & Scancode laut Codepage 850 \ZE
203
204 char & out & 8 & character & History & Zeichen das vom History Modul \"ubernommen werden soll \ZE
205 take & out & 1 & std\_logic & History & Signalisiert Datenfeld char \ZE
206 done & in & 1 & std\_logic & History & Signalisiert die \"Ubernahme der Daten \ZE
207 backspace & out & 1 & std\_logic & History & Signalisiert Backspace (letztes Zeichen im Buffer soll gel\"oscht werden) \ZE
208
209 do\_it & out & 1 & std\_logic & Parser & Auswertung beginnen (ENTER) \ZE
210 finished & in & 1 & std\_logic & Parser & Auswertung fertig \ZE
211 \TEND
212
213
214 \paragraph{Parser}
215 %Wertet die Eingabezeile der History aus und liefert als Antwort entweder einen Fehler zurück oder gibt die einzelnen Berechnungen von je zwei Zahlen an die ALU weiter, die vom History Modul ausgelesenen zusammenhängenden Dezimalstellen werden mit dem Bin/Dez-Converter Modul in Binärzahlen umgerechnet, das Berechnungs-Endergebnis wird wieder in mit dem Converter Modul in einzelne Charakter umgerechnet und in der History gespeichert
216 \THEAD
217 h\_rw & in & 1 & std\_logic & History & 0 = read (Expression), 1 = write (Ergebnis) \ZE
218 h\_spalte & in & 7 & std\_logic\_vector & History & Spaltenadressierung (71 Ziechen inklusive \textbackslash 0) \ZE
219 h\_rget & in & 1 & std\_logic & History & Signalisiert Leseanforderung \ZE
220 h\_rdone & out & 1 & std\_logic & History & Signalisiert dass Daten anliegen \ZE
221 h\_read & in & 8 & character & History & enth\"alt angeforderne Daten \ZE
222
223 h\_wtake & in & 1 & std\_logic & History & Signalisiert Schreibanforderung \ZE
224 h\_wdone & out & 1 & std\_logic & History & Signalisiert dass Daten anliegen \ZE
225 h\_write & out & 8 & character & History & enth\"alt zu schreibende Daten \ZE
226
227 h\_finished & in & 1 & std\_logic & History & Auswertung fertig \ZE
228
229 opcode & out & 3 & enum OPS & ALU & die auszuf\"uhrende Art der Berechnung \ZE
230 op1 & out & 32 & SIGNED(32-1 downto 0) & ALU & erste Operand \ZE
231 op2 & inout & 32 & SIGNED(32-1 downto 0) & ALU & zweite Operand und gleichzeitig der Zieloperand \ZE
232 do\_calc & out & 1 & std\_logic & ALU & Signalisert Berechnungstart \ZE
233 calc\_done & in & 1 & std\_logic & ALU & Berechnung fertig \ZE
234
235 do\_it & in & 1 & std\_logic & Scanner & Auswertung beginnen (ENTER) \ZE
236 finished & out & 1 & std\_logic & Scanner & Auswertung fertig \ZE
237 \TEND
238
239
240 \paragraph{ALU}
241 %Führt die tatsächlichen Berechnungen von Addition, Subtraktion, Multiplikation und Division durch
242 \THEAD
243 opcode & in & 3 & enum OPS & Parser & die auszuf\"uhrende Art der Berechnung \ZE
244 op1 & in & 32 & SIGNED(32-1 downto 0) & Parser & erste Operand \ZE
245 op2 & inout & 32 & SIGNED(32-1 downto 0) & Parser & zweite Operand und gleichzeitig der Zieloperand \ZE
246 do\_calc & in & 1 & std\_logic & Parser & Signalisert Berechnungstart \ZE
247 calc\_done & out & 1 & std\_logic & Parser & Berechnung fertig \ZE
248 \TEND
249
250
251 \paragraph{History}
252 %Verwaltung des dahinterliegenden Buffers von vergangenen Berechnungen und der aktuellen
253 %Eingabezeile, bei Aktualisierung der aktuellen Eingabezeile und bei Empfang eines Ergebnisses vom
254 %Parser Modul signalisiert es das an das Display Modul
255 \THEAD
256 pc\_zeile & in & 7 & std\_logic\_vector & PC-Kommunikation & Zeilenadressierung (50 * 2 Zeilen = 100)\ZE
257 pc\_spalte & in & 7 & std\_logic\_vector & PC-Kommunikation & Spaltenadressierung (71 Zeichen inklusive \textbackslash 0) \ZE
258 pc\_get & in & 1 & std\_logic & PC-Kommunikation & Signalisiert Speicheranforderung \ZE
259 pc\_done & out & 1 & std\_logic & PC-Kommunikation & Signalisiert dass Daten anliegen \ZE
260 pc\_char & out & 8 & character & PC-Kommunikation & enth\"alt angeforderne Daten \ZE
261
262 s\_char & in & 8 & character & Scanner & Zeichen das vom Scanner Modul \"ubernommen werden soll \ZE
263 s\_take & in & 1 & std\_logic & Scanner & Signalisiert Datenfeld char \ZE
264 s\_done & out & 1 & std\_logic & Scanner & Signalisiert die \"Ubernahme der Daten \ZE
265 s\_backspace & in & 1 & std\_logic & Scanner & Signalisiert Backspace (letztes Zeichen im Buffer soll gel\"oscht werden) \ZE
266
267 d\_new\_eingabe & out & 1 & std\_logic & Display & Fordert Display auf die Eingabe auszulesen \ZE
268 d\_new\_result & out & 1 & std\_logic & Display & Fordert Display auf das Ergebnis auszulesen \ZE
269 d\_zeile & in & 5 & std\_logic\_vector & Display & Zeilenadressierung ($2 * 15$ Zeilen $=30$) \ZE
270 d\_spalte & in & 7 & std\_logic\_vector & Display & Spaltenadressierung (71 Ziechen inklusive \textbackslash 0) \ZE
271 d\_get & in & 1 & std\_logic & Display & Signalisiert Speicheranforderung \ZE
272 d\_done & out & 1 & std\_logic & Display & Signalisiert dass Daten anliegen \ZE
273 d\_char & out & 8 & character & Display & enth\"alt angeforderne Daten \ZE
274
275 p\_rw & in & 1 & std\_logic & Parser & 0 = read (Expression), 1 = write (Ergebnis) \ZE
276 p\_spalte & in & 7 & std\_logic\_vector & Parser & Spaltenadressierung (71 Ziechen inklusive \textbackslash 0) \ZE
277 p\_rget & in & 1 & std\_logic & Parser & Signalisiert Leseanforderung \ZE
278 p\_rdone & out & 1 & std\_logic & Parser & Signalisiert dass Daten anliegen \ZE
279 p\_read & in & 8 & character & Parser & enth\"alt angeforderne Daten \ZE
280
281 p\_wtake & in & 1 & std\_logic & Parser & Signalisiert Schreibanforderung \ZE
282 p\_wdone & out & 1 & std\_logic & Parser & Signalisiert dass Daten anliegen \ZE
283 p\_write & out & 8 & character & Parser & enth\"alt zu schreibende Daten \ZE
284
285 p\_finished & in & 1 & std\_logic & Parser & Auswertung fertig \ZE
286 \TEND
287 \end{landscape}
288
289
290 \subsubsection{Verhalten der Interfaces}
291
292 welche tasten als input erlauben (haben numblock und normale ziffern unterschiedliche scancodes?)?
293
294 wie werden ueberlaeufe behandelt?
295
296 fehlerhafte eingaben?
297
298 wie schaut die ausgabe aus?
299
300 was ausgaben bei fehler?
301
302 wie kann download oder upload einer history gestartet werden?
303
304 wie kann auf die history zugegriffen werden?
305
306 soll in der eingabe auch mit pfeiltasten (links,rechts) gescrolled werden koennen?
307
308
309 \subsection{Testfälle}
310
311 alle requirements muessen von testfaellen abgedeckt werden!
312
313 %29 zeilen am bildschirm
314
315
316 \section{Detailed Design Description}
317
318 \subsection{VGA}
319 TODO: not our business?
320
321 \subsection{Display}
322
323 \subsection{RS232}
324 %test, TODO
325 \begin{figure}[!ht]
326 \includegraphics[width=0.9\textwidth]{sm/rs232-rs.pdf}
327 \centering
328 \caption{Statemachine zum Empfangen auf der RS232 Schnittstelle (8N1)}
329 \label{fig:rs232-rs}
330 \end{figure}
331
332
333 \subsection{PC-Kommunikation}
334
335
336 \subsection{PS/2}
337 TODO: not our business?
338
339
340 \subsection{Scanner}
341 \begin{figure}[!ht]
342 \includegraphics[width=0.9\textwidth]{sm/scanner.pdf}
343 \centering
344 \caption{Statemachine zum Scannen des Inputs der PS/2 Schnittstelle}
345 \label{fig:scanner}
346 \end{figure}
347
348 \begin{itemize}
349 \item \textbf{idle}: Setz alle Steuersignale \emph{backspace}, \emph{take} und \emph{do\_it} low.
350 \item \textbf{read}: Bei steigender Flanke auf \emph{new\_data} wird das anliegende Byte des
351 PS/2-Modules \"ubernommen. Je nach Wert wird in den n\"achsten Zustand gewechselt.
352 \item \textbf{enter}: Wurde die Entertaste gedr\"uckt wird der Parser getriggert (\emph{do\_it} ist
353 einen Takt lang high). Der Scanner befindet sich so lange in diesem Zustand bis der Parser das
354 Ergebnis berechnet hat.
355 \item \textbf{l\"oschen}: Teilt dem History Modul mit das letzte Zeichen im Buffer zu l\"oschen
356 (\emph{backspace} ist einen Takt lang high).
357 \item \textbf{\"ubernehmen}: Wenn ein g\"ultiges Zeichen laut Requirements eingegeben wurde, wird
358 jenes Zeichen an \emph{char} angelegt und \emph{take} wird einen Takt lang high gesetzt. Das History
359 Modul wird dadurch getriggert das anliegende Zeichen in den Buffer zu \"ubernehmen.
360 \end{itemize}
361
362
363 \subsection{Parser}
364 \begin{figure}[!ht]
365 \includegraphics[width=0.9\textwidth]{sm/parser.pdf}
366 \centering
367 \caption{Statemachine zum Parsen der aktuellen Expression}
368 \label{fig:parser}
369 \end{figure}
370
371 \begin{lstlisting}
372 procedure exec() {
373         z := z*s;
374         switch(opp) {
375                 case NOP: 
376                         if(aktop != '\0')
377                                 c1();
378                         break;
379                 case '-':
380                         z := z * (-1);
381                 case '+':
382                         c1();
383                         break;
384
385                 case '/':
386                 case '*':
387                   if(aktop in ['+','-','\0']) {
388                           alu(opp, z, punkt);
389                           do_calc = 1;
390                           while(calc_done == 0);
391
392                           alu(ADD, punkt, strich);
393                           punkt = 1;
394                   }
395                   else if (aktop in ['*','/']) {
396                           alu(opp, z, punkt);
397                   }
398                   break;
399         }
400         do_calc = 1;
401         opp = aktop;
402 }
403
404 procedure c1() {
405         if(aktop in ['+','-','\0']) {
406                 alu(ADD, z, strich);
407         }
408         else if (aktop in ['*','/']) {
409                 alu(MUL, z, punkt);
410         }
411 }
412 \end{lstlisting}
413
414 \begin{itemize}
415 \item \textbf{idle}: Das Modul ist unt\"atig und wartet auf eine steigende Flanke von \emph{do\_it}.
416
417 \item \textbf{read char}: Lokale Variablen werden zur\"uckgesetzt und das n\"achste Zeichen wird vom
418 History Modul angefordert.
419
420 \item \textbf{sign}: Ggf. wird das Vorzeichen auf '-' gesetzt.
421
422 \item \textbf{int}: Zeichen f\"ur Zeichen wird eingelesen und die Zahl wird daraus berechnet.
423
424 \item \textbf{calc}: Punkt- und Strichrechnungen m\"ussen getrennt behandelt werden, daher ergibt
425 sich dieses Konstrukt im Codebeispiel.
426
427 \item \textbf{null}: Sonderbehandlung ist n\"otig wenn die Expression mit '\textbackslash 0'
428 abgeschlossen wird.
429
430 \item \textbf{done}: In diesem Zustand wird das Ergebnis das sich je nach \emph{opp} in
431 \emph{strich} oder \emph{punkt}  befindet als String in den Ergebnisbuffer des History Modules
432 geschrieben und danach wird \emph{finished} f\"ur einen Zyklus auf high gesetzt.
433
434 \item \textbf{error}: Zwecks \"Ubersichtlichkeit wurden die Transitionen zu diesem Zustand
435 vernachl\"assigt. Dieser Zustand wird erreicht sobald ein Grammatikfehler oder ein Fehler der ALU
436 auftritt. Es wird der String ``Error'' in den Ergebnisbuffer geschrieben und
437 \emph{finished} wird f\"ur einen Zyklus auf high gesetzt.
438 \end{itemize}
439
440
441 \subsection{ALU}
442 \begin{figure}[!ht]
443 \includegraphics[width=0.9\textwidth]{sm/alu.pdf}
444 \centering
445 \caption{Statemachine der ALU}
446 \label{fig:alu}
447 \end{figure}
448 %TODO: eventuell zweierkomplement statt SUB?
449 Folgende Opcodes werden von uns als enum definiert:
450 \begin{quote}
451 NOP, SUB, ADD, MUL, DIV, DONE
452 \end{quote}
453 wobei NOP und DONE von der ALU nicht bearbeitet werden sollen.
454
455 In jedem State wird die entsprechende Berechnungsart durchgef\"uhrt und danach der Abschluss der
456 Berechnung mit \emph{calc\_done} signalisiert. Wichtig zu beachten ist dabei, dass sich die
457 Rechenoperationen in der Ausf\"uhrungszeit unterscheiden k\"onnen.
458
459
460 \subsection{History}
461 Dieses Modul stellt die zentrale Speicherstelle f\"ur die verschiedenen Module da.
462 Die Idee ist dabei, dass intern ein RAM-Block mit mindestens der Gr\"o\ss{}e
463 $(50\cdot2)*(71) = 710$ Bytes verwaltet wird.
464
465 Das History Modul kann \"uber die angelegten Leitungen \emph{s\_take}, \emph{p\_rget},
466 \emph{p\_wdo}, \emph{pc\_get} bzw. \emph{d\_get} feststellen welches Modul\footnote{die
467 betreffendenen Module sind: Scanner, Parser, PC-Kommunikation und Display} eine Speicheranfrage
468 ausf\"uhrt.
469 Der Zugriff der externen Module erfolgt priorisiert:
470 \begin{quote}
471 Scanner > Parser > PC-Kommunikation > Display
472 \end{quote}
473
474 Weiters ist zu beachten, dass das History Modul f\"ur den Scanner und Parser intern einen Index
475 mitspeichern muss, der die Adresse der aktuellen Eingabe mitf\"uhrt. Mit Hilfe dieses Indexes plus
476 der Spaltenadressierung der Module kann die tats\"achliche Adresse f\"ur des internen RAM-Blockes
477 ermittelt werden.
478
479 Ist das History Modul mit der Speicheranfrage fertig, wird das andere Modul \"uber die entsprechende
480 \emph{done}-Leitung benachrichtigt.
481
482
483 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
484 %LISTINGS
485 %\newpage
486 %\appendix
487 %\section{Listings}
488 %howto include src files
489 %\subsection{einfache Variante -- generierter Sourcecode}
490 %\label{att:einfachsrc}
491 %\lstinputlisting{../einfach/einfach.src}
492 %\lstinputlisting[firstnumber=24, firstline=24, lastline=34]{bla.src} %firstnumber shouldn't be necessary, but there is probably a bug
493
494 \end{document}
495