Advertisement
Guest User

alu

a guest
Jan 21st, 2020
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.32 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4.  
  5. entity ALU is
  6. port(
  7. OP_CODE: in STD_LOGIC_VECTOR(3 downto 0); --wejscie instrukcji
  8. SRC_1: in STD_LOGIC_VECTOR(7 downto 0); -- wejscie 1
  9. SRC_2: in STD_LOGIC_VECTOR(7 downto 0); -- wejscie 2
  10. SRC_AC: in STD_LOGIC; -- pomocnicze przeniesienie
  11. SRC_C: in STD_LOGIC; -- przeniesienie
  12. RST: in STD_LOGIC; -- reset
  13.  
  14. DES_1: out STD_LOGIC_VECTOR(7 downto 0); -- wyjscie 1
  15. DES_2: out STD_LOGIC_VECTOR(7 downto 0); -- wyjscie 2
  16. DES_P: out STD_LOGIC; -- bit parzystosci
  17. DES_C: out STD_LOGIC; -- bit przeniesienia
  18. DES_AC: out STD_LOGIC; -- pomocnicze przeniesienie
  19. DES_OV: out STD_LOGIC -- bit przepelnienia
  20.  
  21. );
  22.  
  23. end ALU;
  24.  
  25. architecture behaviour of ALU is
  26.  
  27. signal bufor: STD_LOGIC_VECTOR (8 downto 0); --dodatkowa zmienna
  28. signal bufor2: STD_LOGIC_VECTOR (7 downto 0);
  29. signal wynik: STD_LOGIC_VECTOR(15 downto 0);
  30.  
  31. begin
  32.  
  33. process(RST) is
  34.  
  35. variable t: std_logic_vector(6 downto 0):="0000000";
  36.  
  37. begin
  38.  
  39. if (RST'event and RST='0') then
  40.  
  41. case OP_CODE is
  42.  
  43. when "0000" => DES_1 <= std_logic_vector(unsigned(SRC_1) + unsigned(SRC_2)); --dodawanie
  44.  
  45. bufor <= std_logic_vector(unsigned('0' & SRC_1) + unsigned('0' & SRC_2));
  46. if (unsigned(bufor))>"11111111" then
  47. DES_C <= '1'; --flaga przeniesienia
  48. else
  49. DES_C <='0';
  50. end if;
  51.  
  52. when "0001" => bufor2 <= std_logic_vector(unsigned(SRC_1) + unsigned(SRC_2)); --dodawanie z przenies...
  53. DES_1 <= std_logic_vector(unsigned(bufor2) + unsigned(t & SRC_C));
  54.  
  55. bufor <= std_logic_vector(unsigned('0' & SRC_1) + unsigned('0' & SRC_2));
  56. bufor <= std_logic_vector(unsigned('0' & SRC_1) + unsigned(t & SRC_C));
  57. if (unsigned(bufor))>"11111111" then
  58. DES_C <= '1'; --flaga przeniesienia
  59. else
  60. DES_C <='0';
  61. end if;
  62.  
  63. when "0010" => DES_1 <= std_logic_vector(unsigned(SRC_1) - unsigned(SRC_2) - unsigned(t & SRC_C)); --odejmowanie, co z flagami?
  64.  
  65. when "0011" => DES_1 <= std_logic_vector(unsigned(SRC_1) + unsigned(t & '1'));
  66.  
  67. when "0100" => DES_1 <= std_logic_vector(unsigned(SRC_1) - unsigned(t & '1'));
  68.  
  69. when "0101" => wynik <= std_logic_vector(unsigned(SRC_1) * unsigned(SRC_2)); --mnozenie
  70.  
  71. if (unsigned(wynik)) > "0000000011111111" then
  72. DES_OV <= '1';
  73. else
  74. DES_OV <= '0';
  75. end if;
  76.  
  77. DES_1 <= wynik(7 downto 0);
  78. DES_2 <= wynik(15 downto 8);
  79.  
  80.  
  81. --when "0110" --dzielenie
  82.  
  83. when "0111" => DES_1 <= SRC_1 AND SRC_2; --AND logiczny
  84.  
  85. when "1000" => DES_1 <= SRC_1 OR SRC_2; --OR logiczny
  86.  
  87. when "1001" => DES_1 <= SRC_1 XOR SRC_2; -- XOR/EXOR
  88.  
  89. when "1010" => DES_1 <= NOT SRC_1; --negacja akumulatora
  90.  
  91. when "1011" => DES_1 <= SRC_1(6 downto 0) & SRC_1(7);-- przesuniecie aku w lewo
  92.  
  93. when "1100" => DES_1 <= SRC_1(6 downto 0) & SRC_C;-- w lewo ze znacznikiem Carry
  94. DES_C <= SRC_1(7);
  95.  
  96. when "1101" => DES_1 <= SRC_1(0) & SRC_1(7 downto 1);-- przes. w prawo
  97.  
  98. when "1110" => DES_1 <= SRC_C & SRC_1(7 downto 1);-- w prawo ze znacznikiem carry
  99. DES_C <= SRC_1(0);
  100.  
  101. when "1111" => DES_1 <= SRC_1(3 downto 0) & SRC_1(7 downto 4);-- wymiana polbajtow - 4 razy przesuniecie (SWAP)
  102.  
  103. when others => NULL;
  104.  
  105. end case;
  106.  
  107. end if;
  108.  
  109. end process;
  110.  
  111. end behaviour;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement