3. vaja: VGA krmilnik

Izdelali bomo VGA krmilnik, ki generira sinhronizacijske signale za prikaz slike na računalniškem monitorju po standardu VGA. Poleg sinhronizacijskih signalov (hsync in vsync) so na izhodu krmilnika še testni barvni izhod (rgb_o) ter koordinate in status trenutne točke (tx_o, ty_o, en_o).

Izdelava VGA krmilne komponente

Standard VGA je nastal še v času katodnih monitorjev. Priključek VGA ima 3 analogne singnale za barve (red, green in blue) in dva digitalna sinhronizacijska signala (hsync za sinhronizacijo vrstic in vsync za osveževanje slike). Na razvojni plošči imamo D/A pretvornik in v vezju bomo barve določali z 8-bitnim vektorjem rgb.

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). Poglejmo časovni potek za dve zaporedni vrstici:

 

Časovni potek signalov določajo parametri, ki jih določa standard VGA: perioda osveževanja vrstic, vidni del slike, začatek in trajanje sinhronizacijskega impulza. Tabela prikazuje parametre za prikaz slike ločljivosti 800 x 600 točk in frekvence osveževanja 72Hz. 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

 1. Naloga

Port ( clk50 : in STD_LOGIC;
       hsync : out  STD_LOGIC;
       vsync : out  STD_LOGIC;           			
       rgb_o : out  STD_LOGIC_VECTOR (7 downto 0);
       tx_o, ty_o: out  STD_LOGIC_VECTOR (8 downto 0);
       en_o : out STD_LOGIC);

V vezju naredimo dva števca hst (števec točk v vrstici) in vst (števec vrstic v sliki). Š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.

Sinhronizacijske izhodne impulze dobimo s kombinacijsko primerjavo vrednosti števcev:

if rising_edge(clk) 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;

S primerjavo vrednosti števcev določimo sinhronizacijske impulze, npr. za hsync zapišemo:

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

Vrednosti obeh števcev predstavljata tudi že koordinate izhodnih točk: hst je koordinata tx_o, vst pa ty_o. Signal en_o naj bo '1', ko sta števca znotraj vidnega dela slike (800 x 600). Definirajmo še izhodne barve rgb, ki naj bodo:

Preizkusi delovanje opisanega vezja na simulaciji.

2. Naloga*

*Če imaš dovolj časa, preizkusi vezje na razvojni plošči brez povezave na procesorski sistem. Za preizkus bo potrebno vezje nekoliko prilagoditi: odstrani izhodne signale tx_o, ty_o in en_o ter deklariraj clk50 kot notranji signal, na portu pa naj bo signal clk. Dodaj v opis vezja delilnik ure iz clk, ki ima frekvenco 100MHz, na clk50.

3. Izdelava komponente IP