Przykładowy projekt
Niniejszy tutorial pokazuje na wybranym przykładzie etapy postępowania, konieczne do wykonania projektu układu cyfrowego, opisanego za pomocą języka opisu sprzętu. Projekt zostanie praktycznie uruchomiony na platformie sprzętowej, wyposażonej w programowalny układ cyfrowy FPGA i konieczne zasoby wejścia / wyjścia. Tutorial prowadzi począwszy od edycji projektu, poprzez jego weryfikację, syntezę logiczną i implementację, a skończywszy na zaprogramowaniu układu FPGA.
Jako przykład posłuży projekt dekodera kodu wyświetlacza siedmiosegmentowego. Konstrukcja pojedynczej cyfry wyświetlacza oparta jest na siedmiu diodach elektroluminescencyjnych (LED), które emitują światło kiedy przepływa przez nie prąd:
Szeregowo włączony rezystor ogranicza prąd płynący przez diodę, aby zapewnić właściwe warunki jej pracy. Praktyczna realizacja powyższego obwodu może wyglądać np. tak:
Każdy segment wyświetlacza to odrębna dioda LED. W praktyce zwykle elektrody jednego rodzaju (np. katody) są ze sobą połączone już w obudowie wyświetlacza, tworząc tzw. wyświetlacz ze wspólną katodą:
Włączenie całego wyświetlacza polega tu więc na podaniu niskiego poziomu napięcia na wspólną katodę, oraz wysokiego poziomu napięcia na anody odpowiadające pożądanym do zaświecenia segmentom. Aby świecąca kombinacja kilku segmentów ułożyła się w rozpoznawalny znak (tutaj: w cyfrę arabską), należy zakodowaną binarnie cyfrę dziesiętną (BCD, Binary Coded Decimal) przekodować na kod wyświetlacza.
Funkcję tę będzie pełnił zaprojektowany przez nas dekoder, który interpretuje informację na 4-bitowym wejściu (Digit) i zamienia ją na kombinację siedmiu bitów sterujących poszczególnymi segmentami (diodami LED) wyświetlacza (SegLED). Reguły transkodowania powinny być zgodne z poniższą tabelą:
Na docelowej dla niniejszego tutorialu platformie uruchomieniowej (płytka Digilent Spartan-3) zastosowano wyświetlacze ze wspólną anodą, co skutkuje odwróceniem poziomów sterowania (wysoki poziom napięcia na wspólną anodę, a niski poziom napięcia na katody poszczególnych segmentów). Jednak - z powodu zastosowania w obwodach anod odwracających polaryzację kluczów tranzystorowych - włączanie całego wyświetlacza (pozycji) odbywa się tutaj także niskim poziomem napięcia. Ponadto na płytce umieszczono aż cztery wyświetlacze siedmiosegmentowe, połączone w jeden moduł sterowany multipleksowo. Jego właściwości nie będą tu jednak w pełni wykorzystywane.
Rozpakowanie i otwarcie projektu
Używane tu oprogramowanie ActiveHDL jest rozbudowanym narzędziem, służącym do projektowania i weryfikacji układów cyfrowych. W ramach niniejszego tutoriala wykorzystywany będzie tylko edytor tekstowy HDL oraz symulator. Środowisko ActiveHDL posłuży także do wywoływania oprogramowania (do syntezy, implementacji, programowania itp.) związanego z dalszą obróbką projektu dla wybranego typu układu programowalnego.
Aby poprawnie otworzyć wyjściową postać projektu należy wykonać kolejno następujące czynności:
zamknąć wszystkie otwarte kopie ActiveHDL
w katalogu C:\My_Designs skasować dotychczasowy folder projektu seg7
tamże otworzyć archiwum seg7.zip i rozpakować je do katalogu C:\My_Designs UWAGA! W razie braku archiwum na dysku można je pobrać z niniejszej strony (na samym dole).
wejść do folderu rozpakowanego projektu i otworzyć plik projektu seg7.aws (UWAGA! Kontakt z serwerem licencji może potrwać nawet kilkadziesiąt sekund !)
zgodzić się (Next) na propozycję konfiguracji licencji (License Configuration)
po otworzeniu projektu, w oknie Design Browser, na fiszce Files powinna być widoczna struktura plików projektu:
otworzyć plik projektu w języku opisu sprzętu VHDL - seg7.vhd
Projektowanie układów cyfrowych za pomocą języków opisu sprzętu
Projekt systemu cyfrowego można wprowadzać przy pomocy edytora graficznego, umieszczając na schemacie elementy i łącząc je, dokonawszy wcześniej syntezy funkcji logicznych. O ile takie podejście jest akceptowalne dla bardzo prostych projektów, to jednak stopień złożoności projektów współczesnych (kilkaset tysięcy...kilka milionów odpowiedników bramek logicznych) nie pozwala już na stosowanie tak niewydajnych narzędzi. Z pomocą przychodzą tu projektantowi narzędzia do automatycznej syntezy (czyli generowania struktury) układów cyfrowych. Edycja projektu (tj. opis jego działania) odbywa się tu na wyższym poziomie abstrakcji za pomocą języków opracowanych specjalnie dla opisu zachowania układów cyfrowych (np.: VHDL, Verilog, języki HLS itp.)
W otworzonym pliku projektu dekodera wyświetlacza w języku VHDL odnaleźć można dwie podstawowe jednostki projektowe: entity i architecture. Pierwsza z nich opisuje tylko interfejs projektowanego modułu, a więc wszystkie wejścia i wyjścia, ich szerokość, typ i ew. inne parametry. Druga z jednostek projektowych opisuje natomiast tylko sposób działania projektowanego modułu.
W jednostce entity przykładowego projektu zadeklarowane są więc następujące sygnały:
Digit : 4-bitowa magistrala wejściowa, wprowadzająca cyfrę BCD,
SegLED : 7-bitowa magistrala wyjściowa, sterująca katodami poszczególnych segmentów wyświetlacza,
i dodatkowo:
Position : 4-bitowa magistrala wyjściowa, służąca do włączania poszczególnych wyświetlaczy (cyfr) poprzez wysterowanie połączonych anod diod LED w obrębie jednego wyświetlacza (cyfry),
DecPoint : 1-bitowe wyjście, sterujące katodą diody LED punktu dziesiętnego.
W jednostce architecture przykładowego projektu, po deklaracji pomocniczej, wewnętrznej, 7-bitowej magistrali Segment, opisano zachowanie się poszczególnych sygnałów wyjściowych:
konstrukcja with Digit select... przypisuje do magistrali Segment kombinacje bitów, powodujące włączenie lub wyłączenie odpowiednich segmentów wyświetlacza w zależności od cyfry podanej na wejście Digit. Należy zauważyć, że specyfikacja stanów odbywa się tu w logice prostej (1 - segment świeci, 0 - segment nie świeci).
klauzula SegLED <= not Segment; odwraca poziomy logiczne dla całej magistrali, aby dostosować je do wymagań fizycznych (0 na katodzie - segment świeci, 1 na katodzie - segment nie świeci)
i dodatkowo:
klauzula Position <= "1110"; powoduje włączenie najmłodszej pozycji i wyłączenie pozostałych pozycji modułu,
klauzula DecPoint <= '1'; powoduje wyłączenie wszystkich punktów dziesiętnych.
Należy tu zauważyć, że zasadnicza, najbardziej czasochłonna do zaprojektowania część architektury, czyli zbiór siedmiu funkcji logicznych, sterujących poszczególnymi segmentami w zależności od wartości cyfry podanej na wejście, w ogóle nie został przez projektanta zsyntezowany (jego struktura jest nieznana na etapie specyfikacji projektu) - tę część pracy wykona bowiem automatyczne narzędzie do syntezy, odciążając tym projektanta od żmudnej syntezy układu "na piechotę". Projektant ograniczył się tu jedynie do wyspecyfikowania zamierzonego efektu działania (podania de facto tablicy prawdy dla funkcji logicznych), nie wnikając w szczegóły ich implementacji.
Kompilacja i symulacja projektu
Przy otwartym oknie pliku projektu seg7.vhd dokonujemy jego kompilacji poprzez naciśnięcie na klawiaturze przycisku funkcyjnego F11. Kompilacja nie powoduje jeszcze wygenerowania struktury układu, realizującej opisane działanie, ale jedynie buduje w pamięci komputera model symulacyjny, pozwalający zweryfikować poprawność kodu wprowadzonego przez projektanta. Po poprawnej kompilacji w oknie konsoli programu (zwykle w dolnej części ekranu) powinien się pojawić raport:
# Compile success 0 Errors 0 Warnings Analysis time : 0.6 [s]
Teraz można już przejść do weryfikacji projektu. W tym celu należy najpierw w oknie Design Browser, na fiszce Files otworzyć plik przebiegów czasowych symulacji waveform.awf. W pliku tym znajdują się tylko dwa najistotniejsze sygnały projektu: wejściowy Digit oraz wyjściowy SegLED. Pozostałe sygnały wyjściowe uznano za trywialne (stałe poziomy), więc nie będą tu poddawane symulacji. Ponieważ każdy z w/w sygnałów jest w istocie magistralą, składającą się z wielu linii, należy je więc rozwinąć (mały znak + na lewo od nazwy każdego z sygnałów magistralnych), aby móc analizować poszczególne bity wchodzące w jego skład.
Dla sygnału wejściowego przypisano już sekwencyjne wymuszenie Binary Counter (widoczne w kolumnie Stimulator). Dzięki niemu podczas symulacji na wejście dekodera będą sekwencyjnie podawane kombinacje czterech bitów, odpowiadające wartościom od 0 do 15 w NKB (Naturalnym Kodzie Binarnym).
Aby przesymulować układ należy:
z menu Simulation wybrać opcję Initialize Simulation,
podczas symulacji można przyciskami + i - na klawiaturze numerycznej dostosowywać powiększenie w poziomie (tzw. podstawę czasu) tak, aby maksymalnie komfortowo móc zweryfikować wyniki symulacji
kilkunastokrotnie nacisnąć na klawiaturze przycisk funkcyjny F5 (Run For)
Każdorazowe naciśnięcie przycisku F5 powoduje wykonanie symulacji dla kolejnego 100ns (umownie) odcinka czasu. Ponieważ czas ten jest równy okresowi wymuszanych zmian na wejściu dekodera, tak więc po każdym naciśnięciu F5 otrzymuje się kolejną liczbę dla dekodera i kolejną kombinację włączonych i wyłączonych segmentów wyświetlacza LED, wygenerowanych na tej podstawie przez dekoder. Należy zweryfikować poprawność dekodera dla wszystkich 16 kombinacji.
Ostateczny wynik symulacji powinien wyglądać jak poniżej. Na koniec należy zatrzymać tryb symulacji, wybierając z menu Simulation opcję End Simulation.
Synteza i implementacja projektu
Dalsza obróbka projektu będzie wykonywana przez zewnętrzne oprogramowanie (do syntezy, implementacji, programowania itp.), dostarczone przez producenta wybranego typu układu programowalnego (tu: Xilinx). Programy te są jednak zintegrowane ze środowiskiem ActiveHDL, a współpraca z nimi będzie się odbywać za pośrednictwem graficznej konsoli Design Flow (fiszka design flow w głównym oknie programu).
Pierwszym krokiem jest wykonanie syntezy opracowanego i zweryfikowanego projektu. Podczas tego procesu przygotowany w języku HDL opis działania układu jest za pomocą złożonych algorytmów zamieniany na model struktury układu, który będzie realizował zaprojektowaną funkcjonalność. Utworzony w wyniku syntezy model co prawda nadal istnieje tylko w zasobach komputera, na którym jest opracowywany, ale jest on już modelem strukturalnym, zawierającym elementy logiczne (bramki, przerzutniki i inne funktory) oraz opisującym połączenia między nimi.
Aby uruchomić syntezę należy na konsoli Design Flow nacisnąć przycisk synthesis. Otworzone zostanie okno logu, w którym pojawiały się będą bieżące raporty z przebiegu procesu syntezy logicznej. Po krótkim czasie synteza powinna zakończyć się sukcesem (poniżej). Okno logu należy wtedy zamknąć przyciskiem Close na dole.
UWAGA! Nie zamykać okna dopóki trwa proces syntezy - wtedy przycisk ma funkcję przerwania procesu (Abort).
Drugim krokiem obróbki projektu jest wykonanie implementacji zsyntezowanego już projektu. Podczas tego procesu otrzymany po syntezie model struktury układu zostaje dopasowany do zasobów konkretnego, wybranego do zaprogramowania układu FPGA. W procesie tym dokonywane jest rozmieszczenie zawartej w modelu logiki stosownie do zasobów docelowego układu oraz rozplanowywane są połączenia między tymi zasobami (dlatego w literaturze proces ten nazywany jest także Place & Route). Na tym etapie poszczególnym sygnałom projektu zostają też przyporządkowane - zgodnie z życzeniami projektanta - konkretne wyprowadzenia docelowego układu programowalnego. Należy tu podkreślić, że efektem działania procesu implementacji jest nadal istniejący tylko w zasobach komputera model struktury układu (tym razem z uwzględnieniem realiów fizycznych), ale oprócz tego uzyskiwany jest tu już plik z danymi, służącymi bezpośrednio do zaprogramowania wybranego układu FPGA.
Przed uruchomieniem implementacji należy upewnić się, że wykonane będą wszystkie etapy obróbki poza budową modelu czasowego (Timing). Poszczególne etapy można włączać / wyłączać na konsoli Design Flow przez kliknięcie myszką w odpowiednie ikonki tuż pod przyciskiem implementation. Prawidłowa konfiguracja narzędzi powinna wyglądać jak poniżej:
Aby uruchomić implementację należy na konsoli Design Flow nacisnąć przycisk implementation. Otworzone zostanie okno logu, w którym pojawiały się będą bieżące raporty z przebiegu procesu implementacji. Po krótkim czasie implementacja powinna zakończyć się sukcesem (poniżej, ostrzeżenia są dopuszczalne). Okno logu należy wtedy zamknąć przyciskiem Close na dole.
UWAGA! Nie zamykać okna dopóki trwa proces implementacji - wtedy przycisk ma funkcję przerwania procesu (Abort).
Programowanie i testowanie układu
Układ będzie uruchamiany na platformie uruchomieniowej Digilent Spartan-3 Starter Board.
Aby zaprogramować układ, należy z konsoli Design Browser uruchomić program do konfiguracji układu programowalnego: Analysis | iMPACT.
Po otwarciu programu należy wczytać projekt konfiguratora, dostosowany do docelowej platformy uruchomieniowej (tu: płytki Digilent Spartan-3 Starter Board). Projekt umieszczony jest w ścieżce:
C:\My_Designs\seg7\implement\seg7.ipf
Po otwarciu projektu konfiguratora, w oknie Boundary Scan, dla układu xc3s200 / seg7.bit ...
...uruchomić menu kontekstowe (prawy przycisk myszy) i wybrać opcję Program. Po załadowaniu do układu programowalnego danych konfiguracyjnych powinien zostać wyświetlony komunikat o powodzeniu...
... a wyświetlacz na płytce powinien zaświecić.
Teraz należy przetestować działanie dekodera, wymuszając przy pomocy czterech połączonych z wejściami dekodera przełączników (zaznaczonych na rysunku) kolejno wszystkie możliwe kombinacje i obserwując zachowanie się wyświetlacza LED.
Zadania samodzielne
Zadanie 1
Zaprojektowany dotychczas dekoder cyfr BCD posiada pewną ułomność. Dla cyfr 6 i 9 kombinacje sterujące wyświetlaczem nie powodują włączenia niektórych segmentów (odpowiednio segmentu A i segmentu D). Należy dokonać odpowiednich zmian w kodzie VHDL, przeprowadzić symulację, syntezę, implementację, zaprogramować układ i przetestować, czy zmiany zostały skutecznie wprowadzone.
Zadanie 2
Po wprowadzeniu powyższych zmian możliwe jest już odróżnienie cyfry 6 od litery b. Tak poprawiony układ należy teraz rozbudować do dekodera cyfr HEX (szesnastkowych). Ponownie należy dokonać odpowiednich zmian w kodzie VHDL, przeprowadzić symulację, syntezę, implementację, zaprogramować układ i przetestować, czy zmiany zostały skutecznie wprowadzone.