WebElektronika

Függvények a VHDL nyelvben

person access_time 2014.04.04.
A VHDL hardverleíró nyelvben fontos szerepet kapnak az alprogramok. Ezért megismerjük most az egyik alprogramfajtának, a függvénynek az alapjait.


A VHDL hardverleíró nyelvben a különböző alprogramokat széles körben használják. Ilyen alprogram a függvény (function) és az eljárás (procedure). A függvény nem, de az eljárás lehet egyidejű vagy akár sorrendi is.

Ebben a cikkben csak a függvényeket fogjuk átnézni példák segítségével.
A függvény paraméterlistájában csak bemenetet fogad el, és csak egy értékkel tér vissza (return használata).
Függvényeket megadhatunk processben, felépítményben, illetve csomagban. Most ezeket nézzük meg 1-1 példa segítségével.

 

Függvény processben

Nézzük meg a következő példát :

process (….)
  function max (a,b: in std_logic_vector) return std_logic_vector is
  begin
     if a > b then
        return a;
     else
        return b;
     end if;
end max;
  
KI <= max(X, Y);           -- Egyidejű függvényhívás
process(X, Y)
begin
     KI  <=max(X, Y)         -- Sorrendi függvényhívás
end process;
  ...
end;    

Látjuk, hogy a függvény egy processben került megadásra.
 
 

Függvény felépítményben

Felépítményben is meg tudunk valósítani függvényt, erre mutat egy lefordítható példát a következő VHDL kód :

LIBRARY IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity tesztfgv is
    port(X, Y : in std_logic_vector(7 downto 0);
        KI : out std_logic_vector(7 downto 0));
end tesztfgv;

architecture RTL of tesztfgv is

    function max (a,b: in std_logic_vector) return std_logic_vector is
    begin
        if a > b then
            return a;
        else
            return b;
        end if;
    end max;

begin

    KI <= max(X, Y);

-- vagy :
    process(X, Y)
    begin
        KI <=max(X, Y);
    end process;
end RTL;

 

Függvény csomagban

Projekteknél célszerű ezt a megoldást választani, hiszen akkor a projekt összes file-ában meghívhatók a csomagban tárolt függvények.

A csomag általános felépítése a következő :

package csomagnév is
     típusok és altípusok
     alprogramok
     konstansok, jelek, stb.
end csomagnév;
package body csomagnév is
     konstansok
     alprogramok
end csomagnév;


Példa

package :

Library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

package fgv2 is
    function komp(A, B : std_logic_vector) return std_logic;

end;

package body fgv2 is
    function komp(A,B : std_logic_vector) return std_logic is
    begin
        if A = B then
            return '1';
        else
            return '0';
        end if;
    end;
end fgv2;


A kód, ahol felhasználtuk a package-et : 

Library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use work.fgv2.all;

entity fgvteszt is
    port(A, B : in std_logic_vector(15 downto 0);
        AeB : out std_logic);
end fgvteszt;

architecture RTL of fgvteszt is
begin

    AeB <= komp(A,B);      -- ez a függvény a csomagban van
end RTL;