3. vaja: VGA krmilnik

Naredili bomo VGA krmilnik, ki generira sinhronizacijske signale za računalniški monitor po standardu SVGA v ločljivosti 800 x 600 točk. Na sredini slike naj bo narisan kvadrat velikosti 512 x 512 točk. Na izhodu vezja so sinhronizacijski signali za monitor, izhodne barve rgb, koordinate znotrak kvadrata xy in signal en, ki določa ali se trenutna točka nahaja v kvadratu. Barvo ozadja naj določa vhodni signal rgb_bg.

 

Priključek VGA ima 3 analogne signale za barve (red, green in blue) in dva digitalna sinhronizacijska signala (hsync za sinhronizacijo vrstic in vsync za osveževanje slike). Slika se na monitorju izrisuje po vrsticah, od leve proti desni in od zgoraj navzdol. Časovni potek je določen tako, da na koncu vsake vrstice počakamo nekaj časa, potem pa aktiviramo sinhronizacijski impulz hsync, ki je na analognem monitorju povzročil vračanje katodnega žarka na začetek nove vrstice. V tem času mora biti na barvnem izhodu rgb vrednost 0 (zatemnilna perioda).

Časovni potek signalov določajo parametri, ki jih določa standard VGA: perioda osveževanja vrstic, vidni del slike, začetek in trajanje sinhronizacijskega impulza. Tabela prikazuje parametre za prikaz slike ločljivosti 800 x 600 točk in frekvence osveževanja 72 Hz. Parametri so podani v obliki števila period ure clk50, ki ima frekvenco 50 MHz:

Perioda vrstice H = 1040 period (točk)
Vidni del Hp = 800 točk
Začetek sinh. pulza
(Front Porch)
Hf = 856 točk
Trajanje pilza Hs = 120 točk

 

Na podoben način so določeni vertikalni parametri, ki skrbijo za osveževanje celotne slike. Parametri določajo število vrstic:

Perioda osveževanja V = 666 vrstic
Vidni del Vp = 600 vrstic
Začetek sinh. pulza
(Front Porch)
Vf = 637 vrstic
Trajanje pilza Vs = 6 vrstic

 

3.1 Izdelava VGA krmilne komponente

Naloga

 Generic ( C_RGB_BITS: INTEGER range 3 to 12 := 6 );
    Port ( clk50  : in STD_LOGIC;
           rgb_bg : in STD_LOGIC_VECTOR (C_RGB_BITS-1 downto 0);
           hsync  : out STD_LOGIC;
           vsync  : out STD_LOGIC;		
           rgb    : out STD_LOGIC_VECTOR (C_RGB_BITS-1 downto 0);
           xy     : out STD_LOGIC_VECTOR (17 downto 0);
           en     : out STD_LOGIC );

V vezju deklarirajmo dva nepredznačena vektorja: hst in vst. Števec hst se povečuje s periodo ure in šteje do H-1, kolikor je perioda vrstice. Vsakokrat, ko ga ponovno resetiramo na 0, povečamo števec vrstic vst, ki naj šteje od 0 do V-1, kolikor je perioda osveževanja slike.

if rising_edge(clk50) then
  if hst < H-1 then   	
    hst <= hst + 1;
  else
    hst <= (others=>0);
    if vst < V-1 then  
      vst <= vst + 1;
    else
      vst <= (others=>0);
    end if;
  end if;

Sinhronizacijske izhodne impulze dobimo s kombinacijsko primerjavo vrednosti števcev, npr. za hsync zapišemo:

hsync <= '1' when hst>=Hf and hst<Hf+Hs else '0';

Vrednosti obeh števcev predstavljata x in y koordinati točk na monitorju (izhodišče je v zgornjem levem vogalu). Napišimo pogoje, ki določajo vrednosti izhodne barve rgb in signala en:

Določi še vektor z izhodnima koordinatama: najprej izračunaj relativno koordinato znotraj pravokotnika (hst-400, vst-300), nato pa zlepi skupaj koordinati v 18-bitni izhod xy.

 3.2 Izdelava sistema s komponento VGA