if Sözdizimi
VHDL dilinde if sözdizimi, bir veya birden fazla koşula bağlı olarak, koşulların bağlı olduğu sözdizimlerinden birini seçmektedir ve seçilen koşula ait söz dizim ifadesi gerçeklenmektedir. Eğer koşul ifadelerinin hiç biri sağlanmamış ise bu durumda hiçbir işlem yapılmamaktadır. Aşağıda VHDL dilinde if sözdizimi tanımı verilmiştir. Verilen sözdiziminde if söz dizimi ile ilgili koşul denetlenmektedir. Eğer bu koşul sağlanırsa koşula bağlı sözdizimleri gerçeklenir. Aksi durumda ise elsif söz dizimi ile ilgili koşul denetlenmektedir ve koşul sağlanırsa koşula bağlı sözdizimleri gerçeklenir. Aksi durumda ise else söz dizimi ile ilgili koşullar gerçeklenmektedir.
if koşul then sözdizimi; {sözdizimi;} elsif koşul then Sözdizimi; {sözdizimi;} else sözdizimi; {sözdizimi;} end if ;
Örnek 1: Aşağıda verilen if_ornek_process.vhd VHDL kodunda if sözdizimi process içerisinde kullanılmıştır. out_cikis çıkış portunun alacağı değer 3 farklı koşulda belirlenmektedir. Eğer in_giris_secme giriş port değeri ‘0’ ise out_cikis çıkış portuna in_giris_1 giriş portunun değeri atanmaktadır. Eğer in_giris_secme giriş port değeri ‘1’ ise out_cikis çıkış portuna in_giris_2 giriş portunun değeri atanmaktadır. in_giris_secme giriş port değeri ‘0’ ve ‘1’ haricinde başka değerler alması durumunda ise out_cikis çıkış portuna ‘0’ değeri atanmaktadır.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity if_ornek_process is Port ( in_giris_1 : in std_logic; in_giris_2 : in std_logic; in_giris_secme : in std_logic; out_cikis : out std_logic ); end if_ornek_process; architecture Behavioral of if_ornek_process is begin process(in_giris_1, in_giris_2, in_giris_secme) begin if in_giris_secme = '0' then out_cikis <= in_giris_1; elsif in_giris_secme = '1' then out_cikis <= in_giris_2; else out_cikis <= '0'; end if; end process; end Behavioral;
Örnek 2 : Aşağıda verilen if_ornek_function.vhd VHDL kodunda if sözdizimi function içerisinde kullanılmıştır. seçme_if fonksiyonun döndürdüğü değer out_cikis çıkış portuna atanmaktadır.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity if_ornek_function is Port ( in_giris_1 : in std_logic; in_giris_2 : in std_logic; in_giris_secme : in std_logic; out_cikis : out std_logic ); end if_ornek_function; architecture Behavioral of if_ornek_function is function secme_if(sinyal_1, sinyal_2, sinyal_secme : std_logic) return std_logic is variable sinyal_cikis : std_logic; begin if sinyal_secme = '0' then sinyal_cikis := sinyal_1; elsif sinyal_secme = '1' then sinyal_cikis := sinyal_2; else sinyal_cikis := '0'; end if; return sinyal_cikis; end secme_if; begin out_cikis <= secme_if(in_giris_1, in_giris_2, in_giris_secme); end Behavioral;
case Sözdizimi
Aşağıda VHDL dilinde case sözdizimi tanımı verilmiştir. Verilen sözdiziminde her when ifadesine bağlı sabit değerlerin case sözdizimidne tanımlanmış ifade değerine eşit olması durumunda, o sabit değere ilişkin sözdizimleri gerçklenmektedir.
case ifade is when sabit_deger => Sözdizimi; {Sözdizimi;} when sabit_deger=> Sözdizimi; {Sözdizimi;} .. .. when others => Sözdizimi; {Sözdizimi;} end case ;
Örnek 3 :Aşağıda verilen case_ornek_process.vhd VHDL kodunda case sözdizimi process içerisinde kullanılmıştır. out_cikis çıkış portunun alacağı değer 3 farklı koşulda belirlenmektedir. Eğer in_giris_secme giriş port değeri ‘0’ ise out_cikis çıkış portuna in_giris_1 giriş portunun değeri atanmaktadır. Eğer in_giris_secme giriş port değeri ‘1’ ise out_cikis çıkış portuna in_giris_2 giriş portunun değeri atanmaktadır. in_giris_secme giriş port değeri ‘0’ ve ‘1’ haricinde başka değerler alması durumunda ise out_cikis çıkış portuna ‘0’ değeri atanmaktadır.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity case_ornek_process is Port ( in_giris_1 : in std_logic; in_giris_2 : in std_logic; in_giris_secme : in std_logic; out_cikis : out std_logic ); end case_ornek_process; architecture Behavioral of case_ornek_process is begin process(in_giris_1, in_giris_2, in_giris_secme) begin case in_giris_secme is when '0' => out_cikis <= in_giris_1; when '1' => out_cikis <= in_giris_2; when others => out_cikis <= '0'; end case; end process; end Behavioral;
Örnek 4 : Aşağıda verilen case_ornek_function.vhd VHDL kodunda if sözdizimi function içerisinde kullanılmıştır. seçme_case fonksiyonun döndürdüğü değer out_cikis çıkış portuna atanmaktadır.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity case_ornek_function is Port ( in_giris_1 : in std_logic; in_giris_2 : in std_logic; in_giris_secme : in std_logic; out_cikis : out std_logic ); end case_ornek_function; architecture Behavioral of case_ornek_function is function secme_case(sinyal_1, sinyal_2, sinyal_secme : std_logic) return std_logic is variable sinyal_cikis : std_logic; begin case sinyal_secme is when '0' => sinyal_cikis := sinyal_1; when '1' => sinyal_cikis := sinyal_2; when others => sinyal_cikis := '0'; end case; return sinyal_cikis; end secme_case; begin out_cikis <= secme_case(in_giris_1, in_giris_2, in_giris_secme); end Behavioral;
Örnek 5: Aşağıda verilen case_ornek_type.vhd VHDL kodunda case sözdizimi process içerisinde kullanılmıştır. case sözdiziminde kullanılacak olan sabit değer ifadeleri t_MATH_ISLEM tipinde tanımlanmış olan TOPLA ve CIKAR ifadeleridir. r_MATH_ISLEM sinyali de t_MATH_ISLEM tipinde sinyal olarak tanımlanmıştır. case r_MATH_ISLEM is söz dizimi ile r_MATH_ISLEM sinyalinin TOPLA değerine eşit olması durumunda out_cikis çıkış portuna in_giris_1 ve in_giris_2 giriş port değerlerinin toplamı atanmaktadır. r_MATH_ISLEM sinyalinin CIKAR değerine eşit olması durumunda out_cikis çıkış portuna in_giris_1 ve in_giris_2 giriş port değerlerinin farkı atanmaktadır. r_MATH_ISLEM sinyalinin alacağı diğer durumlarda ise out_cikis değerinin tüm bitlerine ‘0’ atanmaktadır.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_SIGNED.ALL; entity case_ornek_type is Port ( 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) ); end case_ornek_type; architecture Behavioral of case_ornek_type is type t_MATH_ISLEM is (TOPLA, CIKAR); signal r_MATH_ISLEM : t_MATH_ISLEM := TOPLA; begin process(in_giris_1, in_giris_2) begin case r_MATH_ISLEM is when TOPLA => r_MATH_ISLEM <= CIKAR; out_cikis <= in_giris_1 + in_giris_2; when CIKAR => r_MATH_ISLEM <= TOPLA; out_cikis <= in_giris_1 - in_giris_2; when others => out_cikis <= (others => '0'); end case; end process; end Behavioral;
loop Sözdizimi
Döngü deyimi tekrarlı sıralı sözdizimlerinden meydana gelmektedir. Aynı zamanda söz dizimi ardışık tekrar veya iterasyon numarasının atanması için koşulu listeler. VHDL iki tip döngü tipini desteklemektedir:
- for- loop
- while- loop
for loop döngü sözdizimi için genel yazım formu aşağıda verilmiştir.
dongu_etiketi : for degisken_adi in aralik loop sözdizimi; {sözdizimi;} end loop dongu_etiketi ;
Örnek 6 : Aşağıda for_ornek_process.vhd VHDL kodunda process içerisinde for loop sözdizimi kullanımı örneği verilmiştir. process hassasiyet listesinde in_giris sinyali mevcuttur. Bu durumda in_giris sinyalinde meydana gelecek olan değişimlerde process aktif hale gelecektir. 25. satırda process içerisinde v_sinyal_sonuc değişkeninin 0. bitine ‘0’ atanmaktadır. 27. satırda n_i değişkeni 0’dan 7’e kadar artış gösterecek şekilde for loop döngüsü tanımlanmaktadır. Döngü içerisinde v_sinyal_sonuc değişkeninin ve in_giris giriş portunun n_i. bitleri or işlemine tabi tutulduktan sonra v_sinyal_sonuc değişkeninin n_i+1. bitine atanmaktadır. 31. Satırda tanımlı atama işlemi ile v_sinyal_sonuc değişkeninin ilk 8 biti r_sinyal_sonuc sinyaline atanmaktadır. 17. satırda tanımlı atama ifadesi ile r_sinyal_sonuc sinyali out_cikis çıkış portuna aktarılmaktadır.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity for_ornek_process is Port( in_giris : in std_logic_vector(7 downto 0); out_cikis : out std_logic_vector(7 downto 0) ); end for_ornek_process; architecture Behavioral of for_ornek_process is signal r_sinyal_sonuc : std_logic_vector(7 downto 0); begin out_cikis <= r_sinyal_sonuc; process(in_giris) variable v_sinyal_sonuc : std_logic_vector(8 downto 0); begin v_sinyal_sonuc(0) := '0'; for n_i in 0 to 7 loop v_sinyal_sonuc (n_i + 1) := v_sinyal_sonuc (n_i) or in_giris(n_i); end loop; r_sinyal_sonuc <= v_sinyal_sonuc(8 downto 1); end process; end Behavioral;
Örnek 7 : Aşağıda verilen for_ornek_function.vhd VHDL kodunda for loop sözdizimi function içerisinde kullanılmıştır. fonksiyon_for fonksiyonun döndürdüğü değer out_cikis çıkış portuna atanmaktadır.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity for_ornek_function is Port ( in_giris : in std_logic_vector(7 downto 0); out_cikis : out std_logic_vector(7 downto 0) ); end for_ornek_function; architecture Behavioral of for_ornek_function is function fonksiyon_for(sinyal_giris : std_logic_vector(7 downto 0)) return std_logic_vector is variable sinyal_cikis : std_logic_vector(8 downto 0); begin sinyal_cikis(0) := '0'; for n_i in 0 to 7 loop sinyal_cikis(n_i + 1) := sinyal_cikis(n_i) or sinyal_giris(n_i); end loop; return sinyal_cikis(8 downto 1); end fonksiyon_for; begin out_cikis <= fonksiyon_for(in_giris); end Behavioral;
while loop döngü sözdizimi için genel yazım formu aşağıda verilmiştir.
dongu_etiketi : while kosul loop sözdizimi; {sözdizimi;} end loop dongu_etiketi ;
Örnek 8 : Aşağıda while_ornek_process.vhd VHDL kodunda process içerisinde for loop sözdizimi kullanımı örneği verilmiştir. process hassasiyet listesinde in_giris sinyali mevcuttur. Bu durumda in_giris sinyalinde meydana gelecek olan değişimlerde process aktif hale gelecektir. 27. satırda process içerisinde v_sinyal_sonuc değişkeninin 0. bitine ‘0’ atanmaktadır. 28. satırda n_i değişkeninin 8’den küçük olma koşulu ile while loop döngüsü tanımlanmaktadır. Döngü içerisinde v_sinyal_sonuc değişkeninin ve in_giris giriş portunun n_i. bitleri or işlemine tabi tutulduktan sonra v_sinyal_sonuc değişkeninin n_i+1. bitine atanmaktadır. 33. satırda tanımlı atama işlemi ile v_sinyal_sonuc değişkeninin ilk 8 biti r_sinyal_sonuc sinyaline atanmaktadır. 17. satırda tanımlı atama ifadesi ile r_sinyal_sonuc sinyali out_cikis çıkış portuna aktarılmaktadır.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity while_ornek_process is Port ( in_giris : in std_logic_vector(7 downto 0); out_cikis : out std_logic_vector(7 downto 0) ); end while_ornek_process; architecture Behavioral of while_ornek_process is signal r_sinyal_sonuc : std_logic_vector(7 downto 0); begin out_cikis <= r_sinyal_sonuc; process(in_giris) variable v_sinyal_sonuc : std_logic_vector(8 downto 0); variable n_i : integer := 0; begin n_i := 0; v_sinyal_sonuc(0) := '0'; while n_i < 8 loop v_sinyal_sonuc(n_i + 1) := v_sinyal_sonuc(n_i) or in_giris(n_i); n_i := n_i + 1; end loop; r_sinyal_sonuc <= v_sinyal_sonuc(8 downto 1); end process; end Behavioral;
Örnek 9 : Aşağıda verilen while_ornek_function.vhd VHDL kodunda while loop sözdizimi function içerisinde kullanılmıştır. fonksiyon_while fonksiyonun döndürdüğü değer out_cikis çıkış portuna atanmaktadır.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity while_ornek_function is Port ( in_giris : in std_logic_vector(7 downto 0); out_cikis : out std_logic_vector(7 downto 0) ); end while_ornek_function; architecture Behavioral of while_ornek_function is function fonksiyon_while(sinyal_giris : std_logic_vector(7 downto 0)) return std_logic_vector is variable sinyal_cikis : std_logic_vector(8 downto 0); variable n_i : integer := 0; begin sinyal_cikis(0) := '0'; while n_i < 8 loop sinyal_cikis(n_i + 1) := sinyal_cikis(n_i) or sinyal_giris(n_i); n_i := n_i + 1; end loop; return sinyal_cikis(8 downto 1); end fonksiyon_while; begin out_cikis <= fonksiyon_while(in_giris); end Behavioral;