1 \documentclass[12pt,a4paper,titlepage,oneside]{article}
2 %\documentclass[12pt,a4paper,titlepage,oneside]{report}
4 \usepackage{ProtocolHeader}
9 %\chapter %for use with report class
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.
20 \section{Requirement Spezifikation}
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.
24 %Die Subsections sind vielleicht ein kleiner Overshoot.
29 \req{Der Taschenrechner soll eine Eingabe bestehend aus den Ziffern '0'-'9', Leerzeichen ' ', '+', '-', '*' und '/' ausrechnen können}
31 \req{Der Syntax für so eine Eingabe - eine \textbf{Expression} - sieht folgendermaßen aus:
33 DIGIT = '0' \textbar '1' \textbar '2' \textbar '3' \textbar '4' \textbar '5' \textbar '6' \textbar '7' \textbar '8' \textbar '9' ;
35 UNSIGNED = DIGIT \{ DIGIT \} ;
37 OPERAND = ['-'] UNSIGNED ;
39 OPERATOR = '+' \textbar '-' \textbar '*' \textbar '/' ;
41 EXPRESSION = OPERAND \{ OPERATOR OPERAND \} ;
44 \req{Dabei soll Punkt- vor Strichrechnung gelten}
46 \req{Die Zahlen dürfen im Zahlenbereich eines signed long liegen ($-2^{31}$ bis $2^{31}-1$)}
48 \req{Die Eingabe darf aus 70 Zeichen bestehen}
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}
54 \req{Die Anzeige der Ein- und Ausgaben erfolgt über einen VGA Monitor.}
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}
58 \req{Auf die in zuvor angegebene Methode sollen zusätzlich zur aktuellen Eingabezeile die letzten 14 Ein- und Ausgaben dargestellt werden}
62 \req{Die letzten 50 Ein- und Ausgaben korrekter Eingaben werden als History im Speicher gehalten}
64 \req{Die History soll über RS232, auf Anfrage vom PC, oder bei Betätigen eines Buttons am Development Board, zum PC gesendet werden}
67 \section{High-Level Design Description}
70 \includegraphics[width=\textwidth]{Architektur.png}
72 \caption{Die Architektur des Taschenrechners}
76 In Abbildung \ref{fig:arch} ist der Aufbau des Taschenrechners zu sehen. Der Taschenrechner besteht aus folgenden Modulen:
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
95 %\subsection{Interfaces}
97 \subsection{Externe Interfaces}
99 \subsubsection{Physikalische Interfaces}
101 %TODO die pins sind wahrscheilich gefragt
102 %wie ist das mit dem clock? externe ungenaue clock + interne pll oder wie?
104 Interface zum key pad
106 Interfaces zu VGA, PS/2, RS232
110 Active Low oder Active High
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)
115 ``physikalisch'' im sinne der VHDL entity? oder doch den physischen stecker?
116 Ersteres wuerde ich unter Logisches Interface verstehen.
119 \subsubsection{Logische Interfaces der Module}
123 vga\_clk & in & 1 & std\_logic & PLL & VGA-Clock \ZE
124 vga\_res\_n & in & 1 & std\_logic & PLL & VGA-Reset \ZE
126 vsync\_n & out & 1 & std\_logic & Bildschirm & Vertikale Synchronisation\ZE
127 hsync\_n & out & 1 & std\_logic & Bildschirm & Horizontale Synchronisation\ZE
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
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
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
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
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
157 %Senden und Empfangen von Nachrichten vom/zum PC über die serielle Schnittstelle
159 rxd & in & 1 & std\_logic & PC & Sendeleitung der seriellen \"Ubertragung \ZE
160 txd & out & 1 & std\_logic & PC & Empfangsleitung der seriellen \"Ubertragung \ZE
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
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
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
173 btn & in & 1 & std\_logic & externer Button & zum Triggern der RS232 Kommunikation \ZE
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
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
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
193 ps2\_clk & inout & 1 & std\_logic & Tastatur & Clockleitung zum Keyboard \ZE
194 ps2\_data & inout & 1 & std\_logic & Tastatur & Datenleitung zum Keyboard \ZE
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
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
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
209 do\_it & out & 1 & std\_logic & Parser & Auswertung beginnen (ENTER) \ZE
210 finished & in & 1 & std\_logic & Parser & Auswertung fertig \ZE
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
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
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
227 h\_finished & in & 1 & std\_logic & History & Auswertung fertig \ZE
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
235 do\_it & in & 1 & std\_logic & Scanner & Auswertung beginnen (ENTER) \ZE
236 finished & out & 1 & std\_logic & Scanner & Auswertung fertig \ZE
241 %Führt die tatsächlichen Berechnungen von Addition, Subtraktion, Multiplikation und Division durch
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
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
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
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
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
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
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
285 p\_finished & in & 1 & std\_logic & Parser & Auswertung fertig \ZE
290 \subsubsection{Verhalten der Interfaces}
292 welche tasten als input erlauben (haben numblock und normale ziffern unterschiedliche scancodes?)?
294 wie werden ueberlaeufe behandelt?
296 fehlerhafte eingaben?
298 wie schaut die ausgabe aus?
300 was ausgaben bei fehler?
302 wie kann download oder upload einer history gestartet werden?
304 wie kann auf die history zugegriffen werden?
306 soll in der eingabe auch mit pfeiltasten (links,rechts) gescrolled werden koennen?
309 \subsection{Testfälle}
311 alle requirements muessen von testfaellen abgedeckt werden!
313 %29 zeilen am bildschirm
316 \section{Detailed Design Description}
319 TODO: not our business?
326 \includegraphics[width=0.9\textwidth]{sm/rs232-rs.pdf}
328 \caption{Statemachine zum Empfangen auf der RS232 Schnittstelle (8N1)}
333 \subsection{PC-Kommunikation}
337 TODO: not our business?
342 \includegraphics[width=0.9\textwidth]{sm/scanner.pdf}
344 \caption{Statemachine zum Scannen des Inputs der PS/2 Schnittstelle}
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.
365 \includegraphics[width=0.9\textwidth]{sm/parser.pdf}
367 \caption{Statemachine zum Parsen der aktuellen Expression}
387 if(aktop in ['+','-','\0']) {
390 while(calc_done == 0);
392 alu(ADD, punkt, strich);
395 else if (aktop in ['*','/']) {
405 if(aktop in ['+','-','\0']) {
408 else if (aktop in ['*','/']) {
415 \item \textbf{idle}: Das Modul ist unt\"atig und wartet auf eine steigende Flanke von \emph{do\_it}.
417 \item \textbf{read char}: Lokale Variablen werden zur\"uckgesetzt und das n\"achste Zeichen wird vom
418 History Modul angefordert.
420 \item \textbf{sign}: Ggf. wird das Vorzeichen auf '-' gesetzt.
422 \item \textbf{int}: Zeichen f\"ur Zeichen wird eingelesen und die Zahl wird daraus berechnet.
424 \item \textbf{calc}: Punkt- und Strichrechnungen m\"ussen getrennt behandelt werden, daher ergibt
425 sich dieses Konstrukt im Codebeispiel.
427 \item \textbf{null}: Sonderbehandlung ist n\"otig wenn die Expression mit '\textbackslash 0'
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.
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.
443 \includegraphics[width=0.9\textwidth]{sm/alu.pdf}
445 \caption{Statemachine der ALU}
448 %TODO: eventuell zweierkomplement statt SUB?
449 Folgende Opcodes werden von uns als enum definiert:
451 NOP, SUB, ADD, MUL, DIV, DONE
453 wobei NOP und DONE von der ALU nicht bearbeitet werden sollen.
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.
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.
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
469 Der Zugriff der externen Module erfolgt priorisiert:
471 Scanner > Parser > PC-Kommunikation > Display
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
479 Ist das History Modul mit der Speicheranfrage fertig, wird das andere Modul \"uber die entsprechende
480 \emph{done}-Leitung benachrichtigt.
483 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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