1338


NOTATNIK KONSTRUKTORA
Sterownik VGA
Dodatkowe materiały
na CD/FTP
w układzie FPGA
Dodatkowe materiały na CD/FTP:
Zastosowanie monitora VGA w aplikacji zrealizowanej w układzie
ftp://ep.com.pl, user: 10460, pass: 0646g3n0
FPGA nie jest trudne. Przekonamy się o tym po lekturze artykułu,
" listingi do artukułu
w którym zaprezentowano projekt układu, opisanego w językach
VHDL i Verilog, umożliwiającego wyświetlenie jakiegoś obiektu na
należy do obszaru zajmowanego przez kul-
ekranie monitora. Dobry wzorzec dla uczÄ…cych siÄ™ VHDL a czy
kę. Sygnał ten jest wyliczany na podstawie
Verilog a.
koniunkcji stanów odpowiednich relacji
(narzędzia syntezy wywnioskują z tego
Jako przykład implementacji w ukła- dardzie VGA. Ramka sygnału VGA była już opisu zespół komparatorów) uwzględnia-
dach programowalnych prostego sterow- wielokrotnie opisywana na łamach Elek- jących bieżące położenie kulki (środka
nika VGA przedstawiamy projekt układu, troniki Praktycznej (np. w EP 4/2007 przy kwadratu  współrzędne Ball_X_pos oraz
którego zadaniem jest wyświetlanie na okazji projektu testera monitorów VGA), Ball_Y_pos), rozmiar kulki (bok kwadratu
ekranie monitora poruszającego się i odbi- dlatego nie będzie omawiana. - sygnał Size) oraz stan liczników wierszy
jającego od czterech krawędzi ekranu pro- Na listingu 1 przedstawiono kod w ję- i kolumn (współrzędne aktualnie wybiera-
stego obiektu zwanego dalej kulką. Kulka zyku VHDL opisujący generator sygnałów nego punktu).
w rzeczywistości jest kwadratem o boku synchronizacji. Oprócz wyjść sygnałów Kolejny proces (Move_Ball) aktywo-
o zadanej liczbie pikseli. Kulka podczas po- synchronizacji poziomej (horiz_sync_out) wany podczas każdego narastającego
ruszania się po ekranie dodatkowo zmienia i pionowej (vert_sync_out) oraz stanu licz- zbocza sygnału synchronizacji pionowej
cyklicznie swój rozmiar, sprawiając wraże- nika kolumn  punktów w linii (pixel_co- (vert_sync_out) odpowiada za sterowanie
nie pulsowania i przy każdym odbiciu od lumn) i licznika wierszy  linii (pixel_row), ruchem kulki. W kolejnych instrukcjach
górnej krawędzi ekranu zmienia również moduł ma również wejścia sygnałów kolo- warunkowych sprawdzane są współrzędne
swój kolor na jeden z trzech kolorów pod- rów podstawowych (red, green, blue) oraz położenia środka kulki  oddzielnie współ-
stawowych (czerwony, niebieski, zielony). wyjścia tych sygnałów (red_out, green_out, rzędna pozioma i pionowa oraz uwzględ-
Obraz wyświetlany jest w standardowej blue_out). Na wyjściach sygnałów kolorów niany jest rozmiar kulki. Jeżeli kulka osią-
rozdzielczoÅ›ci VGA (640×480) z czÄ™stotli- podstawowych pojawia siÄ™ ten sam sygnaÅ‚ gnęła którÄ…Å› z krawÄ™dzi ekranu nadawana
wością odświeżania równą 60 Hz. co na analogicznych wejściach wtedy, gdy jest odpowiednia wartość zmiennym Bal-
W projekcie wykorzystano fragmenty liczniki kolumn i wierszy wskazują na ak- l_X_motion oraz Ball_Y_motion. Wartości
kodów zródłowych w języku VHDL analo- tywny obszar ekranu (sygnały video_on_h tych sygnałów następnie służą do wylicze-
gicznego projektu autorstwa Douga Hod- oraz video_on_v mają poziom wysoki). nia następnego (podczas trwania następnej
sona, opublikowanego na stronie www. W czasie trwania przednich i tylnych prze- ramki obrazu) położenia kulki  następ-
retromicro.com. Układ opisany w udo- działów wyrównawczych, jak również pod- nych pionowych i poziomych współrzęd-
stępnionym tam projekcie umożliwia wy- czas trwania samych impulsów synchroni- nych położenia środka kulki. Na przykład,
świetlanie obrazu kulki o stałej wielkości, zacji, wyjścia kolorów podstawowych są jeżeli kulka poruszając się w górę ekranu
poruszającej się po ekranie jedynie w osi wyzerowane (obraz jest wygaszany). znalazła się na jego górnej krawędzi (czy-
pionowej. li współrzędna pionowa położenia kulki
Opisywany w artykule układ składa się Moduł animacji ruchu kulki Ball_Y_pos jest równa rozmiarowi kuli Size
z dwóch modułów (komponentów): genera- Moduł jest głównym elementem pro-  lewy górny róg ekranu ma współrzędne
tora sygnałów synchronizacji oraz modułu jektu realizującym wszystkie efekty zwią- [0,0]), wówczas sygnałowi Ball_Y_motion
odpowiedzialnego za animację ruchu kul- zane z ruchem kulki na ekranie monitora. nadawana jest wartość pewnej stałej, któ-
ki na ekranie. W opisie projektu w języku Do modułu musi być dostarczony z genera- ra definiuje szybkość poruszania się kulki
VHDL występuje jeszcze trzeci nadrzędny tora sygnałów synchronizacji impuls syn- po ekranie (a dokładniej szybkość zmian
moduł, który definiuje jedynie strukturę chronizacji pionowej oraz stanu liczników położenia w osi pionowej). W przedsta-
połączenia wspomnianych wcześniej kom- wierszy i kolumn. Z kolei wyjścia kolorów wionym kodzie na list. 2, wartość tej sta-
ponentów. podstawowych red, green, blue tego modu- łej otrzymywana jest poprzez wywołanie
łu powinny być połączone z analogiczny- funkcji conv_std_logic_vector (w języku
Generator sygnałów mi wejściami modułu generatora sygnałów VHDL wielkość liter jest nieistotna), która
synchronizacji synchronizacji. Kod opisujący moduł ani- jedynie dokonuje konwersji liczby całko-
Zadaniem tego modułu jest wytwo- macji ruchu kulki przestawiono na listin- witej (pierwszy argument funkcji) o zada-
rzenie sygnałów synchronizacji pionowej gu 2. nej liczbie bitów (drugi argument funkcji)
i poziomej oraz udostępnienie bieżących W procesie nazwanym RGB_Dsiplay, do typu standardowego std_logic_vector.
zawartości liczników określających współ- jest wyliczana wartość sygnału Ball_on, Zamiast wywoływania tej funkcji można
rzędne położenia wybieranego w danej którego poziom wysoki, przy danych war- również wpisać stałą wartość w kodzie
chwili punktu (plamki) na ekranie moni- tościach liczników kolumn i wierszy ozna- dziesiętnym. W przypadku, gdy kulka osią-
tora. Sposób działania tego modułu jest cza, że aktualnie wybierany (wyświetlany gnęła dolną krawędz ekranu, zmiennej
zdeterminowany strukturą ramki w stan- na ekranie) punkt nie jest punktem tła lecz Ball_Y_motion nadawana jest wartość tej
90 ELEKTRONIKA PRAKTYCZNA 3/2011
Sterownik VGA w układzie FPGA
Listing 1. Kod opisujący moduł generatora sygnałów synchronizacji
wej dla wybranych przerzutników, można
library IEEE;
posłużyć się atrybutem INIT  tak jak po-
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
kazano to na list. 2 (tuż przed instrukcją
use IEEE.STD_LOGIC_UNSIGNED.all;
begin opisu architektury).
entity VGA_SYNC is
Ostatnia sekcja kodu w procesie Move_
port(clock_25Mhz, red, green, blue : in std_logic;
red_out, green_out, blue_out, horiz_sync_out, vert_sync_out: out std_logic;
Ball odpowiada za modulacjÄ™ rozmiaru wy-
pixel_row, pixel_column: out std_logic_vector(9 downto 0));
end VGA_SYNC; świetlanego obiektu. Rozmiar kulki oscylu-
je pomiędzy dwiema wartościami granicz-
architecture sync_gen of VGA_SYNC is
signal horiz_sync, vert_sync : std_logic;
nymi (2 i 24 piksele  stałe, argumenty
signal video_on, video_on_v, video_on_h : std_logic;
funkcji conv_std_logic_vector) i zmienia siÄ™
signal h_count, v_count :std_logic_vector(9 downto 0);
o jeden punkt wraz z każdym narastającym
begin
zboczem impulsu synchronizacji piono-
-- video_on przyjmuje poziom wysoki, gdy ma być wyświetlony obraz
wej.
video_on <= video_on_H and video_on_V;
pixel_row <= v_count; pixel_column <= h_count;
Implementacja
process
Układ projektu można zrealizować
begin
wait until (clock_25Mhz EVENT) and (clock_25Mhz= 1 );
wykorzystujÄ…c np. zestaw ewaluacyjny
ZL9PLD wraz z modułem dipPLD ZL10PLD
-- h_count zlicza piksele poziomo (640 + dodatkowe dla sygnału synchronizazji)
if h_count = 799 then h_count <=  0000000000 ;
z układem XC3S200. Ponieważ w zestawie
else h_count <= h_count + 1; end if;
dostępny jest generator sygnału zegarowe-
-- v_count zlicza wiersze pikseli (480 + dodatkowe dla sygnału synchronizacji)
go o częstotliwości 3,6864 MHz, a genera-
if (v_count >= 524) and (h_count >= 699) then v_count <=  0000000000 ;
elsif h_count = 699 then v_count <= v_count + 1; end if;
tor impulsów synchronizacji wymaga do-
starczenia sygnału zegarowego o częstotli-
-- Synchronizacja zmian wybranych sygnałów z sygnałem zegarowym
red_out <= red and video_on;
wości ok. 25 MHz (dokładnie 25,125 MHz
green_out <= green and video_on;
blue_out <= blue and video_on;
 ale częstotliwość ta nie jest krytyczna,
horiz_sync_out <= horiz_sync;
niewielkie odchyłki od tej częstotliwości
vert_sync_out <= vert_sync;
mogą spowodować jedynie pewne zmia-
end process;
ny rozmiarów obrazu na ekranie moni-
process (h_count)
tora i ułamkowe zmiany częstotliwości
begin
-- Generowanie sygnału synchronizacji poziomej z użyciem h_count
odświeżania), dlatego istnieje potrzeba od-
-- horiz_sync ------------------------------------__________--------
powiedniego powielenia częstotliwości ge-
-- h_count 0 640 659 755 799
neratora z modułu dipPLD, albo wymiany
if (h_count <= 755) and (h_count >= 659) then horiz_sync <=  0 ;
else horiz_sync <=  1 ; end if;
tego generatora. W pierwszym przypadku
z pomocÄ… przychodzi blok syntezera czÄ™-
-- Generowanie sygnału okreśaljącego obszar aktywny ekranu (H)
if (h_count <= 639) then video_on_h <=  1 ;
stotliwości (DCM) wbudowany w układ
else video_on_h <=  0 ; end if;
end process; XC3S200. Syntezer można zaprogramo-
wać tak, aby jego częstotliwość wyjściowa
process (v_count)
begin
była iloczynem częstotliwości wejściowej
-- Generowanie sygnału synchronizacji pionowej z użyciem v_count
i pewnej liczby wymiernej, której wielkość
-- vert_sync --------------------------------------_____------------
-- v_count 0 480 493-494 524
określana jest poprzez nadanie wartości
if (v_count <= 494) and (v_count >= 493) then vert_sync <=  0 ;
odpowiednim atrybutom. Taki sposób za-
else vert_sync <=  1 ; end if;
stosowano w omawianym projekcie. Plik
-- Generowanie sygnału okreśaljącego obszar aktywny ekranu (V)
o nazwie chipIO.vhd, którego fragment po-
if (v_count <= 479) then video_on_v <=  1 ;
else video_on_v <=  0 ; end if; kazano na list. 3 zawiera również, oprócz
end process;
definicji struktury połączenia modułu ge-
end sync_gen;
neratora impulsów synchronizacji i modu-
Å‚u animacji ruchu kulki, opis implemen-
samej stałej co poprzednio lecz z zanego- o jeden bit w lewo trzybitowy sygnał RGB tacji syntezera DCM wraz definicją odpo-
wanym każdym z jej bitów. Nowa składowa podczas każdego odbicia kulki od górnej wiednich atrybutów. Dzięki temu uzysku-
pionowa współrzędnej położenia kulki ob- krawędzi ekranu. Sygnał ten odpowiada je się częstotliwość sygnału zegarowego
liczana jest poprzez zsumowanie jej bieżą- za kolor wyświetlanej kulki (czerwony, bardzo bliską właściwej. Dokładnie jest to
cej wartości z wartością Ball_Y_motion. Po- zielony i niebieski). Jest to uwarunkowane 24,88 MHz  ze względu na ograniczenia
nieważ zgodnie z arytmetyką dwójkową dla zastosowaniem dla sygnału RGB rejestru zakresu odpowiednich współczynników,
n-bitowych liczb A i B, A  B = A + B +1 przesuwającego pracującego w trybie licz- przy danej częstotliwości wejściowej, nie
( prim oznacza negację), gdy kulka osią- nika pierścieniowego ( krążąca jedynka ). jest możliwe uzyskanie częstotliwości wyj-
gnęła dolną krawędz ekranu (Ball_Y_pos Takie użycie rejestru przesuwającego wy- ściowej bliższej nominalnej 25,125 MHz.
+ Size = 479), to od jej pionowej współ- maga, aby po włączeniu zasilania (zała-
rzędnej jest odejmowana stała wartość (+1 dowaniu pliku konfigurującego do układu Jak to zrobić w Verilogu
można tutaj zaniedbać) i kulka porusza się FPGA) w rejestrze została ustawiona jedyn- Dla tych, którzy preferują język opisu
w górę ekranu. Analogicznie oblicza się ka na wybranej pozycji bitu. Domyślnie po sprzętu Verilog (do grona tych osób zalicza
położenie współrzędnej poziomej kulki. załadowaniu pliku konfigurującego wszyst- się również autor niniejszego artykułu),
Dodatkowo, wraz z instrukcjami wa- kie rejestry (przerzutniki) są zerowane. podajemy także wersję projektu opisaną
runkowymi związanymi ze sprawdzaniem W przypadku wykorzystania środowiska w tym właśnie języku.
pionowego położenia kulki, zaimplemento- projektowego Xilinx ISE i narzędzia synte- Verilog jest językiem opisu sprzętu, któ-
wano rejestr przesuwający, który przesuwa zy XST, w celu nadania wartości początko- ry powstał nieco pózniej niż VHDL. Począt-
ELEKTRONIKA PRAKTYCZNA 3/2011 91
NOTATNIK KONSTRUKTORA
kowo służył jedynie do symulacji układów Listing 2. Kod opisujący moduł animacji ruchu kulki
library IEEE;
cyfrowych i dopiero pózniej został zaadap-
use IEEE.STD_LOGIC_1164.ALL;
towany do celów syntezy logicznej. Skład- use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
nia języka Verilog oparta jest na szeroko
entity ball is
rozpowszechnionym języku C, podczas gdy
port(red,green,blue: out std_logic;
składnia VHDL bazuje na obecnie rzadko vert_sync_out: in std_logic;
pixel_row, pixel_column: in std_logic_vector(9 downto 0));
używanym języku ADA. Język VHDL ma
end ball;
zaawansowane konstrukcje i abstrakcyjne
architecture behavior of ball is
typy danych, które nie występują w Verilo-
signal dir,shift_en, Ball_on : std_logic;
signal Ball_Y_motion : std_logic_vector(9 downto 0);
gu. Dzięki czemu VHDL znacznie bardziej
signal Ball_X_motion, Size : std_logic_vector(9 downto 0);
nadaje siÄ™ do modelowania behawioral- signal Ball_Y_pos, Ball_X_pos : std_logic_vector(9 downto 0);
signal RGB : std_logic_vector(2 downto 0);
nego. Jednak tylko stosunkowo niewielki
attribute INIT : string;
podzbiór instrukcji VHDL akceptowany jest attribute INIT of RGB : signal is  001 ;
begin
przez narzędzia syntezy. Język Verilog z ko-
Red <= RGB(0) when Ball_on =  1 else  1 ;
Green <= RGB(1) when Ball_on =  1 else  1 ;
lei uważany jest za znacznie bliższy sprzę-
Blue <= RGB(2) when Ball_on =  1 else  1 ;
towi niż VHDL. Przyglądając się kodom
-- Ball_on przyjmuje stan wysoki, gdy ma być wyświetlona  kulka
w języku VHDL i Verilog opisującym ten
RGB_Display:
sam projekt, można odnieść wrażenie, że process (Ball_X_pos, Ball_Y_pos, pixel_column, pixel_row, Size)
begin
zazwyczaj kod w języku Verilog jest krótszy,
if ( 0 & Ball_X_pos <= pixel_column + Size) and
bardziej zwarty i przejrzystszy w porówna- (Ball_X_pos + Size >=  0 & pixel_column) and
( 0 & Ball_Y_pos <= pixel_row + Size) and
niu do kodu w języku VHDL.
(Ball_Y_pos + Size >=  0 & pixel_row ) then Ball_on <=  1 ;
else Ball_on <=  0 ; end if;
Na listingach 4...6 (do pobrania z serwe-
end process RGB_Display;
ra FTP) przedstawiono kolejno opisy w jÄ™-
Move_Ball:
zyku Verilog modułu generatora impulsów
process
synchronizacji, modułu animacji ruchu kul- begin
-- Realizuje przesunięcie kulki raz na każdy przedział sychr. V
ki oraz modułu nadrzędnego, definiującego
wait until vert_sync_out event and vert_sync_out =  1 ;
połączenia dwóch pierwszych wymienio-
-- odbicie od góry i dołu ekranu
nych modułów.
if (Ball_Y_pos + Size) >= CONV_STD_LOGIC_VECTOR(479,10) then
Ball_Y_motion <= not CONV_STD_LOGIC_VECTOR(2,10); shift_en <=  0 ;
PodstawowÄ… jednostkÄ… projektowÄ… w jÄ™-
elsif Ball_Y_pos <= Size then
zyku Verilog jest moduł (module), który za- Ball_Y_motion <= CONV_STD_LOGIC_VECTOR(2,10);
if shift_en =  0 then -- realizacja rejestru przesuwnego
wiera zarówno opis interfejsu jak również
RGB <= RGB(1 downto 0) & RGB(2); shift_en <=  1 ; end if;
end if;
opis wnętrza modułu (jego funkcji logicz-
nych). Nie ma tu podziału tak jak w języku
-- wyliczenie następnego pionowego położenia  kulki
Ball_Y_pos <= Ball_Y_pos + Ball_Y_motion;
VHDL, na jednostkÄ™ projektowÄ…  interfejs
(entity) oraz architekturę (architecture). -- odbicie od lewej i prawej krawędzi ekranu
if (Ball_X_pos + Size) >= CONV_STD_LOGIC_VECTOR(639,10) then
W Verilogu, podobnie jak w języku C, rozróż-
Ball_X_motion <= not CONV_STD_LOGIC_VECTOR(2,10);
elsif Ball_X_pos <= Size then
nine są duże i małe litery alfabetu.
Ball_X_motion <= CONV_STD_LOGIC_VECTOR(2,10);
W Verilogu występują dwa podstawowe
end if;
typy danych: wire (i pochodne typu wand,
-- wyliczenie następnego poziomego położenia  kulki
wor, tri) oraz reg. Typ danych wire nie prze- Ball_X_pos <= Ball_X_pos + Ball_X_motion;
chowuje swojej wartości (tak jak zmienna)
-- zmiana rozmiaru  kulki
lecz reprezentuje fizyczne połączenia w mo- if Size >= CONV_STD_LOGIC_VECTOR(24,10) then dir <=  0 ; end if;
if Size <= CONV_STD_LOGIC_VECTOR(2,10) then dir <=  1 ; end if;
delowanym układzie i zwykle stosowany jest
if dir =  1 then Size <= Size + 1;
else Size <= Size - 1; end if;
w kontekście opisu strukturalnego. Danej
typu wire można przypisać wynik tzw. przy- end process Move_Ball;
end behavior;
pisania ciągłego (continuous assignment  in-
strukcja assign) lub sygnał wyjściowy innego
modułu lub bramki logicznej. Typ reg repre- funkcją bieżącego stanu wejść tego układu). w omawianym projekcie jest fragment kodu
zentuje zmienne w języku Verilog. Dla symulatora kod zawarty w bloku always w module animacji ruchu kulki, opisujący
W opisie układów kombinacyjnych oraz instrukcji process wykonywany jest sygnał Ball_on (proces RGB_Display w opi-
w przedstawionym projekcie zastosowano wówczas, gdy nastąpi zmiana wartości sy- sie VHDL  list. 2 i analogiczny blok always
dwie zasadnicze techniki kodowania: wy- gnału znajdującego się na liście wrażliwości. w opisie Verilog  list. 5). Należy zwrócić
korzystanie przypisania do sygnału (signal Drugim istotnym warunkiem opisu układu uwagę na znaczenie poszczególnych opera-
assignment) w VHDL (np.: pixel_row <= kombinacyjnego jest to, aby tak organizować torów w języku Verilog. Postać operatorów
v_coint;) i odpowiadającemu mu przypisania przypisania wartości do sygnału reprezentu- jak i ich znaczenie są tutaj niemal identyczne
ciągłe (continuous assignment) w Verilogu jącego wyjście układu kombinacyjnego, aby jak w języku C. W języku VHDL operator  &
(np.: assign pixel_row = v_count;) oraz wyko- w każdej ścieżce procesu (bloku always) war- jest operatorem sklejania (konkatenacji  ten
rzystanie sekcji proceduralnej always w Veri- tość tego wyjścia była określona (w układach sam operator w Verilogu ma postać  {...} ).
logu i instrukcji process w VHDL, wraz z od- kombinacyjnych nic nie może być pamięta- W Verilogu  & , podobnie jak w języku C,
powiednio sformułowanymi listami wrażli- ne z poprzedniego stanu). Niespełnienie tego oznacza operator iloczynu bitowego. Użycie
wości (sensitivity list). Lista wrażliwości blo- warunku spowoduje, że narzędzia syntezy operatora sklejania w kontekście takim jak
ku always (Verilog) i process (VHDL) musi wywnioskujÄ… z takiego opisu, dla danego w procesie RGB_Display oznacza  poszerze-
zawierać nazwy wszystkich sygnałów, które wyjścia, przerzutnik typu zatrzask. nie sygnału (wektora) Ball_X_pos do 11 bi-
są wejściami opisywanego układu kombina- Przykładem drugiego z wymienionych tów ( doklejany bit MSB jest wyzerowany).
cyjnego (wyjście układu kombinacyjnego jest sposobów opisu układu kombinacyjnego Taki zabieg nie jest konieczny, jeżeli zapew-
92 ELEKTRONIKA PRAKTYCZNA 3/2011
Sterownik VGA w układzie FPGA
Listing 3. Kod opisujący moduł nadrzędny projektu zegarowy (ogólnie: niezależnie od języka
entity chipIO is
HDL, dla opisu układów sekwencyjnych
port(
pin_sysclk : in std_logic;
lista wrażliwości może zawierać jedynie
pin_vga_red : out std_logic;
sygnał zegarowy, zerujący lub ustawiający)
pin_vga_green : out std_logic;
pin_vga_blue : out std_logic;
i pierwszÄ… instrukcjÄ… procesu w postaci: if
pin_vga_hsync_n : out std_logic;
pin_vga_vsync_n : out std_logic (clock_25Mhz event) and (clock_25Mhz =
);
 1 ) then. W języku Verilog również można
end chipIO;
architecture arch of chipIO is
modelować układy sekwencyjne wykorzy-
signal sysClk : std_logic;
stując blok always z pustą listą wrażliwości.
component VGA_SYNC
Wówczas wewnątrz bloku always stosuje się
port( clock_25Mhz : in std_logic;
red, green, blue : in std_logic; instrukcję (jedną lub więcej  kod pomiędzy
red_out, green_out, blue_out : out std_logic;
tymi instrukcjami opisuje pojedynczy stan
horiz_sync_out, vert_sync_out : out std_logic;
pixel_row, pixel_column : out std_logic_vector(9 downto 0));
automatu) w postaci: @(posedge clk), której
end component;
skutkiem jest zwieszenie wykonywania in-
signal vga_pixel_row : std_logic_vector(9 downto 0);
strukcji bloku do momentu wystÄ…pienia na-
signal vga_pixel_column : std_logic_vector(9 downto 0);
signal vga_vert_sync_out : std_logic; rastającego zbocza sygnału clk (podobnie jak
wait until (clk event) and (clk =  1 ) w VHDL).
component ball
port( signal red,green,blue : OUT std_logic;
Taki sposób opisu w Verilogu określa się jako
signal vert_sync_out : in std_logic;
projektowanie z dokładnością cyklu (cycle
signal pixel_row, pixel_column : in std_logic_vector(9 downto 0));
end component;
accurate design). Jednak ten sposób nie jest
component DCM wspierany przez niektóre narzędzia syntezy,
port(CLKFX: out std_logic;
w tym również przez XST Xilinxa. Dlatego
CLKIN: in std_logic);
end component;
też w projekcie zastosowano klasyczny spo-
sób opisu układu sekwencyjnego z blokiem
attribute CLKFX_MULTIPLY: integer;
attribute CLKFX_DIVIDE: integer;
always w postaci: always @(posedge cloc-
attribute CLK_FEEDBACK: string;
attribute CLKIN_PERIOD: integer; k_25Mhz) begin ... end. W takim przypadku
attribute CLK_FEEDBACK of VGA_clock: label is  NONE ;
instrukcje bloku wykonywane są za każdym
attribute CLKFX_MULTIPLY of VGA_clock: label is 27;
attribute CLKFX_DIVIDE of VGA_clock: label is 4;
razem, gdy wystÄ…pi narastajÄ…ce zbocze sy-
attribute CLKIN_PERIOD of VGA_clock: label is 275;
gnału clock_25Mhz.
signal ball_red : std_logic;
W języku Verilog warto również zwrócić
signal ball_green : std_logic;
signal ball_blue : std_logic; uwagę na dwa rodzaje przypisań procedural-
nych: blokujÄ…ce (operator  = ) oraz nieblo-
begin
vgadriver:
kujÄ…ce (operator  <= ). Analogiczne typy
VGA_SYNC
przypisań nie występują w VHDL, a począt-
port map(
clock_25Mhz => sysClk,
kującym użytkownikom Veriloga sprawiają
red => ball_red,
pewne kłopoty. W dużym skrócie przypi-
green => ball_green,
blue => ball_blue,
sanie blokujące ( = ) możemy traktować
red_out => pin_vga_red,
green_out => pin_vga_green,
jako przypisanie natychmiastowe. Wartość
blue_out => pin_vga_blue,
zmiennej, której przypisano wartość z uży-
horiz_sync_out => pin_vga_hsync_n,
vert_sync_out => vga_vert_sync_out,
ciem operatora  = , jest znana już w na-
pixel_row => vga_pixel_row,
stępnej linijce kodu (następnej instrukcji).
pixel_column => vga_pixel_column
);
Przypisanie nieblokujÄ…ce z operatorem  <=
pin_vga_vsync_n <= vga_vert_sync_out;
używane jest w kontekście zdarzeń związa-
nych ze zboczem narastajÄ…cym lub opadajÄ…-
balldriver:
ball
cym wybranego sygnału (zazwyczaj zegara
port map(red => ball_red,
lub sygnału zerującego) i odnosi skutek do-
green => ball_green,
blue => ball_blue,
piero wówczas gdy to zdarzenie wystąpi.
vert_sync_out => vga_vert_sync_out,
pixel_row => vga_pixel_row,
pixel_column => vga_pixel_column);
Podsumowanie
-- pin_sysclk=3.6864MHz, sysClk=24.88MHz
Tworzenie aplikacji z układami FPGA,
VGA_clock : DCM
w których do wizualizacji danych wyko-
port map(CLKIN => pin_sysclk,CLKFX => sysClk);
end arch;
rzystuje siÄ™ monitor VGA, jest stosunkowo
nieskomplikowane. Omawiany projekt nie-
nimy, że prawa strona operatora relacji nie sujący układ sekwencyjny (VHDL  list. 1, wielkim nakładem pracy można uatrakcyj-
przekroczy rozmiaru 10 bitów. W omawia- Verilog  list. 4). W języku VHDL mamy in- nić budując prostą grę zręcznościową na
nym projekcie tak jest (maksymalna wartość strukcję process z pustą listą wrażliwości, wzór znanej gry komputerowej  Arkanoid .
pixel_column + Size to 824  liczba, którą ale na początku znajduje się instrukcja wait. Na przykładzie projektu pokazano
można bez problemu zapisać na 10 bitach), Dalsze instrukcje procesu są wykonywane również możliwość użycia dwóch języków
dlatego też w kodzie w języku Verilog, w tym tylko wówczas, gdy warunek po instrukcji opisu sprzętu: VHDL i Verilog. Przejście od
przypadku zrezygnowano z użycia operatora wait będzie prawdziwy  w tym przypad- opisu układu w jednym języku do opisu
sklejania. ku, gdy wystąpi narastające zbocze sygnału w drugim  w typowych przypadkach  nie
Instrukcja process oraz blok always może zegara (clock_25MHz). Alternatywny opis jest skomplikowane, ale wymaga jednak
służyć również do opisu układów sekwen- w VHDL, dający w wyniku syntezy taki sam pewnej wiedzy.
cyjnych. Rozważmy fragment kodu modułu układ, składałby się z instrukcji process z li- Zbigniew Hajduk
generatora impulsów synchronizacji opi- stą wrażliwości zawierającą tylko sygnał zhajduk@prz-rzeszow.pl
ELEKTRONIKA PRAKTYCZNA 3/2011 93


Wyszukiwarka