View
115
Download
0
Category
Preview:
Citation preview
FPGA Praktikum WS2000/2001
6.Woche:VGA Monitoransteuerung
VGA Grafik
Prinzip einer Braunschen-Röhre VGA Signale Anschluß an den FPGA Aufgaben
Die Braunsche-Röhre
Vakuumröhre mit einem Elektronenstrahl, der ein Beschichtung auf der Vorderseite einen Punkt zum leuchten bringt.
Der Elektronenstrahl kann abgelenkt werden
Die Intensität des Strahls kann gesteuert werden.
Bildaufbau
Der Strahl baut jedes Bild Zeile für Zeile und Punkt für Punkt nacheinander auf.
Er läuft eine Zeile von links nach rechts ab.
Die Intensitätsschwankung gibt die Helligkeit der Punkte auf der Zeile an.
Dann läuft er schnell an den Anfang der nächsten Zeile zurück. Dabei muß der Strahl ausgeschaltet sein.
Am Ende der letzten Zeile läuft der Strahl an den Anfang des Bildes zurück. (Austastlücke)
Problemstellung:
Um ein Bild darzustellen, muß der Elektronenstrahl genau zum richtigen Zeitpunkt die richtige Intensität haben
Aufeinanderfolgende Bilder müssen richtig positioniert werden
Beim Zeilenrücklauf muß der Elektronenstrahl abgeschaltet sein
Ansteuerung
Ein VGA Monitor wird über 5 Signale gesteuert: HSYNC (Horizontale Synchronisation, Ende einer
Zeile) VSYNC (Vertikale Synchronisation, Ende eines
Bildes) Rote Intensität Grüne Intensität Blaue Intensität
Sync Signale
Das HSYNC Signal kennzeichnet das Ende einer Zeile Das VSYNC Signal kennzeichnet das Ende eines Bildes Da die meisten Monitore einen Schwingkreis mit diesen
Signalen synchronisieren müssen die Signale zeitlich sehr gleichmäßig sein.
Außerdem müssen die Signalzeiten in einem vom Monitor vorgegebenen Bereich liegen.
Bei manchen Monitoren (fixed frequency, Fernseher) müssen sogar genau vorgeschriebene Timings eingehalten werden.
Video Timing
Wer schon mal einen Monitor oder eine Grafikkarte gekauft hat, ist über die Timinggrenzwerte gestolpert: Vertikalfrequenz: Bilder pro Sekunde
25 Hz beim Fernseher, z.B. 50 bis 100 Hz bei meinem 17“ Monitor
Horizontalfrequenz: Zeilen pro Sekunde Auch unsichtbare Zeilen der Austastlücke werden mitgezählt 15 kHz Fernseher 30 kHz bis 90kHz bei meinem 17“ Monitor D.h.: Mein Monitor kann offiziell den guten alten Spiele-Modus mit
320x200 Punkten bei 60 Bildern/s (ca. 14kHz) nicht darstellen. Eine Verletzung des Timings kann den Monitor
beschädigen!
Beispieltiming für den SVGA Modus mit 31,5 MHz
Vertikalfrequenz: ca. 60 Bilder/s (16,784 ms pro Bild)
480 Sichtbare Zeilen pro Bild Horizontalfrequenz: 31,5 kHz
31,77 µs pro Zeile 31,77 µs * 480 = 15,25 ms für den Sichtbaren Teil des Bildes 16,784 ms - 15,25 ms = 1,534 ms vertikale Austastlücke 1,534 ms / 31,77 µs = 48 Zeilen Austastlücken Insgesamt also 528 Zeilen
640 Pixel pro Zeile in sichtbaren 25,17 µs 31,77 µs - 25,17 µs = 6,6 µs horizontale Austastlücke 640 / 25,17 µs = 25,4 MHz Pixelfrequenz
HSYNC Timing
Aufbau einer Zeile Die HSYNC Signale werden für jede Zeile gesendet,
auch während der Vertikalen Austastlücke HSYNC Puls ist 3,77 µs lang auf dem Wert ‘0‘.
HSYNC Timing
Damit es bei allen läuft, sollte die Schaltung mit 19,202 MHz arbeiten.
Dann ergeben sich die folgenden Werte: 610 Pixel pro Zeile (31,77 µs) 512 sichtbare Pixel (26,66 µs statt 25,17 µs) die restlichen 98 Pixel sind schwarz Der HSYNC Puls startet bei Pixel 520 der HSYNC Puls endet vor Pixel 592
Durch verschieben des HSYNC Pulses läßt sich das Bild links/rechts verschieben.
VSYNC Timing
Aufbau eines Bildes
VSYNC Timing
Das Bild besteht aus 529 Zeilen 480 Zeilen sind sichtbar 49 Zeilen sind schwarz Der VSYNC Puls ist zwei Zeilen lang ‘0‘: Zeilen 494 und 495
Intensitätssteuerung
Der Monitor bekommt vom FPGA drei Intensitätssignale gesendet.
Je eins für die Grundfarben Rot, Grün und Blau. Jedes Signal kann über einen einfachen 2-Bit
Analog/Digitalwandler auf vier verschiedene Spannungswerte gesetzt werden
Damit sind 23*2 = 26 = 64 verschiedene Farben möglich.
Am bequemsten faßt man im VHDL-Code die sechs Signale zu einem Vektor zusammen:
RGB <= R(1 downto 0) & G(1 downto 0) & B(1 downto 0);
Pinbelegung
Für die UCF Datei: NET HSYNCB LOC=P180;NET VSYNCB LOC=P181;NET R<1> LOC=P194;NET R<0> LOC=P193;NET G<1> LOC=P192;NET G<0> LOC=P191;NET B<1> LOC=P189;NET B<0> LOC=P188;
Schaltung eines VGA Farbausganges
2-Bit D/A Wandler
3,3V Ausgangsspannung am FPGA Pin Red = „00“
Ausgangsspannung 0V
Red = „01“ Spannungsteiler 1000 zu (470 || 75)=65 Ausgangsspannung 201 mV
Red = „10“ Spannungsteiler 470 zu (1000 || 75)=70 Ausgangsspannung 390 mV
Red = „11“ Spannungsteiler (1000 || 470)=320 zu 75 Ausgangsspannung 627 mV
Aufgabe 6.1: Generierung des VGA Timings
Baut eine Schaltung, die HSYNC und VSYNC mit dem beschriebenen Timing erstellt.
Verwendet dazu einen X Zähler von 0 bis 610 und einen Y Zähler von 0 bis 528 aus STD_LOGIC_VECTOR (Wieviele Bits benötigen die Zähler?)
Simuliert mit einem 19,2 MHz Takt mindestens 700 Taktzyklen und überprüft, ob die HSYNC Timing richtig ist. (72 Pixel lang, alle 610 Pixel)
Implementiert, und testet ob im Logfile mindestens 19,2 MHz Taktfrequenz angegeben sind.
Nur weitermachen, wenn diese Überprüfungen positiv ausfallen!
Falls euer Rechner schnell genug ist, überprüft auch das VSYNC Timing. Andernfalls prüft wenigstens, ob der Y Zähler einmal pro Zeile zählt.
Aufgabe 6.2: Ein schwarzes Testbild
Im Diplomandenraum steht ein zusätzlicher Monitor. Zuhause müßt Ihr ständig umstöpseln, oder euch irgendwoher
einen zweiten Monitor besorgen. Ladet die Schaltung in den FPGA, schließt einen Monitor an
und steuert gegebenenfalls das Reset Signal an. Der Monitor sollte nicht pfeifen, kein rollendes Bild zeigen
oder rote Warnlampen aufblinken lassen oder sich abschalten. Es sollte ein stabiles, schwarzes Bild zu sehen sein. Falls nicht: Schnell Monitor ausschalten und Kontakt zu Till
aufnehmen.
Aufgabe 6.3: Ein buntes Testbild
Im Diplomandenraum steht ein zusätzlicher Monitor. Benutzt die obersten Bits des X Zählers, um dem RGB
Farbausgang Werte zuzuweisen. Beispielsweise für Streifen Schwarz, Blau, Rot, Lila: RGB <= H(7) & H(7) & “00“ & H(6) & H(6)
Denkt daran, daß ab Zeile 480 wieder RGB=“000000“ gelten muß.
Testet, ob Ihr die Streifen seht. Gebt die VHDL Dateien für 6.3, den Bitstream für 6.3 und das
Simulationsskript aus Aufgabe 6.1 ab beiprak@em.informatik.uni-frankfurt.de
Nützliche VHDL Infos
Unbedingt zusätzlich die Bibliothek std_logic_unsigned verwenden: use IEEE.std_logic_unsigned.all
Zähler: if rising_edge(clk) if zaehler < 609 then -- zaehlt von 0 bis
609 = 610 Pixel zaehler <= zaehler + 1; else zaehler <= “000000000“;end if;
Nützliche VHDL Infos
Taktet alle Ausgangssignale in Register. Die 52ns Verzögerung die dadurch entstehen sind egal, wenn alle Signale gleichmäßig verzögert werden.
Dies erhöht die mögliche Taktfrequenz, da die externen Signallaufzeiten von den internen getrennt werden.
Wer möchte kann auch intern noch mehrere Pipelinestufen einbauen.
Aufgabe 6.4: Bilder (Einführung)
Wenn man die X- und Y-Zähler als Adressen eines ROMs verwendet, kann man ein Bild darstellen, das in dem ROM gespeichert ist.
Wenn man obere Adressbits nicht anschließt, wiederholt sich das Bild mehrmals, wenn man untere nicht anschliest, werden die Bildpunkte größer.
Schließt man z.B. XCOUNT(6 downto 3) und YCOUNT(6 downto 3) an ein ROM mit 8 Adressleitungen, so enthält das Bild 16x16 Bildpunkte, die jeweils 8x8 Pixel auf dem Monitor groß sind. Das Bild kann sich in X-Richtung also 4 mal wiederholen.
Man kann z.B. ein 1-Bit breites ROM verwenden und dann abhängig vom Wert des Bits eine von zwei Farben anzeigen (palette), oder man speichert in einem 6-Bit breiten ROM direkt die Farbe. (direct color)
Aufgabe 6.4: Bilder (Einführung)
Insgesamt stehen in dem FPGA 14 BlockROMs mit je 4096 Bits zur Verfügung.
Möglich Aufteilungen sind daher: 2-Farben, 256x196, 12 BlockROMs 4-Farben, 196x128, 12 BlockROMs 8-Farben, 128x128, 12 BlockROMs 64-Farben, 128x64, 12 BlockROMs
Aufgabe 6.4: Bilder (Aufgabe)
Generiert ein ROM, daß die Daten für ein einfaches Bild enthält. (Z.B. zwei diagonale Linien)
Das Bild soll mindestens 16x16 Pixel groß sein. Sucht euch aus, wieviele Farben Ihr haben wollt,
und ob Ihr eine Palette oder direct color verwenden wollt.
Baut das ROM so in eure Schaltung ein, daß das Bild auf dem Monitor zu sehen ist.
(Das sollten nur ein paar Drähte sein)
Zusatzaufgabe 6(schwer, nur für gelangweilte Studenten)
Der Prozessor enthält ein DPRAM, daß je einen Port zum PC und zur ALU besitzt.
Statt des Ausgaberegisters kann man dort ein DPRAM einbauen, daß einen Schreib-Port zum Prozessor hat, und einen Leseport zur VGA Grafik
Für die VGA Grafik ersetzt das RAM dann das ROM
Der Prozessor kann jetzt Grafik in das RAM malen. (Probiert mal ein Rechteck zu füllen)
Recommended