Vous êtes sur la page 1sur 10

30/07/2019

Ecole Nationale Polytechnique –Constantine.


Département EEA
Quatrième Année Ingénieurs –Semestre 2.
Automatique/Electrotechnique
Cours. Circuits Programmables

Chapitre V. (Partie 3)
Langages de programmation HDL
(Hardware description langage, langage de description du matériel)
Durée du Cours: 1h30
Présenté par: Dr. S. BENSEGUENI
(benskandix@gmail.com)

Année Universitaire. 2018-2019

2. Développement et conception en langage VHDL


(Déclarations simultanées et séquentielles)
2. Déclarations séquentielles
Les instructions séquentielles se produisent dans un
process et sont exécutées dans l'ordre. Nous
commençons par expliquer le concept de process, puis
examinons certaines des instructions séquentielles
disponibles pour une utilisation dans un process.
En plus des instructions séquentielles qu’on considéra ici,
le VHDL fournit des instructions pour la construction de
boucles (loop, while-loop, for-loop, next
and exit), des instructions pour la construction de
sous-programmes (procedure, function et
return) et des instructions pour suspendre l'exécution
de un processus (wait).
Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Déclarations simultanées et séquentielles)
2. Déclarations séquentielles
Les boucles peuvent facilement être construites à l'aide de
machines d'état (Les for-loop peuvent être utiles pour
répéter un processus plusieurs fois (par exemple une fois pour
chaque élément d'un tableau). Cependant, les boucles ne
peuvent pas être utilisées dans des circuits où les données ne
sont pas immédiatement disponibles, telles que les itérarations
sur les données stockées dans une mémoire. Les limites d'une
boucle doivent être calculables (pouvant être déterminées au
moment de la synthèse).
Les sous-programmes peuvent être mis en œuvre en utilisant
des composants de machine à états (schémas distincts de
manière hiérarchique).
Circuits Programmables Dr. S. Bensegueni

1
30/07/2019

2. Développement et conception en langage VHDL


(Déclarations simultanées et séquentielles)
2. Déclarations séquentielles
N'oubliez pas que les instructions séquentielles VHDL
ne sont pas séquentielles dans le même sens que les
instructions d'un programme exécuté sur un
processeur normal.
Dans un processeur, une nouvelle instruction est
exécutée à chaque cycle d'horloge, tandis que les
instructions séquentielles sont essentiellement
exécutées en cascade.

Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Déclarations simultanées et séquentielles)
2. Déclarations séquentielles
2.1. Processus
Un process est une instruction concurrente unique contenant une
séquence d'instructions séquentielles. Comme un processus est une
instruction concurrente, tous les processus d'une architecture
fonctionnent en parallèle. La syntaxe de base de l'instruction de
process est indiquée ci-dessous. Notez que PROCESS_LABEL est
facultatif.
1 PROCESS_LABEL : process (SENSITIVITY_LIST)
2 begin
3 [sequential statements]
4 end process PROCESS_LABEL;

.
Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Déclarations simultanées et séquentielles)
2. Déclarations séquentielles
2.1. Processus
Un processus reste suspendu jusqu'à ce que tout signal
de la liste SENSITIVITY_LIST change de valeur. Sur la
base de ce que nous incluons dans
SENSITIVITY_LIST, On peut former deux types de
processus: le processus combinatoire spécifiant
uniquement la logique combinatoire et le processus
séquentiel dans lequel les actions se produisent dans le
temps avec une horloge. Pour un processus combinatoire,
toutes les entrées doivent être répertoriées dans la
SENSITIVITY_LIST afin que les sorties puissent être
mises à jour immédiatement.
Circuits Programmables Dr. S. Bensegueni

2
30/07/2019

2. Développement et conception en langage VHDL


(Déclarations simultanées et séquentielles)
2. Déclarations séquentielles
2.1. Processus
Exemple:
1 architecture comb_arch of combinatorial is
2 signal X,Y,A,B,C : std_logic;
3 begin
4 process(A,B,C)
5 begin
6 X<=A or B;
7 Y<=A and C;
8 end process;
9 end comb_arch;

Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Déclarations simultanées et séquentielles)
2. Déclarations séquentielles
2.1. Processus
En règle générale, la conception utilise des machines d'état qui
sont des structures intrinsèquement séquentielles (une horloge
indique la progression d'un état à l'autre). Au minimum, les
processus séquentiels auront un signal d'horloge dans la
SENSITIVITY_LIST.
Si une réinitialisation asynchrone est requise, le signal de
réinitialisation apparaîtra également dans la liste de sensibilité.
Le fragment de code ci-après illustre des processus séquentiels
avec réinitialisations synchrones et asynchrones.

Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Déclarations simultanées et séquentielles)
1 -- Asynchronous reset
2 ASYNC_RESET : process(CLK, Reset)
3 begin
4 if Reset=’1’ then
5 -- Sequential statements - reset function
6 elsif CLK’event and CLK=’1’ then
7 -- sequential statements -- process
implementation
8 end if;
9 end process ASYNC_RESET;
10

Circuits Programmables Dr. S. Bensegueni

3
30/07/2019

2. Développement et conception en langage VHDL


(Déclarations simultanées et séquentielles)
11 -- Synchronous reset
12 SYNC_RESET : process(CLK)
13 begin
14 if CLK’event and CLK=’1’ then
15 if Reset=’1’ then
16 - sequential statements -- reset
function
17 else
18 - sequential statements -- process
implementation
19 end if;
20 end if;
21 end process SYNC_RESET;
Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Déclarations simultanées et séquentielles)
Notez que pour la réinitialisation asynchrone, on a placé
la condition de réinitialisation avant la condition
d'horloge. Une instruction if n'exécute que la première
condition vraie et un signal de reset asynchrone a
toujours la priorité sur l'horloge; la condition de
réinitialisation doit donc être vérifiée en premier. La
construction CLK’event utilisée dans les lignes 6 et 14
utilise l’attribut event qui n’est vrai que si le signal
d’horloge change d’état. VHDL définit une plage
d'attributs pour différents objets, l'un d'entre eux étant
l'attribut event défini pour les signaux. L'attribut event
ne correspond directement à aucun composant
numérique. Il est utilisé pour permettre l'inférence de
bascules.
Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
Dans un processus, il est possible d'attribuer une
valeur à deux types d'objet : les signaux et les
variables. L'attribution de signal séquentiel diffère de
l'attribution de signal simultané parce que plusieurs
assignations séquentielles au même signal ne
conduisent pas à plusieurs conducteurs pour ce
signal.
Considérons le fragment de code suivant :

Circuits Programmables Dr. S. Bensegueni

4
30/07/2019

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
1 architecture sig_assign_arch of sig_assign is
2 signal W,X,Y,Z,O1,O2,A1,A2 : std_logic;
3 begin
4 -- Concurrent signal assignment
5 A1 <= not W;
6 O1 <= Y or X;
7 O1 <= A1 and Z; -- Two drivers for O1
8
9 process(W,X,Y,Z) -- Driver for O2
10 begin
11 -- Sequential signal assignment
12 A1 <= not W;
13 O2 <= Y or X; -- No effect
14 O2 <= A1 and Z; -- Assignment of O2
15 end process;
16 end sig_assign_arch;

Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
Les lignes 6 et 7 sont des assignations de signaux
simultanées pour le signal O1, le signal O1 ayant donc
deux conducteurs. Les lignes 13 et 14 sont des
affectations de signaux séquentielles car elles font partie
d'un processus. Dans l'affectation séquentielle du signal,
une valeur n'est affectée à un signal qu'à la fin du
processus, seule l'affectation finale a donc un effet. Étant
donné que la valeur attribuée est déterminée à la fin du
processus, l'ordre d'affectation séquentielle des signaux
n'a pas d'importance. Par exemple, placer la ligne 12
après la ligne 14 ne changerait pas le résultat final. Notez
qu'un processus constitue un pilote pour les signaux qui
lui sont attribués.
Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
Lorsque vous devez attribuer une valeur immédiatement, vous
pouvez utiliser une variable. Les variables VHDL ne peuvent être
utilisées que dans un processus et ne sont accessibles que dans
le processus dans lequel elles sont définies. Ces variables
agissent comme les variables dans d'autres langages (une valeur
leur est immédiatement attribuée). Pour rendre cette différence
évidente, l'affectation de variable utilise une syntaxe différente
de l'affectation du signal.
VARIABLE_NAME := EXPRESSION;
Les variables sont déclarées dans le processus. Pour aider à
clarifier la différence entre les signaux et les variables,
considérons les fragments de code suivants qui sont identiques
sauf pour A, qui est une variable dans le premier programme et
un signal dans le deuxième.

Circuits Programmables Dr. S. Bensegueni

5
30/07/2019

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
1 architecture arch of test1 is
2 signal X,Y,Z : std_logic;
3 begin
4 process(X,Y,Z) {
5 variable A : std_logic;
6 begin
7 A := X;
8 Z <= A xor ‘1’;
9 A := ‘1’;
10 Y <= A or ‘1’;
11 end process;
12 end arch;
Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
1 architecture arch of test2 is
2 signal X,Y,Z : std_logic;
3 signal A : std_logic;
4 begin
5 process(A,X,Y,Z) {
6 begin
7 A <= X;
8 Z <= A xor ‘1’;
9 A <= ‘1’;
10 Y <= A or ‘1’;
11 end process;
12 end arch;
Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
Etant donné que les variables reçoivent immédiatement une
valeur, l’exécution du premier code entraînera les affectations
suivantes :
Z <= X xor ‘1’;
Y <= ‘1’ or ‘1’;
Dans le deuxième fragment de code, seule la ligne 9 a un effet,
la ligne 7 sera ignorée car A est un signal. Ainsi, le résultat net
de l'exécution du code de droite sera les assignations suivantes :
Z <= ‘1’ xor ‘1’;
Y <= ‘1’ or ‘1’;
Il est important d'initialiser une variable avant de l'utiliser. Si la
variable est initialisée après son utilisation, un verrou sera
déduit pour stocker la valeur de la variable.

Circuits Programmables Dr. S. Bensegueni

6
30/07/2019

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
Instruction if
L'instruction if séquentielle est similaire à
l'affectation conditionnelle simultanée des signaux.
La principale différence entre les deux concepts vus
précédemment réside dans le fait que l'affectation
conditionnelle du signal affecte une valeur à un signal
en fonction de certaines conditions. L'instruction if
est plus puissante et permet de réaliser n'importe
quelle opération en fonction d'une condition.
La syntaxe d'une instruction if séquentielle est :
Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)

if COND1 then
[sequential statements]
elsif COND2 then
[sequential statements]
else
[sequential statements]
end if;

Notez que la lettre ‘e’ est manquante dans la branche elsif.


.

Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
Veillez à éviter les situations dans lesquelles une variable n'est pas
affectée avant sa lecture, ce qui peut se produire dans le fragment de
code suivant :
1 process (in1)
2 variable var1 : std_logic;
3 begin
4 if in1 = ’1’ then
5 var1 := ‘1’;
6 end if;
7 out1 <= var1;
8 end process;
Dans ce cas, si in1 n’est pas égal à "1", var1 n’est pas initialisée. Cette
situation n'est pas illégale. Cependant, cela peut conduire à des
résultats incohérents.
Circuits Programmables Dr. S. Bensegueni

7
30/07/2019

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
Instruction case
L'instruction case est similaire à l'affectation de signal
sélectionnée concurrente. L'instruction case est plus
puissante que l'affectation simultanée de signaux
puisqu'elle permet l'exécution de code arbitraire plutôt
que la simple affectation de signal. L'instruction case
permet également l'utilisation de l'instruction
séquentielle NULL, ce qui signifie que rien ne doit être
exécuté si l'expression prend une valeur donnée.
L'instruction case n'exécutera que les instructions
séquentielles de la branche évaluées comme étant vraies.
Il n'est pas nécessaire d'utiliser une instruction break
comme dans le langage C.
Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
La syntaxe d'une instruction de casse séquentielle est la
suivante :
case EXPRESSION is
when CHOICE1 =>
[sequential statements]
when CHOICE2 =>
[sequential statements]
when others =>
[sequential statements]
end case;
Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
Exemple de code
L'exemple de code ci-dessous implémente la machine à
états simple illustrée à la figure ci-dessous. La machine à
états est implémentée avec une réinitialisation synchrone
et a deux états S1 et S2. Lors de la réinitialisation, la
machine à états est mise dans l'état initial (S1) et la sortie
(testout) est réglée sur haute.

.
Circuits Programmables Dr. S. Bensegueni

8
30/07/2019

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
Exemple de code
Si l'entrée de test devient haute, la machine à états
passe à l'état S2 où testout est réglé sur bas. Si
l'entrée test retourne à l'état bas, la machine à états
revient à l'état S1 et testout est défini sur haut.

.
Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
Exemple de code
Cette machine à états est une implémentation (inefficace) d'une sorte
d'inverseur synchrone. Le code inclus ici a été généré automatiquement à
partir d'un outil de saisie de machine à états.
1 library IEEE;
2 use IEEE.std_logic_1164.all;
3
4 entity test is
5 port (clk: in STD_LOGIC;
6 reset: in STD_LOGIC;
7 testin: in STD_LOGIC;
8 testout: out STD_LOGIC);
9 end;
10
11 architecture test_arch of test is

Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
13 type Sreg0_type is (S1, S2);
14 signal Sreg0: Sreg0_type;
15
16 begin
17
18 StateMachine : process (clk)
19 begin
20
21 if clk’event and clk = ’1’ then
22 if reset=’1’ then
23 Sreg0 <= S1;
24 testout<=’1’;
25 else
26 case Sreg0 is
27 when S1 =>
28 testout<=’1’;
29 if testin=’1’ then
30 Sreg0 <= S2;
31 end if;
Circuits Programmables Dr. S. Bensegueni

9
30/07/2019

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
32 when S2 =>
33 testout<=’0’;
34 if testin=’0’ then
35 Sreg0 <= S1;
36 end if;
37 when others =>
38 null;
39 end case;
40 end if;
41 end if;
42
43 end process StateMachine;
44 end test_arch;
Circuits Programmables Dr. S. Bensegueni

2. Développement et conception en langage VHDL


(Assignation de variable et de signal)
32 when S2 =>
33 testout<=’0’;
34 if testin=’0’ then
35 Sreg0 <= S1;
36 end if;
37 when others =>
38 null;
39 end case;
40 end if;
41 end if;
42
43 end process StateMachine;
44 end test_arch;
Circuits Programmables Dr. S. Bensegueni

10

Vous aimerez peut-être aussi