Principy VHDL

Jazyk pro popis hardwaru. (Hardware Description Language)

Návrh číslicového obvodu probíhá ve třech krocích:

1) Vstup

2) Syntéza

Způsoby popisu číslicového obvodu

VHDL popisuje číslicová zařízení a jednotlivé části pomocí komponent.

Entita

Popisuje rozhraní mezi komponentou a okolím. Rozhraní komponenty se skládá ze signálů rozhraní a generických parametrů. Signály rozhraní mohou být podle směru v módu IN, OUT nebo INOUT.

entity NAND is
  -- parametry
  generic (DATA_WIDTH len: integer := 0);
   -- signály rozhraní
  port (A : in std_logic_vector (DATA_WIDTH-1 downto 0);
        I : in std_logic_vector (len - 1 downto 0);
        O : out std_logic_vector (len - 1 downto 0)
  );
end entity register;

Porty entity jsou speciální signály, se kterými lze provádět omezené operace čtení a zápisu. Kromě své funkce rozhraní entity mohou být použity jako lokální signály v rámcipříslušné architektury.

Architektura

Definuje chování nebo strukturu komponenty. Je vždy svázaná s entitou, která definuje rozhraní s okolím.

architecture name_of_architecture of name_of_entity is
  -- deklarační část
begin
  -- Příkazy (provádějí se paralelně, jsou to procesy)
end architecture name_of_architecture;

Konstrukce jazyka

Příklady popisu

Behaviorální popis

Architektura složena z jednoho a více procesů. Cílem je pouze popsat, jak se mění výstupy v závislosti na změnách vstupních signálů.

architecture behv of NAND is
begin
   nand_proc : process (A, B)
   begin
     Y <= not (A AND B);
   end process nand_proc;
 end behv;

Proces

Senzitivity list procesu – proces je spuštěn, pokud dojde ke změně signálu v senzitivity listu.

name: process (sensitivity list)
  -- declarations
begin
  -- sequential statements
end process name

Strukturální popis

Popisuje, z čeho se daný systém skládá. Komponenty na nejnižší úrovni jsou vždy popsány behaviorálně.

architecture struct of NAND is
  signal ab_and : stdl_logic_vector(7 downto 0);
begin
  and_i: entity work.AND
    port map (In0 => A, In1 => B, Output => ab_and);
  not_i: entity work.NOT
    port map (In0 => ab_and, Output => Y);
end behv;