- Section 7.3.5
Objects of user-defined types cannot directly be assigned to or from objects of even a closely related type. A type conversion allows the assignment to be made:
type BUS_VAL is range 0 to 255; variable X_INT : integer := 22; variable X_BUS : BUS_VAL; -- X_BUS := X_INT; --illegal X_BUS := BUS_VAL(X_INT);
Closely related types are:
- integer types and real types
- array types whose lengths, index types and element types match.
type T_BYTE is array (7 downto 0) of std_ulogic; signal TYPE_BUS : T_BYTE; signal VEC_BUS : std_ulogic_vector(7 downto 0); -- TYPE_BUS <= VEC_BUS; --illegal TYPE_BUS <= T_BYTE(VEC_BUS);
If conversion is required between types which are not closely related, a user defined function must be used:
signal X_BOOL: boolean; signal X_STD: std_ulogic; function BOOL_TO_SL( X : boolean ) return std_ulogic is begin if X then return ('1'); else return ('0'); end if; end BOOL_TO_SL; -- X_STD <= X_BOOL; --illegal X_STD <= BOOL_TO_SL(X_BOOL);
A type conversion function may be called in a port map to match port type to signal type.
Most logic synthesis tools support type conversion for appropriate array and integer types.
Most also accept the type conversion functions in the std_logic_1164 package.
Some synthesis vendors supply a VHDL package containing conversion functions which the synthesizer will support.