VHDL’de GENERATE İfadeleri

generate ifadesi, VHDL’de tekrarlanan lojikler eşitlikler veya component örneklerinde kullanılır. İki tip generate ifadesi mevcuttur :

  • if generate
  • for generate

Bu ifadelerden if generate çok nadir kullanılır. Fakat for generate sıklıkla kullanılan bir ifadedir ve genel gösterimi aşağıda verilmiştir.

for değer in aralik generate
    ifade ;
    {ifade ;}
end generate;

Aşağıda verilen örnekte 4 bitlik std_logic_vector tipinde sinyal_1 sinyaline başlangıç değeri olarak “0001”  atanmıştır. sinyal_2 sinyali de 5 bitlik std_logic_vector tipinde tanımlanmıştır. sinyal_2 sinyalinin en anlamsız bitine ‘1’ değeri atanmaktadır. Daha sonra for generate döngüsü içerisinde sinyal_1 ve sinyal_2’ye ait n_i. bitler xor işlemine tabi tutulduktan sonra sinyal_2’nin n_i + 1. bitine atamaktadır. Koda ilişkin devre benzetimi Şekil 1’de verilmiştir.

..
..
signal sinyal_1 : std_logic_vector(3 downto 0) := “0001”;
signal sinyal_2 : std_logic_vector(4 downto 0);
..
..
sinyal_2(0) <= ‘1’;
for_kontrol: for n_i 0 to 3 generate
    sinyal_2(n_i + 1) <= sinyal_2(n_i) xor sinyal_1(n_i)
end generate for_kontrol;
..
..

Şekil 1 for generate için verilen örneğe ilişkin lojik gösterim

if generate ifadesinin genel gösterimi aşağıda verilmiştir.

if koşul generate
    ifade ;
    {ifade ;}
end generate;

Örnek 1: Aşağıda verilen for_if_generate.vhd VHDL kodunda for generate ve if generate ifadeleri kullanılarak 8 bitlik toplayıcı tasarımı yapılmıştır. for_kontrol etiketli for generate döngüsü ile ardışık olarak oluşturulan toplayıcı devreleri ile toplama sonucu elde edilmektedir. Döngü içerisinde bulunan if_kontrol_EAB etiketli if generate söz dizimi ile sadece n_i değerinin sıfır olduğu durumda söz dizimi içerisinde bulunan yarı toplayıcı lojik eşitlikleri aktif hale gelmektedir. n_i’nin diğer durumlarında ise bu blok pasif durumda olacaktır. if_kontrol_DB etiketli if generate söz dizimi ile sadece n_i değerinin sıfırdan farklı olduğu durumlarda söz dizimi içerisinde bulunan tam toplayıcı lojik eşitlikleri aktif hale getirmektedir.

library IEEE;
use IEEE.STD_LOGIC_1164.all;
 
entity for_if_generate is
  port (
    in_giris_1 : in std_logic_vector(7 downto 0); 
    in_giris_2 : in std_logic_vector(7 downto 0); 
    out_cikis : out std_logic_vector(7 downto 0); 
    out_cikis_elde : out std_logic
  );
end for_if_generate;
 
architecture Behavioral of for_if_generate is
 
  signal r_toplam : std_logic_vector(8 downto 1);
 
begin
 
  for_kontrol : for n_i in 0 to 7 generate
    if_kontrol_EAB : if n_i = 0 generate
      out_cikis(n_i)<= in_giris_1(n_i) xor in_giris_2(n_i);
      r_toplam(n_i + 1)<= in_giris_1(n_i) and in_giris_2(n_i);
    end generate if_kontrol_EAB;
 
    if_kontrol_DB : if n_i> 0 generate
      out_cikis(n_i) <= r_toplam(n_i) xor
      in_giris_1(n_i) xor in_giris_2(n_i);
        
      r_toplam(n_i + 1)<= (r_toplam(n_i) and
      in_giris_1(n_i)) or (in_giris_1(n_i) and
      in_giris_2(n_i)) or (in_giris_2(n_i) and
      r_toplam(n_i)); 
    
    end generate if_kontrol_DB;
 end generate for_kontrol;

  out_cikis_elde <= r_toplam(8);

end Behavioral;

Örnek 2: Yukarıda verilen for_if_generate.vhd VHDL kodunda yarı toplayıcı ve tam toplayıcı lojik eşitlikleri yerine yari_toplayici ve tam_toplayici alt devrelerinin kullanıldığı  port_map_for_if_generate.vhd VHDL kodu aşağıda verilmiştir. Kodda 40-46. satırlarda yari_toplayici alt devre tasarımı yapılmıştır. Kodda 50-47. satırlarda tam_toplayici alt devre tasarımı yapılmıştır.

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity port_map_for_if_generate is
  Port (
    in_giris_1 : in std_logic_vector(7 downto 0);
    in_giris_2 : in std_logic_vector(7 downto 0);
    out_cikis_elde : out std_logic;
    out_cikis : out std_logic_vector(7 downto 0)
  );
end port_map_for_if_generate;

architecture Behavioral of port_map_for_if_generate is

  component yari_toplayici
  port(
    in_giris_1 : in std_logic;
    in_giris_2 : in std_logic;
    out_cikis : out std_logic;
    out_cikis_elde : out std_logic
  );
  end component;

  component tam_toplayici
  port(
    in_giris_elde : in std_logic;
    in_giris_1 : in std_logic;
    in_giris_2 : in std_logic;
    out_cikis : out std_logic;
    out_cikis_elde : out std_logic
  );
  end component;
 
  signal r_toplam : std_logic_vector(8 downto 1);
 
begin

  for_kontrol : for n_i in 0 to 7 generate
    if_kontrol_EAB : if n_i = 0 generate
      yari_toplayici_map : yari_toplayici
      port map(
        in_giris_1 => in_giris_1(n_i),
        in_giris_2 => in_giris_2(n_i),
        out_cikis => out_cikis(n_i),
        out_cikis_elde => r_toplam(n_i + 1)             
      );                               
    end generate if_kontrol_EAB;

    if_kontrol_DB : if n_i > 0 generate
      tam_toplayici_map : tam_toplayici
      port map(
        in_giris_elde => r_toplam(n_i),
        in_giris_1 => in_giris_1(n_i),
        in_giris_2 => in_giris_2(n_i),
        out_cikis => out_cikis(n_i),
        out_cikis_elde => r_toplam(n_i + 1)             
      );   
    end generate if_kontrol_DB;      
  end generate for_kontrol;

  out_cikis_elde <= r_toplam(8);
 
end Behavioral;

Bir yanıt yazın

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