Aggregate
Formal Definition
A basic operation that combines
one or more values into a composite value of a record or array type.
Syntax:
aggregate ::= ( element_association { , element association } )
element_association ::= [choices => ] expression choices ::=
choice { | choice } choice ::= simple expression
|
discrete_range |
element_simple_name
| others
Description
The aggregate assigns one
or more values to the elements of a record or array creating the
composite value of this type. Aggregates are composed of element
associations, which associate expressions to elements (one expression
per one or more elements). Element associations are specified in
parentheses and are separated by commas.
An expression assigned to an element or elements must be of the same
type as the element(s).
Elements can be referred to either by textual order they have in the
object declaration (so called positional
associations - example 1) or by its name (named
associations - example 2). Both methods can be used in the same
aggregate, but in such a case all positional associations appear
first (in textual order) and all named associations appearing next
(in any order). In any case if the association others
is used, it must be the last one in an aggregate.
The choice clause, denoting selection of element(s) can have any of
the following forms: simple expression, discrete range, simple name
or reserved word others.
A value of simple expression can be applied in arrays only and must
belong to discrete range of an array type. A simple expression
specifies the element at the corresponding index value. Example 2
illustrates this concept.
A discrete range must meet the same conditions as a simple
expression. It is useful when several consecutive elements of an
array are assigned the same value (example 3). A discrete range
serves for defining the set of indexes only and the direction
specified or implied has no significance.
The use of element simple name as a choice is restricted to records
only. In this case, each element is identified by its name (Example 4).
When some elements are assigned different values and the remaining
elements will receive some other value, reserved word others
can be used to denote those elements (Example 5). Such a choice must
be the last in an aggregate and can be used both in arrays and in
records, provided that the remaining elements of the records are of
the same type.
The choice others can serve
as a very convenient way to assign the same value to all elements of
some array, e.g. to reset a wide bus (Example 6).
If several elements are assigned the same value, a multiple choice
can be used. In such a case a bar sign (|) separates references to
elements (Example 7). If a multiple choice is used in an array
aggregate, it may not be mixed with positional associations.
Examples
Example 1
variable Data_1 : BIT_VECTOR
(0 to 3) := ('0','1','0','1');
Bits number 0 and 2 are assigned the value '0', while bits 1 and 3
are assigned '1'. All element associations here are positional.
Example 2
variable Data_2 : BIT_VECTOR
(0 to 3) := (1=>'1',0=>'0',3=>'1',2=>'0');
Like in the previous example, bits number 0 and 2 are assigned the
value '0', while bits 1 and 3 are assigned '1'. The element
associations here, however, are named. Note that in this case the
elements can be listed in arbitrary order.
Example 3
signal Data_Bus :
Std_Logic_Vector (15 downto 0);
. . .
Data_Bus <= (15 downto 8
=> '0', 7 downto 0 => '1');
Data_Bus will be assigned the value of "0000000011111111".
The first element is associated a value in positional way (thus it is
bit number 15), and the other two groups are assigned values using
discrete ranges.
Example 4
type Status_Record is record
Code : Integer;
Name : String (1 to 4);
end record;
variable Status_Var :
Status_Record := (Code => 57, Name => "MOVE");
Choice as an element simple name can be used in record aggregates -
each element is associated a value (of the same type as the element itself).
Example 5
signal Data_Bus :
Std_Logic_Vector (15 downto 0);
. . .
Data_Bus <= (14 downto 8
=> '0', others => '1');
Data_Bus will be assigned the same value as in example 3
("1000000011111111"), but this aggregate is written in more
compact way. Apart from bits 14 through 8, which receive value '0'
all the others (15 and 7 through 0) will be assigned '1'. Note that
the choice others is the last in the aggregate.
Example 6
signal Data_Bus :
Std_Logic_Vector (15 downto 0);
. . .
Data_Bus <= (others => 'Z');
Instead of assigning "ZZZZZZZZZZZZZZZZ" to Data_Bus in
order to put it in high impedance state, an aggregate with the others
choice representing all the elements can be used.
Example 7
signal Data_Bus :
Std_Logic_Vector (15 downto 0);
. . .
Data_Bus <= (15 | 7 downto
0 => '1',
others
=> '0');
Note the multiple choice specification of the assignment to the bits
15 and 7 through 0. The result of the assignment to Data_Bus will be
the same as in examples 3 and 5 ("1000000011111111").
Important Notes
-
Associations with elements' simple names are allowed in record
aggregates only.
-
Associations with simple expressions or discrete ranges as choices
are allowed only in array aggregates.
-
Each element of the value defined by an aggregate must be represented
once and only once in the aggregate.
-
Aggregates containing the single element association must always be
specified using named association in order to distinguish them from
parenthesized expressions.
-
The others choice can be
only the last in an aggregate.
|