Amigos, aqui les dejo una ALU de 8bits TOP-LEVEL que programó un de mis grupos de la UNEFA Maracay-Venezuela. Hay funciones de conversión muy útiles... como no les di restricciones al grupo en cuanto al tipo de programación, lograron esta preciosura de código. Muy fácil de comprender... lástima que no he probado aun el controlador PS2 para teclado y la tarjeta con la que cuento tiene solo 4switches, pero esta simulado con el ISE WEB PACK 9.2 y todo está perfectamente...
Espero validarla en la tarjeta pronto. Les cuento...
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity alu is port
(A, B: in std_logic_vector(7 downto 0);
S : in std_logic_vector(2 downto 0);
O : out std_logic_vector(8 downto 0));
end alu;
architecture mux of alu is
FUNCTION logica(A, B: in std_logic_vector(7 downto 0); S: in std_logic_vector(2 downto 0))
RETURN std_logic_vector IS
BEGIN
case S is
WHEN "100" => return ('0'&A and '0'&B);
WHEN "101" => return ('0'&A or '0'&B);
WHEN "110" => return (not '0'&A);
WHEN "111" => return ('0'&A xor '0'&B);
WHEN OTHERS => return "000000000";
end case;
END logica;
FUNCTION aritmetica(A, B: in std_logic_vector(7 downto 0); S: in std_logic_vector(2 downto 0))
RETURN std_logic_vector IS
constant uno :std_logic_vector(7 downto 0):="00000001";
BEGIN
case S is
WHEN "000" => return std_logic_vector(TO_SIGNED((to_integer(unsigned('0'&A)) + to_integer(unsigned('0'&B))),9));
WHEN "001" => return std_logic_vector(TO_SIGNED((to_integer(unsigned('0'&A)) - to_integer(unsigned('0'&B))),9));
WHEN "010" => return std_logic_vector(TO_SIGNED((to_integer(unsigned('0'&A)) + to_integer(unsigned('0'&uno))),9));
WHEN "011" => return std_logic_vector(TO_SIGNED((to_integer(unsigned('0'&A)) - to_integer(unsigned('0'&uno))),9));
WHEN OTHERS => return "000000000";
end case;
END aritmetica;
BEGIN
O <= aritmetica (A, B, S)
when S(2)='0'
else
logica (A, B, S)
when S(2)='1';
END MUX;
--Espero sus comentarios...