|
|
Resolution Function
Formal Definition
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.
Simplified Syntax
function function_name
(parameters) return type;
function function_name
(parameters) return type is
declarations
begin
sequential statements
end function function_name;
Description
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.
Examples
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.
Important Notes
-
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.
|