QVGA-/Composite-Treiber für FPGA
c't-LabScript kann auch eingesetzt werden, um mittels der Video-Interface-Konfigurationsdatei (VGA.BIT oder FBAS60.BIT) Messwerte und einfache Grafiken auf einem am FPGA-Modul angeschlossenen VGA-Monitor darzustellen. Die Auflösung beträgt 320 x 240 Bildpunkte bei 64 Farben (Zeilenverdopplung auf VGA-Standard bei vga.bit). Sie benötigen dafür die FPGA-Modul-Firmware ab Version 1.1 (aktuell: 2.1).
Als Video-Speicher für das FPGA ist ein simples 32 KByte-SRAM (62256 o.ä.) ausreichend, das entsprechend dem Schaltplan schem_FPGA_RAM.pdf auf einer Lochraster-Steckkarte aufgebaut werden kann; Platinenlayouts zum Selberätzen sind ebenfalls vorhanden. c't 4/2009 stellt die universelle Erweiterungskarte DACRAM vor, die ebenfalls ein Video-RAM enthält.
Eine kleine Demonstration der Möglichkeiten (auch von LabScript) zeigt DEMOVGA.INI im Unterverzeichnis "sdcard" (im ZIP-File, Inhalt komplett auf eine SD-Karte kopieren und DEMOVGA.INI starten - VGA.BIT wird automatisch geladen).
Die Firmware überprüft nach jedem Laden einer Konfigurationsdatei, ob sie ein Video-Interface enthält -- indem sie versucht, in den Grafikspeicher bestimmte Werte abzulegen und wieder fehlerfrei auszulesen. Die FPGA-Modul-SubChannel? auf den Adressen 64 bis 79 sind für das Video-Interface reserviert und dürfen nicht für andere Zwecke missbraucht werden, das könnte die Firmware verwirren. Unser FPGA-Video-Interface nutzt von diesem Adressbereich nur die ersten drei Register: Das erste ist ein Adressregister für das Framebuffer-RAM mit Autoinkrement (zählt bei jedem Byte-Zugriff auf das Buffer-RAM eins weiter), das zweite dient nur zum Auslesen der Framebuffer-Daten, und das dritte ist ein Befehlsregister für den hier "pixel_engine" genannten VHDL-Funktionsblock.
Die etwas hochtrabende Bezeichnung täuscht darüber hinweg, das die "Engine" nur einfachste Bit-Manipulationen beherrscht (Pixel anhand einer Maske setzen, invertieren, löschen) -- wir wollten ja auch keinen 6845 oder gar 3D-Grafikchip implementieren. Immerhin wurde der Block gut auf den (eigentlich für kleine LCDs gedachten) generischen Grafiktreiber abgestimmt, den der bei der Firmware-Entwicklung verwendete Cross-Compiler (AVRCo Pascal von E-Lab) bereitstellt.
Wenn Sie die FPGA-Sourcen genauer untersuchen, werden Sie feststellen, dass das SPI gegenüber dem des FPGA-Frequenzzählers auf das Nötigste zusammengestrichen wurde. Der Video-Sync-Generator "sync" ist dagegen beispielhaft und kann (über Konstanten im zugehörigen VDHL-Code, siehe Kommentare dort) in weiten Grenzen parametriert werden. Für das langsamere FBAS-Timing benötigt er allerdings einen durch acht und nicht durch vier geteilten 50-MHz-Takt; ein Zähler (Mitte oben im QVGA-Schaltbild) ist dafür schon vorgesehen.
Das zunächst "schwarzweiße" Video-Signal serialisiert nach alter Väter Sitte ein 8-Bit-Schieberegister, das seine Daten direkt aus dem (externen) Video-RAM bekommt. Die farbige Darstellung erreichen wir, indem die Video-Ausgänge mit einem Farb-Byte aus der oberen Adresshälfte verUNDet werden. Großer Vorteil: Der Atmel-Controller muss sich nur um einbittige Schwarzweiß-Pixel kümmern, als Nachteil haben immer acht nebeneinander liegende Pixel die gleiche Farbe -- was für die angedachte Messwert-Visualisierung wohl kein allzu großes Manko darstellt.
Gegenüber der ersten Version wurde das Timing überarbeitet, das QVGA-Interface läuft nun mit allen LC-Monitoren.
