library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity ALU is port ( A, B : in std_logic_vector (15 downto 0); -- acumuladores COD : in std_logic_vector (3 downto 0); -- código de instrucción CC : in std_logic; -- ciclo de aplicación R : out std_logic_vector (15 downto 0); -- resultado C : in std_logic; -- entrada de acarreo Nulo, Carry, V_over : out std_logic ); -- indicadores end ALU; architecture OPERACIONES of ALU is -- necesidad de una señal de resultado de un bit más para detectar acarreos signal RR : STD_logic_vector(16 downto 0); begin -- operaciones de la ALU process(COD, A, B, C, CC) begin if CC = '0' or COD(3) = '1' then RR <= (others => '0'); -- solo toman valor en el ciclo de ejecución de instrucciones de la parte operativa else RR(16) <= '0'; -- por defecto para operaciones que no utilizan acarreo case COD is when "0000" => RR <= '0' & A + B + C; -- suma (con acarreo) when "0001" => RR <= '0' & A - B - C; -- resta (con acarreo) when "0010" => RR(15 downto 0) <= A and B; -- and when "0011" => RR(15 downto 0) <= A or B; -- or when "0100" => RR(15 downto 0) <= A - 1; -- decrementar when "0101" => RR(15 downto 0)<= not A; -- invertir when "0110" => RR <= A & ‘0’; -- deplazamiento hacia la izquierda when "0111" => RR <= A(0) & ‘0’ & A(15 downto 1); -- deplazamiento hacia la derecha when others => RR <= (others => '0'); end case; end if; end process; -- resultado R <= RR(15 downto 0); -- valor de los indicadores process(COD,RR, A, B, CC) begin -- resultado nulo if RR(15 downto 0) = "0000000000000000" then Nulo <= '1'; else Nulo <= ‘0’; end if; -- acarreo Carry <= RR(16); -- desbordamiento (over-flow) V_over <= '0'; -- por defecto if COD = "0000" then -- operación de suma if (A(15) = '0' and B(15) = '0' and RR(15) = '1') or (A(15) = '1' and B(15) = '1' and RR(15) = '0') then V_over<= '1'; end if; end if; if COD = "0001" then -- operación de resta if (A(15) = '0' and B(15) = '1' and RR(15) = '1') or (A(15) = '1' and B(15) = '0' and RR(15) = '0') then V_over<= '1'; end if; end if; end process; end OPERACIONES;