Documentos de Académico
Documentos de Profesional
Documentos de Cultura
12) ALU: Realice un sistema que compruebe la siguiente tabla de verdad de una Unidad Lógica
Aritmética de datos de 8 bits, la cual realiza las siguientes operaciones lógicas, aritméticas, de
desplazamiento y comparación, despliegue el resultado en 2 displays de 7 segmentos y 3 leds para
la salida de comparación:
Operación S A B F M m i
Como se observa, solamente se llegó al caso 6, que se refiere a las operaciones lógicas, las cuales se
pueden realizar con los datos std_logic_vector sin problema. Ahora bien, para realizar las
operaciones aritméticas, debemos convertir el puerto A y B de std_logic_vector a un tipo de dato
entero, esto lo hacemos de la siguiente manera:
Ahora bien, se muestran los demás casos, donde además se incluyen los desplazamientos lógicos,
los cuales se harán con multiplicaciones y divisiones, por lo que se realizan igual con las señales AA
y BB. Así mismo se agrega el caso 15 de comparación con los 3 posibles casos:
Para simular, creamos un archivo vector waveform, agregamos los nodos y colocamos A, B y F en
radix hexadecimal, Mmi en binario y S en unsigned decimal:
A los puertos A y B les damos un valor arbitrario (ícono con el símbolo ¿), de acuerdo a los valores
de la tabla:
Y a la selectora le asignamos un count value (incluso pueden mover el puerto para que quede de la
siguiente manera:
Y al guardarlo y darle simular nos da las siguientes salidas:
Si observan nos genera las salidas tal como se muestran en la tabla del inicio, ahora bien,
modificaremos los datos del vector de forma de onda. Pueden abrir el archivo de simulación original
(sin la salida generada) para modificar los valores de los puertos de entrada, dando CTRL+O y
seleccionando el tipo de archivo .vwf:
Así con el archivo original .vwf modificaremos los datos para que demostremos también los demás
casos de la comparación, así como también podemos asignarles valores “don’t care” para que se
apegue más a la tabla:
Ya con los valores asignados en la tabla de verdad, guardamos y volvemos a simular:
Aún no acabamos, ya que la salida de la última simulación está en binario, y se requiere la salida en
hexadecimal, lo que haremos es un proceso conocido como “enmascaramiento” en el cual
partiremos el dato de 8 bits de la salida para convertirlo en 2 datos de 4 bits cada uno:
Operación S A B F M m i D2 D1
entity alu is
port(A,B:in std_logic_vector(7 downto 0);
S:in integer range 0 to 15;
Mmi:out std_logic_vector(2 downto 0);
D1,D2:out std_logic_vector(6 downto 0));
end entity;
case F1 is
when 0 => D1 <= not"1111110";
when 1 => D1 <= not"0110000";
when 2 => D1 <= not"1101101";
when 3 => D1 <= not"1111001";
when 4 => D1 <= not"0110011";
when 5 => D1 <= not"1011011";
when 6 => D1 <= not"1011111";
when 7 => D1 <= not"1110000";
when 8 => D1 <= not"1111111";
when 9 => D1 <= not"1111011";
when 10 => D1 <= not"1110111";
when 11 => D1 <= not"0011111";
when 12 => D1 <= not"1001110";
when 13 => D1 <= not"0111101";
when 14 => D1 <= not"1001111";
when 15 => D1 <= not"1000111";
end case;
case F2 is
when 0 => D2 <= not"1111110";
when 1 => D2 <= not"0110000";
when 2 => D2 <= not"1101101";
when 3 => D2 <= not"1111001";
when 4 => D2 <= not"0110011";
when 5 => D2 <= not"1011011";
when 6 => D2 <= not"1011111";
when 7 => D2 <= not"1110000";
when 8 => D2 <= not"1111111";
when 9 => D2 <= not"1111011";
when 10 => D2 <= not"1110111";
when 11 => D2 <= not"0011111";
when 12 => D2 <= not"1001110";
when 13 => D2 <= not"0111101";
when 14 => D2 <= not"1001111";
when 15 => D2 <= not"1000111";
end case;
end process;
end architecture;
Simulación en Quartus II
Fácil, ¿no?