09.07.2015 Aufrufe

Assembler und Computergrafik - Eingebettete Systeme - Goethe ...

Assembler und Computergrafik - Eingebettete Systeme - Goethe ...

Assembler und Computergrafik - Eingebettete Systeme - Goethe ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Kapitel 1EinleitungIn diesem Abschlussversuch des Praktikums wird die Programmierung eines Prozessors mittels<strong>Assembler</strong> vermittelt. Verwendet wird eine an der Professur für <strong>Eingebettete</strong> <strong>Systeme</strong> entwickelte16-Bit RISC-CPU, deren Design Anleihen bei verschiedenen RISC-Architekturen aufweist<strong>und</strong> in VHDL implementiert wurde. Hauptziel dieses Versuches ist es die <strong>Assembler</strong>programmierungder CPU mit verschiedenen Anwendungen aus dem I/O- <strong>und</strong> Grafikbereich. Nebenden wesentlichen <strong>Assembler</strong>gr<strong>und</strong>lagen werden unter anderem auch 2D-Grafiktechnikenbetrachtet. Im Gr<strong>und</strong>lagenteil werden die Konzepte einer <strong>Assembler</strong>sprache sowie deren Funktionsweiseerläutert. Des Weiteren wird die Umsetzung von 2D-Grafikprogrammierung mittels<strong>Assembler</strong> vermittelt. Anschließend werden die folgenden Aufgaben bearbeitet:ˆ Umsetzung eines Pseudo-Zufallszahlengenerators in <strong>Assembler</strong>ˆ Erstellen <strong>und</strong> Zeichnen von 2D-Grafikobjekten mittels <strong>Assembler</strong>ˆ Bewegung von Grafikobjekten mittels externer I/O-Steuereingaben durch den Benutzerˆ Umsetzung eines rudimentären Spiel-Automaten in <strong>Assembler</strong>2


KAPITEL 2. GRUNDLAGEN 4Abbildung 2.1: Beispiel eines LFSR mit 8-BitExklusiv-Oder-Gatter (EOR, XOR) direkt in Hardware sehr effizient möglich. Aber auch einMicrocontroller-Programm benötigt nur einige Zeilen (<strong>Assembler</strong>-) Code zur Realisierung inSoftware.Das Prinzip des LFSR besteht darin, den Ausgang eines Schieberegisters auf seinen Eingangrückzukoppeln <strong>und</strong> mindestens eine XOR-Operation durchzuführen. Die nebenstehendeAbbildung stellt eine besonders einfache Realisierung mit einem 8-Bit-Schieberegister <strong>und</strong>nur einem XOR-Gatter dar. Bei geeigneter Wahl einer Kombination aus Registerlänge n<strong>und</strong> den Einkopplungsstellen durchläuft das LFSR beim Shiften (bitweises Weiterschieben)aus einem beliebigen Anfangszustand ungleich Null sämtliche 2 n − 1 möglichen Zustände,bis der Startzustand wieder erreicht ist. Durch Abgreifen eines Bits, z. B. Bit 0, nach jedemShift-Schritt oder Verwendung größerer Registeranteile nach mehreren Schritten lassensich Pseudo-Zufallszahlen gewinnen. Komplexere LFSR enthalten mehrere XOR-Gatter, diezwischen einzelnen Registerzellen angeordnet sind <strong>und</strong> das ”umlaufende“ Bit mehrfach mitdem internen Bit-Strom verknüpfen. Auf diese Weise findet eine stärkere Veränderung desRegisterinhalts pro Shift-Schritt statt.Eine Zwischenstufe zwischen den echten <strong>und</strong> Pseudo-Zufallszahlen stellen Zahlenwerte dar,die auf besondere Weise gewonnen werden <strong>und</strong> als scheinbar echte Zufallszahlen bezeichnetwerden können. Eine solche Zahl ist beispielsweise die exakte Uhrzeit zu einem bestimmtenZeitpunkt oder die möglichst genau gemessene Zeitdauer eines Tastendrucks. Wird einescheinbar echte Zufallszahl zur Initialisierung eines LFSR verwendet, so kann man durch dasShiften eine Folge scheinbar echter Zufallszahlen generieren. Dies soll hier aber nicht weiterverfolgt werden.2.2 <strong>Assembler</strong>spracheEine <strong>Assembler</strong>sprache ist eine spezielle Programmiersprache, welche die Maschinenspracheeiner spezifischen Prozessorarchitektur in einer für den Menschen lesbaren Form repräsentiert.Daraus folgt, dass jede Computerarchitektur ihre eigene <strong>Assembler</strong>sprache hat.Ein zugehöriger <strong>Assembler</strong> ist genaugenommen ein Compiler, der den Code eines ”<strong>Assembler</strong>programms“in Maschinensprache, d. h. Binärwörter übersetzt.Programmbefehle in Maschinensprache sind einfache Bitmuster, die aus den Opcodes <strong>und</strong>den zugehörigen Daten gebildet werden. Zur symbolischen Darstellung von Maschinenbefehlenwerden Abkürzungen (so genannte mnemonische Symbole) benutzt, die sich ein Programmiererleichter einprägen kann als eine Funktionsbeschreibung oder gar den binären Opcode einesBefehls.Das <strong>Assembler</strong>programm ist also nur eine für Menschen etwas komfortablere Darstellungdes Maschinenprogramms:Anstatt


KAPITEL 2. GRUNDLAGEN 50x4022in der hexadezimalen Darstellung schreiben zu müssen, kann der Programmierer die <strong>Assembler</strong>anweisungADD R1, R2verwenden, die für den Prozessor, welcher im Praktikum benutzt wird, genau dasselbe bedeutet.2.2.1 Eigenschaften einer <strong>Assembler</strong>spracheDie Fähigkeiten einer <strong>Assembler</strong>sprache hängen direkt von der Zielarchitektur ab. Besitztdie Ziel-CPU nicht den entsprechenden Befehl, so kann auch der <strong>Assembler</strong>programmiererkeinen solchen Befehl ohne weiteres benutzen. Die ganzen Konstrukte höherer Programmiersprachen,die dem Programmierer erlauben seine Algorithmen in verständliche Programmezu übertragen, fehlen:ˆ keine komfortablen Schleifen (for, while, repeat-until)ˆ keine strukturierten Datentypenˆ keine Unterprogramme mit typisierter Parameterübergabeˆ keine automatische SpeicherverwaltunBeispiel:summe = a + b + c + d;Der Ausdruck für die obige Summe kann für die Praktikums-CPU nicht in einem einzigenMaschinensprachebefehl kodiert werden <strong>und</strong> muss daher in mehreren Anweisungen aufgeteiltwerden. Die CPU kann immer nur zwei Register addieren <strong>und</strong> das Ergebnis in einem derRegister speichern.Das folgende C-Programm entspricht daher eher dem <strong>Assembler</strong>programm:summe = a + b;summe = summe + c;summe = summe + d;<strong>und</strong> würde in der <strong>Assembler</strong>sprache der Praktikums-CPU wiefolgt lauten:Im Allgemeinen passiert hier folgendes:LD R1, [a]LD R2, [b]LD R3, [c]LD R4, [d]ADD R1, R2ADD R1, R3ADD R1, R4


KAPITEL 2. GRUNDLAGEN 8# Sprungbefehl mit d i r e k t e r AdresseADD R2 , R10CP R2 , R3IMM 0x000BRE 0x3MUL R2 , R5XOR R2 , R7ST R2 , R11LD R2 , R12# Sprungbefehl mit i n d i r e k t e r Adresse durch Sprungmarke JMP MARKADD R2 , R10CP R2 , R3BRE JMP MARKMUL R2 , R5XOR R2 , R7ST R2 , R11JMP MARK:LD R2 , R12Direkte Adressen stellen die ursprüngliche Form dar, die auch direkt von der Hardware interpretiertwerden kann. Aufgr<strong>und</strong> der Tatsache, dass aber in der Regel jedem <strong>Assembler</strong>befehlein Maschinenbefehl im Verhältnis 1:1 zugr<strong>und</strong>eliegt, ist die Umsetzung von Sprungmarkenhardwaretechnisch mit reinem <strong>Assembler</strong>konzept nur schwer möglich, da Marken im Gr<strong>und</strong>eSynonyme für Zahlenwerte sind. Die Abbildung dieser ”Synonyme“ auf konkrete Zahlenwertemüsste somit zur Laufzeit erfolgen, wodurch alleine für die Verwendung des Konzepts vonSprungmarken zusätzliche Hardware notwendig wäre. Die meisten <strong>Assembler</strong>sprachen nutzendeshalb den Einsatz von mitgelieferten Compilern um dieses Problem zu umgehen. Dieseermöglichen es, eine virtuelle Erweiterung des ursprünglichen Befehlsspektrums der Hardware(hier CPU) zu gewährleisten. Für Sprungmarken würde dies konkret bedeuten, dassdie Abbildung der Marke auf den jeweiligen Zahlenwert durch den Compiler erfolgt, der das<strong>Assembler</strong>programm in den ursprünglichen Befehlssatz der Hardware überführt. So werdenzum Beispiel oft auch Engpässe bei der Verwaltung von Opcodes umgangen, indem z.B. einemvirtuellen <strong>Assembler</strong>befehl ein oder mehrere Befehle der Hardware zugr<strong>und</strong>eliegen. Innerhalbdes Praktikums ist die Verwendung von Sprungadressen in beiden Varianten möglich, da Siein späteren Versuchen Ihre entwickelten Programme mittels eines bereitgestellten Compilersin die Maschinensprache der Praktikums-CPU überführen.2.2.5 InstruktionsformateRechner besitzen eine feste Anzahl von Maschinenbefehlen, die sich in mehrere verschiedenenBefehlsformatgruppen einteilen lassen. Diese Befehlsformatgruppen werden beim Entwurfeines Prozessors definiert. Die Programmierung eines Rechners erfolgt letztlich (nach demÜbersetzen des Hochsprachenprogramms) durch Maschinenbefehlsfolgen, die im Speicher ab-


KAPITEL 2. GRUNDLAGEN 10Befehlswort: 0x4022Opcode A: 0x1 (arithmetische Instruktion)Opcode B: 0x0 (Addition zweier Register)Im Befehlswort kennzeichnet 0x die hexadezimale Darstellung. Des Weiteren sindneben der hexadezimalen auch die dezimale (0d) <strong>und</strong> die binäre (0b) Darstellungvon Zahlen möglich.ˆ Befehlsformat 2– Aufteilung der BitsIN[15:14] => Opcode A (Befehlsklasse)IN[13:10] => Opcode B (eigentlicher Befehl/Instruktion der Klasse)IN[9:5] => Operand A (Register)IN[3:0] => Immediate[3:0] (konstanter 4-Bit Wert [0:15])IN[4] => nicht definiert– BeispielBefehl:IMM 0d0ADDI R1, 0d14Ergebnis: R1 ← R1 + 14Befehlsworte: 0xF0000x442Eˆ Befehlsformat 3– Aufteilung der BitsIN[15:12] => Opcode (Immediate, IMM)IN[11:0] => Immediate[15:4] (konstanter 12-Bit Wert [0:4095])– Opcode0xF => IMM // R IMM ← immediateDer IMM-Befehl ist nur sinnvoll, wenn er direkt vor einem Befehl steht, der ebenfallsein Immediate enthält wie z.B. ADDI. In jedem Fall wird der Immediate Wertauf 16-Bit erweitert. Die höherwertigen 12-Bits liefern die IMM-Instruktion, dierestlichen vier die Folgeinstruktion. Die höherwertigen 12-Bits der IMM-Instruktionbleiben auch nach der Instruktion im IMM-Register erhalten. Deshalb ist daraufzu achten, dass dieser Wert je nach Bedarf explizit auf Wert 0 (default) rückgesetztwird.– BeispielBefehle:IMM 0d123ADDI R1, 0d14Ergebnis: R1 ← R1 + (123 ∗ 2 4 + 14)Befehlsworte: 0xF07B0x442E


KAPITEL 2. GRUNDLAGEN 132.3 GrafikprogrammierungBei der Grafikprogrammierung ist vor allem die Geschwindigkeit sehr wichtig. Im Allgemeinensind Grafikoperationen sehr rechenaufwendig <strong>und</strong> benötigen daher viel Prozessorzeit. Umdiese Geschwindigkeit zu erreichen, wurden die entsprechenden Programmroutinen früher oftin <strong>Assembler</strong> implementiert. Noch heute kann man Unterprogramme mit <strong>Assembler</strong>befehlenim Quellcode vieler höherer Programmiersprachen sehen.Die Grafikkarte eines PCs kennt verschiedene Bildschirmmodi, in denen die Anzahl derPixel <strong>und</strong> Farben unterschiedlich sind. In unserem Fall wird der Bildschirm in der Standard-VGA-Auflösung von 640 x 480 geometrischen (physikalischen) Bildpunkten angesteuert. Aufgr<strong>und</strong>der Adressierungskomplexität der Pixelmenge, sieht die interne Darstellung der Praktikums-CPU ein Down-Sampling um den Faktor 4 vor. Somit ist es möglich eine geringere Auflösungmit 160 x 120 logischen Bildpunkten zu betreiben, wobei 1 logischer Pixel einem Quadrat aus4x4 geometrischen Pixeln entspricht.Der Bild- bzw. Grafikspeicher ist im SRAM des FPGA-Boards abgelegt. Beginnend abAdresse 0x0000 gibt es zwei Arten der Pixel-Adressierung.ˆ Flush Adressierung, d.h. jede Adresse adressiert immer alle Pixel zugleich, wodurchjeder Pixel den gleichen Farbwert zugewiesen bekommt (löschen des Bildspeichers miteiner einheitlichen Farbe). Den Pixeln können somit nicht unterschiedliche Farbwertezugewiesen werden. Des Weiteren muss berücksichtigt werden, dass die Zeitspanne diefür einen vollständigen Flush benötigt wird (ca. 3,1 Millisek<strong>und</strong>en), deutlich länger ist,als die Ausführung einer einzigen <strong>Assembler</strong>instruktion durch die CPU (ca. 167 Nanosek<strong>und</strong>en).Während dieser Phase ist es nicht möglich den Bildspeicher zu adressieren,noch die Art der Pixel-Adressierung zu ändern.ˆ Indirekte Adressierung über ein 2D kart. Koordinatensystem, d.h. jede Adresse adressiertgenau einen Pixel <strong>und</strong> unterteilt sich in Lower-Byte (Adresse[7:0]) für die Y-Koordinate <strong>und</strong> Upper-Byte (Adresse[15:8]) für die X-Koordinate. Jedem Pixel kannsomit ein individueller Farbwert zugewiesen werden.Die Art der Adressierung wird über einen Konfigurationswert des Video-Memory-Controllers(VMC) im Hauptspeicher (RAM) der CPU an der Adresse 0x0007 festgelegt, wobei der Wert0x0002 für Flush <strong>und</strong> 0x0001 für die Indirekte Adressierung steht. Da die Grafikeinheitlediglich 8 Farben darstellen kann, stehen für jeden Pixel 3-Bit für die Farbkodierung (RGB)zur Verfügung, d.h. bei einem Schreibzugriff auf den Bildspeicher werden nur die 3 niederstwertigenBits gespeichert <strong>und</strong> die restlichen Bits des Datums ignoriert. Bei einem Lesezugriffauf den Bildspeicher werden die nicht vorhandenen Bits des gelesenen Wortes mit Nullenaufgefüllt.Das Koordinatensystem hat seinen Ursprung in der linken oberen Ecke des Bildschirms.Dort befindet sich der Punkt (0, 0) mit der Adresse 0x0000. Wird der Bytewert an dieserPosition verändert, so ändert sich automatisch die Farbe des Pixels auf dem Bildschirm. Umnun jeden Punkt einzeln zu erreichen (indirekte Adressierung), kann man die Adresse auchso formulieren:Basisadresse ist 0x0000, die Verschiebung zum aktuellen Pixel wird durch die Angabe derX-([0:159]) <strong>und</strong> Y-Koordinate ([0:119]) intern automatisch durch den VMC berechnet. Umdie jeweiligen Koordinaten an die richtige Bit-Position der Adresse zu setzen, können Sie BIT-


KAPITEL 2. GRUNDLAGEN 14SHIFTING verwenden. Das folgende <strong>Assembler</strong>programm realisiert das Setzen des Pixels (23,67) mit der Farbe Blau, unter Verwendung von Bit-Shifting kombiniert mit Schleifen:# a k t i v i e r e Flush ModusIMM 0x000LDI R0 , 0x2LDI R1 , 0x7ST R0 , R1LDI R0 , 0x7CLRV R3Listing 2.4: Setzen eines blauen Pixels auf dem Monitor# W a r t e s c h l e i f e b i s Flush beendet i s t ( 3 . 1 Millisek<strong>und</strong>en )CLR R0LDI R1 , 0 x4883AWAIT FLUSH:INC R0CP R0 , R1BRNE AWAIT FLUSH# a k t i v i e r e n der i n d i r e k t e n Adressierung von PixelnIMM 0x000LDI R0 , 0x1LDI R1 , 0x7ST R0 , R1# s e t z e n der X−Koordinate in R1=0d23=0x0017IMM 0x001LDI R1 , 0x7# s e t z e n der Y−Koordinate in R2=0d67=0x0043IMM 0x004LDI R2 , 0x3# S c h l e i f e um X−Koordinate des P i x e l s an P o s i t i o n [ 1 5 : 8 ]# der Adresse zu s h i f t e nSHIFT X COORD :# X−Koordinate um e i n Bit nach l i n k s s chiebenLSL R1# Zähler inkrementierenINC R3# V e r g l e i c h AbruchsbedingungIMM 0x000LDI R4 , 0x8CP R3 , R4BRNE SHIFT X COORD


KAPITEL 2. GRUNDLAGEN 15# Verknüpfen der f e r t i g e n Z i e l a d r e s s e aus beiden Koordinaten# X[ 1 5 : 8 ] <strong>und</strong> Y[ 7 : 0 ] in R1OR R1 , R2# s e t z e n des P i x e l s ( 2 3 , 6 7 ) mit der Farbe BlauIMM 0x000# s e t z e n der Farbe Blau in R3LDI R3 , 0x1STV R3 , R12.3.1 Sprites - bewegliche GrafikenEin Sprite ist ein zweidimensionales Grafikobjekt. Bei einem Sprite handelt es sich um einenkleinen rechteckigen Speicherbereich, der als Bildschirmausschnitt den Bildschirminhalt partiellverdeckt oder sich mit ihm mischt. Ein Sprite wird von der Grafikhardware über dasHintergr<strong>und</strong>bild, bzw. den restlichen Inhalt der Bildschirmanzeige eingeblendet.Die Positionierung wird dabei komplett von der Grafikhardware erledigt. Die aktuellePosition des Sprites wird in einem Registersatz gehalten, so dass eine Änderung der Registereinträgezu einer Bewegung des Sprites führt. Als Beispiel kann ein Mauszeiger betrachtetwerden, der heutzutage von den meisten Grafikkarten als Hardware-Sprite zur Verfügunggestellt wird. In vergangenen Zeiten waren Sprites vor allem in Videospielen <strong>und</strong> Homecomputernverbreitet. Der C64 beispielsweise verdankt einen Großteil seiner Grafikfähigkeiten derUnterstützung von Sprites.2.3.2 Funktionsweise eines SpritesDas Sprite wird von der Grafikhardware an der gewünschten Position im Bild eingefügt.Weil dadurch das restliche Bild im Grafikspeicher nicht beeinflusst wird, muss dieses nichtimmer wieder neu dorthin kopiert werden. Durch diese Entlastung des Hauptprozessors sindSprites sehr schnell <strong>und</strong> gleichzeitig einfach zu programmieren, erfordern allerdings zusätzlicheHardwareressourcen.Die Daten für die Sprite-Grafik werden dabei entweder direkt in Registern der Grafikhardwarevorgehalten oder in speziellen RAM-Bereichen, auf die diese Hardware einen genügendschnellen Zugriff hat.Zur Bewegung eines Sprites reicht es aus, lediglich dessen i <strong>und</strong> j Koordinate zu ändern.Die aktuelle Position (i, j) des Sprites wird in einem Register gehalten, so dass eine Änderungdes Registereintrags (i+1, j+1) zu einer Bewegung des Sprites führt. In den drei Abbildungen2.2, 2.3 <strong>und</strong> 2.4 sehen Sie, wie die Bewegung realisiert wird.Bestimmung der Koordinaten bei der Bewegung des Sprites über den BildschirmDie komplizierte Berechnung der Adresse im Grafikspeicher <strong>und</strong> das Umkopieren des Inhaltsentfällt, was ebenfalls den Hauptprozessor entlastet. Der Grafikprozessor fügt selbständig ander vorgegebenen Koordinate das Sprite beim Aufbau des nächsten Bildes im Vordergr<strong>und</strong>ein. Auch animierte Sprites sind möglich.


KAPITEL 2. GRUNDLAGEN 17ˆ Adresse 0xFFF0, 8-Bit Register - oberste Zeile des Spritesˆ Adresse 0xFFF1, 8-Bit Register - zweite Zeile des Spritesˆ Adresse 0xFFF2, 8-Bit Register - dritte Zeile des Spritesˆ Adresse 0xFFF3, 8-Bit Register - ...ˆ Adresse 0xFFF4, 8-Bit Register - ...ˆ Adresse 0xFFF5, 8-Bit Register - ...ˆ Adresse 0xFFF6, 8-Bit Register - ...ˆ Adresse 0xFFF7, 8-Bit Register - unterste Zeile des Spritesˆ Adresse 0xFFF8, 8-Bit Register - horizontale Position des Spritesˆ Adresse 0xFFF9, 8-Bit Register - vertikale Position des Sprites2.4 Entwicklungsumgebung <strong>und</strong> CompilerDas TINY RISC STUDIO v1.0 ist eine Entwicklunsgumgebung, welche Ihnen das Implementieren,Kompilieren, Debuggen <strong>und</strong> Emulieren von <strong>Assembler</strong>programmen der Praktikums-CPU ermöglicht. Die fertige Ausgabe des Compilers wird direkt durch Pfadangabe in dasInstruktionsregister (ROM) der CPU geschrieben. Der Aufbau <strong>und</strong> die Nutzung der GUI(Abbildung 2.5) ist einfach gehalten <strong>und</strong> besteht im wesentlichen aus 8 Komponenten, derenNutzung im Folgenden erläutert wird.1. Menüleiste2. Toolbar3. Eingabefeld, Zwischencode <strong>und</strong> Ausgabe4. Interaktive Boardgrafik5. VGA-Memory Output6. Interaktive Anzeige interner Werte7. Putty-Konsole8. Status Konsole2.4.1 MenüleisteDie Menüleiste, in Abbildung 2.5 als 1. gekennzeichnet, bietet Standardoptionen zum Compilieren,zum Laden <strong>und</strong> zum Speichern des Quellcodes. Die Menüunterpunkte sind folgendaufgelistet <strong>und</strong> beschrieben.


KAPITEL 2. GRUNDLAGEN 19Optionsˆ Compiler output directory: An dieser Stelle lassen sich Pfad <strong>und</strong> Dateinamen desCompiler-Outputs bestimmen. Über den Compile-Button der Toolbar kann anschliessenddie angegebene Datei erzeugt werden. Zu beachten ist, dass das Anhängen derDateiendung nicht automatisch erfolgt, d.h. zur Erstellung einer mem-Datei muss derDateiname mit ”.mem“ enden.ˆ Compiler output format: Hier kann angegeben werden, ob das Compilat binär oderhexadezimal ausgegeben werden soll. Als Default-Wert ist hexadezimal eingestellt.ˆ Commentary Symbol: Hier kann das zu verwendende Kommentarzeichen bestimmtwerden. Zur Auswahl stehen Raute <strong>und</strong> Doppelslash. Der Default-Wert ist auf die Rauteeingestellt. Das Symbol ist jeder Zeit änderbar, der Compiler wird jedoch ausschließlichdas aktuell als Kommentarsymbol ausgewählte Zeichen erkennen. Desweiteren richtetsich die Funktion des Popup-Menüs zum Setzen <strong>und</strong> Entfernen von Kommentarzeichennach der aktuell getroffenen Auswahl.2.4.2 ToolbarDie in Abbildung 2.5 als 2. gekennzeichnete Toolbar ermöglicht die schnelle <strong>und</strong> einfacheSteuerung des Emulators <strong>und</strong> Compilers.ˆ Compile: Über den Compile-Button wird der eingegebene Programmcode compiliert<strong>und</strong> am ”Compiler output directory“ angegebenen Pfad <strong>und</strong> Namen gespeichert. Solltenunter ”Compiler output directory“ keine Angaben vorliegen, wird der Benutzerweiterhin aufgefordert diese Einstellungen zu treffen, bevor anschließend das Compilaterzeugt wird. Sollten im Quellcode Syntaxfehler vorhanden sein, wird stattdessen eineentsprechende Fehlermeldung mit Beschreibung auf der Konsole ausgegeben.ˆ Max/Min: Die Anzeige des VGA-Memory Output ist ein wichtiger Bestandteil bei derArbeit mit grafischen Aspekten. Dennoch kann die Anzeige für eine genaue Überprüfungder einzelnen Pixel zu klein sein. Für einen solchen Fall ist die Anzeige über diesenKnopf vergrößerbar. Zu diesem Zweck werden die interaktive Boardgrafik, die interaktiveAnzeige der internen Werte <strong>und</strong> die Putty-Konsole ausgeblendet <strong>und</strong> die Anzeige desVGA-Memory Outputs entsprechend vergrößert. Bei erneuter Benutzung dieses Buttonswerden die Veränderungen der Anzeige rückgängig gemacht <strong>und</strong> der alte Zustandwiederhergestellt.Emulationˆ New: Vor dem Start einer Emulation muss diese zunächst initialisiert werden. Zu diesemZweck wird bei Verwendung dieses Buttons der <strong>Assembler</strong>code intern compiliert,wodurch das Zwischencode- <strong>und</strong> Ausgabefenster aktualisiert, jedoch kein Compilat alsexterne Datei erzeugt wird. Desweiteren werden alle Werte der interaktiven Anzeige derinternen Werte auf ihren default-Zustand zurück gesetzt. Sollten im Code noch Fehlerexistieren oder kein Code vorhanden sein, so schlägt die Initialisierung fehl <strong>und</strong> eineentsprechende Fehlermeldung wird auf der Konsole ausgegeben. Da die Emulation auf


KAPITEL 2. GRUNDLAGEN 20dem Stand der Initialisierung arbeitet, werden Veränderungen im Code für die laufendeEmulation nicht berücksichtigt. Soll neuer Code oder aktualisierter Code emuliertwerden, muss über diesen Button erneut eine Initialisierung vorgenommen werden.ˆ Next Stop: Über diesen Button ist exakt die nächste Codezeile ausführbar. Welche diesaktuell ist, gibt der rote Pfeil beim Eingabefeld an. Sollte kein roter Pfeil zu sehen sein,beendet sich die Emulation im Initialisierungszustand, d.h. es wird bei der ersten Codezeilebegonnen, da der Programmzähler noch Null ist. Der ”Next Step“-Button kannbeliebig oft nacheinander ausgeführt werden. Er bietet sich besonders gut zum Debuggenan, da bei dieser Variante der Emulation in der Konsole zusätzliche Warnhinweiseangezeigt werden. Diese Warnhinweise machen auf ein Verhalten aufmerksam, welcheszwar keinen Programmfehler hervorruft, jedoch wahrscheinlich nicht beabsichtigt war,beispielsweise bei Werten außerhalb des Wertebereichs.ˆ Start: Durch diesen Button wird eine Emulation gestartet, bei welcher der vollständigeCode ausgeführt wird. Zu diesem Zweck wird stets bei der ersten Codezeile mit Default-Werten gestartet. Die Emulation wird gestoppt, sobald ein Breakpoint erreicht wirdoder der Benutzer den ”Stop“-Button betätigt. Sollte der Code nicht initialisiert seinoder verändert worden sein, muss die Emulation zunächst über den ”New“-Button neuinitialisiert werden, bevor die ”Start“-Funktion erneut genutzt werden kann.ˆ Resume: Dieser Button dient dem Fortsetzen einer Emulation. Die Emulation startetan der zuletzt ausgeführten Codezeile oder bei der ersten Codezeile, sollte der Initialisierungszustandvorliegen <strong>und</strong> läuft bis zum Erreichen eines Breakpoints oder dem ”Stop“durch den Benutzer. Die ”Resume“-Funktion läuft dabei nicht auf Default-Werten, sondernnutzt die zuletzt aktuellen Werte. Als Folge dessen lässt sich eine Emulation überdiese Funktion fortsetzen <strong>und</strong> alle vorher getätigten Änderungen berücksichtigen. Zureffektiven Benutzung wird hierzu ein eventueller Breakpoint in der Codezeile, die alserstes ausgeführt wird, ignoriert. Sollte der Code nicht initialisiert sein oder verändertworden sein, muss die Emulation zunächst über den ”New“-Button neu initialisiert werden,bevor die ”Resume“-Funktion genutzt werden kann.ˆ Stop: Dieser Button bricht eine laufende Emulation ab. Sollte keine Emulation laufen,dann bleibt die Aktion funktionslos <strong>und</strong> es wird eine Meldung auf der Konsole ausgegeben.Beim Beenden der Emulation wird im Eingabefenster ein roter Pfeil auf Höhe derCodezeile gesetzt, die als nächstes auszuführen gewesen wäre.ˆ Running: Hinter diesem Schriftzug ist ein roter oder grüner Punkt zu finden, welcherangibt, ob die Emulation läuft oder gestoppt ist. Ein grüner Punkt bedeutet dabei,dass die Emulation arbeitet <strong>und</strong> ein roter Punkt, dass sie nicht arbeitet. Zu beachtenist die Verwendung von Breakpoints sowie dem ”Next Step“-Button. Da letzterer nureine Codezeile ausführt <strong>und</strong> bei Breakpoints in der Regel nur eine begrenzte Anzahlan Codezeilen ausgeführt werden, werden diese in der Praxis so schnell verarbeitetwerden, dass ein Umschalten von Rot-Grün-Rot nicht zu erkennen ist, sondern derPunkt konstant auf Rot bleibt.


KAPITEL 2. GRUNDLAGEN 212.4.3 Eingabefeld, Zwischencode <strong>und</strong> AusgabeDer in Abbildung 2.5 als 3. gekennzeichnete Bereich beinhaltet das Eingabefeld, den Zwischencode<strong>und</strong> die Ausgabe. Über den Reiter am oberen Ende kann jeweils auf den entsprechendenBereich zugegriffen werden, wobei das Eingabefeld als Default dient.ˆ Eingabefeld: Das Eingabefeld dient als Hauptarbeitsbereich. In diesem wird der Quellcodegeladen, erstellt <strong>und</strong> bearbeitet. Am oberen Bereich des Eingabefelds wird weiterhinder Dateipfad <strong>und</strong> -name zum aktuell geöffneten Dokument angegeben, sofernvorhanden. Im großen, weißen Bereich kann der Code beliebig editiert werden. EineHilfe bietet dafür das Popup-Menü. Eine Bedienhilfe des Eingabefeldes stellt dabei dieNavigation am linken Rand dar. Sie zeigt nicht nur dynamisch die Nummerierung derCodezeilen an, sondern bietet auch Interaktionsmöglichkeiten. Ein Klick auf die Navigationder entsprechenden Codezeile setzt einen Breakpoint, ein weiterer Klick entferntdiesen wieder. Auf diese Weise können beliebig viele Breakpoints gesetzt werden. DieNavigationszeile beinhaltet weiterhin Raum für die Anzeige des Programmzeigers, alsoden aktuellen Stand der Emulation. Sollte eine Emulation ausgeführt worden sein, wirdein roter Pfeil die entsprechende Zeile markieren.ˆ Zwischencode: Das Zwischencodefenster ist nicht editierbar. Nach Nutzung des ”Compile“-Buttonsoder des ”New“-Buttons wird der Zwischencode erzeugt <strong>und</strong> angezeigt.Der Zwischencode entspricht dem Quellcode, abgesehen davon, dass jegliche Kommentare<strong>und</strong> leere Bereiche entfernt wurden <strong>und</strong> IMM-Befehle eingefügt wurden. Zum Debuggenist ein Blick in den Zwischencode hilfreich, da durch das automatische Einfügender IMM-Befehle vor bestimmten Operationen Programmierfehler entstehen können,wenn der Benutzer von einem anderen IMM-Wert ausgeht, als dies real der Fall ist.Weiterhin basiert die Emulation auf dem Zwischencode.ˆ Ausgabe: Das Ausgabefenster ist nicht editierbar <strong>und</strong> der Inhalt wird nach Nutzungdes ”Compile“-Buttons oder des ”New“-Buttons erzeugt. Das Ausgabefenster zeigt an,wie die exportierte ”.mem“-Datei aussieht oder aussehen würde.2.4.4 Interaktive BoardgrafikDie interaktive Boardgrafik, in Abbildung 2.5 als 4. gekennzeichnet, ermöglicht die Nutzungder Peripherie des Boards, als wäre dieses real vorhanden. Die LEDs <strong>und</strong> 7-Segment-Anzeigewerden automatisch verändert <strong>und</strong> eingeschaltet, sobald intern der entsprechende Wert gesetztist. Auf diese Weise ist das Ergebnis der Emulation direkt sichtbar. Weiterhin sind sowohlButtons (unten links) als auch Switches (unten rechts) anklickbar <strong>und</strong> ermöglichen so eineBeeinflussung der Emulation. Im Code abgefragte Memory-Werte der Buttons <strong>und</strong> Switchesbeziehen sich direkt auf den Status der Buttons <strong>und</strong> Switches dieser Boardgrafik. Ihr Statusist weiterhin auch in der interaktiven Anzeige der internen Werte einsehbar.2.4.5 VGA-Memory OutputÜber diese Anzeige, in Abbildung 2.5 als 5. gekennzeichnet, kann das Ausgabebild des VGA-Memory betrachtet werden. Die Anzeige zeigt alle physikalischen Pixel des VGA-Memory mitden dazugehörigen Farbwerten sowie den Sprite an, sofern dieser definiert wurde. Währendin Realität die Pixel des VGA-Memory ohne vorherige Definition einen beliebigen Farbwert


KAPITEL 2. GRUNDLAGEN 22annehmen ( ”Pixelchaos“), ist dieses Verhalten durch das bunte Default-Bild des Miniaturbildschirmsdargestellt. Über die interaktive Anzeige der internen Werte können Pixel zusätzlichsowohl gelesen, als auch gesetzt werden. Die Anzeige wird automatisch aktualisiert <strong>und</strong> aufdem Stand der internen Verarbeitung gehalten.2.4.6 Interaktive Anzeige interner WerteDiese Anzeige, in Abbildung 2.5 als 6. gekennzeichnet, beinhaltet verschiedene Tabellen, dieüber die dazugehörigen Reiter wechselbar sind <strong>und</strong> alle relevanten Werte des internen Boardzustandesbesitzen. Das Aussehen der einzelnen Tabellen unterscheidet sich je nach Darstellungsgebietleicht voneinander, um dadurch zusätzliche Informationen geben zu können. AlleTabellenbesitzen eine dezimale, hexadezimale <strong>und</strong> binäre Darstellung des ausgewählten Wertes.Da diese drei Darstellungen in einer Tabellenzeile jeweils den selben Wert abbilden, sinddiese folglich äquivalent. Bis auf wenige Ausnahmen (Switches, Buttons, SREG <strong>und</strong> RXD-REG) lassen sich alle Werte editieren (Hinweis: Nur die Werte selbst, nicht die Namen odersonstigen Informationen), jedoch ausschließlich bei pausierter Emulation. Bei Änderung einesWertes werden alle dazugehörigen Äquivalenzen aktualisiert <strong>und</strong> der neue Wert intern verarbeitet.Beispielsweise lassen sich über diese Anzeige LEDs setzen oder der VGA-Memoryflushen. Durch Modifikation der Werte bei pausierter Emulation eignet sich diese Anzeigeneben dem Lesen vor allem zur Manipulation der Emulation. Alle Tabellen sind bezüglichder Benutzereingaben sicher <strong>und</strong> erlauben nur eine Eingabe im entsprechenden Format (z.B.Binärzahl in die Tabellenspalte für binäre Werte). In der Status-Konsole wird jedoch immereine Mitteilung erscheinen, wenn ein Wert erfolgreich gesetzt wurde oder wenn ein Fehler aufgetretenist. Während alle Tabelleneinträge automatisch beim Pausieren oder Initialisiereneiner Emulation aktualisiert werden, sind die VGA-Memory Werte aus Gründen der Performanznur manuell über den Button am Anfang der Tabelle aktualisierbar.2.4.7 Putty-KonsoleDie unter Abbildung 2.5 als 7. gekennzeichnete Putty-Konsole visualisiert die Kommunikationzwischen dem Board <strong>und</strong> dem PC. Da diese Komponente für die diesigen Praktikumsaufgabenirrelevant ist, wird diese hier nicht weiter betrachtet.2.4.8 Status-KonsoleDie Status-Konsole, unter Abbildung 2.5 als 8. gekennzeichnet, ist das wichtigste Werkzeugzum Umgang mit Problemen <strong>und</strong> Fehlermeldungen im Code sowie mit dem Emulator allgemein.Zu fast allen Aktionen werden in dieser Statusmitteilungen ausgegeben, welche entwedereine erfolgreiche Aktion bestätigen oder den Fehler der Nichtausführung näher beschreiben.Allgemeine Fehlermeldungen werden dabei durch drei rote Ausrufezeichen in der Navigationszeileder Konsole gekennzeichnet, während spezielle Codefehler mit einer roten Zahl inder Navigationszeile versehen werden. Diese rote Zahl ist mit der Codezeile des Eingabefeldesgleichzusetzen, in welcher der Fehler aufgetreten ist. Wird eine neue Emulation über denButton ”New“ initialisiert, wird der Inhalt der Konsole gelöscht.


Kapitel 3Anmerkungen <strong>und</strong> Tippsˆ In einer Aufgabe werden Sie ein <strong>Assembler</strong>programm schreiben, um das Sprite aufdem Bildschirm ausgeben zu können. Um den Inhalt des Sprites zu definieren, solltenSie den Bitvektor für jede Zeile hexadezimal kodieren <strong>und</strong> die Zahl als Immediate inein Register laden. Der Registerinhalt kann dann an die entsprechende Speicherstellegeschrieben werden. Für einen Vektor sieht geht dies wie folgt:# Hexadezimalekodierung des e r s t e n VektorsLDI R2 , 0xFFF0# R2 e n t h ä l t Adresse der e r s t e n S p r i t e z e i l e ,# R3 d i e Bit−Kodierung der Sprite −Z e i l eST R3 , R2ˆ Bei der Aufgabenbearbeitung gehen Sie davon aus, dass das Sprite nur um ein Pixel proRichtungseingabe verschoben wird.ˆ Bei einem vollständigen FLUSH des Bildspeichers dauert es ca 3,1 Millisek<strong>und</strong>en bisder Bildspeicher wieder adressiert werden kann. Innerhalb dieser Zeitspanne ist die CPUjedoch in der Lage 18.563 aufeinanderfolgende Instruktionen auszuführen. Somit solltenach jeder FLUSH-ANWEISUNG (CLRV) ein entsprechender Warteschleifenzykluseingelegt werden, bevor die nächste Instruktion des eigentlichen Programms ausgeführtwerden soll. Ansonsten besteht die Gefahr der inkorrekten Ausführung von Bilsdpeicheroperationeninnerhalb des Programms.ˆ Programme, die selbst keine Endlosschleife enthalten, sollten am Programmende miteiner solchen abgeschlossen werden, damit das Programm nur genau einmal ausgeführtwird.# SprungmarkeMARKE:# Sprung zum S c h l e i f e n a n f a n gJMP MARKEˆ In der <strong>Assembler</strong>sprache unserer Praktikums-CPU muss vor jedem bedingtem Sprungbefehlder Compare Befehl ausgeführt werden.23


KAPITEL 3. ANMERKUNGEN UND TIPPS 24ˆ Kommentare werden bei der Praktikums-CPU mit dem Symbol # eingeleitet.ˆ Das FPGA-Board bietet neben dem FPGA-Chip zusätzliche IO-Peripherie (Schalter,LEDS,Buttons, etc.), auf welche die Praktikums-CPU wie folgt Zugriff hat: Im Datenspeicherder CPU ist für jede IO-Komponente eine Adresse reserviert, in der deren aktuellerWert/Zustand abgelegt ist. Die entsprechenden Adressen sind in der nachfolgendenMemory-Map des Datenspeichers aufgelistet.Memory-Map des Datenspeichers:Adresse (HEX)0x00000x00010x00020x00030x00070x0004 - 0x07FF0x0800 - 0xFFFFBelegung7-Segment AnzeigeLEDSSWITCHESBUTTONSVGA-ADDRESS-MODE[1 = indirekt,2 = flush]USER DATAnicht VerfügbarDie genaue Bitbelegung der Adressen ist wie folgt:7-Segment Anzeige [10:0]AN3 AN2 AN1 AN0 g f e d c b aLEDS [7:0]LD7 LD6 LD5 LD4 LD3 LD2 LD1 LD0Switches [7:0]SW7 SW6 SW5 SW4 SW3 SW2 SW1 SW0Buttons [3:0]BT3 BT2 BT1 BT0


Kapitel 4VorbereitungsaufgabenMit den folgenden Aufgaben werden Sie die <strong>Assembler</strong>-Programme vorbereiten, die Sie imPraktikum fertig implementieren <strong>und</strong> testen werden. Es ist nicht notwendig, allerdings hilfreich,den <strong>Assembler</strong>-Code schon komplett zu erstellen. Definieren Sie für alle zu schreibendenProgramme die interne Struktur (Pesudo-Code) <strong>und</strong> den Ablaufplan. Da einige der Programmeim späteren Verlauf mit anderen kombiniert werden, sollten Sie darauf achten möglichstsauber“ zu Arbeiten, was die Verwendung von Registern betrifft. Dokumentieren Sie deshalb”genau welche Register wo <strong>und</strong> wie verwendet werden, um spätere Inkosistenzen zur Laufzeitzu vermeiden.Aufgabe 1.Verinnerlichen Sie die gr<strong>und</strong>legenden Konzepte der <strong>Assembler</strong>programmierung, so dassSie in der Lage sind, komplexere Programme mit Schleifen, Abfragen <strong>und</strong> arithmetischenAusdrücken zu implementieren. Hierzu sollten Ihnen die in Abschnitt 2.2.7 vorgestelltenKonstrukte genügen. Des Weiteren sollten Sie sich mit dem Befehlssatz der Praktikums-CPU vetraut machen. Lesen Sie hierzu die zur Verfügung gestellte Befehlstabelle (Befehlstabelle.pdf)<strong>und</strong> versuchen Sie dabei die Funktion <strong>und</strong> Anwendung der einzelnenBefehle zu verstehen. Insbesondere die der Sprung-, Daten- <strong>und</strong> Transferbefehle.Aufgabe 2. Stellen Sie den Pseudo-<strong>Assembler</strong>-Code für den in Abschnitt 2.1 vorgestellten Pseudo-Zufallszahlengenerator auf. Verwenden Sie hierfür den vorgestellten Ansatz mittels eineslinear rückgekoppelten Schieberegisters. Verwenden Sie dabei die volle 16 Bit Registerlängeals Schieberegister um damit Zufallszahlen mit einer möglichst langen Periodezu generieren. Für die Einkopplungsstellen sollten zwei XOR-Operationen an jeweilsunterschiedlichen Bitpositionen genügen. Des Weiteren soll dem Generator eine Parameterübergabemöglich sein, so dass die obere Grenze des Zahlenintervalls dynamischzur Laufzeit übergeben werden kann. Die Berechnung einer Pseudo-Zufallszahl dauertsomit solange an, bis eine gewünschte Zahl in dem entsprechenden Intervall berechnetwurde. Die Rückgabe der Zufallszahl erfolgt ebenfalls in einem von Ihnen frei wählbarenRegister.Aufgabe 3. Überlegen Sie sich den Ablaufplan eines <strong>Assembler</strong>programmes, welches ein Quadratmit der Größe 10 x 10 Pixel in einer beliebigen Farbe an einer beliebigen Stelle desBildschirms zeichnet. Der Code sollte dabei so modular gehalten werden, dass dieserproblemlos später in einem anderen Programm wieder verwendet werden kann. VerwendenSie daher ein Register, welches als Übergabeparameter für die Ursprungskoordinatedes Quadrats dient. Der Ursprung des Quadrats soll seine oberen linke Ecke sein.25


KAPITEL 4. VORBEREITUNGSAUFGABEN 26Aufgabe 4.Bereiten Sie ein <strong>Assembler</strong>programm vor, das ein Sprite Ihrer Wahl an einer beliebigenStelle des Bildschirms ausgibt. Überlegen Sie sich zunächst wie es aussehen soll.Ein Sprite besteht aus 8 Vektoren, die jeweils 8 Bit breit sind. Ihnen steht somit ein8x8 Feld zur Verfügung. Füllen Sie das Feld mit Einsen <strong>und</strong> Nullen, entsprechend demgewünschten Aussehen. Wenn im Vektor eine 0 vorkommt, dann ist diese Stelle transparent,sonst weiß. Um das Sprite letztendlich zeichnen zu können, müssen Sie es wiein Abschnitt 3 gezeigt, zeilenweise als Konstante in Register laden <strong>und</strong> an die entsprechendenSpritespeicherstellen speichern.Aufgabe 5. Überlegen Sie sich eine Fusion der beiden <strong>Assembler</strong>programme aus Aufgabe 2. <strong>und</strong> 3.Das resultierende Programm sollte in der Lage sein, ein Quadrat mit 10 x 10 Pixeln aneiner durch den Pseudo-Zufallsgenerator bestimmten X,Y-Koordinate des Bildschirmszu zeichnen. Berücksichtigen Sie als zulässigen Wertebereich der Ursprunkskoordinatedes Quadrats die obere linke Ecke mit X = [0, 150] <strong>und</strong> Y = [0, 110].Aufgabe 6.Wie könnte ein <strong>Assembler</strong>programm aussehen, mit dem man das Sprite mit Hilfe derTastereingaben der Nexys-Platine am Bildschirm in vier Richtungen verschieben kann,so dass es auf eine zufällig positionierte Hitbox (Quadrat 10 x 10 Pixeln) hinzu bewegtwerden kann. Ist das Sprite vollständig innerhalb der Hitbox-Hülle positioniert,so wird die Box gelöscht, an einer zufälligen Stelle des Bildschirms neu gezeichnet <strong>und</strong>das ”Spiel“ beginnt von vorne. Der jeweils entsprechende Taster soll dabei das Spritenach links, rechts, oben oder unten bewegen. Sie brauchen nicht zu berücksichtigen,dass mehr als einer der Taster gleichzeitig gedrückt wird. Als Kollisionserkennung, bzw.Hitbox-Überdeckung durch den Sprite sollte der folgende Koordinatenabgleich nach jedereigehenden Bewegung ausreichen:(X, Y ) Sprite == (X + 1, Y + 1) HitboxFür die spätere Programmumsetzung soll der folgende Automat mit insgesamt dreiZuständen dienen.Abbildung 4.1: ”Hit The Box“ Automaten Programmablauf


KAPITEL 4. VORBEREITUNGSAUFGABEN 27Startzustand 00: InitialisierungDa nach dem Einschalten der CPU zunächst einmal alle internen Werte <strong>und</strong> Zuständemit Null initialisert sind, müssen zunächst einmal die verschiedenen Konfigurationen,wie Adressmodi, Spritedeklarationen <strong>und</strong> andere Default-Initialiserungen durchgeführtwerden. Hierzu gehört das Laden <strong>und</strong> Speichern des Sprites sowie die Definition derPositionskoordinaten beider Objekte. Damit die Hitbox <strong>und</strong> das Sprite erstmalig vonder VGA-Hardware korrekt gezeichnet werden können, müssen die Koordinaten beiderObjekte mit der obigen Bedingung gemäß einer vollständigen Überdeckung initialisiertwerden, d.h. (X, Y ) Sprite = (X + 1, Y + 1) Hitbox . Anschließend wird ohne jedwede Eingabein den Folgezustand 01 gewechselt. Nach dem Verlassen ist ein erneuter Wechselin den Startzustand nicht mehr möglich.Zustand 01: KollisionserkennungIn diesem Zustand erfolgt die Kollisions-/Überdeckungserkennung. Wird eine Kollisionmittels Koordinatenabgleich erkannt, so wird der aktuelle Bildschirm geflusht (gelöscht),die Koordinate der Hitbox mittels Pseudo-Zufallszahlengenerator neu berechnet <strong>und</strong>anschließend an einer zufälligen Position neu gezeichnet. Da es sich bei der Hitboxnicht um ein Sprite-Objekt handelt, ist ein vollständiges neuzeichnen der Hitbox indiesem Zustand notwendig. Nach dem Beenden dieser Routine oder im Falle einerNichtüberdeckung wird in den Folgezustand 10 gewechselt.Zustand 10: EingabekontrolleIm Zustand 10 erfolgt die Überwachung der Eingabeperipherie. Hierzu werden die Tastermittels ”Polling“ permanent auf Knopfdruck überprüft. Sofern das Drücken einesTasters erkannt wurde, wird die Spritekoordinate in der entsprechenden Richtung manipuliert.Da es sich um ein Sprite handelt, welches mit dem aktuellen Inhalt des Bildspeicherslediglich überblendet wird, entfällt an dieser Stelle das Neuzeichnen. Anschließendwird in den Zustand 01 gewechselt. Wird bei keinem der Taster ein Knopfdruck erkannt,verbleibt der Automat in diesem Zustand (10).


Kapitel 5PraktikumsaufgabenFür die folgenden Aufgaben entpacken Sie die ZIP-Datei für Versuch 5 von der Praktikumswebsite<strong>und</strong> erstellen ein neues Projekt mit allen darin enthaltenen VHDL-Dateien sowie mitden Dateien ”irom.bmm“ <strong>und</strong> ”irom.mem“. Verwenden Sie als Editor, Compiler <strong>und</strong> Debuggerdas zur Verfügung gestellte ”TINY RISC STUDIO v1.0“.Aufgabe 1.Implementieren Sie den Pseudo-Zufallszahlengenerator aus Vorbereitungsaufgabe 2. VerwendenSie für Rück- <strong>und</strong> Übergabeparameter entsprechende Register der CPU. Anschließendsimulieren Sie Ihr Programm zunächst mit dem Debugger um logische Fehlerin der Programmstruktur zu erkennen.Aufgabe 2. Implementieren Sie Ihr <strong>Assembler</strong>programm zum Zeichnen eines Quadrats mit 10 x 10Pixeln aus Vorbereitungsaufgabe 3. Simulieren Sie es zunächst mit Hilfe des Debuggers<strong>und</strong> testen Sie es abschließend auf der FPGA-Platine.Aufgabe 3.Aufgabe 4.Stellen Sie Ihr <strong>Assembler</strong>programm zum Zeichnen eines Sprites aus Vorbereitungsaufgabe4 fertig <strong>und</strong> testen Sie es anschließend auf der FPGA-Platine.Hit The Box“: Implementieren Sie den in Vorbereitungsaufgabe 6 vorgestellten Automatenvollständig in <strong>Assembler</strong>. Nutzen Sie dazu Ihre bereits vorhandenen Programme”aus den Aufgaben 1, 2 <strong>und</strong> 3 <strong>und</strong> binden Sie diese in den jeweiligen entsprechendenZuständen ein. Um Ihnen den Einstieg zu erleichtern, haben wir eine Datei mit demNamen HitTheBox Aufgabe 4.txt“ vorbereitet, in der Sie den Code des Automaten”vervollständigen müssen. Diese beinhaltet bereits die Struktur des Automaten (Sprungmarkender Zustände <strong>und</strong> deren Reihenfolge im Programm) sowie den Code für denZustand 10 (Eingabeüberprüfung der Taster). Die zu editierenden Stellen sind im Codemit TODO“ <strong>und</strong> einem zugehörigen Hinweis gekennzeichnet. Nachdem Sie den Automatenvollständig implementiert haben, simulieren Sie ihn zunächst mit dem Debugger.”Abschließend testen Sie ihn auf der FPGA-Platine.28

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!