Jazyk VHDL je jazyk určený k popisu číslicových obvodů. Umožňuje popisovat číslicové obvody strukturálně (popisem zapojení obvodu) nebo behaviorálně (popisem chování obvodu algoritmem). Umožňuje implicitní popis paralelizmu.
Zdrojový kód ve VHDL se skládá z dvou částí. První částí je popis vnější struktury obvodu, prováděný pomocí tzv. entit. Entita představuje jednu komponentu ve VHDL, její rozhraní a nastavení. Můžeme si ji představit i jako jednu součástku elektrického obvodu. K Entitě může být přiřazena jedna, nebo několik architektur, které popisují vnitřní strukturu a chování entity, tedy to co tato součástka dělá. Architektura se pak skládá z jednotlivých procesů, které popisují chování vnitřních bloků obvodu.
K uchovávání stavu se (obdobně jako proměnné v klasických programovacích jazycích používají dvě struktury:
<=
. Do signálu smí zapisovat pouze jeden jediný proces. V obou případech, pokud k signálu přistupujeme (uvnitř nějakého procesu), pak je v něm pořád původní hodnota až do skončení běhu procesu, kde se do něj zapíše nová hodnota. To znamená, že je možné uvnitř procesu provést například výměnu dvou signálů bez pomocné proměnné:ram(0) <= ram(1); ram(1) <= ram(0);
Entita slouží na identifikaci komponenty a popisu jejího rozhraní. Popis entity obsahuje název entity, nastavení pro generické proměnné a zejména popis rozhraní obvodu.
V reálu si to můžete představit jako černej šváb s nožičkama o kterým víte který nožíčky k čemu slouží.
entity invertor_gen is -- počet invertorů generic ( len: integer := 4 ); port ( I : in std_logic_vector (len - 1 downto 0); O : out std_logic_vector (len - 1 downto 0) ); end invertor_gen;
Popisuje vnitřek entity.
Popisovat ji může třemi způsoby, které lze kombinovat:
architecture name_of_architecture of name_of_entity is --architekturu lze ale použítt pi pro jinou entitu -- Deklarační část, je vyhrzena pro deklarace signálů, konstant nebo typů použitých uvnitř architektury begin -- Příkazy (provádějí se paralelně, jsou to procesy) end architecture name_of_architecture;
Proces je vnitřní jednotka architektury (něco podobného jako funkce u běžných programů). V jedné architektuře může být mnoho procesů. Všechny procesy běží vzájemně paralelně (opravdu paralelně, nejedná se o přepínání kontextu jako u programů). Pokud je nutné procesy mezi sebou synchronizovat, je nutné k tomu využít signálů. V hlavičce procesu je jeho název a sensitivity list, což je seznam signálů, které vyvolají jeho spuštění (při simulaci, ve skutečnosti běží proces pořád).
Tělem procesu je pak popis reakce na vstup. Příkazy uvnitř procesu se provádějí sekvenčně, je však nutné si uvědomit chování signálů, se kterými se pracuje uvnitř (viz uchovávání stavu).
name_of_process: process (sensitivity_list) --sensitivity list určuje na jaké vstupy má proces reagovat -- Deklarace proměnných, konstant a typů použitých uvnitř procesu begin -- Sekvenční příkazy end process name_of_process;
Hodinově synchronní sekvenční obvody obsahují jeden základní obrat VHDL a tou je reakce na hodinový signál. Pokud je tento pojmenován např. CLK, pak uvnitř procesu umístíme kód, který zajistí reakci na náběžnou hranu (předpoklad je, že CLK je v sensitivity listu):
if CLK'event and CLK = '1' then -- tělo procesu end if