Należy zaprojektować moduł generujący sygnały VGA. Działanie
modułu powinno być następujące:
Rys. 1 Obrazek do wyświetlenia na monitorze VGA.
Wymagania dotyczące zaliczenia:
Symulacja funkcjonalna nie jest obowiązkowa (ale może być wykonana w razie
konieczności).
Należy zaprogramować płytkę testową FPGA i praktycznie sprawdzić
działanie układu (przebieg testu przedstawić na filmie):
Uwagi i informacje dodatkowe:
Wejścia i wyjścia układu:
clk_i – zegar 100MHz,
red_o – wyjście sygnału
koloru czerwonego do monitora (4 bity),
green_o – wyjście sygnału
koloru zielonego do monitora (4 bity),
blue_o – wyjście sygnału
koloru niebieskiego do monitora (4 bity),
hsync_o – wyjście sygnału
synchronizacji poziomej do monitora,
vsync_o – wyjście sygnału
synchronizacji pionowej do monitora,
sw5_i – przełącznik do
ustawiania czerwonej składowej tła,
sw6_i – przełącznik do ustawiania
zielonej składowej tła,
sw7_i – przełącznik do
ustawiania niebieskiej składowej tła,
btn_i – przyciski do
przesuwania prostokąta z bitmapą (4 bity).
Plik z ograniczeniami
projektowymi: iup10.xdc
Obrazek do wyświetlania w
formacie COE
oraz BMP.
Informacje o analogowym
sygnale VGA (częstotliwość pikseli można ustalić na równe 25 MHz):
Generowanie
sygnału VGA
Parametry sygnału VGA
Przy generacji sygnału wideo należy pamiętać o
zerowaniu sygnałów RGB poza obszarem wyświetlania obrazu VGA (na podstawie
poziomu sygnału analogowego poza obszarem wyświetlania monitor ustala poziom
czerni dla każdego z kolorów).
Sygnały red_o, green_o i
blue_o są czterobitowe, ale wszystkie bity poszczególnych sygnałów sterujemy
równocześnie tą samą wartością (mamy więc 8 możliwych kolorów), np.:
red_o <= red & red
& red & red; -- lokalny sygnał
red jest typu std_logic
Monitor po wykryciu sygnału
video włącza się z uśpienia, pełną jasność ekranu osiągnie po około 1 minucie.
Instrukcja syntezy modułu pamięci ROM za pomocą generatora IP core w
Vivado:
·
W okienku Flow
navigator rozwijamy PROJECT MANAGER i klikamy w IP Catalog.
·
Następnie rozwijamy Memories
& Storage Elements i dalej rozwijamy RAMs & ROMs & BRAM.
Poniżej przedstawiono omawiane okno dialogowe.
·
Klikamy podwójnie w Block
Memory Generator.
·
W polu Component
Name wpisujemy nazwę, którą otrzyma generowany przez nas moduł, np.: vga_bitmap
·
W zakładce Basic
zmieniamy Memory Type na Single Port ROM. Poniżej przedstawiono
omawiane okno dialogowe.
·
W zakładce Port A
Options zmieniamy Port A Width na 8, następnie zmieniamy Port
A Depth na 12406, następnie w polu Enable Port Type wybieramy
Always Enabled.
Wyłączamy opcję Primitives Output Register.
Poniżej przedstawiono omawiane okno dialogowe.
·
W zakładce Other
Options zaznaczamy Load Init File, a następnie za pomocą przycisku Browse
znajdujemy plik zad_vga_plik_coe.coe
zawierający plik bitmapy i klikamy w OK. Pliku nie edytujemy.
Poniżej przedstawiono omawiane okno dialogowe.
·
Znajdujący się w lewym
górnym rogu przycisk Documentation otworzy szczegółową dokumentację
generowanego komponentu.
·
W zakładce Summary
możemy znaleźć podsumowanie istotnych parametrów tworzonego komponentu.
Szczególnie istotna jest informacja: Total Port A Read Latency: 1 Clock
Cycle(s). Oznacza ona, że odczyt z pamięci odbywa się z opóźnieniem 1 cyklu
zegara w stosunku do zbocza zegarowego zatrzaskującego odczytywany adres. W
przypadku wątpliwości proszę zajrzeć do dokumentacji komponentu.
Poniżej przedstawiono omawiane okno dialogowe.
·
Na zakończenie
potwierdzamy ustawienia przyciskiem OK w prawym dolnym rogu i po chwili
zatwierdzamy w okienku Generate Output Products przyciskiem Generate rozpoczęcie
syntezy nowego komponentu.
·
Jeszcze raz
potwierdzamy w okienku Generate Output Products przyciskiem OK.
·
Po zakończeniu
generacji komponent zostanie dołączony do listy plików źródłowych projektu.
W celu ułatwienia dołączenia komponentu do
hierarchii aktualnego projektu w okienku Sources można wybrać zakładkę IP
sources. Wtedy wyświetlą się wygenerowane moduły IP. Po rozwinięciu
wybranego modułu oraz rozwinięciu Instantiation Template można zobaczyć
plik *.vho zawierający szkielet deklaracji komponentu oraz przykład jego
użycia (tworzenia instancji). Możemy te elementy łatwo przekopiować do naszego
pliku projektowego, w którym planujemy podłączyć wygenerowany komponent, a
zaprojektowany komponent zajmie właściwe miejsce w hierarchii projektu.
Istotny fragment przykładowego pliku VHO:
--
The following code must appear in the VHDL architecture header:
------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
component vga_bitmap
port (
clka: IN std_logic;
addra: IN std_logic_VECTOR(13
downto 0);
douta: OUT std_logic_VECTOR(7
downto 0));
end component;
-- COMP_TAG_END ------ End COMPONENT Declaration ------------
-- The following code must appear in the VHDL architecture
-- body. Substitute your own instance name and net names.
------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
your_instance_name : vga_bitmap
port map (
clka => clka,
addra => addra,
douta => douta);
-- INST_TAG_END ------ End INSTANTIATION Template ------------
-- You must compile the wrapper file vga_bitmap.vhd when simulating
-- the core, vga_bitmap. When compiling the wrapper file, be sure to
-- reference the VHDL simulation library.
Tekst zaznaczony na czerwono należy skopiować do obszaru definicji
sygnałów lokalnych. Tekst zaznaczony na niebiesko
(po ustaleniu nazwy instancji komponentu oraz sygnałów podłączonych) należy
skopiować do obszaru opisu systemu. Po dokonaniu powyższych modyfikacji
komponent powinien zająć właściwe miejsce w hierarchii plików projektu.