VHDL’de Saklayıcı (Register) Tasarımı

Bu kısıma kadar anlatılan örneklerden görüleceği üzere “D Mandalı” bilgiyi saklama özelliğine sahip bir elemandır. 1 Bit uzunluğundaki bilgi (‘1’ ya da ‘0’) “D Mandalı” üzerinde saklanabilmektedir. Bu özellik kullanılarak, birden fazla “D Mandalı” bir araya getirilerek basit bir hafıza elemanı tasarlamak münkündür. Bu şekilde tasarlanmış hafıza elemanlarına “saklayıcı” (register) adı verilmektedir. Şekil 1’de “D Mandalı” kullanılarak tasarlanmış bir saklayıcıya ait genel tasarım gösterimi verilmiştir. İstenilen sayıda D Mandalı kullanılarak, istenilen uzunlukta bir saklayıcı tasarlamak mümkündür.

Şekil 9‑8 Saklayıcı tasarımı

Örnek 1: Aşağıda 4 bitlik saklayıcı devresinin gerçekleştirildiği saklayici_4_bit.vhd VHDL kodu verilmiştir. saklayici_4_bit varlığımıza ilişkin port bildirimleri 5-10. satırları arasında yapılmaktıdır. Tanımlamalardan da görüleceği üzere saklayıcımızın data giriş ve çıkış portları 4 bittir.  17. satırda 4 bitlik r_saklayici sinyali tanımlanmaktadır. 20. satırda out_cikis portuna r_saklayici sinyali atanmaktadır. 21. satırda tanımlanan söz dizimi ile process’in in_clk, in_rst ve in_giris değerlerinden meydana gelen değişiklikler ile aktif olacağı belirtilmektedir.

process içerisinde yapılan tanımlamardan da görüleceği üzere saklayıcı tasarımında eş zamanlı olmaya reset kullanılmıştır. 24. satırda  in_rst giriş portu ‘1’ değerini aldığında  in_giris giriş portunun aldığı değerler  farketmeksiniz r_saklayici sinyalinin tüm bitlerine ‘0’ değeri atanmaktadır. Bu durumda out_cikis değerinin tüm bitleride ‘0’ olmaktadır. in_rst girişinin diğer durumlarında ise in_clk giriş portunun yükselen kenarı ile birlikte in_giris değeri r_cikis sinyaline atanmaktadır. in_clk giriş sinyalinin yükselen kenarının meydana gelmemesi durumunda ise r_cikis sinyali bir önceki değerini korumaktadır.

library IEEE;
use IEEE.STD_LOGIC_1164.all;
 
entity saklayici_4_bit is
  port (
    in_clk : in std_logic;
    in_rst : in std_logic;
    in_giris : in std_logic_vector(3 downto 0);
    out_cikis : out std_logic_vector(3 downto 0)
  );
end saklayici_4_bit;
 
architecture Behavioral of saklayici_4_bit is
 
  signal r_saklayici : std_logic_vector(3 downto 0);
 
begin
 
  out_cikis <= r_saklayici;
 
  process(in_clk, in_rst, in_giris)
  begin
    if in_rst = '1' then
      r_saklayici <= (others => '0');
    elsif rising_edge(in_clk) then
      r_saklayici <= in_giris;       
    end if;
  end process;
 
end Behavioral;

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

1. adım :in_clk giriş portunun yükselen kenarı ile birliktein_rst giriş portudeğerinin ‘0’ olmasıyla in_giris giriş portu değeri r_saklayici sinyaline atanmaktadır ve r_saklayici sinyalinin değeri “0000” olmaktadır. r_saklayici sinyalinin değerinin “0000” olması ile out_cikis çıkış portuna “0000” değeri atanmaktadır.

2. adım :in_rst giriş portudeğerinin ‘1’ olması nedeniyle r_saklayici sinyaline “0000” değeri atanmaktadır. r_saklayici sinyalinin değerinin “0000”  olması ile out_cikis çıkış portuna “0000”, değeri atanmaktadır. 2. adım içerisinde in_giris giriş portu değerinin değişmesi ile birlikte saat darbesi yükselen kenarının meydana gelmesine rağmen eş zamanlı olmayan reset ile tasarlanmış saklayıcının çıkışı değişmemektedir.

3. adım :in_rst giriş portudeğeri ‘0’ olmakta fakat saat darbesi yükselen kenarı meydana gelmemesi nedeniyle r_saklayici sinyalinin değeri değişmemektedir ve bu nedenle out_cikis çıkış portunun değeri de değişmemiştir.

4. adım :  in_clk giriş portunun yükselen kenarı ile birliktein_rst giriş portudeğerinin ‘0’ olmasıyla in_giris giriş portu değeri r_saklayici sinyaline atanmaktadır ve r_saklayici sinyalinin değeri “1111” olmaktadır. r_saklayici sinyalinin değerinin “1111”  olması ile out_cikis çıkış portuna “1111” değeri atanmaktadır.

5. adım :in_rst giriş portudeğerinin ‘1’ olmasıyla r_saklayici sinyalinin değerine “0000” atanmaktadır. r_saklayici sinyalinin değerinin “0000”  olması ile out_cikis çıkış portuna “0000”değeri atanmaktadır.

6. adım :in_clk giriş portunun yükselen kenarı ile birliktein_rst giriş portudeğerinin ‘0’ olmasıyla in_giris giriş portu değeri r_saklayici sinyaline atanmaktadır ve r_saklayici sinyalinin değeri “0000” olmaktadır. r_saklayici sinyalinin değerinin “0000”  olması ile out_cikis çıkış portuna “0000” değeri atanmaktadır.

7. adım :in_rst giriş portudeğerinin ‘1’ olmasıyla r_saklayici sinyaline “0000” değeriatanmaktadır. r_saklayici sinyalinin değerinin “0000” olması ile out_cikis çıkış portuna “0000” değeri atanmaktadır. 7. adım içerisinde in_giris giriş portu değerinin değişmesi ile birlikte saat darbesi yükselen kenarının meydana gelmesine rağmen eş zamanlı olmayan reset ile tasarlanmış saklayıcının çıkışı değişmemektedir.

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

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
 
entity tb_saklayici_4_bit is
end tb_saklayici_4_bit;
 
architecture Behavioral of tb_saklayici_4_bit is
 
  component saklayici_4_bit
  Port (
    in_clk : in std_logic;
    in_rst : in std_logic;
    in_giris : in std_logic_vector(3 downto 0);
    out_cikis : out std_logic_vector(3 downto 0)
  );
  end component;
 
  constant CLK_PERIOD : time := 150 ns;
  signal in_clk : std_logic := '0';
  signal in_rst : std_logic := '0';
  signal in_giris : std_logic_vector(3 downto 0) := (others => '0');
  signal out_cikis : std_logic_vector(3 downto 0) := (others => '0');

begin
 
  process
  begin
    in_clk <= '1';
    wait for CLK_PERIOD / 2;

    in_clk <= '0';
    wait for CLK_PERIOD / 2;       

  end process;
 
  process
  begin
    in_rst <= '0'; wait for 50 ns;           
    in_rst <= '1'; wait for 150 ns;
    in_rst <= '0'; wait for 300 ns;
    in_rst <= '1'; wait for 100 ns;
    in_rst <= '0'; wait for 100 ns;
    in_rst <= '1';  wait for 280 ns;
    in_rst <= '0'; wait for 20 ns;               
  end process;

  process
  begin
    in_giris <= (others => '0'); wait for 100 ns;
    in_giris <= (others => '1'); wait for 370 ns;
    in_giris <= (others => '0'); wait for 230 ns;
    in_giris <= (others => '1'); wait for 100 ns;
    in_giris <= (others => '0'); wait for 200 ns;
  end process;
 
  saklayici_4_bit_map : saklayici_4_bit
  port map(
    in_clk => in_clk,
    in_rst => in_rst,
    in_giris => in_giris,
    out_cikis => out_cikis
  );
end Behavioral;

Örnek 2: Aşağıda etkinleştirme girişine sahip n_bit bitlik saklayıcı devresinin gerçekleştirildiği saklayici_generic_aktif_sinyal.vhd VHDL kodu verilmiştir. saklayici_generic_aktif_sinyal varlığımıza ilişkin generic bildirimleri 5-7. Satırlarda, port bildirimleri 8-14. satırları arasında yapılmaktıdır.

Tanımlamalardan da görüleceği üzere saklayıcımızın data giriş ve çıkış portları generic parametresi içersinde tanımlanan n_bit uzunluğundadır. 19. satırda n_bit bitlik r_saklayici sinyali tanımlanmaktadır. 23. satırda out_cikis portuna r_saklayici sinyali atanmaktadır. 25. satırda tanımlanan söz dizimi ile process’in in_clk, in_rst ve in_giris değerlerinden meydana gelen değişiklikler ile aktif olacağı belirtilmektedir.

process içerisinde yapılan tanımlamardan da görüleceği üzere saklayıcı tasarımında eş zamanlı olmaya reset kullanılmıştır. 27. satırda  in_rst giriş portu ‘1’ değerini aldığında  in_giris giriş portunun aldığı değerler  farketmeksiniz r_saklayici sinyalinin tüm bitlerine ‘0’ değeri atanmaktadır. Bu durumda out_cikis değerinin tüm bitleride ‘0’ olmaktadır. in_rst girişinin diğer durumlarında ise in_clk giriş portunun yükselen kenarı ile birlikte 30. satırda tanımlanan koşul ifadesi ile in_en giriş portunun aktif olması (değerinin ‘1’ olması) ile birlikte  in_giris giriş port değeri r_cikis sinyaline atanmaktadır. in_en giriş portunun pasif olması (değerinin ‘0’ olması) veya in_clk giriş sinyalinin yükselen kenarının meydana gelmemesi durumunda ise r_saklayici sinyali bir önceki değerini korumaktadır.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
 
entity saklayici_generic_aktif_signal is
  Generic(
    n_bit : integer := 4
  );
  Port (
    in_clk : in std_logic;
    in_rst : in std_logic;
    in_en : in std_logic;
    in_giris : in std_logic_vector(n_bit - 1 downto 0);
    out_cikis : out std_logic_vector(n_bit - 1 downto 0)
  );
end saklayici_generic_aktif_signal;
 
architecture Behavioral of saklayici_generic_aktif_signal is
 
  signal r_saklayici : std_logic_vector(n_bit - 1 downto 0);
 
begin
 
  out_cikis <= r_saklayici;
 
  process(in_clk, in_rst, in_en, in_giris)
  begin
    if in_rst = '1' then
      r_saklayici <= (others => '0');
    elsif rising_edge(in_clk) then
      if in_en = '1' then
        r_saklayici <= in_giris;
      end if;       
    end if;
  end process;
end Behavioral;

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

1. adım :in_rst giriş portunundeğerinin ‘0’ olması ve in_clk giriş portunun yükselen kenarı ile birliktein_en giriş portunun ‘1’ değerini almasıyla in_giris giriş portu değeri r_saklayici sinyaline atanmaktadır ve r_saklayici sinyalinin değeri “0000” olmaktadır. r_saklayici sinyalinin değerinin “0000”  olması ile out_cikis çıkış portuna “0000” değeri atanmaktadır.

2. adım :in_rst giriş portunundeğeri ‘1’ olması nedeniyle r_saklayici sinyaline “0000” atanmaktadır. r_saklayici sinyalinin değerinin “0000”  olması ile out_cikis değerine “0000” atanmaktadır. 2. adım içerisinde in_giris giriş portu değeri değişse de eş zamanlı olmayan reset ile tasarlanmış saklayıcının çıkışı değişmemektedir.

3. adım :  in_rst giriş portunundeğerinin ‘0’ olması ve in_clk giriş portunun yükselen kenarı meydana gelmesine rağmen in_en giriş portu değerinin ‘0’ olması nedeniyle r_saklayici sinyalinin değeri değişmemiştir ve bu sebeple çıkış değeri de değişmemiştir.

4. adım :in_rst giriş portunundeğerinin ‘0’ ve in_en giriş portu değerinin ‘1’ olmasına rağmen in_clk giriş portunun yükselen kenarı meydana gelmemesi nedeniyle r_saklayici sinyalinin değeri değişmemiştir ve bu sebeple çıkış değeri de değişmemiştir.

5. adım:in_rst giriş portunundeğerinin ‘0’ olması ve in_clk giriş portunun yükselen kenarı ile birliktein_en giriş portunun ‘1’ değerini almasıyla in_giris giriş portu değeri r_saklayici değerine atanmıştır ve r_saklayici sinyalinin değeri “1111” olmaktadır. r_saklayici değerinin “1111”  olması ile out_cikis değerine “1111” atanmaktadır.

6. adım:in_rst giriş portunundeğeri ‘1’ olması nedeniyle r_saklayici değerine “0000” atanmaktadır. r_saklayici değerinin “0000”  olması ile out_cikis çıkış portuna “0000” değeri atanmaktadır.

7. adım: in_rst giriş portunundeğerinin ‘0’ olması ve in_clk giriş portunun yükselen kenarı ile birliktein_en giriş portunun ‘1’ değerini almasıyla in_giris giriş portu değeri r_saklayici değerine atanmıştır ve r_saklayici sinyalinin değeri “0000” olmaktadır. r_saklayici değerinin “0000”  olması ile out_cikis çıkış portuna “0000” değeri atanmaktadır.

8. adım:in_rst giriş portunundeğeri ‘1’ olması nedeniyle r_saklayici değerine “0000” atanmaktadır. r_saklayici değerinin “0000”  olması ile out_cikis çıkış portuna “0000” atanmaktadır.

Şekil 3  saklayici_generic_aktif_signal varlığı benzetim çıktısı

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
 
entity tb_saklayici_generic_aktif_signal is
end tb_saklayici_generic_aktif_signal;
 
architecture Behavioral of tb_saklayici_generic_aktif_signal is
 
  component saklayici_generic_aktif_signal
  Generic(
    n_bit : integer := 4
  );
  Port (
    in_clk : in std_logic;
    in_rst : in std_logic;
    in_en : in std_logic;
    in_giris : in std_logic_vector(n_bit - 1 downto 0);
    out_cikis : out std_logic_vector(n_bit - 1 downto 0)
  );
  end component;
 
  constant CLK_PERIOD : time := 150 ns;
  signal in_clk : std_logic := '0';
  signal in_rst : std_logic := '0';
  signal in_en: std_logic := '0';
  signal in_giris : std_logic_vector(3 downto 0) := (others => '0');
  signal out_cikis : std_logic_vector(3 downto 0) := (others => '0');
 
begin
  

  Process
  Begin
    in_clk <= '1';
    wait for CLK_PERIOD / 2;
 
    in_clk <= '0';
    wait for CLK_PERIOD / 2;       
 
  end process;
 
  Process
  Begin
    in_rst <= '0'; wait for 50 ns;           
    in_rst <= '1'; wait for 150 ns;
    in_rst <= '0'; wait for 300 ns;
    in_rst <= '1'; wait for 100 ns;
    in_rst <= '0'; wait for 100 ns;
    in_rst <= '1';  wait for 280 ns;
    in_rst <= '0'; wait for 20 ns;               
  end process;
 
  process
  begin
    in_en <= '1'; wait for 250 ns;           
    in_en <= '0'; wait for 150 ns;
    in_en <= '1'; wait for 250 ns;           
    in_en <= '0'; wait for 150 ns;
    in_en <= '1'; wait for 200 ns;            
  end process;
  

  process
  begin
    in_giris <= (others => '0'); wait for 100 ns;
    in_giris <= (others => '1'); wait for 370 ns;
    in_giris <= (others => '0'); wait for 230 ns;
    in_giris <= (others => '1'); wait for 100 ns;
    in_giris <= (others => '0'); wait for 200 ns;
  end process;
 
  saklayici_generic_aktif_signal_map :
  saklayici_generic_aktif_signal
  generic map(
    n_bit => 4
  )
  port map(
    in_clk => in_clk,
    in_rst => in_rst,
    in_en => in_en,
    in_giris => in_giris,
    out_cikis => out_cikis
  );
 
end Behavioral;

Bir yanıt yazın

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