VHDL’de Yetki Girişli D Mandalı (D Latch) Uygulaması

D Mandalı devresi giriş sinyalinin durumu değiştiği zaman çıkış değerini güncelleyen, değişim olmadığı durumlarda ise çıkış değerini koruyan bir devre elemanıdır. Bu elemana bir yetkilendirme girişi eklendiğinde oluşan elemana “Yetki Girişli D Mandalı” adı verilmektedir. Bu elemanda çıkış değerinin güncellenmesi normal D Mandalından farklı olarak yetki girişinin de ‘1’ olması gerekmektedir. Eğer yetki girişi ‘0’ ise giriş değeri değişse bile çıkış değeri son durumunu korumaya devam edecektir.

Yetki girişli D mandalı doğruluk tablosu Tablo 1’de verilmiştir. Tablo 1’den de görüleceği üzere in_en giriş portu değeri ‘0’ olduğunda çıkış değerleri in_giris giriş portu değerinin önemi olmadan bir önceki değerini korumaktadır. in_engirişi portu değeri‘1’ olduğunda ise in_giris giriş portu değeri out_cikis çıkış portuna ve in_giris giriş portu değerinin değili ise out_cikis’ çıkış portuna aktarılmaktadır. Şekil 1’de ise yetki girişli D mandalı mantık devresi gösterilmiştir.

in_enin_girisout_cikis(+)out_cikis'(+)
00out_cikisout_cikis’
01out_cikisout_cikis’
1001
1110
Tablo 1 Yetki girişli D mandalı doğruluk tablosu

Şekil 1 D mandalı mantık devresi

Örnek 1: Bu örnekte Yetki Girişli D Mandalı mantık devresinin gerçekleştirildiği d_latch.vhd VHDL kodu verilmiştir. Tablo 1 ve Şekil 1’den de görülceği üzere d_latch varlığımız iki giriş ve iki çıkış portuna sahiptir. Port tanımlamaya ilişkin bildirimler 5-10. satırları arasında yapılmatıdır. Port tanımalamaları std_logic veri tipinde yapıldığından dolayı 1. ve 2. satırlarda gerekli kütüphane bildirimleri yapılmaktadır.

15. satırda std_logic veri tipinde r_cikis sinyali tanımlanmaktadır. 19. satırda tanımlanan söz dizimi ile process’in in_en ve in_giris giriş portları değerlerinde meydana gelen değişiklikler ile aktif olacağı belirtilmektedir. 22. satırda tanımlı koşul ifadesinin sağlanması yani in_en giriş portu değerinin ‘1’ olması durumunda in_giris giriş portu değeri r_cikis sinyaline atanmaktadır. Aksi durumlarda ise r_cikis sinyali bir önceki değerini korumaktadır. 28. satırda out_cikis çıkış portuna r_cikis sinyalinin değeri atanırken, 29. satırda ise out_cikis_degil çıkış portuna r_cikis sinyalinin değerinin değili atanmaktadır.

library IEEE;
use IEEE.STD_LOGIC_1164.all;
 
entity d_latch is
  port (
    in_en : in std_logic;
    in_giris : in std_logic;
    out_cikis : out std_logic;
    out_cikis_degil : out std_logic
  );
end d_latch;

architecture Behavioral of d_latch is
 
  signal r_cikis : std_logic := '0';
 
begin
 
  process(in_en, in_giris)
  begin
 
    if in_en = '1' then
      r_cikis <= in_giris;
    end if;
 
  end process;
 
  out_cikis <= r_cikis;
  out_cikis_degil <= (not r_cikis);
 
end Behavioral;

Aşağıda ise d_latch varlığının benzetim yapılabilmesi için tb_d_latch.vhd sınama kodu (test bench) verilmiştir ve sınama koduna ait benzetim çıktısı Şekil 2’de gösterilmiştir. Şekil 2’de gösterilen benzetim sonucunda:

1. adım: in_en giriş portu değeri ‘1’ olduğundan r_cikis sinyaline in_giris giriş portu değeri atanmaktadır ve r_cikis sinyalinin değeri ‘0’ olmaktadır. r_cikis sinyalinin değerinin ‘0’ olması ile out_cikis çıkış portuna ‘0’, out_cikis_degil çıkış portuna ‘1’ değerleri atanmaktadır. 

2. adım: in_en giriş portu değerine‘0’ ve in_giris giriş portu değerine ‘1’ atanmaktadır. r_cikis sinyalinin değeri in_en giriş portu değerinin ‘0’ olması nedeniyle bir önceki adımdaki değerini korumuştur. r_cikis sinyalinin değerinin değişmemesi ile çıkış portlarının değerleride değişmemiştir.

3. adım: in_en giriş portu değerine ‘1’ atanmaktadır. in_en girişi portu değeri ‘1’ olmasıyla r_cikis sinyaline in_giris giriş portu değeri atanmıştır ve r_cikis sinyalinin değeri ‘1’ olmaktadır. r_cikis sinyalinin değerinin ‘1’ olması ile out_cikis çıkış portuna ‘1’, out_cikis_degil çıkış portuna ‘0’ değerleri atanmaktadır. 

4. adım:in_en giriş portu değeri ‘1’ olduğundan r_cikis sinyaline in_giris giriş portu değeri atanmıştır ve r_cikis sinyalinin değeri ‘0’ olmaktadır. r_cikis sinyalinin değerinin ‘0’ olması ile out_cikis çıkış portuna ‘0’, out_cikis_degil çıkış portuna ‘1’ değerleri atanmaktadır. 

5. adım: in_en giriş portu değeri‘0’ olmaktadır. r_cikis sinyalinin değeri in_en giriş portu değerinin ‘0’ olması nedeniyle bir önceki adımdaki değerini korumuştur. r_cikis sinyalinin değerinin değişmemesi ile çıkış portlarının değeride değişmemiştir.

6. adım: in_en giriş portu değeri ‘1’ olduğundan r_cikis sinyaline in_giris giriş portu değeri atanmıştır ve r_cikis sinyalinin değeri ‘1’ olmaktadır. r_cikis sinyalinin değerinin ‘1’ olması ile out_cikis çıkış portuna ‘1’, out_cikis_degil çıkış portuna ‘0’ değerleri atanmaktadır.

7. adım: in_en giriş portu değeri‘1’ olduğundan r_cikis sinyaline in_giris giriş portu değeri atanmıştır ve r_cikis sinyalinin değeri ‘0’ olmaktadır. r_cikis sinyalinin değerinin ‘0’ olması ile out_cikis çıkış portuna ‘0’, out_cikis_degil çıkış portuna ‘1’ değerleri atanmaktadır. 

8. adım:in_en giriş portu değeri‘0’ olmaktadır. r_cikis sinyalinin değeri in_en giriş portu değerinin ‘0’ olması nedeniyle bir önceki adımdaki değerini korumuştur. r_cikis sinyalinin değerinin değişmemesi ile çıkış portlarının değeride değişmemiştir.

Şekil 2 d_latch varlığı benzetim çıktısı

tb_d_latch.vhd VHDL kodun amacı d_latch varlığının benzetiminin yapmak olduğundan dolayı tb_d_latch varlığına ait bir port tanımlaması yapılmamıştır. tb_d_latch.vhd VHDL kodu sentezlenemez ve sadece benzetim için kullanılabilmektedir. Test kodlarının oluşturulması amacı ile kullanılacak olan sinyallerin tanımlama işlemleri 18-21. satırlarda yapılmıştır.

25-33. satırlar arasında tanımlanan process ile in_en yetkilendirme sinyalinin davranışı tanımlanmaktadır. wait for komutu ile tanımlanan süre kadar process içinde beklenmektedir.

  • 27. satırda yapılan tanımlama ile in_en yetkilendirme sinyaline ‘1’ değeri atanmaktadır ve 100ns beklendikten sonra 28. satırda tanımlanan ifade gerçeklenecektir. Diğer bir ifade ile 27. satırda yapılan tanımlama ile in_en yetkilendirme sinyalinin 0-100 ns aralığında alacağı değer tanımlanmıştır.
  • 28. satırda tanımlanan ifade ile in_en yetkilendirme sinyalinin 100-220 ns aralığında alacağı değerin ‘0’ olacağı belirtilmektedir.
  • 29. satırda tanımlanan ifade ile in_en yetkilendirme sinyalinin 220-540 ns aralığında alacağı değerin ‘1’ olacağı belirtilmektedir.
  • 30. satırda tanımlanan ifade ile in_en yetkilendirme sinyalinin 540-700 ns aralığında alacağı değerin ‘0’ olacağı belirtilmektedir.
  • satırda tanımlanan ifade ile in_en yetkilendirme sinyalinin 700-900 ns aralığında alacağı değerin ‘1’ olacağı belirtilmektedir.
  • satırda tanımlanan ifade ile in_en yetkilendirme sinyalinin 900-1000 ns aralığında alacağı değerin ‘0’ olacağı belirtilmektedir.

35-42. satırları arasında tanımlanan process içerisinde in_giris sinyalinin davranışı tanımlanmaktadır.

  • 37. satırda tanımlanan ifade ile in_giris sinyalinin 0-100 ns aralığında alacağı değerin ‘0’ olacağı belirtilmektedir.
  • 38. satırda tanımlanan ifade ile in_giris sinyalinin 100-500 ns aralığında alacağı değerin ‘1’ olacağı belirtilmektedir.
  • 39. satırda tanımlanan ifade ile in_giris sinyalinin 500-700 ns aralığında alacağı değerin ‘0’ olacağı belirtilmektedir.
  • 40. satırda tanımlanan ifade ile in_giris sinyalinin 700-800 ns aralığında alacağı değerin ‘1’ olacağı belirtilmektedir.
  • 41. satırda tanımlanan ifade ile in_giris sinyalinin 800-1000 ns aralığında alacağı değerin ‘0’ olacağı belirtilmektedir.

d_latch varlığının tb_d_latch varlığında alt devre olarak kullanılabilmesi için gerekli component tanımlama işlemleri 9-16. satırlar arasında yapılmıştır. 44-50. satırlar arasında ise d_latch alt devresine ilişkin bağlantılar yapılmaktadır.

library IEEE;
use IEEE.STD_LOGIC_1164.all;
 
entity tb_d_latch is
end tb_d_latch;
 
architecture Behavioral of tb_d_latch is
 
  component d_latch
  Port (
    in_en : in std_logic;
    in_giris : in std_logic;
    out_cikis : out std_logic;
    out_cikis_degil : out std_logic           
  );
  end component;
 
  signal in_en : std_logic := '0';
  signal in_giris : std_logic := '0';
  signal out_cikis : std_logic := '0';
  signal out_cikis_degil : std_logic := '0';

begin

  process
  begin
    in_en <= '1'; wait for 100 ns;
    in_en <= '0'; wait for 120 ns;
    in_en <= '1'; wait for 320 ns;
    in_en <= '0'; wait for 160 ns;
    in_en <= '1'; wait for 200 ns;
    in_en <= '0'; wait for 100 ns;
  end process;

  process
  begin
    in_giris <= '0'; wait for 100 ns;
    in_giris <= '1'; wait for 400 ns;
    in_giris <= '0'; wait for 200 ns;
    in_giris <= '1'; wait for 100 ns;
    in_giris <= '0'; wait for 200 ns;
  end process;

  d_latch_map : d_latch
  port map(
    in_en => in_en,
    in_giris => in_giris,
    out_cikis => out_cikis,
    out_cikis_degil => out_cikis_degil
  );
 
end Behavioral;

Bir yanıt yazın

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