Ćwiczenie 4 Kaskadowanie liczników 1. Opis projektu tworzonego w dalszej części instrukcji Celem ćwiczenia jest zapoznanie się ze sposobem kaskadowania liczników synchronicznych. Tutorial składa się z następujących etapów: - utworzenia projektu w programie Active-HDL; - utworzenia schematu Top; - zbudowania podzielnika częstotliwości przez 1 000; - sprawdzenia w symulacji czy dzielnik częstotliwości działa prawidłowo; - rozbudowania podzielnika częstotliwości tak by dzielił przez 100 milionów; - zweryfikowania na płycie ewaluacyjnej poprawnego działania dzielnika częstotliwości przez 100 milionów. 2. Tworzymy nowy projekt w Active HDL a) Uruchomić program Active-HDL. Można użyć ikony na pulpicie lub wybrać z menu start Wszystkie programy a następnie Aldec -> Active-HDL 9.3. UWAGA! Program uruchamia się dobre 30-40 sekund nie dając oznak życia cierpliwości Rys. 1. Uruchomienie programu Active-HDL. b) Pojawi się okno wyboru licencji. Wybrać Next. Rys. 2. Okno wyboru licencji. 1
c) W oknie Getting Started wybrać utworzenie nowej przestrzeni roboczej i kliknąć OK. Rys. 3. Okno pozwala otworzyć istniejącą przestrzeń roboczą lub utworzyć nową. d) W kolejnym oknie nadaje się nazwę przestrzeni roboczej oraz ustawia jej położenie na dysku. Proszę nadać unikalną nazwę, tak by nie nadpisywać czyjegoś projektu, np. Pon_1615_Cw4. Nazwa musi zaczynać się od litery po czym mogą występować litery, cyfry i znaki podkreślenia _. Znak podkreślenia nie może być na końcu ani w sąsiedztwie drugiego znaku podkreślenia. Nie używać polskich liter ani znaku spacji (dotyczy to też ścieżki na dysku twardym)! Proszę nie zmieniać ścieżki okresowo czyścimy komputery. Rys. 4. Wybór nazwy i położenia dla tworzonej przestrzeni roboczej. e) W kolejnym oknie wybrać opcję Create an Empty Design with Design Flow. W efekcie, dołożymy do przestrzeni roboczej pusty projekt i będziemy mieć aktywny tzw. Design Flow (niezbędny aby wgrać później projekt na płytkę ewaluacyjną; w razie pomyłki się nie przejmować gdyż Design Flow można łatwo aktywować w ustawieniach istniejącego projektu). 2
Rys. 5. Wybieramy utworzenie nowego projektu z aktywnym Design Flow. f) W kolejnym oknie mamy możliwość wybrać narzędzia uruchamiane w trakcie syntezy i implementacji. Ważne jest aby wszystkie opcje ustawić tak jak na rysunku poniżej. Zwrócić szczególną uwagę aby Block Diagram Configuration był ustawiony na EDIF Schematic natomiast pole Default HDL Language było ustawione na VHDL. Jeżeli opcje nie były poprawnie wybrane to dokonać zmian a po utworzeniu projektu zawołać prowadzącego zmieni wtedy wartości domyślne w ustawieniach programu tak by na kolejnych zajęciach nie trzeba było nic zmieniać. Rys. 6. Konfiguracja projektu. g) W kolejnym oknie wpisać nazwę projektu, np.: Tutor. Nazwa musi zaczynać się od litery po czym mogą występować litery, cyfry i znaki podkreślenia _. Znak podkreślenia nie może być na końcu ani w sąsiedztwie drugiego znaku podkreślenia. Nie używać polskich liter ani znaku spacji! 3
Rys. 7. Wybór nazwy i położenia projektu. h) Zatwierdzić utworzenie nowej przestrzeni roboczej i nowego projektu. Rys. 8. Ostatnie okno kreatora. 4
3. Schemat Top.bde W poprzednim ćwiczeniu, źródłem impulsów wejściowych był przycisk po każdym jego wciśnięciu licznik zwiększał wartość o jeden. Jednakże, czasami licznik przeskakiwał o kilka wartości. Było to spowodowane drganiami styków w przycisku. Na dzisiejszych zajęciach wykorzystamy generator fali prostokątnej tak by stan licznika był inkrementowany co jedną sekundę bez naszej ingerencji. Okres jednej sekundy odpowiada częstotliwości 1 Hz. Płytka laboratoryjna wyposażona jest w generator 100 MHz czyli musimy zbudować podzielnik aż przez 100 000 000. Na obecnym etapie prac mamy gotową przestrzeń roboczą Pon_1615_Cw4 w której znajduje się jeden projekt o nazwie Tutor. Projekt jest na razie pusty musimy zacząć tworzyć poszczególne pliki projektowe. a) Pobrać materiały pomocnicze i wypakować je do folderu src tworzonego projektu. D:\My_Designs\[nazwa workspace]\tutor\src\ Rys. 9. Zawartość folderu src tworzonego projektu. b) Dołączamy skopiowane pliki do projektu. Po lewej stronie znajduje się okno Design Browser, w którym na poszczególnych zakładkach (Files, Structure, Resources) zobrazowane są zasoby i struktura projektu. Na zakładce Files należy kliknąć dwukrotnie opcję Add New File. W oknie Add New File kliknąć pole Add Existing File. Rys. 10. Dołączanie istniejących plików do projektu. 5
c) W kolejnym oknie zaznaczyć wszystkie pliki i kliknąć przycisk Otwórz. Rys. 11. Wybór plików które zostaną dołączone. d) Wyświetl zawartość pliku Licznik_10.bde i go skompiluj. Każdy poprawnie skompilowany moduł projektu w środowisku AHDL jest do wykorzystania jako komponent na dowolnym poziomie hierarchii projektu. e) W Design Browser ponownie kliknij na Add New Files. W oknie Add New File wybierz typ pliku Block Diagram, wpisz nazwę schematu Top i kliknij OK. Schemat Top.bde będzie głównym schematem projektu. Będzie on zawierał podzielnik częstotliwości oraz licznik dziesiętny. Rys. 12. Utworzenie nowego schematu o nazwie Top. 6
f) Wyświetl bibliotekę symboli elementów cyfrowych Symbols Tolbox. W tym celu poszukaj na górnym pasku programu ikony skrótu Show Symbols Toolbox (S). Rys. 13. Ikona skrótu do wyświetlenia biblioteki elementów. g) Uzupełnij zawartość schematu Top.bde zgodnie z rysunkiem poniżej. Używaj elementów wyłącznie z biblioteki ARTIX7. Rys. 14 Schemat Top.bde. Ne schemacie użyto elementów o nazwach: - BUFGP tuż za terminalem o nazwie M_CLK; - IBUF tuż za terminalami o nazwach M_CLR i M_EN; - Licznik_10 jeżeli nie ma go w Symbols Toolbox to sprawdź czy schemat Licznik_10.bde jest skompilowany; - OBUF przed każdym z terminali wyjściowych LED<n>. W poprzednich projektach używaliśmy podejścia bottom-up, np. rysowaliśmy schemat układu sterującego pojedynczym segmentem, który następnie był użyty na wyższym poziomie hierarchii do stworzenia całego dekodera wyświetlacza, który znów był użyty w hierarchii wyżej Ale Active-HDL wspiera też podejście top-down i z niego skorzystamy dzisiaj. Najpierw utworzymy bloczek podzielnika częstotliwości przez 100 milionów (użyjemy elementu FUB). Następnie, wejdziemy do środka tego podzielnika i stworzymy bloczek dzielnika przez 10. Wejdziemy do środka podzielnika przez 10 i narysujemy jego schemat. Podzielnik przez 10 przekonwertujemy na symbol i użyjemy go do stworzenia schematu dzielącego częstotliwość na początek przez 1 000 (symulacja układu dzielącego przez 100 milionów trwałaby bardzo długo). Sprawdzimy symulacyjnie czy układ działa poprawnie. Po poprawnej weryfikacji działania, rozbudujemy podzielnik tak by dzielił przez docelowe 100 milionów. 7
h) Narysuj bloczek podzielnika częstotliwości. Na pasku z ikonami skrótów kliknij na Fub. Narysuj niebieski prostokąt Rys. 15. Ikona narzędzia do rysowania Fub. Rys. 16. Schemat Top.bde z dołożonym blokiem Fub. Wprowadzamy tu nowy element środowiska edytora schematów BDE Active-HDL tzw. Fub. Jest to ten niebieski symbol ze schematu powyżej. Fub jest bardzo wygodnym modułem projektowym pozwala na bardzo szybkie wprowadzenie podziału w projekcie na bloki funkcjonalne. i) Dorysuj połączenia do elementu Fub. Jeżeli zaczniesz rysować połączenie poza elementem Fub i skończysz rysować na Fubie, to utworzysz pin wejściowy. Jeżeli zaczniesz rysować połączenie klikając najpierw na elemencie Fub i skończysz łączyć na innym elemencie, to utworzysz pin wyjściowy z Fub (zwróć uwagę na czarne trójkąty na krawędzi elementu Fub mają mieć kierunek dokładnie taki jak na rysunku poniżej). Nazwami pinów się nie przejmuj, domyślne nazwy przy ich utworzeniu mogą być inne Rys. 17. Fub z dorysowanymi połączeniami. j) Nadaj nazwy połączeniom dochodzącym do Fub. Dwukrotnie kliknij w przewód, w polu segment wpisz odpowiednią nazwę przewodu. Oczekiwany efekt przedstawiono na rysunku poniżej. Zwróć uwagę, że nazwy pinów elementu Fub otrzymują nazwy przewodów do nich dołączonych. 8
Rys. 18. Nazwy pinów elementu Fub są identyczne jak nazwy przewodów do nich dołączonych. k) Zmień nazwę elementu Fub. Kliknij prawym przyciskiem myszy na elemencie Fub i z menu kontekstowego wybierz Properties Pojawi się nowe okno. Na zakładce General, w polu Fub name wpisz Divider i kliknij OK. Rys. 19. Nadanie nazwy Divider elementowi Fub. l) Utwórz schemat BDE stanowiący zawartość elementu Fub o nazwie Divider. W tym celu ponownie kliknij prawym przyciskiem myszy na Fub ale tym razem wybierz opcję Push. Bardzo ważne jest aby w pojawiającym się oknie był wybrany Block Diagram. Kliknij OK aby zatwierdzić. Rys. 20. Tworzymy schemat reprezentujący zawartość elementu Fub o nazwie Divider. 9
W efekcie, zostanie utworzony plik Divider.bde oraz wyświetlona jego zawartość. Automatycznie zostały wygenerowane terminale ENABLE, CLK oraz CLK_EN tak by zawartość schematu Divider.bde zgadzała się z symbolem Fuba umieszczonego wyżej w hierarchii. 4. Schemat Divider.bde Powiedzmy, że w pierwszym etapie konstrukcji bądź co bądź sporego licznika (mamy dzielić przez 100 milionów!) zaprojektujemy dzielnik przez 10. Do jego budowy wykorzystamy jednak gotowy element biblioteczny. Następnie będziemy kaskadować moduły dzielników przez 10 tak aby uzyskać wymagany stopień podziału. a) W pliku Divider.bde rysujemy poniższy schemat. Rys. 21. Zawartość schematu Divider.bde na obecnym etapie projektu. Po narysowaniu tego niezwykle skomplikowanego schematu sprawdź czy: - jeżeli wstawiałeś terminal wyjściowy CLK_EN, to masz teraz dwa takie na schemacie, pierwszy wygenerował się automatycznie przewiń schemat w prawo Ma być tylko jeden! - zmieniłeś nazwę Fuba na Div_10; - masz poprawny kierunek pinów (czarne trójkąciki na krawędziach Fuba). b) Utwórz schemat BDE stanowiący zawartość elementu Fub o nazwie Div_10. W tym celu kliknij prawym przyciskiem myszy na Fub i wybierz opcję Push. Zwróć uwagę aby w pojawiającym się oknie był wybrany Block Diagram. Kliknij OK aby zatwierdzić. Rys. 22. Tworzymy schemat reprezentujący zawartość elementu Fub o nazwie Div_10. 10
5. Schemat Div_10.bde Tu już wreszcie zaprojektujemy jakąś logikę!!! Aby szybko i sprawnie zaprojektować licznik wykorzystamy element biblioteczny CB4RE. Yyyyyy no więc na wcześniejszych płytkach z układem Spartan 3 to działało natomiast CB4RE z biblioteki Artix7 wymaga uruchomienia syntezy przed implementacją Z tego powodu użyjemy BinCounter, który robi dokładnie to samo co CB4RE ale jest narysowany na bramkach i przerzutnikach a nie opisany w języku VHDL. BinCounter to binarny licznik 4 bitowy (czyli liczy od 0 do 15 po czym się przepełnia) z synchronicznym wejściem kasującym. a) Wyświetl zawartość schematu BinCounter.bde i go skompiluj. b) W pliku Div_10.bde rysujemy poniższy schemat. Etykiety Qn nie są tutaj po kolei! Rys. 23. Zawartość schematu Div_10.bde. Metoda projektowa jest bardzo prosta. Dekodujemy stan 1001 (czyli 9 dziesiętnie) na wyjściach Q0 Q3 i wtedy podajemy poziom logiczny wysoki na synchroniczne wejście kasujące R licznika binarnego CB4RE. Ponieważ wejście R jest synchroniczne, to licznik CB4RE zostanie skasowany dopiero przy kolejnym zboczu narastającym zegara. Oczywiście można zaprojektować taki licznik lepiej ale nam chodzi o projektowanie najszybsze narzędzia do implementacji bardzo skutecznie zminimalizują równania i zoptymalizują realizację projektu w układzie FPGA. Na rysunku poniżej przedstawiono działanie podzielnika częstotliwości. Licznik BinCounter jest taktowany głównym zegarem o częstotliwości 100 MHz. Dodatnie impulsy na sygnale ENABLE, pojawiają się periodycznie i aktywują nam licznik BinCounter na dokładnie jeden takt zegara. Licznik zwiększa wtedy stan o jeden. Aby cyfra 9 trwała dokładnie tyle samo co pozostałe, to po jej wykryciu trzeba zaczekać na kolejny impuls ENABLE i dopiero wyzerować licznik (realizuje to bramka AND2). W przeciwnym razie, stan 9 na wyjściu licznika BinCounter będzie trwał tylko jeden takt zegara CLK. 11
Rys. 24. Wynik symulacji schematu Div_10.bde. c) Zapisz zmiany i skompiluj schemat Div_10 bde. d) Wyświetl zawartość schematu Divider.bde. e) Kliknij prawym przyciskiem myszy na Fub Div_10 znajdujący się na schemacie Divider.bde i wybierz z menu kontekstowego opcję Convert Fub to Symbol. Pojawi się komunikat z informacją że tej operacji nie da się cofnąć. Chcemy kontynuować i klikamy Yes. Konwersja do symbolu pozwoli na wielokrotne użycie elementu Div_10 np. na jego kaskadowanie. f) Rozbuduj schemat Divider.bde tak by dzielił przez 1000. Zadanie sprowadza się do połączenia odpowiedniej liczby elementów Div_10 w łańcuszek. Pamiętaj, że Div_10 dzieli częstotliwość przez 10 (a nie zmniejsza ją o 10). Możesz wzorować się na Rys. 25 ale liczba elementów Div_10 jest tam nieprawidłowa! Rys. 25. Nieprawidłowa realizacja podzielnika przez 1000. g) Zapisz zmiany i skompiluj schemat Divider.bde. 6. Symulacja podzielnika przez 1000 a) Wybieramy schemat który chcemy symulować. W tym celu należy rozwinąć listę Top-level selection znajdującą się w Design Browser i wybrać Divider. Jeżeli nie ma go na liście, to schemat nie został wcześniej skompilowany (lub kompilacja zakończyła się błędem). b) Inicjalizujemy symulację poprzez wybranie z menu głównego programu opcji Simulation -> Initialize Simulation. W oknie Design Browser automatycznie przełączy się zakładka z Files na Structure, obrazującą strukturę projektu (jego elementy i połączenia w ujęciu hierarchicznym). c) Otwieramy okno przebiegów czasowych, przyciskając na pasku narzędzi przycisk New Waveform. Rys. 26. Ikona skrótu otwierająca okno do analizy działania układu. d) Dodaj sygnały które będą obserwowane w symulacji. Aby w oknie przebiegów czasowych móc edytować wymuszenia i obserwować zmiany stanów sygnałów w funkcji czasu, należy wprowadzić do niego wybrane ze struktury projektu sygnały. Ponieważ przykładowy projekt podczas symulacji będzie traktowany jako czarna skrzynka, to wystarczy że do okna przebiegów czasowych dodamy tylko terminale wejściowe (CLK, ENABLE) i wyjściowe (CLK_EN). 12
W tym celu, w oknie Design Browser należy zaznaczyć powyższe sygnały i przenieść je (metodą drag-and-drop) do okna przebiegów czasowych. e) Do wszystkich sygnałów wejściowych przypisujemy wymuszenia, czyli mechanizm pozwalający dokonywać zmian na wejściu symulowanego układu. W tym celu zaznaczamy sygnały CLK i ENABLE, klikamy prawym przyciskiem myszy na zaznaczonych sygnałach i wybieramy z menu kontekstowego opcję Stimulators Jeżeli w menu nie ma Stimulators... to proszę wybrać z głównego menu programu Tools -> Preferences Pojawi się okno, w którego lewej części zaznaczamy Waveform Viewer/Editor. W prawej części okno zmieniamy Default waveform viewer/editor na Standard Waveform Viewer/Editor. Jeżeli nie da się rozwinąć listy, to proszę zatrzymać symulację i spróbować ponownie. Dla sygnału CLK Wybieramy rodzaj wymuszenia z listy Type w naszym przypadku będzie to zegar czyli Clock. Zmieniamy okres zegara na 1 ns (będzie się łatwo liczyło) i klikamy Apply (pojawi się wtedy parawka obok nazwy sygnału). Rys. 27. Dla sygnału zegarowego przypisujemy wymuszenie w postaci Clock. Dla sygnału ENABLE Wybieramy rodzaj wymuszenia z listy Type Value. Z rozwijanej listy wybieramy Force value: 1. Klikamy Apply (pojawi się wtedy parawka obok nazwy sygnału). Rys. 28. Przypisanie wymuszenia Value do sygnału ENABLE. 13
f) Wykonujemy symulację krokowo. Każde kliknięcie przycisku Run For powoduje wykonanie kroku symulacji o długości podanej w polu tekstowym znajdującym się tuż obok. Ponieważ nasz dzielnik ma dzielić sygnał zegarowy przez 1000, to należałoby wykonać co najmniej 1000 taktów zegara. Zamiast klikać 10 razy, można zmienić wartość pola na np. 1010 ns i wykonać jeden krok symulacji. Rys. 29. Każde kliknięcie przycisku Run For spowoduje wykonanie kolejnych 1010 ns symulacji. Nigdy nie klikamy przycisku Run. Nie mamy zdefiniowanego końca symulacji, przez co będzie się ona wykonywać w nieskończoność. W efekcie zapchamy pamięć RAM i komputer zacznie przymulać lub w skrajnym przypadku się zawiesi. Jeżeli kliknąłeś Run, to jak najszybciej kliknij End Simulation (symbol Stop). g) Sprawdź czy podzielnik działa prawidłowo. Sygnał wyjściowy CLK_EN powinien mieć niski poziom logiczny praktycznie cały czas. Z wyjątkiem chwili czasowej tuż przed 1000 ns, gdzie na jeden takt zegara powinien przełączyć się do poziomu wysokiego. Rys. 30. Wynik symulacji podzielnika przez 1000. h) Zatrzymaj tryb symulacji, wybierając z menu Simulation opcję End Simulation. i) Na schemacie Divider.bde dołóż kolejne symbole Div_10 tak by układ dzielił przez 100 milionów (a nie przez 1000 jak obecnie). j) Zapisz i skompiluj schemat Divider.bde. k) Zapisz i skompiluj schemat Top.bde. 14
7. Implementacja i programowanie a) Wyświetl zawartość zakładki Design Flow. Rys. 31. Zakładka Design Flow. Jeżeli ikona jest wyszarzona to popełniono błąd na etapie zakładania projektu (wybrano złą opcję na Rys. 5). Aby aktywować Design Flow, wybierz z głównego menu programu Tools -> Preferences W nowym oknie wybierz z lewej strony Flows i zaznacz opcję Enable Design Flow Manager. b) Wyświetl okno opcji dla implementacji Rys. 32. Wyświetlenie opcji implementacji. Opcje implementacji są bardzo rozbudowane i służą do profilowania sposobu w jaki ma działać oprogramowanie przeprowadzające implementację. Na zajęciach będziemy konfigurować najbardziej podstawowe opcje, pozostawiając pozostałe w ustawieniach domyślnych. c) Wskaż który schemat będzie implementowany. W zakładce Main (patrz poniżej) kliknij przycisk Browse. W nowym oknie przejdź do folderu compile i wybierz plik Top.edn. d) Wskaż na jakim układzie FPGA projekt zostanie zrealizowany. Family: Xilinx 14x ARTIX7 Device: 7a100tcsg324 Speed Grade: -3 15
e) Wskaż plik UCF wiążący nazwy Terminali znajdujących się na schematach z pinami ułożonymi na obudowie układu FPGA. Z rozwijanej listy Constrain File (UCF) Support wybierz opcję Custom constrain file. Następnie kliknij przycisk Browse i wybierz plik Cw4.ucf znajdujący się w katalogu src. f) W tym momencie można już kliknąć OK aby zatwierdzić zmiany. Rys. 33. Ustawienia implementacji. g) Kliknij na ikonie Configure tak by zrobiła się kolorowa. Rys. 34. Ikona Configure musi być kolorowa aby wygenerował się plik *.bin do programowania układu FPGA. h) Uruchom implementację klikając na ikonie implementation. Implementacja projektu składa się z kilku etapów i może zająć do kilku minut! Na górnym pasku widać postęp 16
Ostrzeżeniami, (z grubsza) nie należy się przejmować. Ich liczba nie powinna przekroczyć 7 ostrzeżeń. W przypadku błędu, przewijamy na sam początek logu i szukamy pierwszego błędu od góry (każdy kolejny jest jego następstwem). W szczególności, nie należy pytać prowadzącego gdzie jest plik *.ngd?. Plik *.ngd jest tworzony na koniec etapu translacji. Jeżeli z powodu innego błędu translacja się nie powiedzie, to kolejny etap mapowania wygeneruje błąd o brakującym pliku *.ngd i przerwie proces implementacji. i) Zweryfikować czy wszystkie Terminale zostały poprawnie zaalokowane. Jeżeli 100% bloków IOB jest przyporządkowanych, to znaczy, że dyrektywy z pliku *.ucf zostały uwzględnione. Rys. 35. Sprawdzamy liczbę zaalokowanych Input-Output Blocks (IOB). j) Podłączyć płytkę FPGA do komputera przy pomocy kabla USB. Kabel wepnij w gniazdo PROG znajdujące się na lewej krawędzi płytki. k) Przestaw włącznik POWER (lewy górny róg) do pozycji ON. l) W programie Active-HDL wyświetl zawartość zakładki Design Flow (punkt 7.a). m) Kliknij na ikonie Analysis a następnie kliknij na ikonie impact. Tak, ten program też się długo uruchamia ;D Rys. 36. Uruchomienie narzędzia impact służącego do programowania układu FPGA. n) Jeżeli zobaczysz poniższy błąd to kliknij OK i się nie przejmuj. 17
Rys. 37. Ten błąd można zignorować. o) Jeżeli program zapyta się czy automatycznie utworzyć i zapisać projekt, to zaznacz opcję Don t show this message again i kliknij Yes. Rys. 38. Chcemy aby program przy starcie tworzył nam nowy projekt. p) Jeżeli impact uruchomi się pusty. Kliknij dwukrotnie Boundary Scan. Na białym polu, które się pojawiło kliknij prawym przyciskiem myszy i wybierz Initialize Chain. Rys. 39. Puste okno programu impact. q) Dążymy do tego by zobaczyć poniższe okno. Zostawiamy domyślnie zaznaczoną opcję Configure device using Boundary-Scan (JTAG) i klikamy OK. 18
Rys. 40. Jeśli impact przywita nas tym oknem, to jesteśmy w domu. r) W kolejnym oknie klikamy cokolwiek, byle nie Help. Rys. 41. To okno zamykamy. s) Kliknąć prawym przyciskiem na xc7a100t i wybieramy Assign New Configuration File. Rys. 42. Wskazujemy położenie pliku do programowania układu FPGA. t) Wskazać plik top.bit znajdujący się w folderze D:\My_Designs\[nazwa workspace]\tutor\implement\ver1\rev1\ Pojawi się pytanie czy użyć pamięci nieulotnej PROM zawsze wybierać No. 19
Rys. 43. Nie będziemy używać pamięci nieulotnej PROM. u) Ponownie kliknij prawym przyciskiem na xc7a100t i wybierz Program. Następnie OK. v) Zweryfikuj poprawne działanie projektu. SW<0> steruje sygnałem M_EN. Przestaw go w pozycję Hi. SW<1> steruje sygnałem M_CLR. Przestaw go w pozycję Low Stan licznika jest wyświetlany na diodach LED. Wartość powinna zmieniać się co 1 sekundę. 20