Instructions séquentielles

Le terme instruction séquentielle désigne une instruction utilisable dans le corps d’un processus. À part les affectations de signaux, les instructions suivantes ne peuvent pas apparaître directement dans le corps d’une architecture en tant qu’instructions concurrentes.

Ne pas confondre :

Ce sont deux notions indépendantes : en VHDL, les instructions séquentielles peuvent servir à décrire aussi bien de la logique combinatoire que de la logique séquentielle.

Affectation d’un signal ou d’une variable

Dans un processus, l’affectation d’un signal suit la même syntaxe que l’affectation concurrente.

nom de signal <= expression;

Les variables sont affectées au moyen de l’opérateur := :

nom de variable := expression;

Ici, nom de signal et nom de variable peuvent également désigner un élément de tableau ou un champ d’une valeur structurée.

L’existence de deux opérateurs différents permet de mettre en évidence la différence de comportement entre ces deux instructions d’affectation :

Dans un processus, les affectations conditionnelles de signaux et de variables (when...else), et les affectations avec sélection (with...select) sont valides à partir du standard VHDL-2008 seulement.

Les versions antérieures du langage VHDL n’acceptent que les affectations simples. Il faut alors utiliser les instructions if et case pour obtenir un comportement équivalent.

Instruction if

L’instruction if choisit un bloc d’instructions à exécuter parmi une liste de blocs associés à des conditions. Le premier bloc dont la condition est vraie est exécuté. Si aucune condition n’est vraie, la clause else finale est exécutée.

if condition then
   instruction séquentielle
   ...
   instruction séquentielle
elsif condition then
   instruction séquentielle
   ...
   instruction séquentielle
...
else
   instruction séquentielle
   ...
   instruction séquentielle
end if;

Les conditions sont des expressions dont le résultat doit être de type boolean.

Les écritures elsif et else if ne sont pas équivalentes :

Instruction case

L’instruction case choisit un bloc d’instructions à exécuter en fonction de la valeur d’une expression.

case expression is
    when valeur =>
       instruction séquentielle
       ...
       instruction séquentielle
    when valeur | ... valeur =>
        instruction séquentielle
        ...
        instruction séquentielle
    ...
    when others =>
        instruction séquentielle
        ...
        instruction séquentielle
end case;

Après le mot-clé when on peut trouver une valeur simple ou une liste de valeurs possibles séparées par des barres verticales (|, à ne pas confondre avec l’opérateur or). La clause when others est facultative : elle permet de traiter tous les cas non couverts dans les clauses when précédentes.

Les clauses when doivent être mutuellement exclusives (on ne doit pas trouver deux fois la même valeur) et exhaustives (toutes les valeurs possibles de l’expression doivent être couvertes).

Instruction for

La boucle for permet de répéter un bloc d’instructions en faisant progresser un compteur de boucle dans un intervalle.

label : for nom du compteur in intervalle loop
   instruction séquentielle
   ...
   instruction séquentielle
end loop label;

Le label est facultatif.

Instructions next et exit

Dans une boucle, les instructions next et exit permettent respectivement de passer à l’itération suivante, ou de sortie de la boucle.

Dans l’exemple ci-dessous, on cherche le premier '1' dans le vecteur x. Dès qu’il est trouvé, on place un '1' au même indice dans le vecteur y et on sort de la boucle.

y <= "00000000";
for i in 0 to 7 loop
    if x(i) = '1' then
        y(i) <= '1';
        exit;
    end if;
end loop;

Les instructions next et exit peuvent s’écrire selon différentes variantes. Nous donnons ci-dessous la syntaxe de l’instruction exit. Les même règles s’appliquent à l’instruction next.

-- Sortir de la boucle courante.
exit;
-- Sortir de la boucle qui possède ce label.
exit label d'une boucle;
-- Sortir de la boucle courante si la condition est vraie.
exit when condition;
-- Sortir de la boucle qui possède ce label si la condition est vraie.
exit label d'une boucle when condition;

Appel de procédure

L’appel de procédure s’écrit en indiquant le nom de la procédure, suivi de la liste des arguments entre parenthèses et séparés par des virgules.

nom de la procédure(expression, ... expression);

La notation par association fait correspondre chaque nom de paramètre avec sa valeur :

nom de la procédure(nom de paramètre => expression, ... nom de paramètre => expression);

Instruction return

L’instruction return n’est autorisée que dans un sous-programme. Elle permet de sortir immédiatement du sous-programme. Dans une fonction, elle indique la valeur à retourner.

-- Dans une procédure
return;

-- Dans une fonction
return expression;