VHDL/Jednostki projektowe
Projekty urządzeń opisywanych w języku VHDL składają się z tzn. modułów, komponentów, lub ogólnie jednostek projektowych. W dalszej części artykułu będzie stosowany zwrot komponent.
Hierarchizacja projektu
edytujKażde urządzenie, samo w sobie jest traktowane jako jeden komponent (jako jedna całość). Jednocześnie urządzenie główne może być zbudowane z pomniejszych komponentów (czyli prostszych urządzeń spełniających konkretne funkcje), które dopiero po połączeniu tworzą jedną całość.
Ponieważ, każdy z komponentów sam w sobie często traktowany jest jako osobny projekt, prowadzi to do zależności pomiędzy poszczególnymi komponentami, którą dalej nazywać będziemy hierarchią projektu.
Opis komponentu
edytujOpis każdego komponentu składa się z dwóch części:
- opisu interfejsu - czyli deklaracji rodzajów portów oraz ich typów
- opis architektury - czyli opis tego jak zbudowany jest komponent (może istnieć wiele architektur dla jednego interfejsu)
Taka budowa opisów komponentów podyktowana jest tym, że architekturę komponentu o ściśle określonym interfejsie często można opisać na różny, ale równoważny pod względem funkcjonalnym, sposób.
Deklaracja interfejsu komponentu
edytujPrzykładowa deklaracja interfejsu komponentu o nazwie nazwa_komponentu wygląda następująco:
entity nazwa_komponentu is
[ generic deklaracje_generyczne ]
port ( nazwa_portów1 : rodzaj_portów typ_portów;
nazwa_portów2 : rodzaj_portów typ_portów
);
end nazwa_komponentu;
Rodzaje portów
edytujKażdy z portów ma przypisany do siebie typ, określający jaki typ sygnału przez niego przepływa, oraz rodzaj. Rodzaj sygnału określa w którą stronę może następować przepływ sygnału należącego do interfejsu komponentu. Wyróżnia się następujące rodzaje portów:
- in - określa port wejściowy komponentu
- out - określa port wyjściowy komponentu
- inout - określa port, który może pełnić role portu wyjściowego, albo wejściowego (ale nie obu naraz)
- buffer - określa port, który może pełnić role portu wyjściowego, lub wejściowego (a więc i obu naraz)
Deklaracje generyczne (opcjonalne)
edytujDeklaracja generic jest opcjonalna i określa lokalne stałe użyte do opisu czasu i rozmiaru wewnątrz komponentu. Generic może mieć wartość domyślną.
generic ( nazwa_stalej1 : typ_stalej [ := wartosc ]; nazwa_stalej2 : typ_stalej [ := wartosc ]; );
Deklaracja architektury komponentu
edytujPrzykładowa deklaracja architektury komponentu o nazwie nazwa_komponentu wygląda następująco:
architecture nazwa_architektury of nazwa_komponentu is [cześć deklaratywna] begin [cześć opisowa] end nazwa_architektury;
Opis Architektury
edytujOpis architektury składa się z dwóch zasadniczych części:
- deklaratywnej
- opisowej
Cześć deklaratywna
edytujZnajduje się miedzy słowami kluczowymi is oraz begin. W jej obrębie można zawrzeć następujące informacje:
Deklaracja sygnału wewnętrznego
edytujsignal nazwa_sygnałów : typ_sygnałów ;
Przykładowo:
signal sygnał_wewnętrzny1, sygnał_wewnętrzny2 : std_logic;
signal sygnał_wewnętrzny3 : std_logic_vector(3 downto 0);
Deklaracja podkomponentu
edytujcomponent nazwa_podkomponentu port ( nazwa_portów1 : rodzaj_portów typ_portów; nazwa_portów2 : rodzaj_portów typ_portów ); end component nazwa_podkomponentu;
Część opisowa
edytujPrzykłady kodu
edytujPrzykładami kodu wykorzystującymi informacje zawarte w tym rozdziale są:
- Bramka NAND - prosta deklaracja interfejsu wraz z opisem architektury
- Bramka XOR - komponent zbudowany z bramek NAND i posiadający sygnały wewnętrzne