WebElektronika

Eljárások a VHDL nyelvben

person access_time 2014.05.05.
A VHDL hardverleíró nyelvben gyakran használnak alprogramokat, azaz függvényeket és eljárásokat. Most az eljárások készítését, használatát ismerhetjük meg példák segítségével.


Nézzük meg az eljárások (procedure) készítésének menetét. Hasonlóan a függvényekhez, megadhatunk eljárásokat felépítményben, processben és csomagban. Az utóbbira láthatunk példát a következő VHDL kódban, amely mind a két alprogram típus (function, procedure) készítésére mutat példát.

A csomag (pelda2.vhd) tartalma :

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

package pelda2 is
    procedure increment (signal A: in std_logic_vector(7 downto 0);
        signal B: out std_logic_vector(7 downto 0));
    
    procedure decrement (signal A: in std_logic_vector(7 downto 0);
        signal B: out std_logic_vector(7 downto 0));

    procedure MUX2 (A, B, SEL : in std_logic; signal Y : out std_logic);

    function hatvany2(A : in integer) return integer;
    function paros(A : in std_logic_vector) return std_logic;

end pelda2;

package body pelda2 is
    procedure increment (signal A: in std_logic_vector(7 downto 0);
                 signal B: out std_logic_vector(7 downto 0)) is
    begin
        B <= std_logic_vector(unsigned(A) + 1);
    end;

    procedure decrement (signal A: in std_logic_vector(7 downto 0);
                 signal B: out std_logic_vector(7 downto 0)) is
    begin
        B <= std_logic_vector(unsigned(A) - 1);
    end;

    procedure MUX2 (A, B, SEL : in std_logic; signal Y : out std_logic) is
    begin
        Y <= (A and not(SEL)) or (B and SEL);
    end;
    
    function hatvany2(A : in integer) return integer is
    begin
        return A * A;
    end;
    
    function paros(A : in std_logic_vector) return std_logic is
    begin
        if A(0) = '1' then
            return '1';
        else
            return '0';
        end if;
    end;
end pelda2;

 

A csomag nem csak ejárásokat, hanem függvényeket is tartalmaz, viszont a tesztelésnél ezeket most nem fogjuk felhasználni.

Készítsünk most egy VHDL file-t (teszt1.vhd), amelynek segítségével tesztelhetjük a csomagban található eljárásokat). Legyen ennek a file-nak a neve : teszt1.vhd.

 

Az eljárásokat tartalmazó VHDL file (teszt1.vhd) :

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.pelda2.all;

entity teszt1 is
    port(Y : out std_logic);
end teszt1;
 
architecture BEH of teszt1 is
signal    jelA :    std_logic_vector(7 downto 0) := X"12";
signal    jelB :    std_logic_vector(7 downto 0) := X"24";

begin

    MUX2('1','0','0',Y);
    process
    begin
        for i in 0 to 10 loop
            increment(jelA, jelA);
            decrement(jelB, jelB);
            wait for 10 ns;
        end loop;
    end process;
end BEH;

 

Látható, hogy a "teszt1.vhd" file-ban egy process található, ugyanis ez felel a tesztvektorok előállításáért.
Készítsünk most egy projektet a VHDL Simili segítségével. Vegyük fel ezt a két file-t (pelda2, teszt1) és fordítsuk le ezeket.
Ezután szimuláljuk le a teszt1.vhd file-t. A szimulációs eredmény az első ábrán látható.


1. ábra   Az eljárások működésének szimulációs eredménye