-- El std_logic es el tipo std_ulogic resuelto
-- Para ello se basa en una tabla de resolución

--Tabla de resolución

type stdlogic_table is
array (std_ulogic, std_ulogic) of std_ulogic;
constant resolution_table : stdlogic_table :=
------------------------------------------
-- 'U', X', '0', '1', Z', 'W', 'L', 'H', '-'
------------------------------------------

(('U', 'U', 'U', 'U', 'U', 'U', 'U', 'U', 'U' ), -- 'U'
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ), -- X'
( 'U', 'X', '0', 'X', '0', '0', '0', '0', 'X' ), -- '0'
( 'U', 'X', 'X', '1', '1', '1', '1', '1', 'X' ), -- '1'
( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', 'X' ), -- Z'
( 'U', 'X', '0', '1 ', 'W', 'W', 'W', 'W', 'X' ),-- 'W'
( 'U', 'X', '0', '1 ', 'L', 'W', 'L', 'W','X' ), -- 'L'
( 'U', 'X', '0', '1 ', 'H', 'W', 'W', 'H', 'X' ),-- 'H'
( 'U', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X' ) -- '-'
);

--2. Función de resolución

-- Entonces, cuando deben conciliarse valores en una operación lo más fácil es llamar la table de resolución
-- La siguiente función devuelve el valor resuelto de un dato

function resolved ( s : std_ulogic_vector) return std_ulogic is
variable result : std_ulogic := 'Z'; -- estado más débil
Begin

if s'length = 1 then return s(s'low);
else

for i in s'range loop

result := resolution_table(result, s(i));

end loop;

end if;

return result;
end function resolved;


WcN - Joan Oliver. Diseño de circuitos digitales con VHDL