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

edytuj

Każ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

edytuj

Opis 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

edytuj

Przykł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

edytuj

Każ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)

edytuj

Deklaracja 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

edytuj

Przykł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

edytuj

Opis architektury składa się z dwóch zasadniczych części:

  • deklaratywnej
  • opisowej

Cześć deklaratywna

edytuj

Znajduje się miedzy słowami kluczowymi is oraz begin. W jej obrębie można zawrzeć następujące informacje:

Deklaracja sygnału wewnętrznego

edytuj
signal 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

edytuj
component 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

edytuj

Przykłady kodu

edytuj

Przykł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