Projekt VGA Core in VHDL

Wechseln zu: Navigation, Suche

von J.S.

Ein einfacher VGA-Core in VHDL zur Implementierung in eigene designs zwecks direkter Ausgabe digital repräsentierter Analogsignale oder Erzeugung dynamischer, grafischer Animationen.

Motivation[Bearbeiten]

Oftmals besteht die Notwendigkeit, eine grössere Zahl von sich schnell ändernden Signalen innerhalb eines FPGA-Designs visuell darzustellen, hat aber nicht die Möglichkeit, eine ausreichend schnelle Schnittstelle zu einem übergeordneten System zu implementieren und zu nutzen. Änderungen an FFT-Daten oder Bilddaten oder parallelen Signalwegen mehrerer AD-Eingänge können vom Auge mit wenigstens 10 Bildern je Sekunde erfasst werden - erforderten aber große Datenraten zu einem PC hin sowie und dazu weitere Auswertesoftware. Mit einer direkten Ausgabe auf einem Monitor kann der Aufwand vereinfacht werden sowie Hürden, wie die Latenz bei PCs und die Bandbreite bzw. die limitierte Zahl von Kanälen bei LogicAnalyzern und Oszilloskopen umgangen werden.

Für die Beobachtung von flächenförmigen Datenanordnungen wie Registerbänken oder sporadischen Fehlern bieten sich Datenfelder mit Markierungen und Farbwerten an, die man als Matrix darstellt. Je nach Auftreten eines Signals klinkt dann das entsprechende Kästchen.

Signalerzeugung[Bearbeiten]

Je nach gewünschter Auflösung des Bildes ist ein bestimmtes Videotiming einzuhalten. Der Core ist vorbereitet für 640x480 sowie 800x600, kann jedoch leicht der Erfordernissen angepasst werden, sofern die Hardware die benötigte Signalbandbreite / Taktfrequenz leisten kann.

Tabelle[Bearbeiten]

Pixeltakt 50 MHz 75 MHz 100 MHz 108 MHz 135 135 /162 148.351 148.500 154.000 193.250
Horizontal 800 1024 1280 1280 1280 1600 1920 1920 1920 1920
Front Porch 56 24 40 48 64 64 88 528 48 136
Synch 120 136 168 184 192 192 48 44 32 200
Back Porch 64 144 96 200 192 305 144 148 80 336
Pixel X 1040 1328 1584 1712 1728 2160 2200 2640 2080 2592
Pixeltakt 48,1 56,5 63,1 63,1 78,1 75 67,4 56,3 1920 1920
Vertikal 600 768 1024 1024 1024 1200 1080 1080 1200 1200
Front Porch 37 3 3 3 3 1 4 4 3 3
Synch 6 6 3 3 3 3 5 5 6 6
Back Porch 23 29 26 26 55 46 36 36 26 36
Pixel Y 666 806 1056 1056 1085 1250 1125 1125 1235 1245
Frames 72,2 70,1 59,8 59,7 72,0 50 /60 60,1 50,1 59,94 59,9

Links[Bearbeiten]

VGA timing infos

Database Modelines

VGA Timings

Datenspeicherung[Bearbeiten]

unbuffered[Bearbeiten]

Die Daten werden idealerweise zum Zeitpunkt der Entstehung ausgegeben. Damit entfällt eine aufwändige Pufferung oder ein Video-RAM. Damit ist es nötig, die Daten entsprechend vorzuberechnen.

buffered[Bearbeiten]

Wenn Systemtakt und Horizontal-Frequenz nicht zusammenpassen oder Daten nicht permanent periodisch anfallen, reicht für die Daten ein asynchrones FIFO, das maximal einmalig je Bild beschrieben- und durch den H-Takt ausgelesen wird. Damit lässt sich rechentechnisch die komplette Zeit des Rohbildes für die Datenerzeugung nutzen und eine höhere Komplexität realisieren, bzw das Timing bei kritischen Anwendungen noch einhalten.

Im einfachsten Fall lässt sich dies für eine Zeile realisieren. Ansonsten braucht es einen Bildspeicher.

Ausgabe[Bearbeiten]

1-Bit Version[Bearbeiten]

Hier erfolgt die Ausgabe digital, also nur mit einem Bit je Farbkanal. Es werden 5 Leitungen benötigt. Damit sind 7 Farben und Schwarz darstellbar. Wie man trotzdem mehr Farben bekommt, wird im Projekt unten dargestellt.

Mehrbit-Version[Bearbeiten]

Hier erfolgt die Ausgabe ebenfalls digital, allerdings mit mehreren Bits je Farbkanal. Es werden damit 3 x n + 2 Leitungen benötigt. Zur Anwendung kommt ein Widerstandsnetzwerk vom Typ R-2R, wie es z.B. auf dem Spartan 3A board von Digilent / Trenz realisiert ist. Die Widerstände bilden in Zusammenwirkung mit den Terminierungswiderständen und der Leitungsimpedanz einen Spannungsteiler.

DAC - Version[Bearbeiten]

Hier wird der Farbwert je Kanal an einen Video-DAC übertragen

Applikationsbeispiele[Bearbeiten]

Nachfolgend befinden sich einige von usern bereitgestellte fertig synthetisierte files zum Laden in den jeweiligen FPGA. Wer das Projekt auf seine Plattform portiert, bitte das file auch einstellen.

Spartan 3E[Bearbeiten]

Board-Beschreibung[Bearbeiten]

Spartan 3E Kit von Digilent

Der core muss an folgende Eigenheiten des boards angepasst werden:

Das board läuft mit 50MHz Quarz, besitzt nur einen 1-Bit-Anschluss je VGA-Farbe und wird daher interlaced (s.u.).

Es werden die 4 Input buttons verwendet, von denen einer als Reset fungiert. Dieser wurde auf den Drehencoder umgemappt.

Wichtig für das S3E: Die Steuerleitungen für das Flash müssen gfs. programmiert werden. Siehe Projekt.

Ansonsten wird nichts verwendet. Das Laden geht über das Platform-Flash (embedded JTAG Adapter).


Testbildgenerator 800x600 SVGA (J.S.)[Bearbeiten]

Modus: SVGA 800×600 @ 50MHz, mit scrollenden und interlacten Farben.

Testbildgenerator für das Spartan 3E-board von digilent: Vga test.bit

Das Spartan 3E-board wird mit einem 3-Bit Anschluss betrieben, womit eigentlich nur 7 Farben möglich wären. Im Beispieldesign werden jeweils 2 benachbarte Farben im Spektrum multiplext, z.B. Rot und Gelb zu Orange oder Blau und Schwarz zu Dunkelblau. So entstehen etwa 30 verschiedene, nutzbare Farben. Das Multiplexen wird mit einem selbstschwingenden Takt bewerkstelligt, der nicht mit dem H-Takt korrelliert. Genaueres zu dieser Funktion im Projekt oder hier: Farbmultiplexfunktion (Stand 2007)

Zusätzlich zu den rotierenden Farben bewegt sich ein Cursor/Ball durchs Bild, um zu zeigen, wie man selektiv Objekte einblenden und dem Raster überlagern kann. In ähnlicher Weise liesse sich ein ruler für ein Oszilloskop oder auch eine Lichtorgel realisieren.

Das Bild entspricht exakt der Ausgabe der Version im folgenden ISE-Projekt: Jsvgademo s3e.zip


Oszilloskop mit FFT und Ausgabe in SXGA 1280x1024 (J.S.)[Bearbeiten]

Modus: SXGA 1280×1024x60 @ 108MHz, mit den beiden gefilterten Wellenformen und FFT samt Windows der gelben, einmal gefilterten Welle.

Das file Datei:Jsoscvgacore1280 s3e.bit demonstriert ein Oszilloskop mit 8 verschiedenen Wellenformen, zwei IIR-Filter eine FFT523 und die Echtzeitausgabe entlang von x und y. Es erzeugt nacheinander im Wechsel 8 Wellenformen, filtert diese in 2 Stufen und stellt sie im bekannten 10x8 Raster dar. Die hierfür gewählte Auflösung beträgt gegenüber der VGA-Demo jetzt 1280x1024, da diese einfach in das typische Oszi-Raster mit jeweils 128 Punkten passt. Aufgrund der Echtzeitausgabe wird kein Video-RAM benötigt. Die Wellen werden als Punkte (weiss), sowie Linien (gelb und türkis) dargestellt.

Die Demo selbsttätig die Filtereingänge (gelb / türkis) über zwei wechselnde Windows auf einen FFT-Core, dessen scan-Bereich und Werteausgabe in der jeweiligen Farbe angezeigt wird. Zudem wird in der neuen Version die gefensterte Welle dargestellt. Das Umschalten erfolgt mit dem Bildzähler. Das Design ist absichtlich auf ein file zusammenkopiert und trennt nur zwischen Signal-Generator und Video-Mixer. Dieser kann entfallen, wenn man keine interlacten Farben haben möchte.


Die gleiche Ausgabe nun mit einer künstlichen Sinuswelle aus 8 Punkten je Viertelwelle und der einmal gefilterter Welle (gelb) und deren Spektrum.

Leider lässt der begrenzte Platz im S3E keine erweiterten Funktionen wie Datenspeicherung, Zoom, verbreiterte Darstellung der FFT, etc zu. Die Wellensynthesen, Filter und Modulatoren, sowie die FFT mussten in der Zahl und Auflösung reduziert werden. Auch das Maus-Interface und der Zeichengenerator wurden herausgenommen. Damit enthält das Design kaum noch PCB-spezifische Elemente und kann leicht portiert werden. Die FFT ist maximal ausgebaut und per area constraint synthetisiert, um das design erzeugt zu bekommen. Um das Design praktisch zu verwenden, müsste die FFT gekürzt werden. Eigene Module können eingehängt werden, indem man sich auf die bereitgestellten Video-X und Video-Y Koordinaten bezieht und die Latenzen, die bei einer umständlicheren Berechung entstehen, anpasst. Die Latenz beträgt derzeit je nach Implementierung 3-4 Takte.

Wichtig: Das Design nutzt zwei verkette DCMs, um auf die "krumme" Frequenz von 108MHz statt ehemals 135MHz zu kommen, die für die Darstellung nötig ist. Damit sinkt die Wiederholfrequenz von 75Hz auf 60Hz, aber mit der geringeren Video-Taktfrequenz ist das Design bei dem S3E erheblich einfacher zu fitten, da entspannter. Bei beiden Versionen war das Bild gestochen scharf und die Bewegung der Wellen sehr plastisch. Getestet wurde mit 2 TFT-Monitoren, die beide allerdings etwas brauchen, bis sie sich auf das Bild zentriert haben. Teilweise kommt es zum Ruckeln, wenn die Monitore einen Auto-Zoomm nutzen und ständig kalibieren. Der fette weisse Rahmen hilft, das zu unterdrücken. Manchmal klappt das Farbmultiplex nicht richtig - scheint an der Art zu liegen, wie die TFTs die Analogdaten scannen und interpolieren. In eigenen Designs daher entweder weglassen und nur die Vollfarben verwenden oder einen 4-Bit Ausgang für die Farben nutzen.


Logic Analyzer[Bearbeiten]

Spektrum Analyzer[Bearbeiten]

Spartan 3A[Bearbeiten]

board ist defekt - kann nicht getestet werden. Wer ein solche board hat, bitte die Version laden, anpassen und wieder hochladen und den Satz entfernen.

Spartan 6[Bearbeiten]

Digilent Atlys Spartan 6[Bearbeiten]

GUI für Drum Synthesizer über DVI

Eingebaute GUI für einen Schlagzeugsynthesizer (siehe Projekt Drumcomputer in VHDL) mit Keyboard, Mouse-CTRL, virtuellen Reglern für die Settings und Parameter sowie Volumen-Anzeigen für Kompressoren und Master-Volume. Realisiert mit DVI-Ausgabekarte mit bis zu 1600x1200.


Trenz TE630 mit S6LX75[Bearbeiten]

Trenz TE630 mit Xilinx Spartan 6LX75 auf Trägerboard TE0304
Modus: 800×600x72 @ 50MHz

Das plugin-Modul von Trenz-Elektronik, hier montiert auf einem passenden Trägerboard. Daten des Systems:

  • S6 LX75 FPGA (mit Webedition programmierbar)
  • DDR3-RAM 1 GB
  • Serial Male/FeMale
  • VGA 5Bit/Farbe RGB
  • USB, PS/2 Maus + Tastatur
  • Compact Flash-Interface
  • JTAG, Spannungsversorgung

Komplettes FPGA-Projekt für Xilinx ISE 14.7, angepasst für TE0304 + TE630file mit dem integrierten 100 MHZ-Oszillator fuer 50MHz-VGA-timing 800x600x72 auf CRT-Monitor. Zur eigenen Verwendung muss gfs das timing etwas angepasst werden. Bei anderen Applikationen gfs. die Inverter aus der Schaltung nehmen, wegen Polarität der Synch-Signale. Datei zur freien Verwendung: Datei:Jsvgacore s6.zip

Link zu einer Visualisierung: https://youtu.be/H3eBzMw-HfI


Altera Cyclone IV DE-115 (Terasic)[Bearbeiten]

Das C4 board von Terasic ist ein ideales board mit allem drauf, was für professionelle Anwendungen nötig ist. Es wird zusammen mit einem extension board verwendet, das ADCs und DACs sowie weitere Audio-In-Outs zur Verfügung stellt. Es ist vollständig mit der freien Webedition programmierbar und kommt zudem mit einer System-Builder-Software. Ein Video-DAC mit hoher Analoggüte ist integriert. Wenn das nicht reicht, kann über die SAMTEC-Stecker ein third party DVI-Video-Board angeschlossen werden.

Altera Cyclone 4 Plattform mit IO-Extension von Terasic

MainBoard:

  • 115.000 LEs, 180 Multiplier DSPs, 2x GB Ethernet, 1x USB Host + 2x USB + 1 Seriell, 1x VideoInput, 1 Stereo LineIn, 1 Stereo MicIn, 1 Stereo Stereo LineOut / Stereo HeadPhone, 16 Schalter, 4 Taster

Extension Board:

  • 2x ADC 150 MHz 14 Bit, 2x DAC 250 MHz 14 Bit
  • Stereo LineIn, Stereo MicIn, Stereo Stereo LineOut, Stereo HeadPhone


Wellenformgenerator nach LaPlace[Bearbeiten]

LaPlace-Generator mit 4 Wellen

Bildung eines Kreises durch sinusförmige Grundwelle und einigen sinusförmigen Oberwellen nach LaPlace/Fourier. Das System produziert bis zum 20MHz + 7 Oberwellen bis zu 160MHz.

Ein Funktionsgenerator mit FPGA


Downloads[Bearbeiten]

  • VGA-Oszilloskop-Demo mit 1280x1024x60 für Digilent Spartan 3E board. (Xilinx ISE 14.1 - Projekt) Datei:Uc-js-vga-osc.zip

Bezugsquellen[Bearbeiten]

Links zu Anwendungen[Bearbeiten]

Relevante Beiträge[Bearbeiten]

Projekte[Bearbeiten]