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). |
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