An array is an object that is a collection of elements of the same type. VHDL supports N-dimensional arrays, but Foundation Express supports only one-dimensional arrays. Array elements can be of any type. An array has an index whose value selects each element. The index range determines how many elements are in the array and their ordering (low to high, or high downto low). An index can be of any integer type.
You can declare multidimensional arrays by building one-dimensional arrays where the element type is another one-dimensional array, as shown in the following example.
type BYTE is array (7 downto 0) of BIT;
type VECTOR is array (3 downto 0) of BYTE;
VHDL provides both constrained arrays and unconstrained arrays. The difference between these two arrays comes from the index range in the array type definition.
A constrained array's index range is explicitly defined; for example, an integer range (1 to 4). When you declare a variable or signal of this type, it has the same index range.
The syntax of a constrained array type definition follows.
type array_type_name is
array ( integer_range ) of type_name ;
array_type_name is the name of the new constrained array type, integer_range is a subrange of another integer type, and type_name is the type of each array element.
An example of a constrained array type definition follows.
type BYTE is array (7 downto 0) of BIT;
-- A constrained array whose index range is
-- (7, 6, 5, 4, 3, 2, 1, 0)
You define an unconstrained array's index range as a type, for example, INTEGER. This definition implies that the index range can consist of any contiguous subset of that type's values. When you declare an array variable or signal of this type, you also define its actual index range. Different declarations can have different index ranges.
The syntax of an unconstrained array type definition follows.
type array_type_name is
array (range_type_name range <>)
of element_type_name ;
array_type_name is the name of the new unconstrained array type, range_type_name is the name of an integer type or subtype, and element_type_name is the type of each array element.
An example of an unconstrained array type definition follows.
type BIT_VECTOR is array(INTEGER range <>) of BIT;
-- An unconstrained array definition
. . .
variable MY_VECTOR : BIT_VECTOR(5 downto -5);
The advantage of using unconstrained arrays is that a VHDL tool remembers the index range of each declaration. You can use array attributes to determine the range (bounds) of a signal or variable of an unconstrained array type. With this information, you can write routines that use variables or signals of an unconstrained array type, independently of any one array variable's or signal's bounds. The next section describes array attributes and how they are used.
Foundation Express supports the following predefined VHDL attributes for use with arrays.
The above attributes return a value corresponding to part of an array's range. The table below shows the values of the array attributes for the variable MY_VECTOR in the example of an unconstrained array type definition from the previous Unconstrained Array section.
Attribute Expression | Value |
---|---|
MY_VECTOR'left | 5 |
MY_VECTOR'right | -5 |
MY_VECTOR'high | 5 |
MY_VECTOR'low | 5 |
MY_VECTOR'length | 11 |
MY_VECTOR'range | (5 down to -5) |
MY_VECTOR'reverse_range | (-5 to 5) |
The following example shows the use of array attributes in a function that ORs together all elements of a given BIT_VECTOR (declared in the example of an unconstrained array type definition in the previous section) and returns that value.
function OR_ALL (X: in BIT_VECTOR) return BIT is
variable OR_BIT: BIT;
begin
OR_BIT := '0';
for I in X'range loop
OR_BIT := OR_BIT or X(I);
end loop;
return OR_BIT;
end;
Note that this function works for a BIT_VECTOR of any size.