VHDL/Jednostki projektowe

Z Wikibooks, biblioteki wolnych podręczników.

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