The Enumeration type is a type whose values are defined by listing (enumerating) them explicitly. This type values are represented by enumeration literals (either identifiers or character literals).
type type_name is (type_element, type_element, ...);
The enumeration type is a type with an ordered set of values, called enumeration literals, and consisting of identifiers and character literals. Each of enumeration literals must be unique within the given declaration type, but different enumeration types may use the same literals (example 1). In this case, it is said that such literals are overloaded. When such a literal is referenced in the source code, its is determined from the context, in which enumeration this literal has occurred.
All enumerated values are ordered and each of them has a numeric (integer) value assigned to it. The number indicates the position of the literal. The very first literal in the definition has position number zero and each subsequent has the number increased by one from its predecessor (example 2).
Each enumeration type defined has implicitly defined relational operators that can be used on the type values.
The package Standard contains declarations of several predefined enumeration types: BIT, BOOLEAN, CHARACTER, SEVERITY_LEVEL, FILE_OPEN_KIND and FILE_OPEN_STATUS. Apart from that the package Std_Logic_1164 defines another enumeration type, STD_ULOGIC.
Example 1
type NotGood is
(X, '0', '1', X); -- illegal
type MyBit is
(L, H);
type Test is
('0', '1', L, H);
The type NotGood is an illegal declaration as the literal X appears
twice in the same declaration. On the other hand there is nothing
incorrect in using L (LOW) and H (HIGH) twice because they are used
in two different declarations.
Example 2
type FSM_States is (Init, Read, Decode, Execute, Write);
The type FSM_States defines five possible values, which are numbered from 0 to 4: the position number of Init is 0, position of Read is 1, Decode - 2, Execute - 3, and Write - 4.
It is illegal to define an enumeration type with a range.
It is assumed that the values are defined in ascending order. For this reason it is recommended to order the literals in such a way that the default value is the first one (it is referred to through the attribute 'left').
Objects of enumeration types are typically synthesizeable.