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!