-- 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
Beginif s'length = 1 then return s(s'low);
elsefor i in s'range loop
result := resolution_table(result, s(i));
end loop;
end if;
return result;
end function resolved;