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;
Elkészítünk most VHDL nyelven egy PWM modult. Természetesen digitális úton állítunk elő PWM jelet.. . . .
Készítünk VHDL nyelven most egy programozható szélességű multiplexert, amelyet azután elhelyezünk egy Spartan 6-os FPGA-ban. A bemenet (és a kiválasztó jel) szélessége paraméteresen állítható be a fordítás előtt.. . . .
Készítünk VHDL nyelven most egy programozható szélességű multiplexert, amelyet azután elhelyezünk egy Spartan 6-os FPGA-ban. A bemenet (és a kiválasztó jel) szélessége paraméteresen állítható be a fordítás előtt.. . . .