Case Statement
Formal Definition
The case
statement selects for execution one of several alternative sequences
of statements; the alternative is chosen based on the value of the
associated expression.
Simplified Syntax
case expression is
when
choice => sequential_statements
when
choice => sequential_statements
. . .
end
case;
Description
The case statement evaluates
the listed expressions and selects one alternative sequence of
statements according to the expression value. The expression can be
of a discrete type or a one-dimensional array of characters (example 1).
The case statement contains
a list of alternatives starting with the when
reserved word, followed by one or more choices and a sequence of statements.
An alternative may contain several choices (example 2), which must be
of the same type as the expression appearing in the case statement.
For each expression there should be at least one locally static
choice. The values of each choice must be unique (no duplication of
values is allowed).
A choice can be either a simple name (example 1), a name of a simple
element (example 2) or discrete range (a slice, example 3). The
choice types can be mixed.
A subtype with a constraint range (example 4) can substitute a slice.
Another option is to use an object name as the choice. The object
must be of the same type as the expression in the case
statement. Example 5 shows it for a constant.
When all explicitly listed choices do not cover all the alternatives
(all the values available for an expression of given type) the others
choice must be used because the choice
statements must cover all the alternatives, see example 5).
Examples
Example 1
P1:process
variable x: Integer range
1 to 3;
variable y: BIT_VECTOR (0 to 1);
begin
C1: case
x is
when
1 => Out_1 <= 0;
when
2 => Out_1 <= 1;
when
3 => Out_1 <= 2;
end case C1;
C2: case
y is
when
"00" => Out_2 <= 0;
when
"01" => Out_2 <= 1;
when
"10" => Out_2 <= 2;
when
"11" => Out_2 <= 3;
end case C2;
end process;
Depending on the values of the variable x and y, we assign the values
0, 1, 2 or 3 (in the second case) to the signals Out_1 and Out_2
(both of type Integer).
Example 2
P2:process
type Codes_Of_Operation is (ADD,SUB,MULT,DIV);
variable Code_Variable: Codes_Of_Operation;
begin
C3: case
Code_Variable is
when
ADD | SUB => Operation := 0;
when
MULT | DIV => Operation := 1;
end case C3;
end process;
When two or more alternatives lead to the same sequence of operations
then they can be specified as a multiple choice in one when clause.
Example 3
P3:process
type Some_Characters is ('a','b','c','d','e');
variable
Some_Characters_Variable: Some_Characters;
begin
C4: case
Some_Characters_Variable is
when
'a' to 'c' => Operation
:= 0;
when
'd' to 'e' => Operation
:= 1;
end case C4;
end process;
Slices can be used as choices. In such a case, the slice name must
come from the discrete range of the expression type.
Example 4
P5:process
variable Code_of_Operation :
INTEGER range 0 to 2;
constant Variable_1 :
INTEGER := 0;
begin
C6: case
Code_of_Operation is
when
Variable_1 | Variable_1 + 1 =>
Operation
:= 0;
when
Variable_1 + 2 =>
Operation
:= 1;
end case C6;
end process;
Constant used as a choice.
Example 5
P6:process
type Some_Characters is ('a','b','c','d','e');
variable Code_of_Address : Some_Characters;
begin
C7:case
Code_of_Address is
when
'a' | 'c' => Operation := 0;
when others
=> Operation := 1;
end case C7;
end process;
If the Code_of_Address variable is equal to 'a' and 'c', then the
assignment Operation:=0;
will be chosen. For the 'b', 'd' and 'e' values, the assignment Operation:=1;
will be performed.
Important Notes
-
The case expression must be of a discrete type or of a
one-dimensional array type, whose element type is a character type.
-
Every possible value of the case expression must be covered by the
specified alternatives; moreover, every value may appear only once
(no duplicates or overlapping of ranges is allowed).
-
The When others clause may
appear only once and only as the very last choice.
|