Vous êtes sur la page 1sur 44

UNIVERSITE ABD EL MALEK ESSAADI

ÉCOLE NATIONALE DES SCIENCES APPLIQUÉES


Tétouan

MODULE: ELECTRONIQUE EMBARQUEE

Filière: GM2

Année: 2019/2020
A. ZAKRITI 1
UNIVERSITE ABD EL MALEK ESSAADI
ÉCOLE NATIONALE DES SCIENCES APPLIQUÉES
Tétouan

CIRCUITS NUMÉRIQUES PROGRAMMABLES

« Éléments de VHDL »

A. ZAKRITI 2
UNIVERSITE ABD EL MALEK ESSAADI
ÉCOLE NATIONALE DES SCIENCES APPLIQUÉES
Tétouan

« Éléments de VHDL »

Types d’instructions en
description comportemental

A. ZAKRITI 3
Rappel

A. ZAKRITI 4
Les instructions en mode concurrent
1- Affectation conditionnelle: WHEN/ELSE
C'est l'assignation d'une valeur à un signal ou des valeurs à un
agrégat de signaux sur la base d'une condition.

Identificateur_signal = nom_signal ou agrégat


Condition = expression booléenne comportant:
- des opérateurs relationnels: =, /=, <=, >, >=
- des opérateurs logiques: and, or, xor

A. ZAKRITI 5
Les instructions en mode concurrent

Exemple:

celui-ci se rapporte aux conditions manquantes et détermine


la valeur à assigner pour l’ensemble des cas manquants

A. ZAKRITI 6
Les instructions en mode concurrent

Exemple 1 :
Donner l’architecture d’une description comportementale
VHDL en utilisant l’instruction WHEN/ELSE pour décrire la
fonction logique suivante:
𝑺 = 𝒂  𝒃 .𝑪ഥ+𝒅

S est à l’état 1 si d = 1 ou ((a = b) ET (c = 0)) sinon S = 0

S <= ‘ 1 ’ when d = ‘ 1 ’ else


‘ 1 ’ when a = b and c = ‘ 0 ‘ else
‘0‘;

A. ZAKRITI 7
Les instructions en mode concurrent
Exemple 2 :
Donner une description comportementale VHDL en
utilisant l’instruction WHEN/ELSE pour décrire la fonction
logique suivante:

𝑭 = 𝒄 . 𝑺1 . 𝑺𝟎 + 𝒂 . 𝑺1 . 𝑺0 + 𝒃 . 𝑺1 . 𝑺0 + 𝒄 . 𝑺1 . 𝑺0

On peut lire La fonction F de la façon suivante:


F prend a si S1S0 = 01
F prend b si S1S0 = 10
F prend c pour les autres cas
A. ZAKRITI 8
Les instructions en mode concurrent
entity Func_F is
Port ( a, b, c : in std_logic;
s : in std_logic_vector(1 downto 0);
F : out std_logic);
end Func_F;

architecture DATA of Func_F is


Begin
F <= a when (s = “01") else F prend a si S1S0 = 01
F prend b si S1S0 = 10
b when (s = "10") else F prend c pour les autres cas

c;
end DATA;
A. ZAKRITI 9
Les instructions en mode concurrent

Exemple 3 :
Donner une description comportementale VHDL en utilisant
l’instruction WHEN/ELSE pour décrire la fonction logique
suivante:
𝑭 = a . s0 + b . s1 . 𝑠0 + c . s2 . 𝑠1 . 𝑠0 + a . b . c . 𝑠2. 𝑠1 . 𝑠0

On peut lire La fonction F de la façon suivante:


F prend a si s0 = 1 sinon
F prend b si s1 = 1 sinon
F prend c si s2 = 1 sinon
F prend l’expression algébrique: a.b.c
A. ZAKRITI 10
Les instructions en mode concurrent
entity Func_F is
Port ( a, b, c : in std_logic;
F prend a si s0 = 1 sinon
s2, s1, s0 : in std_logic; F prend b si s1 = 1 sinon
F : out std_logic); F prend c si s2 = 1 sinon
end Func_F; F prend l’expression algébrique: a.b.c

architecture DATA of Func_F is


Begin
F <= a when s0 = ‘1’ else -- priorité à s0
b when s1 = ‘1’ else -- si s0 = 0, priorité à s1
c when s2 = ‘1’ else -- si s0 = 0 et s1 = 0, priorité à 2
a and b and c; -- valeur de F = expression logique
end DATA;
A. ZAKRITI 11
Les instructions en mode concurrent

Exemple 4: Faites de même pour décrire les deux équations


suivantes:

𝑭 = 𝒄 . 𝑺1 . 𝑺𝟎 + 𝒂 . 𝑺1 . 𝑺0 + 𝒃 . 𝑺1 . 𝑺0 + 𝒄 . 𝑺1 . 𝑺0
𝑬 = 𝒂 . 𝑺𝟏 . 𝑺0 + 𝒃 . 𝑺1. 𝑺0 + 𝒄 . 𝑺1. 𝑺0 + 𝒂 . 𝑺1 . S0

Identificateur_signal = agrégat: (F , E)

A. ZAKRITI 12
Les instructions en mode concurrent
entity Func_F is
Port ( a, b, c : in std_logic;
s : in std_logic_vector(1 downto 0);
F, E : out std_logic);
end Func_F;

architecture DATA of Func_F is


Begin
(F , E) <= (a , b ) when (s = “01") else
(b , c ) when (s = "10") else
(c , a );
end DATA;
A. ZAKRITI 13
Les instructions en mode concurrent
2- Affectation sélective :
Cette instruction permet d'assigner une valeur à un signal
ou des valeurs à un agrégat de signaux, en fonction des
valeurs d'un sélecteur.

Identificateur_signal = nom_signal | agrégat


Sélecteur = identificateur_signal
Valeur_signal = identificateur_signal | expression_logique
Valeur_sélecteur = choix_multiple de valeurs | concaténation | agrégat

A. ZAKRITI 14
Les instructions en mode concurrent

Exemple 1 :
Reprendre la description comportementale VHDL de la fonction
F en utilisant l’instruction:

With … Select … <= … When …

𝑭 = 𝒄 . 𝑺1 . 𝑺𝟎 + 𝒂 . 𝑺1 . 𝑺0 + 𝒃 . 𝑺1 . 𝑺0 + 𝒄 . 𝑺1 . 𝑺0

Le signal de sélection est le bus S

A. ZAKRITI 15
Les instructions en mode concurrent

entity Func_F is
Port ( a, b, c : in std_logic;
S : in std_logic_vector(1 downto 0);
F : out std_logic);
end Func_F;
architecture DATA of Func_F is
Begin
With S Select
F <= a when "01" ,
b when "10" ,
c when others ;
end DATA;
A. ZAKRITI 16
Les instructions en mode concurrent
Remarque 1: le cas où la clause when others est absente

architecture DATA of Func_F is


Begin
With S Select 𝑭 = 𝒄 . 𝑺1 . 𝑺𝟎 +
F <= a when "01" , 𝒂 . 𝑺1 . 𝑺0 + 𝒃 . 𝑺1 . 𝑺0 +
b when "10" , 𝒄 . 𝑺1 . 𝑺0
c when “00" ,
c when “11" ; -- la clause when others n’est pas utilisée
end DATA;

On rappelle le type std_logic comporte d’autres valeurs que le 0 et 1 


message d’erreur sur le compilateur

ERROR: A value is missing in select


A. ZAKRITI 17
Les instructions en mode concurrent

entity Func_F is
Port ( a, b, c : in bit;
S : in bit_vector(1 downto 0); Ici on a changé le
F : out bit); std_logic par le type BIT
end Func_F;
architecture DATA of Func_F is
Begin
With S Select
L’utilisation de when others n’est pas
F <= a when "01" , obligatoire car le type bit ne comprend que
b when "10" , des 1 et 0  Pas de message d’erreur
c when “00" ,
c when “11" ;
end DATA;

A. ZAKRITI 18
Les instructions en mode concurrent
Remarque 2: Utilisation de la valeur '-'

architecture DATA of Func_F is


Begin
With S Select
F <= a when "01" ,
b when "10" ,
c when “00" ,
c when “11" ,
‘-’ when others;
end DATA;

A. ZAKRITI 19
Les instructions en mode concurrent

Exemple 2 :
Donner la description comportementale VHDL de la fonction Y
en utilisant l’instruction: With … Select … <= … When …

𝑭 = d. 𝑠2. s1 . s0 + c. 𝑠2. s1 . 𝑠0 + b . 𝑠2. 𝑠1 . s0 + a . 𝑠2. 𝑠1 . 𝑠0 +


a . b . 𝑠1 + 𝑐 . 𝑑. s1

Le signal de sélection est le bus S sur 3 bits

A. ZAKRITI 20
Les instructions en mode concurrent

𝑭 = d. 𝑠2. s1 . s0 + c. 𝑠2. s1 . 𝑠0 + b . 𝑠2. 𝑠1 . s0 + a . 𝑠2. 𝑠1 . 𝑠0 +


a . b . 𝑠1 + 𝑐 . 𝑑. s1

architecture DATA of Func_F is


Begin Autres façons d’écrire
les valeurs d’un signal
With s Select vecteur
Y <= a when (‘0’, ‘0’, ‘0’) , -- agrégat
b when ‘0’ & ‘0’ & ‘1’ , -- concaténuation
c when "010" ,
c when "011" ,
a and b when "100" | "101 ",
c and d when "110" | "111 ", -- Choix multiple de
valeurs de sélecteur
‘-’ when others ; , indiqué par: |
end DATA;
A. ZAKRITI 21
Les instructions en mode concurrent
Cas d’un identificateur_signal = agrégat ( Exemple de
signal F et signal E)

𝑭 = 𝒄 . 𝑺1 . 𝑺𝟎 + 𝒂 . 𝑺1 . 𝑺0 + 𝒃 . 𝑺1 . 𝑺0 + 𝒄 . 𝑺1 . 𝑺0
𝑬 = 𝒂 . 𝑺𝟏 . 𝑺0 + 𝒃 . 𝑺1. 𝑺0 + 𝒄 . 𝑺1. 𝑺0 + 𝒂 . 𝑺1 . S0

architecture DATA of Func_F is


Begin
With S Select
(F , E) <= (a ,b) when "01" ,
(b ,c) when "10" ,
(c , a) when others ;

end DATA;
A. ZAKRITI 22
Itération d’instructions concurrentes

Ces instructions permettent de créer des


structures régulières en dupliquant un bloc
d’instructions concurrentes un certain nombre de
fois (for… Generate….. End generate) ou en
créant un tel bloc si une condition est réalisée:

A. ZAKRITI 23
Itération d’instructions concurrentes

Exemple: (for… Generate….. End generate)


Ecrire un code VHDL pour réaliser un additionneur 4 bits en
utilisant une duplication automatique du composant «
Additionneur complet (Full ADD)»

(Full ADD)
A. ZAKRITI 24
Itération d’instructions concurrentes

 Entité/architecture du composant « Full ADD »:

entity fulladd is
Port ( x, y, cin : in STD_LOGIC;
s, cout : out STD_LOGIC) ;
end fulladd;
architecture Behavioral of fulladd is
begin
s<= (x xor y) xor cin;
cout<= ((x xor y) and cin ) or (x and y);

end Behavioral;

A. ZAKRITI 25
Itération d’instructions concurrentes

 Entité/architecture du code Additionneur 4 bits:

entity add4bits is

Port ( A : in std_logic_vector(3 downto 0);


B : in std_logic_vector(3 downto 0);
ci : in STD_LOGIC;
sum : out std_logic_vector(4 downto 0));

end add4bits;

A. ZAKRITI 26
Itération d’instructions concurrentes

architecture struct of add4bits is


component Fulladd
port(x,y, cin : in std_logic;
s, cout : out std_logic);
end component;
signal R : std_logic_vector(4 downto 0);

A. ZAKRITI 27
Itération d’instructions concurrentes

begin
R(0) <= ci;
sum(4) <= R(4);
G: for I in 0 to 3 generate
inst: Fulladd port map(x => A(I), y => B(I), cin=> R(I), s=> sum(I),
cout=> R(I+1));

end generate G;
end struct;

A. ZAKRITI 28
Instructions séquentielles

Ces instructions doivent être placées à l'intérieur d'un


PROCESS, d’une procédure et d’une fonction.
1- Instruction IF: Instruction de test

C ’est l ’équivalent séquentiel de l ’assignation conditionnelle


(when …else…)

Syntaxe : [label :] if condition then


{instruction_sequentielle}
{elsif condition then
{instruction_sequentielle} }
[else {instruction_sequentielle} ]
end if [label];

A. ZAKRITI 29
Instructions séquentielles
Exemple 1 : Décrire le comportement du Demi-Additionneur
avec l’instruction: IF…. Then …. End if

A. ZAKRITI 30
Instructions séquentielles

Exemple 2: l’instruction IF…. then …. else …end if

process (a,b)
begin
if a=b then
equal <=‘1’; Description d’un
else comparateur
equal<=‘0’; d’égalité
end if;

end process;

A. ZAKRITI 31
Instructions séquentielles
Exemple 3: Décrivons la fonction F avec l’instruction:
IF…. then …. elsif . …else …end if
𝑭 = 𝒄 . 𝑺1 . 𝑺𝟎 + 𝒂 . 𝑺1 . 𝑺0 + 𝒃 . 𝑺1 . 𝑺0 + 𝒄 . 𝑺1 . 𝑺0

process (s, a, b, c) -- s est un vecteur: s (1 downto 0)


begin
if s = "01" then
x <= a;
elsif s = “10" then
x <= b;
else
x <= c;
end if;
end process;
A. ZAKRITI 32
Instructions séquentielles
Remarque: clause « else » manquante
Reprenons l’exemple précédent:
𝑭 = 𝒄 . 𝑺1 . 𝑺𝟎 + 𝒂 . 𝑺1 . 𝑺0 + 𝒃 . 𝑺1 . 𝑺0 + 𝒄 . 𝑺1 . 𝑺0

process (s, a, b, c) Dans ce cas «else » est absente


begin
if s = "01" then
F <= a;
elsif s = “10" then ça n’a pas grand effet car
F <= b; Si s = "11", le signal x conserve la
valeur qu'il avait au moment de la
elsif s = “00" then dernière activation du processus à
F <= c; condition de faire entrer la
end if; combinaison 00 en premier
end process; Or, le code génère des « warnings »

A. ZAKRITI 33
Instructions séquentielles

On peut résoudre le problème de warning générer en


utilisant: valeur par défaut

process (s, a, b, c)
begin
F <= c; -- valeur par défaut
if s = "01" then
F <= a;
elsif s = “10" then
F <= b;
elsif s = “00" then
F <= c;
end if;
end process;

A. ZAKRITI 34
Instructions séquentielles

2- Instruction CASE
• C ’est l ’équivalent séquentiel de l’assignation sélective de
signal (with…select): Permet l ’exécution d ’une opération
en fonction de la valeur prise par une expression)

Syntaxe :

Remarque: => signifie: implique

A. ZAKRITI 35
Instructions séquentielles
Exemple 1: Reprenons l’exemple précédent en utilisant
l’instruction: case … when …
𝑭 = 𝒄 . 𝑺1 . 𝑺𝟎 + 𝒂 . 𝑺1 . 𝑺0 + 𝒃 . 𝑺1 . 𝑺0 + 𝒄 . 𝑺1 . 𝑺0

process (s, a, b, c)
begin
Case s is
when "01" => F <= a;
when “10" => F <= b;
when "00" => F <= c;
when “11" => F <= c; La clause others est obligatoire
when others => F <= ‘0’; avec le type std_logic
end case;  L’erreur de Syntaxe au cas
end process; d’absence:
« A value is missing in case »
A. ZAKRITI 36
Instructions séquentielles
Remarque: On peut exprimer le sélecteur s en octal
entity instru_case is
Port ( a, b, c : in bit;
s : in bit_vector(2 downto 0);
F : out bit); En octal « s » doit être
end instru_case; obligatoirement sur 3
process (s, a, b, c) bits
begin
Case s is
when o“1" => F <= a;
when o“2" => F <= b;
when o"0" => F <= c; En octal on écrit:
when o“3" => F <= c; o“0“, o“1“, o“2“, ……
when others => F <= ‘0’;
end case; Ici aussi « others » est
end process; obligatoire
A. ZAKRITI 37
Instructions séquentielles

Exemple 2: Reprenons l’exemple de deux signaux de


sorties (agrégat) en utilisant l’instruction:
case … when …

𝑭 = 𝒄 . 𝑺1 . 𝑺𝟎 + 𝒂 . 𝑺1 . 𝑺0 + 𝒃 . 𝑺1 . 𝑺0 + 𝒄 . 𝑺1 . 𝑺0

𝑬 = 𝒂 . 𝑺𝟏 . 𝑺0 + 𝒃 . 𝑺1. 𝑺0 + 𝒄 . 𝑺1. 𝑺0 + + 𝒂 . 𝑺1 . S0

A. ZAKRITI 38
Instructions séquentielles
process (s, a, b, c)
begin
Case s is
when "01" =>
F <= a; E<= b;
when “10" => -- séquence d’instructions
F <= b; E<= c;
when "00" =>
F <= c; E<= a;
when “11" =>
F <= c; E<= a;
when others =>
F <= ‘0’; E<= ‘0’;
end case;
end process;
A. ZAKRITI 39
Instructions séquentielles

1- Instruction: FOR

Toujours le Nom etiquette


Syntaxe : est optionnelle

[etiquette :] for identifiant in discrete_range loop


{séquence d’instructions séquentielles }
end loop [etiquette];

La séquence peut contenir des


instructions ou d'autres boucles

A. ZAKRITI 40
Instructions séquentielles

Exemple:
La variable i de la boucle n'a pas à
Process (a,b) être déclarée et est utilisée à
l'intérieur de la boucle
Begin

for i in 7 downto 0 loop -- boucle sur 0 à 7

s(i) <= not(a(i) xor b(i)); valeur_haute downto valeur_basse


ou
valeur_basse to valeur_haute:
end loop; (0 to 7)

end process;

A. ZAKRITI 41
Instructions séquentielles

2- Instruction WHILE
Tant que la condition est vraie (true) la
Syntaxe : séquence d'instructions est répétée.

[etiquette :] while condition loop

{séquence d’ instructions séquentielles}

end loop [etiquette];

Nom etiquette est optionnelle

A. ZAKRITI 42
Instructions séquentielles

Exemple: Décrivons la fonction, en utilisant la boucle While…


S=V*E
S est un signal sur 8 bits; E l’est aussi
V sur un seul bit

entity instruc_whil is
Port ( v : in std_logic;
E : in std_logic_vector(7 downto 0);
S : out std_logic_vector(7 downto 0));
end instruc_whil;

A. ZAKRITI 43
Instructions séquentielles

architecture Behavioral of instruc_whil is


Begin

Process (E,v)
variable i : integer; -- déclaration de i
begin
i := 0; -- i doit être initialisée
while i <= 7 loop
s(i) <= v and E(i);
i := i+1; -- incrémentation
end loop;
end process;

end Behavioral;

A. ZAKRITI 44