====== LOOP ====== ===== loop_statement ===== [ loop _label : ] [ iteration_scheme ] loop sequence_of_statements end loop [ loop _label ] ; ===== Parents ===== * function_statement_part * procedure_statement_part * process_statement_part ===== Further definitions ===== ==== label ==== * [[.:bnf#identifier]] ==== iteration_scheme ==== ''**while** [[.:bnf#condition]]'' ''**for** //loop// _[[.:bnf#parameter_specification]]'' ==== sequence_of_statements ==== ''{ [[.:bnf#sequential_statement]] }'' ===== Examples ===== This is an endless loop in which the signal //q// is assigned the value of //d// 1 ns after the condition //clock =`1`// has been fulfilled. LOOP WAIT UNTIL clock = '1' ; q <= d AFTER 1 ns ; END LOOP ; ---- This loop, which has a label, is run six times. In each pass the value of var is raised by 5. lbl : FOR i IN 0 TO 5 LOOP var := var + 5 ; END LOOP ; ---- The While-loop is run as long as //value > 0// is valid. The statements within the loop are ignored if //value = 3// . WHILE value > 0 LOOP NEXT WHEN value = 3 ; tab( value ) := value REM 2 ; value := value / 2 ; END LOOP ; ---- These are two examples for chained **FOR** -loops which are needed to calculate the values of the elements of a two-dimensional array. In the second example each of the **FOR** -loops has its own label. With the **EXIT** -statement the inner loop is left if //i = j// . FOR i IN 10 DOWNTO 2 LOOP FOR j IN 0 TO i LOOP table( i, j ) := i + j - 7 ; END LOOP ; END LOOP ; lbl_1 : FOR i IN 10 DOWNTO 2 LOOP lbl_2 : FOR j IN 0 TO i LOOP EXIT lbl_2 WHEN i = j ; table ( i, j ) := i + j - 7 ; END LOOP lbl_2 ; END LOOP lbl_1 ;