VHDL’de IF, CASE ve LOOP Sözdizimleri

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;

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir