HES Praktikum, Aufgabe 4
Integration in ECO32
Aufgabenstellung
Integrieren Sie Ihren Display-Controller in eine vorgegebene
Implementierung des ECO32-Systems. Demonstrieren Sie die
Funktionsfaehigkeit mit Hilfe des Maschinen-Monitors!
Vorbereitung
1. Ihr Display soll an den FPGA-internen Bus des ECO32 angeschlossen
werden - also muss es das Busprotokoll des Systems beherrschen. Der
Bus ist ein synchroner Bus, d.h. alle Schaltvorgaenge passieren auf
der steigenden Taktflanke. Es werden immer 32-Bit breite Worte
uebertragen, niemals einzelne Bytes oder Halbworte (wenn im Programm
ein solcher Zugriff stattfindet, setzt die Buslogik des Prozessors
das auf Wortzugriffe um). Obwohl Synchronisation der Bussignale nicht
notwendig ist, brauchen wir doch einen "Handshake": es gibt sehr wohl
Peripherie, die nicht in der Lage ist, innerhalb eines einzigen
Taktzyklus den Zugriff durchzufuehren. Die Grundidee geht folgendermassen:
Die CPU legt die Adressen (und ggf. Write und die zu schreibenden Daten)
auf den Bus und aktiviert das Strobe-Signal. Wenn das Peripheriegeraet
den Buszyklus in diesem Takt beenden kann, aktiviert es sofort (also
asynchron durch kombinatorische Logik) das Acknowledge-Signal. Wenn
das nicht geht, garantiert die CPU, dass die von ihr auf den Bus gelegten
Signale konstant gehalten werden. Sobald das Geraet den Buszyklus beenden
kann, aktiviert es das Acknowledge-Signal. Mit der naechsten steigenden
Taktflanke ist dann der Bustransfer beendet, ohne weitere Signalisierung
"rueckwaerts" durch die CPU. Der kuerzeste Buszyklus dauert damit einen
Taktzyklus, der laengste ist unbestimmt (wird aber begrenzt durch einen
Taktzaehler in der CPU, der bei Ueberlauf eine Bus-Timeout-Exception
ausloest).
2. Wir beginnen nun mit einem wichtigen Hilfsmittel zu arbeiten, einem
Logik-Simulator (Vorschlag: Ikarus Verilog, "iverilog"). Um die bei
der Simulation entstehenden Signale anschauen zu koennen, braucht man
einen VCD-Viewer (Vorschlag: GTK-Wave, "gtkwave"). Das
RAM-Test-Paket enthaelt die
Beschreibung eines kleinen RAMs, das an den ECO32-Bus angeschlossen
werden koennte. Die Schaltung soll nicht in den ECO32 integeriert
werden, denn der besitzt ein viel groesseres externes SDRAM. Sie
ist aber trotzdem sehr nuetzlich, denn sie zeigt, wie Block-RAM am
Bus arbeiten kann. Das Paket instanziiert das RAM in einer "Test-Bench".
Das ist eine Schaltung, die nicht zur Synthese gedacht ist, sondern
das "DUT" (device under test) mit externen Signalen zur Anregung
versorgt und ggf. die vom DUT gelieferten Signale auswertet. Lassen
Sie die Simulation laufen und interpretieren Sie die gezeigten Signale
im Detail. Erklaeren Sie insbesondere, warum das Schreiben nur einen
Taktzyklus dauern muss, das Lesen aber zwei, und wie dieses Verhalten
durch die Schaltung im RAM-Modul erreicht wird!
3. Statten Sie Ihren Display-Controller mit einem Bus-Interface fuer
den ECO32-Bus aus. Damit man spaeter den Display-Inhalt leicht scrollen
kann, muss auch das Auslesen des Display-Memories funktionieren.
Integration
1. Entpacken Sie den ECO32 und
machen Sie sich mit der Organisation des Projekts vertraut. Neben
der eigentlichen Hardware sind enthalten:
binutils: Assembler und Binder
doc: Dokumentation, insbesondere das ECO32-Manual
lcc: C-Compiler mit kleinem "Fussabdruck"
monitor: Maschinenmonitor, nuetzlich zum Testen von Hardware
sim: Befehlssatzsimulator, nuetzlich zum Testen von Software
tools: verschiedene Binaerformat-Konverter
Keine Angst, mit den meisten Komponenten ausser der Hardware haben
Sie nur indirekt zu tun. Die Benutzung des Assemblers und Binders,
um Testprogramme auf dem Board unter dem Maschinenmonitor laufen zu
lassen, werden wir spaeter noch genauer behandeln.
2. Kopieren Sie Ihren Display-Controller in ein neues Subdirectory
unter hardware/src.
3. Jetzt kommt die eigentliche Integration:
- Instanziierung Ihres Display-Controllers im Toplevel-Modul
- Durchschleifen der VGA-Signale an Pins des FPGAs
- Spezifikation der Pins dieser Signale in eco32.ucf
- Anschluss des Controllers an den Bus
Das Display soll im virtuellen Adressraum des ECO32 an der Stelle
0xF0100000 erscheinen; die physikalische Adresse ist also 0x30100000.
Es belegt dort 32*128 Worte, also 32*128*4 Bytes, von denen aber
nur jeweils das unterste Byte wichtig ist - warum ist das so?
Ergaenzen Sie den I/O-Adressdecoder und die Bus-Multiplexer (wofuer
sind die da?) entsprechend!
Test
1. Mit Hilfe des Maschinen-Monitors schreiben Sie Zeichen direkt
in das Display-Memory. Pruefen Sie, ob die richtigen Zeichen
auch an den richtigen Stellen auf dem Bildschirm auftauchen.
2. Ebenfalls mit Hilfe des Maschinen-Monitors lesen Sie die Zeichen
an den beschriebenen Stellen wieder aus. Testen Sie vor allem
die "Corner Cases" - hier im eigentlichen Sinne des Wortes... :-)
Was passiert eigentlich beim Lesen/Schreiben an den Positionen,
die auf dem Bildschirm nicht angezeigt werden?
3. Die Ausgabe des Maschinen-Monitors kann mit Hilfe eines der
DIP-Switches (SW1-4) auf das Display umgestellt werden (dabei
wird die Eingabe ebenfalls umgestellt, auf das Keyboard). Die
dafuer notwendige Software (warum braucht man da ueberhaupt
etwas?) ist im Maschinen-Monitor bereits enthalten. Pruefen
Sie vor allem, ob das Scrollen des Bildschirms ohne Fehler
funktioniert.
ACHTUNG, WICHTIG!
Sie MUESSEN sich IMMER erst ENTLADEN, bevor Sie irgendein
Teil des FPGA-Bords beruehren! Am besten ist es, wenn Sie mit
Ihren Fingern (alle, nacheinander!) das Gehaeuse des PS/2-Steckers
anfassen und sich danach nicht mehr von der Stelle ruehren.
Nichtbeachtung kann zur Zerstoerung der Bauteile durch statische
Aufladung fuehren!