Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie Katedra Elektroniki Technika Cyfrowa Wprowadzenie do laboratorium komputerowego część II
Wstęp W ramach zajęć przedstawione zostaną różne sposoby projektowania przerzutników (flip flops) począwszy od najprostszego przerzutnika wyposażonego jedynie w wejście synchronizujące (zegarowe CLK), wejście danych () i wyjście danych (Q), skończywszy na przerzutnikach wyposażonych w synchroniczne i asynchroniczne wejścia sterujące (zerujące /CLEAR, ustawiające /P oraz zezwalające ). 2
1. Elementy sekwencyjne Proszę uruchomić środowisko projektowe ISE klikając dwukrotnie przyciskiem myszy na ikonie znajdującej się na pulpicie systemu Windows. W narzędziu ISE proszę założyć nowy projekt o nazwie Projekt2. (Przypomnienie) Aby założyć nowy projekt, proszę wybrać opcję New Project z me File. nu File New Project 3
W pierwszym oknie czarodzieja proszę stosownie nazwać projekt i podać ścieżkę dostępu do niego, Name: Projekt2 Location: C:\MyXilinx\Projekt2 (przykładowo) odatkowo proszę umieścić prosty opis projektu w polu escription. np. Projekt zawierać będzie podstawowe, synchroniczne elementy sekwencyjne. Następnie proszę kliknąć na przycisku Next. Next 4
W drugim oknie czarodzieja proszę dopilnować poprawnego wyboru układu FPGA, w którym projekt ma zostać zaimplementowany. (Przypomnienie) Family Artix 7 evice XC7A100T Package CSG324 Speed 2 Resztę opcji proszę pozostawić bez zmian i kliknąć na przycisku Next. Next W ostatnim, trzecim oknie czarodzieja, proszę kliknąć na przycisku Finish. 5
1.1. Elementarny przerzutnik typu Przerzutnik typu jest bodajże najszerzej rozpowszechnionym i najczęściej stosowanym przerzutnikiem ze wszystkich. Jego funkcjonalność sprowadza się do przepisania na wyjście Q stanu wejścia w momencie wystąpienia zbocza narastającego/opadającego synchronizującego sygnału zegarowego CLK. Proszę dodać nowy moduł VHL o nazwie dff do projektu. Moduł powinien posiadać dwa porty wejściowe ( i CLK) oraz jeden port wyjściowy (Q). (Przypomnienie) Aby dodać nowy moduł do projektu, proszę w oknie ISE kliknąć n a przycisku New Source. W oknie czarodzieja proszę zaznaczyć VHL Module i nazwać go stosownie, VHL Module File name: dff po czym proszę kliknąć na przycisku Next. Next 6
W drugim oknie czarodzieja proszę zdefiniować porty wejścia/wyjścia przerzutnika typu. Mo dwa porty wejściowe (CLK i ) oraz jeden port wyjściowy (Q). duł powinien posiadać (Przypomnienie) Port Name: in CLK in Q out Po wprowadzeniu nazw portów, proszę kliknąć na przycisku Next. Next W ostatnim oknie czarodzieja proszę kliknąć na przycisku Finish. Moduł dff opisywać będzie synchroniczny przerzutnik typu wyzwalany zboczem narastającym sygnału zegarowego CLK. Opis jego architektury w języku VHL zamieszczono poniżej. Po zaznajomieniu się z nim (stosowne słowo komentarza umieszczono poniżej), proszę skopiować go w odpowiednie miejsce w pliku dff.vhd. Synchroniczność pracy przerzutnika typu wyraża się poprzez uzależnienie całego procesu od zmian stanu wejścia zegarowego CLK. W przypadku wystąpienia zbocza narastającego w sygnale CLK (funkcja rising edge), na wyjście Q przepisana zostanie wartość z wejścia. W pozostałych przypadkach, wartość na wyjściu Q nieulegnie zmianie (stan pamiętania ostatniego stanu wyjściowego). Przerzutnik jest elementarnym cyfrowym elementem z pamięcią. architecture Behavioral of dff is begin process(clk) begin if(rising_edge(clk)) then Q <= ; end if; 7
end process; end Behavioral; Plik po wprowadzeniu wszystkich zmian proszę zapisać, a następnie przeprowadzić jego syntezę w celu sprawdzenia poprawności opi modułu w języku su VHL. (Przypomnienie) Synthesize XST Wykorzystując czarodzieja proszę dodać do projektu test bench w języku VHL i nazwać go stosownie. (Przypomnienie) New Source VHL Test Bench File name: testb_dff Location: C:\MyXilinx\Projekt2 Po wszystkim proszę kliknąć na przycisku Next. Next 8
W następnym oknie czarodzieja proszę kliknąć na przycisku Next. Ostatnie okno stanowi podsumowanie do nowoutworzonego pliku test bencha. Proszę kliknąć na przycisku Finish. Nowoutworzony plik zostanie automatycznie otwarty w oknie głównym aplikacji ISE. Proszę go zmienić w taki sposób, by wyglądał podobnie jak wzorzec zamieszczony poniżej. W pierwszej kolejności proszę zdefiniować okres przebiegu zegarowego period, jako wynoszący 10 [ns]. Następnie proszę stosownie zmienić zawartość procesu CLK_process i usunąć wszystkie nadmiarowe linijki kodu stworzone przez czarodzieja. Należy jeszcze opisać serię wymuszeń na wejściu przerzutnika. Po wprowadzeniu wszystkich zmian plik należy zapisać. LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY testb_dff IS EN testb_dff; ARCHITECTURE behavior OF testb_dff IS -- Component eclaration for the Unit Under Test (UUT) COMPONENT dff PORT( : IN std_logic; CLK : IN std_logic; Q : OUT std_logic ); EN COMPONENT; BEGIN --Inputs signal : std_logic := '0'; signal CLK : std_logic := '0'; --Outputs signal Q : std_logic; -- Clock period definitions constant period : time := 10 ns; -- Instantiate the Unit Under Test (UUT) uut: dff PORT MAP ( =>, CLK => CLK, Q => Q ); -- Clock process definitions CLK_process : process begin CLK wait for period/2; CLK wait for period/2; end process; 9
-- Stimulus process stim_proc: process begin wait; end process; EN; wait for 2 ns; wait for 2 ns; wait for 2 ns; Po przełączeniu widoku okna drzewa projektu z implementacji na symulację, proszę ustawić czas symulacji na 50 [ns] i uruchomić symulator ISim. (Przypomnienie) Process Properties Simulation Run Time 50 ns Simulate Behavioral Model Proszę dopasować szerokość przebiegów do wielkości okna symulatora (Zoom to Full View). Uzyskany widok powinien przypominać przebiegi zamieszczone poniżej. Przez pierwszych 5 [ns] na wyjściu Q panuje stan nieustalony. Przyczyną jego wystąpienia jest brak zdefiniowanego stanu wyjścia Q przed pojawieniem się zbocza narastającego sygnału zegarowego CLK (brak zdefiniowanego stanu początkowego). Tuż po pojawieniu się pierwszego zbocza narastającego (5 [ns]), na wyjście Q zostaje przerzucony stan z wejścia (w tym przypadku wartość 0 ). Wartość ta utrzymuje się do czasu wystąpienia następnego narastającego zbocza zegarowego (15 [ns]). Ponieważ wartość na wejściu wynosi wtedy 1, toteż na wyjściu Q wystawiony zostaje stan wysoki. Krótkotrwałe wystąpienie stanów 0 (20 22 [ns]) i 1 (22 24 [ns]) przed kolejnym zboczem narastającym sygnału zegarowego, nie wpływa w żaden sposób na stan wyjścia Q. UWAGA! W rzeczywistym układzie reprogramowalnym prawdopodobieństwo pojawienia się stanu nieustalonego w początkowej fazie jego działania jest bardzo niewielkie. zieje się tak ze 10
względ u na występowanie tzw. Power On Reset, czyli operacji zerowania wszystkich elementów elektronicznych w momencie załączenia zasilania układu. Zmieniając zawartość jednej linii kodu VHL opisującej przerzutnik typu można wyeliminować całkowicie zjawisko występowania stanu niesutalonego na wyjściu Q przerzutnika przed pojawieniem się pierwszego zbocza zegarowego, oraz wszystkie nieporządane konsekwencje jakie stan te mo że za sobą pociągnąć zarówno na poziomie symulacji, jak i sprzętowej implementacji. W pliku dff.vhd proszę odszukać entity modułu dff i dodać do linii opisującej port wyjściowy Q zerowy warunek początkowy. Q : out ST_LOGIC := '0' Po zapisaniu wprowadzonej zmiany proszę zapisać plik dff.vhd, a następnie ponownie uruchomić symulację. Uzyskane wyniki powinny przypominać te przedstawione na rysunku poniżej. Zgodnie z oczekiwaniami dodanie warunku początkowego wyeliminowało stan nieustalony na wyjściu Q przed wystąpieniem pierwszego zbocza narastającego w sygnale zegarowym CLK. 11
1.2. Przerzutnik typu z asynchronicznymi wejściami sterującymi Proszę dodać nowy, pusty moduł VHL o nazwie dff_a do projektu. Pusty moduł tworzy się niemal identycznie, jak prezentowano to do tej pory. Różnica objawia się w drugim oknie czarodzieja, gdzie nie definiuje się żadnych portów, a po prostu klika na przycisk Next. o entity modułu dff_a proszę skopiować definicję portów z entity modułu dff, a następnie poszerzyć je o trzy porty wejściowe CLEAR, P i. Poprawną definicję entity modułu dff_a przedstawionio poniżej. entity dff_a is Port ( : in ST_LOGIC; CLK : in ST_LOGIC; : in ST_LOGIC; CLEAR : in ST_LOGIC; P : in ST_LOGIC; Q : out ST_LOGIC:= '0'); end dff_a; o architektury modułu dff_a proszę skopiować zawartość architektury modułu dff, a następnie uzależnić process od zmian stanu na wejściach, CLEAR i P. Asynchroniczność dodatkowych wejść sterujących wymusza konieczność uzależnienia pracy modułu dff_a nie tylko od zmian stanu na wejściu zegarowym CLK, ale również od zmian stanów na wejściach sterujących. Jednocześnie każde z wejść pracuje niezależnie i nie wpływa w żaden sposób na pracę pozostałych. architecture Behavioral of dff_a is begin process(clk, CLEAR, P) begin if(rising_edge(clk)) then Q <= ; end if; end process; end Behavioral; Proszę zdefiniować warunek zerowania przerzutnika w momencie pojawienia się stanu wysokiego na jego wejściu CLEAR. Zerowanie przerzutnika powinno być operacją nadrzędną w stosunku do wszystkich pozostałych jego trybów pracy. W drugiej kolejności proszę zdefiniować warunek wystawienia na wyjściu przerzutnika stanu wysokiego (warunek ustawienia) w momencie wystąpienia stanu wysokiego na wejściu P. Ustawianie powinno być drugim w hierarchii ważności trybem pracy przerzutnika. Proszę zdefiniować warunek normalnej pracy przerzutnika, jako pojawienie się na wejściu zezwalającym stanu 1. Najniższy priorytet powinien posiadać normalny tryb pracy przerzutnika, a więc przepisywanie wartości z wejścia na wyjście Q w momencie wystąpienia narastającego zbocza w przebiegu synchronizującym CLK. Warunek ten został zdefinio wany poprawnie w module dff i nie powinien być zmieniany. Referencyjną zawartość procesu głównego asynchronicznego przerzutnika typu przedstawiono poniżej. 12
if(clear = '1') then Q else if(p = '1') then Q else if(rising_edge(clk)) then if( = '1') then Q <= ; end if; end if; end if; end if; Moduł proszę zsyntezować w celu weryfikacji poprawności jego składni. Proszę utworzyć nowy test bench dla modułu dff_a, przystosować go do symulacji działania testowanego modułu i zdefiniować w nim serię wymuszeń, które umożliwią dokładną obserwację różnych trybów pracy przerzutnika typu z asynchronicznymi wejściami sterującymi. Przykład wymuszeń umieszczono poniżej. -- Stimulus process stim_proc: process begin CLEAR P wait for period*1.25; CLEAR P CLEAR P CLEAR P CLEAR P CLEAR P 13
wait; end process; CLEAR P Po uruchomieniu test bencha wyniki symulacji powinny przypominać te umieszczone poniżej. Brak stanu wysokiego na wejściu zezwalającym wstrzymuje normalną pracę przerzutnika na wyjściu Q utrzymuje się stan poprzedni (sprzed obecnego zbocza narastającego). Stan wysoki tylko na wejściu P wymusza stan wysoki na wyjściu Q przerzutnika. Stan wysoki na wejściu CLEAR wymusza stan niski na wyjściu Q przerzutnika. Nadrzędność wejścia CLEAR nad wejściem P widać pomiędzy 42 a 52 [ns] symulacji, kiedy to na wyjściu Q pojawia się stan niski, pomimo stanu wysokiego na wejściu P. Stan wysoki na wejściu uaktywnia przerzutnik. W 55 [ns] przy narastającym zboczu sygnału zegarowego CLK z wejścia zostaje przepisany stan wysoki na wyjście Q. Trwa on do momentu pojawienia się stanu wysokiego na wejściu zerującym CLEAR. Wejścia CLEAR oraz P sterują pracą przerzutnika asynchronicznie, tzn. odpowiedź na wymuszenie podane na któreś z tych wejść pojawia się natychmiastowo, niezależnie od zegara CLK, na wyjściu Q. 14
1.3. Przerzutnik typu z synchronicznymi wejściami sterującymi Proszę dodać nowy, pusty moduł VH L o nazwie dff_s do projektu. Prócz standardowych portów przerzutnika typu (, CLK, Q) entity modułu dff_s zawierać powinno definicję wejść sterujących, i. Poprawną definicję entity modułu dff_s przedstawionio poniżej. UWAGA! Funkcja synchronicznego portu jest identyczną z funkcją asynchronicznego portu CLEAR (zerowanie przerzutnika), podobnie jak funkcja synchronicznego portu jest identyczna z funkcją asynchronicznego portu P (ustawianie przerzutnika). Różnica nazw portów jest zwyczajowa i ma na celu podkreślenie ich synchroniczności. entity dff_s is Port ( CLK Q end dff_s; : in ST_LOGIC; : in ST_LOGIC; : in ST_LOGIC; : in ST_LOGIC; : in ST_LOGIC; : out ST_LOGIC:= '0'); o architektury modułu dff_s proszę skopiować zawartość architektury modułu dff. Proces powinien być zależny tylko i wyłącznie od zmian stanów na linii zegarowej CLK. Przekłada się to na pracę wszystkich portów przerzutnika synchronizowaną zegarem CLK. Wzorując się na projekcie przerzutnika typu z asynchronicznymi wejściami sterującymi, proszę opisać architekturę przerzutnika typu z synchronicznymi wejściami sterującymi. Wzorcowy kod w języku VHL przedstawiono poniżej. Nadrzędnym warunkiem pracy przerzutnika z synchronicznymi wejściami sterującymi jest wystąpienie narastającego zbocza na wejściu zegarowym CLK. opiero po wystąpieniu takiego zdarzenia interpretowane są stany pozostałych portów wejściowych. Podobnie jak w przypadku przerzutnika z asynchronicznymi wejściami sterującymi, tutaj również sygnał zerujący () ma najwyższy priorytet spośród wszystkich wejść sterujących. Sygnał ustawiający () ma priorytet niższy od sygnału zerującego, ale wyższy od sygnału zezwalającego (). Przepisanie stanu z wejścia na wyjście Q następuje jedynie w przypadku, gdy wystąpiło zbocze narastające sygnału zegarowego CLK, na wejście zezwalające podany jest stan logiczny 1, a pozostałe wejścia sterujące są nieaktywne ( 0 ). UWAGA! Priorytet wejść sterujących jest sprawą czysto umowną i może być zupełnie dowolny. Jedynie od projektanta zależy, które z wejść sterujących będzie posiadać najwyższy priorytet, a które najniższy. Projektując moduł z wejściami sterującymi należy pamiętać, że brak poprawnie zdefiniowanego szeregu instrukcji warunkowych if skutkować może nieoczekiwanym zachowaniem układu (np. ten sam priorytet wejść sterujących i przy jednoczesnym podaniu na oba wejścia wartości 1 doprowadzi do sprzecznej sytuacji, w której na wyjściu miałby się pojawić jednocześnie stan 0 i 1 ). if(rising_edge(clk)) then if( = '1') then Q else 15
if( = '1') then Q else if( = '1') then Q <= ; end if; end if; end if; end if; Moduł proszę zsyntezować w celu weryfikacji poprawności jego składni. Proszę utworzyć nowy test bench dla modułu dff_s, przystosować go do symulacji i zdefiniować w nim serię wymuszeń identyczną jak w przypadku test bencha dla modułu dff_a. Przykład wymuszeń umieszczono poniżej. -- Stimulus process stim_proc: process begin wait for period*1.25; 16
wait; end process; Po uruchomieniu test bencha wyniki symulacji powinny przypominać te umieszczone poniżej. Brak stanu wysokiego na wejściu zezwalającym wstrzymuje normalną pracę przerzutnika na wyjściu Q utrzymuje się stan poprzedni (sprzed obecnego zbocza narastającego). Stan wysoki tylko na wejści wymusza stan wysoki na wyjściu Q przerzutnika, ale dopiero od momentu wystąpienia zbocza narastającego na linii CLK. Stan wysoki na wejściu wymusza stan niski na wyjściu Q przerzutnika, ale podobnie jak w przypadku wejścia, dopiero począwszy od najbliższego zbocza narastającego sygnału taktującego. Nadrzędność wejścia nad wejściem widać pomiędzy 45 a 55 [ns] symulacji, kiedy to na wyjściu Q pojawia się stan niski, pomimo stanu wysokiego na wejściu. Stan wysoki na wejściu uaktywnia przerzutnik. W 55 [ns] przy narastającym zboczu sygnału zegarowego CLK z wejścia zostaje przepisany stan wysoki na wyjście Q. Trwa on do momentu pojawienia się pierwszego zbocza narastającego po wystąpieniu stanu wysokiego na wejściu zerującym. Wejścia oraz sterują pracą przerzutnika synchronicznie, tzn. odpowiedź na wymuszenie podane na któreś z tych wejść pojawia się dopiero po wystąpienia zbocza narastającego sygnału CLK. UWAGA! Obecność wejścia zezwalającego z punktu widzenia programisty może wydawać się zbyteczna, jednak z punktu widzenia projektanta systemów cyfrowych port jest nieodzownym elementem prawie każdego modułu synchronicznego. Podobnie (a)synchronizm wejść sterujących może wydawać się sprawą nieistotą. W rzeczywistości użycie modułów sekwencyjncyh z asynchronicznym trybem pracy może angażować więcej zasobów logicznych FPGA. Z tego też względu zaleca się stosować moduły z synchronicznymi wejściami sterującymi. * Studentów zachęca się do zapoznania się z materiałem dostępnym pod adresem : http://www.eetimes.com/document.asp?doc_id=1278998 oraz publikacjami Xilinx: wp275 oraz wp272 (zamieszczone w dodatkowych materiałach na stronie przedmiotu). Należy to jednak uczynić po wykonaniu tego ćwiczenia. 17
Wizualizacja wyników jest bardzo ważnym elementem każdej symulacji, jednak poszukiwanie miejsca i przyczyny błędu w ten sposób może być niekiedy bardzo męczące. Zwłaszcza gdy liczba wyświetlonych przebiegów jest znacząca. Z pomocą przychodzą wtedy projektantowi poznane już asercje, raporty i komunikaty wyświetlane na standardowym urządzeniu wejścia/wyjścia (w przypadku symulatora ISim jest to okno konsoli). Proszę zmodyfikować główny proces test bencha w taki sposób, by przypominał ten zamieszczony poniżej. -- Stimulus process stim_proc: process variable Message variable edge_current : line; : time; begin edge_current := NOW; write(message, LF); write(message, string'("------- Simulation started -------")&LF); write(message, string'("reset starts at ")); write(message, edge_current); write(message, string'(". ")); write(message, string'("clock is disabled.")&lf); write(message, string'("-------------------------------------")); writeline(output, Message); wait for period*1.25; edge_current := NOW; write(message, string'("--------------------------------------")&lf); write(message, string'("clock enabled at ")); write(message, edge_current); write(message, string'(". ")); write(message, string'("reset is still enabled.")&lf); write(message, string'("--------------------------------------")); writeline(output, Message); edge_current := NOW; write(message, string'("--------------------------------------")&lf); write(message, string'("set enabled at ")); write(message, edge_current); write(message, string'(". ")); write(message, string'("reset is disabled.")&lf); write(message, string'("--------------------------------------")); writeline(output, Message); 18
assert Q /= '0' report "Synchronous reset works" severity NOTE; assert Q /= '1' report "Synchronous reset does not work" severity ERROR; wait; report "Simulation finished with failure" severity FAILURE; end process; W nagłówku pliku proszę również dołączyć bibliotekę odpowiedzialną za obsługę standardowych urzędzeń wejścia/wyjścia. library ST; use ST.TEXTIO. all; Po wprowadzeniu zmian plik proszę zapisać i uruchomić ponownie symulację. Proszę zwrócić uwagę na komunikaty zwracane w oknie konsoli ISim. Przyglądając się zawartości pliku test bencha znaleźć można szereg nieznanych do tej pory funkcji, typów i konstrukcji. Zostaną one teraz omówione dokładniej. 19
W celu wysłania komunikatów do urządzenia wejścia/wyjścia użyto polecenia writeline. Aby móc go użyć należy wpierw zdefiniować zmienną (tak, by jej wartość była uaktualniana natychmiast wewnątrz procesu) typu line (typ ten odnosi się do linii urządzenia wejścia/wyjścia w tym przypadku linii w oknie konsoli). Pierwszym argumentem jaki przyjmuje polecenie writeline jest wskaźnik do urządzenia wejścia/wyjścia, na którym komunikat ma zostać wyświetlony (output standardowe urządzenie wejścia/wyjścia monitor). rugi argument to w artość/wielkość/komunikat, jaki ma zostać wyświetlony. W przypadku konstrukcji writeline(output, Message); będzie to zmienna Message. Zmienna ta pozostaje pusta tak długo, jak długo nie przypisze się do niej jakichś wartości. Służy temu polecenie write przyjmujące dwa argumenty zmienną i treść, jaka do tej zmiennej ma zostać przypisana. Na przykład konstrukcja write(message, LF); oznacza przypisanie do zmiennej Message znaku LF oznaczającego rozpoczęcie nowej, pustej linii (efekt równoznaczny z wciśnięciem klawisza ENTER na klawiaturze). Widoczna w kilku liniach konstrukcja string'(" xxx ") mogłaby zostać zredukowana do samego " xxx ", jednak jej użycie zapewnia poprawną konwersję znaków. Operator & pełni taką samą funkcję jak podczas kontatenacji bitów, a więc skleja ze sobą dwa polecenia, tak że konstukcja write(message, string'("------- Simulation started -------")&LF); prowadzi do przypisania do zmiennej Message komunikatu Simulation started oraz rozpoczęcia nowej linii. Z każdym kolejnym użyciem funkcji write zmienna Message zostaje rozbudowana o szereg kolejnych znaków/wartości. Następuje więc swoista agregacja znaków trwająca tak długo, aż względem zmiennej Message nie zostanie użyte polecenie writeline "opróżniające" jej zawartość. Cechą, która odróżnia komunikaty od asercji i raportow jest możliwość wypisania przy pomocy komunikatów wartości poszczególnych stałych, zmiennych, sygnałów, itp. W ten sposób podawana jest np. informacja odnośnie aktualnego czasu symulacji. o zmiennej edge_current poleceniem edge_current := NOW; przypisany zostaje aktualny czas symulacji. Wartość ta zostaje następnie wpisana do zmiennej Message przy pomocy komunikatu write(message, edge_current); Polecenie report służy do wyświetlenia ciągu znaków i może posiadać jeden z 4 poziomów ważności (severity levels), tj. notatka (NOTE), ostrzeżenie (WARNING), porażka (FAILURE) i błąd (ERROR). W przypadku wystąpienia tego ostatniego symulacja zostaje natychmiast przerwana. Asercja (assert) jest rodzajem raportu, który wyświetlany jest warunkowo. Jeśli warunek asercji nie jest spełniony, wyświetlony zostaje komunikat raportu (z zachowaniem poziomu ważności). W przedstawionym przykładzie sprawdzana jest poprawność działania synchronicznego portu zerującego. 2. Uruchamianie projektu na płycie z układem Artix 7 Wykonując kroki 5 8 z instrukcji "Wprowadzenie do laboratorium komputerowego" zaimplementuj przerzutnik z synchronicznymi wejściami sterującymi. 20
W pliku ucf należy wybrać odpowiednie piny układu FPGA, tak by możliwe było fizyczne sprawdzenie działania układu. Sugeruje się wykorzystanie linii z serii "User Switches" (patrz ucf) do podłączania por tów,,, oraz linii z serii "User Buttons" do podłączenia sygnału zegarowe go CLK*. Możliwe są również inne sposoby podłączenia. Ten punkt wprowadzenia jest ważny, gdyż będzie one realizowany każdorazowo dla wszystkich projektów implementowanych w ramach kolejnych zajęć komputerowych. Studenci będą w ramach implementowanych projektów określać sposób testowania mo w układzie FPGA, co się wiąże z dobrem właściwych wyprowadzeń na płycie z dułu układem Artix 7. * net "CLK" dopięty do przycisków przy implementacji będzie zgłaszać błąd informujący o próbie podłączenie do niededykowanej linii zegarowej. Można go obejść umieszczając w pliku ucf: NET "CLK" CLOCK_EICATE_ROUTE = FALSE ; 21