Fonksiyon hesaplama değerleri veya davranış tanımlaması için bir algoritmanın tanımlı olduğu alt programdır. Fonksiyonun önemli özelliği belirli bir tipe ait değerde dönüş sağlamasıdır. Fonksiyonun bu özelliği diğer alt program tiplerinden en önemli farkıdır. Aşağıda VHDL dilinde fonksiyon tanımlama sözdizimi verilmiştir.
function fonksiyon_adi (fonksiyon_girisleri : giris_tipleri) return donus_tipi is tanımlamalar begin Sıralı Söz dizimleri end fonksiyon_adi;
Aşağıda ayni_giris isimli fonksiyonda 4 bitlik giriş sinyallerinin bir biri ile aynı olması durumunda 1 aksi durumda 0 döndürülmektedir. ayni_giris fonksiyonun in_giris_1 ve in_giris_2 bitleri std_logic_vector tipinde 4 bit olarak tanımlanmıştır. Fonksiyonun döndürdüğü değer ise std_logic tipindedir.
function ayni_giris(in_giris_1, in_giris_2 : std_logic_vector(3 downto 0)) return std_logic is begin if in_giris_1 = in_giris_2 then return '1'; else return '0'; end if; end ayni_giris;
Bir başka örnekte ise toplayici_4_bit fonksiyonu ile 4 bitlik toplayıcı işlemi gerçekleştirilmektedir. 1. satırda fonksiyon tanımlama işlemi yapılmıştır. Tanımlama işleminde in_giris_1 ve in_giris_2 ifadeleri 4 bitlik std_logic_vector tipinde ve in_giris_elde ifadesi bir bitlik std_logic tipindedir. Fonksiyon std_logic_vector tipinde değer döndürmektedir. 19. satırda ise toplama sonucun tutulduğu 5 bitlik std_logic_vector tipindeki v_toplam değişkeni döndürülmektedir.
function toplayici_4_bit (in_giris_1, in_giris_2 : std_logic_vector(3 downto 0); in_giris_elde: std_logic) return std_logic_vector is variable v_elde : std_logic; variable v_toplam : std_logic_vector(4 downto 0); begin v_elde:= in_giris_elde; v_toplam := (others => '0'); for n_i in 0 to 3 loop v_toplam(n_i) := in_giris_1(n_i) xor in_giris_2(n_i) xor v_elde; v_elde := (in_giris_1(n_i) and in_giris_2(n_i)) or (in_giris_1(n_i) and v_elde) or (in_giris_2(n_i) and v_elde); end loop; v_toplam (4) := v_elde; return v_toplam; end toplayici_4_bit;
Örnek 1. Yukarıda tanımlanan toplayici_4_bit fonksiyonunun kullanıldığı function_ornek.vhd VHDL kodu aşağıda verilmiştir. Kodda fonksiyon tanımlama işlemleri 16-35. satırlar arasında yapılmaktadır. 41. satırda toplayici_4_bit fonksiyonu çağrılmaktadır. Fonksiyon girişleri in_giris_1, in_giris_2 ve in_giris_elde giriş portlarıdır. Fonksiyonun dönderdiği değer r_toplama_sonuc sinyaline atanmaktadır. 43. satırda toplama sonucu out_cikis çıkış portuna r_toplama_sonuc sinyalinin sağdan 4 biti atanmaktadır. 44. satırda elde sonuç değeri out_cikis_elde portuna r_toplama_sonuc sinyalinin en anlamlı biti atanmaktadır.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity function_ornek is Port ( in_giris_elde : in std_logic; in_giris_1 : in std_logic_vector(3 downto 0); in_giris_2 : in std_logic_vector(3 downto 0); out_cikis : out std_logic_vector(3 downto 0); out_cikis_elde : out std_logic ); end function_ornek; architecture Behavioral of function_ornek is function toplayici_4_bit (in_giris_1, in_giris_2 : std_logic_vector(3 downto 0); in_giris_elde: std_logic) return std_logic_vector is variable v_elde : std_logic; variable v_toplam : std_logic_vector(4 downto 0); begin v_elde := in_giris_elde; v_toplam := (others => '0'); for n_i in 0 to 3 loop v_toplam(n_i) := in_giris_1(n_i) xor in_giris_2(n_i) xor v_elde; v_elde := (in_giris_1(n_i) and in_giris_2(n_i)) or (in_giris_1(n_i) and v_elde) or (in_giris_2(n_i) and v_elde); end loop; v_toplam (4) := v_elde; return v_toplam; end toplayici_4_bit; signal r_toplama_sonuc : std_logic_vector(4 downto 0) := (others => '0'); begin r_toplama_sonuc <= toplayici_4_bit(in_giris_1, in_giris_2, in_giris_elde); out_cikis <= r_toplama_sonuc(3 downto 0); out_cikis_elde <= r_toplama_sonuc(4); end Behavioral;