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.
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 :
<=
indique que l’affectation prend effet avec un retard
(voir à ce sujet la section Signaux et variables).:=
indique que l’affectation est immédiate.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.
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 :
elsif
introduit une nouvelle branche dans l’instruction if
courante.else if
ouvre une nouvelle instruction if
qu’il faudra refermer avec un end if
.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).
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.
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;
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);
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;