A resolution function is a function that defines how the values of multiple sources of a given signal are to be resolved into a single value for that signal.
function function_name (parameters) return type;
function function_name (parameters) return type is
declarations
begin
sequential statements
end function function_name;
The resolution function allows multiple values to drive a single signal at the same time. This is particularly important for buses, which are connecting multiple sources of data.
The specification of a resolution function is the same as for ordinary functions with one requirement: the resolution function must be pure.
Resolution functions are associated with signals that require resolution by including the name of the resolution function in the declaration of signals or in the declaration of the signal subtype.
Example 1
TYPE std_ulogic IS ( 'U', -- Uninitialized
'X',
-- Forcing Unknown
'0',
-- Forcing 0
'1',
-- Forcing 1
'Z',
-- High Impedance
'W',
-- Weak Unknown
'L',
-- Weak 0
'H',
-- Weak 1
'-'
-- Don't care
);
TYPE std_ulogic_vector IS ARRAY
( NATURAL RANGE <> ) OF std_ulogic;
FUNCTION resolved ( s :
std_ulogic_vector ) RETURN std_ulogic;
SUBTYPE std_logic IS
resolved std_ulogic;
TYPE std_logic_vector IS ARRAY
( NATURAL RANGE <>) OF std_logic;
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' ) -- | - |
);
FUNCTION resolved ( s :
std_ulogic_vector ) RETURN
std_ulogic IS
VARIABLE result
: std_ulogic := 'Z'; -- weakest state default
BEGIN
-- the test for a single driver is essential otherwise the
-- loop would return 'X' for a single driver of '-' and that
-- would conflict with the value of a single driver unresolved
-- signal.
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 resolved;
The example is a part of the Std_Logic_1164 Package specification.
The name of the resolution function called Resolved is included into
the declaration of the subtype Std_Logic (highlighted by boldface).
The resolution function itself is declared at the end of the example.
Standard types (BIT and BIT_VECTOR) are not resolved and it is not possible to specify multiple-source buses with these types. This is quite restrictive for typical applications, which use buses.
Because Std_Logic and Std_Logic_Vector are resolved and can handle buses, they became the de facto industrial standard types.