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. 
     
  
    
 
    |