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