VHDL ile 4 Bitlik Aritmetik Mantık Birimi(ALU) Tasarımı

Mikroişlemcilerin en önemli kısımlarından biri olan ALU, kaydediciler(registerler) üzerinde toplama, çıkarma, karşılaştırma, kaydırma, döndürme işlemlerini yaparlar. Kısacası mantıksal ve matematiksel işlemler ALU tarafından gerçekleştirilir.

GENEL

Aritmetik Mantık Biriminin yapacağı mantıksal ya da aritmetiksel işlemler ALU_MOD girişi adını verdiğimiz girişten dijital olarak uyguladığımız 3 bitlik data ile seçilecektir.

alu_mod_secim

Tüm modları ve diğer durumları kapsayacak 4 bitlik bir ALU tasarlayacak olursak;

  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  4. entity ALU is
  5. port( ALU_MOD : in STD_LOGIC_VECTOR (2 downto 0);
  6. A : in STD_LOGIC_VECTOR (3 downto 0);
  7. B : in STD_LOGIC_VECTOR (3 downto 0);
  8. N_Flag : out STD_LOGIC;
  9. Z_Flag : out STD_LOGIC;
  10. C_Flag : out STD_LOGIC;
  11. O_Flow : out STD_LOGIC;
  12. Y : out STD_LOGIC_VECTOR (3 downto 0) );
  13. end ALU;
  14. architecture davranis of ALU is
  15. begin
  16. process(A,B,ALU_MOD)
  17. variable Temp: STD_LOGIC_VECTOR(4 downto 0);
  18. variable YV: STD_LOGIC_VECTOR(3 downto 0);
  19. variable C_Flag_Deger,Z_Flag_Deger : STD_LOGIC;
  20. begin
  21. C_Flag <= '0';
  22. O_Flow <= '0';
  23. TEMP := "00000";
  24. Z_Flag_Deger := '0';
  25. case ALU_MOD is
  26. when "000" => --Pass
  27. YV := A;
  28. when "001" => -- a+b
  29. Temp := ('0' & A)+('0' & B);
  30. YV := Temp(3 downto 0);
  31. C_Flag_Deger := Temp(4); --MSB Flaga atıldı
  32. O_Flow <= YV(3) xor A(3) xor B(3) xor C_Flag_Deger;
  33. C_Flag <= C_Flag_Deger;
  34. when "010" => -- a-b
  35. Temp := ('0' & A)-('0' & B);
  36. YV := Temp(3 downto 0);
  37. C_Flag_Deger := Temp(4); --MSB Flaga atıldı
  38. O_Flow <= YV(3) xor A(3) xor B(3) xor C_Flag_Deger;
  39. C_Flag <= C_Flag_Deger;
  40. when "011" => -- b-a
  41. Temp := ('0' & B)-('0' & A);
  42. YV := Temp(3 downto 0);
  43. C_Flag_Deger := Temp(4); --MSB Flaga atıldı
  44. O_Flow <= YV(3) xor A(3) xor B(3) xor C_Flag_Deger;
  45. C_Flag <= C_Flag_Deger;
  46. when "100" => -- NOT
  47. YV := not A;
  48. when "101" => -- AND
  49. YV := A and B;
  50. when "110" => -- OR
  51. YV := A or B;
  52. when "111" => -- XOR
  53. YV := A xor B;
  54. when others =>
  55. YV := A;
  56. end case;
  57. for i in 0 to 3 loop
  58. Z_Flag_Deger := Z_Flag_Deger or YV(i);
  59. end loop;
  60. Y <= YV;
  61. Z_Flag <= not Z_Flag_Deger;
  62. N_Flag <= YV(3);
  63. end process;
  64. end davranis;

Kodu sentezledikten sonra Synthesize –XST sekmesi içerisindeki View RTL Schematik seçeneğini seçerek karşımıza çıkan Startup Mode ekranından “Start with a schematic of the top –level block” seçeneğini seçerek şematik tasarımımıza ulaşıyoruz.
Şematikte karşımıza çıkan bloklara çift tıklayarak logic gate seviyesine kadar inip tasarımı detaylandırabiliriz.

genel_yapı

 

Test Bench Programı

  1. LIBRARY ieee;
  2. USE ieee.std_logic_1164.ALL;
  3. ENTITY ALU_TB IS
  4. END ALU_TB;
  5. ARCHITECTURE behavior OF ALU_TB IS
  6. COMPONENT ALU
  7. PORT( ALU_MOD : IN std_logic_vector(2 downto 0);
  8. A : IN std_logic_vector(3 downto 0);
  9. B : IN std_logic_vector(3 downto 0);
  10. N_Flag : OUT std_logic;
  11. Z_Flag : OUT std_logic;
  12. C_Flag : OUT std_logic;
  13. O_Flow : OUT std_logic;
  14. Y : OUT std_logic_vector(3 downto 0)
  15. );
  16. END COMPONENT;
  17. --Girisler
  18. signal ALU_MOD : std_logic_vector(2 downto 0) := (others => '0');
  19. signal A : std_logic_vector(3 downto 0) := (others => '0');
  20. signal B : std_logic_vector(3 downto 0) := (others => '0');
  21. --Çıkıslar
  22. signal N_Flag : std_logic;
  23. signal Z_Flag : std_logic;
  24. signal C_Flag : std_logic;
  25. signal O_Flow : std_logic;
  26. signal Y : std_logic_vector(3 downto 0);
  27. BEGIN
  28. uut: ALU PORT MAP (
  29. ALU_MOD => ALU_MOD,
  30. A => A,
  31. B => B,
  32. N_Flag => N_Flag,
  33. Z_Flag => Z_Flag,
  34. C_Flag => C_Flag,
  35. O_Flow => O_Flow,
  36. Y => Y
  37. );
  38. stim_proc: process
  39. begin
  40. wait for 100 ns;
  41. A <= "1001";
  42. B <= "1111";
  43. wait for 50 ns;
  44. ALU_MOD <= "000";
  45. wait for 50 ns;
  46. ALU_MOD <= "001";
  47. wait for 50 ns;
  48. ALU_MOD <= "010";
  49. wait for 50 ns;
  50. ALU_MOD <= "011";
  51. wait for 50 ns;
  52. ALU_MOD <= "100";
  53. wait for 50 ns;
  54. ALU_MOD <= "101";
  55. wait for 50 ns;
  56. ALU_MOD <= "110";
  57. wait for 50 ns;
  58. ALU_MOD <= "111";
  59. wait;
  60. end process;
  61. END;
tb
Tags:, ,

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir