Vykreslování obrazců na VGA pomocí FPGA firmy Xilinx

Autoři: Martin Bruchanov, Jan Šenolt, Tomáš Uko

Zadaní

Naprogramujte obvody FPGA firmy Xilinx k zobrazování jednoduchých obrazců na monitor počítače

Teorie

Obr.1 Zobrazení na monitoru
Funkce VGA
Pro vykreslení obrazce na monitor je třeba vědět několik důležitých informací o fungovaní VGA signálu. VGA video signál má 5 aktivních signálů. Dva jsou kompatibilní s logickými úrovněmi TTL logiky, horizontální a vertikální synchronizace, a používají se pro synchronizaci obrazu. Tři analogové signály s 0.7 až 1.0 V špička-špička úrovní jsou použity pro ovládání barev. Barevné signály jsou Red, Green, Blue. Změnou analogových hodnot všech tří signálů dochází k vykreslení všech možných barev.
Technologie zobrazení
Způsob ovládaní monitoru nemá cenu detailně popisovat. Takže jen zmíním základní poznatky. Electronový svazek prochází po řadcích celou plochu obrazovky. Tento svazek je vychylován pomocí magnetické nebo elektrostatického pole. RGB signál je použit pro ovládání síly elektronového svazku. Světlo je generováno, když je aktivní video signál a toto světlo dopadne na stínítko obrazovky čímž vytvoří obraz tečky (případně řádku). Každá obrazovka obsahuje tři různé fotoemitory, každý pro jednu složku RGB signálu.
Ve standartním VGA je má obrazovka rozlišení 640 na 480 pixelů. Video signál musí celou obrazovku překreslit alespoň 60krát za vteřinu. Tomu se říká "refresh-rate". Lidské oko potřebuje frekvenci alespoň 30Hz aby vidělo normální obraz.
K odstranění blikání z interferencí z flourescenčních světelných zdrojů se používá v monitorech "refresh-rate" vyšší než 60 Hz. Barva každého pixelu monitoru je určena hodnotou RGB signálů když elektronový paprsek přechází přes dané místo. V režimu 640 x 480 s 60 Hz frekvencí je to zhruba 40 ns na pixel. A hodiny s 25MHz frekvencí mají tuto periodu.
Vykreslování
Proces vykreslování začína v levém horním rohu a po řádcích postupuje do pravého spodního rohu. Na konci řádky se resetuje číslo vykreslovaného sloupce a číslo řádky se nastaví na další. Jakmile je vykreslena celá obrazovka, proces začíná znovu. Vertikální synchronizace říká monitoru ať začne kreslit nový obraz a monitor začne kreslit v levém horním rohu. Horizontální synchronizace říká monitoru, ať "zalomí" řádek. Po vykreslení 480 řad pixelů pomocí 480 signálů na horizontální synchronizaci, signál vertikální synchronizace řekne monitoru, ať posune vychylování na bod 0,0. Během doby, kdy se nezobrazují pixely a paprsek se vrací zpět do levého horního rohu, by měl být RGB signál vynulován.
Časování signálů synchronizace viz následující dva obrázky.
Obr.2 Zobrazení na monitoru II.
Obr.3 Časování vertikální synchronizace
Obr.4 Časování horizontální synchronizace

Řešení

Hlavní entita
Obr.5 Entita
Entita pro vykreslování se skládá z hlavní entity a jedné komponenty o které bude řeč později. Entita má jeden vstupní signál - hodiny (50 MHz) a několik výstupních, jak dokládá následující obrázek.
Signály:
  • red_out - ovládá R složku pixelu
  • blue_out - ovládá B složku pixelu
  • green_out - ovládá G složku pixelu
  • horiz_sync_out - signál horizontální synchronizace
  • vert_sync_out - signál horizontální synchronizace
Časování
Pro vykreslování obrazců na monitoru se používá 25MHz frekvence, ale protože Xilinx Spartan 3 používá hodiny s vyšší frekvencí (50 MHz), museli jsme pomocí DCM (Digital Clock Manager) snížit frekvenci pro zobrazování na polovinu. Pro tuto potřebu jsme si naimportovali následující kus kódu přímo od firmy Xilinx, který slouží k ovládání DCM. DCM u Spartanu podporuje mnohem větší rozsah aplikací než jsme potřebovali, umí posouvat fázi o 90, 180, 270 stupnů a podobné hrátky, nám však stačilo použít pouze možnost pro dělení hodinového signálu 2. Následujícím příkazem sme naportovali tuto komponentu do našeho kódu.
CLK_DIV2: clk_div port map (CLKIN_IN => clock_50Mhz, CLKDV_OUT => CLK, RST_IN => '0'); Nyní již na signálu CLK máme 25 MHz hodiny, které můžeme použít pro vykreslování grafiky.
Ovládání grafiky
Při vykreslování je třeba zajistit následující věci:
Vlastní grafika
Entita umožňuje vykreslovat několik různých obrazců, které lze přepínat pomocí tlačítka na PCB desce. Zárověň indikuje rozsvícenými diodami svůj stav, tj. který obrazec je právě zobrazen, toto bylo vytvořeno z důvodu testování, pro vlastní funkci nemá svícení diod žádný vliv.
Obrazce
Obrazce zobrazené na monitor jsou celkem 4.
Celý kód
Celý kód entity je ke stažení zde.
Celý projekt je ke stažení zde.

Literatura