Vous êtes sur la page 1sur 37

Université Sultan Moulay Slimane

Ecole Supérieur de Technologie de Béni Mellal (ESTBM)

Licence professionnelle
Semestre 6
Module : Conception des
Systèmes Embarqués

Chapitre 3 :
Synthèse VHDL d’Architectures

ESTBM – Pr. EL DAOUDI


1.1. Introduction

▪ Auparavant pour décrire le fonctionnement d’un circuit électronique programmable les techniciens et les ingénieurs
utilisaient des langages de bas niveau (ABEL, PALASM, ORCAD/PLD,..) ou plus simplement un outil de saisie de
schémas.

▪ Les sociétés de développement et les ingénieurs ont voulu s’affranchir des contraintes technologiques des circuits.
Ils ont donc créé des langages dits de haut niveau à savoir VHDL et VERILOG. Ces deux langages font abstraction
des contraintes technologies des circuits PLDs.

▪ L’abréviation VHDL signifie VHSIC Hardware Description Language (VHSIC : Very High Speed Integrated Circuit).
Ce langage a été écrit dans les années 70 pour réaliser la simulation de comportement des circuits électroniques et
la configuration physique des circuits FPGA ou CPL.

2
1.2. Structure d'un programme en VHDL

Une description VHDL est composée de deux parties indissociables, à savoir:


• L'entité qui définit les signaux en E/S et correspond la vue externe du modèle.
• L'architecture qui contient les instructions VHDL permettant de décrire le fonctionnement souhaité.
• Déclaration des bibliothèques: nommées par IEEE, elles contiennent les définitions des types de signaux électroniques, des
fonctions et des sous programmes utiles à la définition de l'architecture

3
1.2.1. Déclaration des bibliothèques

La première chose à faire est de définir les librairies qui seront utilisées dans le code.
Library IEEE ;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
Cela se fait de la manière suivante :
Tout d’abord, la librairie principale (en générale, IEEE), ensuite, le mot clé « use », qui indique quelle package de la librairie
nous allons utiliser. Après cela, le nom du package. Enfin, le « .all » signifie que l’on souhaite utiliser tout ce qui se trouve dans
ce package. Lorsque le nom de la librairie est précédé de IEEE, cela signifie que c’est une librairie qui est définie dans la
norme IEEE, et que l’on retrouvera donc normalement dans tout logiciel. A l’inverse, il faut se méfier des librairies qui ne sont
pas IEEE, car elles sont en générale spécifiques à un logiciel. Les librairies IEEE principales sont :
• IEEE.std_logic_1164
• IEEE.numeric_std
• IEEE.std_logic_arith,...

4
1.2.2.Déclaration de l’entité et des entrées / sorties (I/O)

La déclaration de l'entité permet de définir le nom de la description VHDL, les entrées, les sorties et l'instruction qui les est
défini se nomme par « PORT »

Entity nom_de_l'entite is Description du signal Remarque : pour "description des signaux"


Port (nom_V1: sens type; on note : Nom_du_signal : sens type;
in pour l’entrée et out pour la sortie
nom_V2: sens type;
nom_V3: sens type);
End nom_de_l'entite;

Exemple N°1 : Additionneur complet Sout Cout Entity addi is


Port (A: in Bit;
B: in Bit;
Additionneur Cin: in Bit);
Sout: out Bit;
Cout: out Bit);
A B Cin End addi;
5
Exemple N°2 : Une bascule D

Entity bascule is CLK Q


Port ( CLOCK : in std_logic; D Bascule
D : in std_logic; RESET D
RESET : in std_logic;
Q : out std_logic );
End bascule;

Remarque : Après la dernière définition du signal de l’instruction port il ne faut jamais mettre de point virgule.
1.Le nom du signal est composé de caractères : les premier caractère est une lettre
2.Le sens du signal :
• in = signal d'entrée
• out = signal de sortie
• inout : signal en entrée/sortie
3.le type du signal : les types prédéfinis par le langage VHDL sont assez nombreux et le langage permet la
création de ses propres types ou sous types. Pour le moment, on va utiliser std_logic pour un signal et
std_logic_vector pour un bus.

Constantes: Les constantes sont utilisées pour référencer une valeur ou un type spécifique. Elles permettent une meilleur
lecture et maintenance d'une source. De tous types, elles sont utilisées dans les entités, architectures ou packets.
Syntaxe
CONSTANT const_name {, const_name} : type := value;
6
Exemple N°3 : constant BUS_WIDTH : integer := 8;

Generic: La section GENERIC_DECLARATIONS dans l'entête ENTITY permet de définir des paramètres
exploitables dans l'architecture.

Cette méthode d'écriture permet une maintenance plus aisée.

Syntaxe
ENTITY entity_name IS
[generic_declarations][port_declarations]
END [entity_name];

7
1.2.2.1. Le NOM_DU_SIGNAL

Il est composé de caractères, le premier caractère doit être une lettre, sa longueur est quelconque, mais elle ne doit pas
dépasser une ligne de code. VHDL n’est pas sensible à la « casse », c’est à dire qu’il ne fait pas la distinction entre les
majuscules et les minuscules.

L’instruction port.
Syntaxe: NOM_DU_SIGNAL : sens type;
Exemple: CLOCK: in std_logic;
BUS : out std_logic_vector (7 downto 0);

On doit définir pour chaque signal : le NOM_DU_SIGNAL, le sens et le


type.

8
1.2.2.2. Le SENS du signal (les modes de ports)
VHDL définit 4 modes qui déterminent le sens de transfert d’une donnée à travers le port.

• in : pour un signal en entrée.


In Out
• out : pour un signal en sortie.
D inout
• inout : pour un signal en entrée sortie
Exemple
• buffer : pour un signal en sortie mais utilisé comme RESET buffer
entrée dans la description.

1.2.2.3. Le TYPE
Le TYPE utilisé pour les signaux d’entrées/sorties est :

• le std_logic pour un signal.


• le std_logic_vector pour un bus composé de plusieurs signaux.

Par exemple un bus bidirectionnel de 5 bits s’écrira :


LATCH : inout std_logic_vector (4 downto 0) ;
Où LATCH(4) correspond au MSB et LATCH(0) correspond au LSB. Most/Least significant bit
9
Exemple N°1 : Faire un bus de 5 bits;

BUS : inout std_logic_vector(4 downto 0);


BUS (4) est le MSB
BUS (0) est le LSB
Un signal de type std_logic peut prendre 4 valeurs :
'0' ou ‘L’ : pour un niveau bas
‘1' ou 'H’ : pour un niveau haut
‘Z’ : pour un état haute impédance
‘-’ : indifférent
Quand on a un bit on le met entre cote (')
Plus d'un bit on le met entre guillemets (")

Exemple N°2 : Soit le signal d’entrée A de 8 bits, on le déclarera en VHDL comme suit:

A: in std_logic_vector (7downto 0);


Ou bien
A: in std_logic_vector (0 to 7);

La différence entre les deux expressions est l’indice du MSB et du LSB.


Dans la 1ére expression, l’indice du MSB est A(7) et celui du LSB est A(0) et l’inverse pour
la deuxième expression.
10
a) Les types prédéfinis par tous les compilateurs

integer: entier négatif ou positif


natural: entier positif ou nul
positive: entier positif
bit : énuméré dont les deux seules valeurs possibles sont ‘0’ et ‘1’
bit_vector: composite tableau représentant un vecteur de bits
boolean: énuméré dont les deux valeurs possibles sont False et True
real: flottant compris entre -1.0E38 et 1.0E38
- Les types std_logic et std_logic_vector sont les plus utilisés.

b) Conversions de type
Les environnements de développement fournissent en général des paquetages comportant des fonctions de conversion de
type. Par exemple, la bibliothèque de Xilinx ISE contient :

- conv_integer (a) pour convertir un std_logic_vector a en un integer


- conv_unsigned (x,n) pour convertir un std_logic_vect or, integer, unsigned ou signed xen un unsigned de n bits
(réalise un changement de taille)
- conv_signed (x,n) pour convertir un std_logic_vector, integer, signed ou unsigned x enun signed de n bits (réalise
un changement de taille)
- conv_std_logic_vector (x,n) pour convertir un integer, unsigned ou signed x en unstd_logic_vector de n bits

Pour utiliser ces fonctions, il suffit d’accéder au paquetage std_logic_arith de la bibliothèque IEEE
11
1.2.2.4. Les identificateurs
Les identificateurs sont des appellations d’objets du langage (données et types).

– Ils sont constitués de caractères alphabétiques (26 lettres), numériques (10 chiffres décimaux) et
du caractère souligné _ ; les lettres accentuées sont exclues
– Le premier caractère doit être une lettre
– Les lettres majuscules et minuscules sont équivalentes
– Le dernier caractère doit être différent de _
– Deux _ à la file sont interdits
– Le nom ne doit pas être un mot réservé
– La longueur d’un mot est quelconque (mais une ligne maximum)

1.2.2.5. Les littéraux


Les littéraux sont les représentations de valeurs attribuées aux objets données et aux objets types.

– Les entiers décimaux : 1234


– Les bits ‘0’, ‘1’ -- type bit
– ‘0’, ‘1’ ,‘U’, ‘X’, ‘H’, ‘L’, ‘W’, ‘Z’, ‘-’ -- type std_logic
– Les vecteurs de bits
▪ représentation binaire “1010”
▪ représentation octale O”12”
▪ représentation hexadécimale X”A”
– Les caractères ‘a’
– Les chaînes de caractères “ERREUR”, “ERREUR ” & “N° ”
12
1.2.3.Classifiation des styles de description

L’architecture décrit le fonctionnement souhaité pour un circuit ou une partie du circuit. En effet le fonctionnement d’un circuit
est généralement décrit par plusieurs modules VHDL. Il faut comprendre par module le couple ENTITE/ARCHITECTURE.
Trois grands formalismes coexistent pour décrire les architectures :

•Flot de données : Le circuit est décrit par une liste d’instruction concurrenes, d’affectation de signaux, une
expression conditionnelle ou une expression sélective;
•Structurel : on décrit le circuit comme une série de boîtes noires interconnectées au moyen de signaux (utilisé pour
des circuits moyens ou grands) ; on procèdera de cette manière pour synthétiser un additionneur complet à l'aide de
deux demi-additionneurs;
•Comportemental: de manière très semblable à un langage de programmation informatique, on précise le
fonctionnement voulu à l'aide d'une suite d'instructions de contrôles plus ou moins évoluées (conditions, boucles,
etc.), dans un process

L’architecture établit à travers les instructions et les relations entre les entrées et les sorties. On peut avoir un fonctionnement
purement combinatoire, séquentiel ou bien les deux (séquentiel et combinatoire).

Architecture nom_de_l'architecture of nom_de_l'entite is


Begin
… instructions … ;
13
End nom_de_l'architecture;
Exemple N°1 : Réaliser le programme VHDL d'une porte NAND;

On donne :- l'affectation : <= a


- les opérateurs logiques : and, not S
Library ieee; Entity
USE ieee.std_logic_1164.all; b (AND)
Entity Function_AND is
Port (a : in std_logic;
b : in std_logic;
s : out std_logic );
End Function_AND;

Architecture desc_AND of Function_AND is


Begin
S <= a and b;
End desc_AND;

14
Exemple N°2 : Réaliser un additionneur;

𝑆 = 𝐴⨁𝐵⨁𝐶𝑖𝑛
𝐶𝑜𝑢𝑡 = 𝐴𝐵 + 𝐶𝑖𝑛𝐴 + 𝐶𝑖𝑛𝐵

Library ieee;
USE ieee.std_logic_1164.all;
Entity addi is
Port (A : in std_logic;
B : in std_logic;
Cin : in std_logic;
Cout : out std_logic;
S : out std_logic);
End addi;

Architecture arch_addi of addi is


Begin
S <= A XOR B XOR Cin;
Cout <= (A and B) or (A and Cin) or (B and Cin);
End arch_addi;

15
1.2.4.Les opérateurs

1.2.4.1. L’affectation simple : <=

Dans une description VHDL, c’est certainement l’opérateur le plus utilisé. En effet il permet demodifier l’état d’un signal en
fonction d’autres signaux et/ou d’autres opérateurs.

Exemple avec des portes logiques : S1 <= E2 and E1 ;


Les valeurs numériques que l’on peut affecter à un signal sont les suivantes :

- ‘1’ ou ‘H’ pour un niveau haut avec un signal de 1 bit.


- ‘0’ ou ‘L’ pour un niveau bas avec un signal de 1 bit.
- ‘Z’ pour un état haute impédance avec un signal de 1 bit.
- ‘-’ pour un état quelconque, c’est à dire ‘0’ ou ‘1’. Cette valeur est très utilisée avec lesinstructions : when …
else et with …. Select ….
- Pour les signaux composés de plusieurs bits on utilise les guillemets " … " , voir les exemples.
- Les bases numériques utilisées pour les bus peuvent être :

BINAIRE, exemple : BUS <= "1001" ; -- BUS = 9 en decimal


HEXA, exemple : BUS <= X"9"; -- BUS = 9 en décimal
OCTAL, exemple : BUS <= O"11" ; -- BUS = 9 en décimal
16
1.2.4.2. Opérateur de concaténation : &
Exemple N°1 : A <= "001";
B <= "101";
C <= A & B & "01" N.B : Pour utiliser ces opérateurs, il faut ajouter les
C <= 00110101 bibliothèques suivantes:

use ieee.numeric_std.all
use ieee.std_logic_arith.all
1.2.4.3. Opérateur logiques
Les opérateurs logiques ont priorités sur la concaténation.

Opérateur VHDL
ET AND
Décalage à Gauche SLL Remplacement par des 0
NON ET NAND
OU OR Décalage à Droite SRL Remplacement par des 0

NON OU NOR
Rotation à Gauche ROL Le caractère de gauche est mis à droite
OU EXCLUSIF XOR
NON OU EXCLUSIF XNOR Rotation à Droite ROR Le caractère de droite est mis à gauche
NON NOT

17
Exemple N°2 : A <= “1010011”

Donner le résultat des opérateurs suivants :

B <= "01" & A SLL 2 B <= 011001100

B <= "01" & A SLL 2 B <= 011001100

A SLL 2 → “1010011” LSB

“1001100”
18
Exemple N°2 : A <= “1010011”

Donner le résultat des opérateurs suivants :

C <= A SRL 3 & "11" C <= 000101011

B <= A SRL 3 & "11" C <= 000101011

A SRL 3 → “1010011”
MSB

“0001010”
19
Exemple N°2 : A <= “1010011”

Donner le résultat des opérateurs suivants :

D <= A ROL 4 D <= 0111010

D <= A ROL 4 D <= 0111010

A ROL 4 → “1010011” LSB

“0111010”
20
Exemple N°2 : A <= “1010011”

Donner le résultat des opérateurs suivants :

E <= A ROR 2 & "00" E <= 111010000

E <= A ROR 2 & "00" E <= 111010000

A ROR 2 →MSB “ 1 0 1 0 0 1 1 ”

“1110100”
21
1.2.4.4. Opérateurs d’assignation et d’association

- Assignation de la variable nom_variable :=expression ;


• à l’intérieur d’un processus
- Assignation du signal (dynamique) nom_signal <=expression ;
• dans la zone d’instructions d’une architecture
- Assignation du signal (statique) signal nom_signal_interne : type_signal
:=valeur_initiale ;
• dans la zone de déclaration d’une architecture
- Association des signaux nom_signal_formel =>nom_signal_effectif ;
• connecteur des signaux dans une instanciation de composant

signal a : std_logic_vector (0 to 7);

signal b : std_logic_vector (7 downto 0); a(0) a(1) a(2) a(3) a(4) a(5) a(6) a(7)

a <= “11110000”; 1 1 1 1 0 0 0 0

b <= “11110000”;
b(7) b(6) b(5) b(4) b(3) b(2) b(1) b(0)
1 1 1 1 0 0 0 0

MSB (toujours à gauche)


La notation downto est la plus conventionnelle pour les applications de synthèse.
22
Opérateur VHDL
ADDITION +
SOUSTRACTION -
MULTIPLICATION *
DIVISION /

Remarque : l'utilisation de ces opérateurs avec des signaux de grandes tailles peut générer de grandes structures électronique.

Exemple N°1 :
S1 <= A – 3 ; -- S1 = A – 3
-- On soustrait 3 à la valeur de l’entrée / signal A
S1 <= S1 + 1 ; -- On incrémente de 1 le signal S1
Remarque : Un commentaire débute par deux traits (signe moins) : --

1.2.4.5. Opérateurs relationnels Opérateur VHDL


Egal =
Il permet de modifier l'état d'un signal ou
Différent /=
de signaux suivant le résultat d'un test ou
Inférieur <
d'une condition. En logique combinatoire,
Inférieur ou égal <=
ils sont souvent utilisés avec les
Supérieur >
instructions when, select, with.
Supérieur ou égal >=
23
1.2.5.Les instructions du mode concurrent

1.2.5.1. Affectation conditionnelle

Signal <= expression when condition


else expression when condition
else expression when condition
else expression ;

Remarque : la dernière ligne "else expression" n'est pas obligatoire mais elle est fortement conseillée.

Exemple N°1 : Réaliser le programme VHDL d'un multiplexeur 4 vers 1 avec entrée de sélection

24
E1 SEL S
E2 S
00 E1
E3 MUX
01 E2
E4 10 E3
11 E4
SEL[1..0]

Library ieee;
USE ieee.std_logic_1164.all;
Entity multiplex is
Port ( E1,E2,E3,E4 : in std_logic;
SEL : in std_logic_vector (1 downto 0);
S : out std_logic );
End multiplex;
Architecture desc_multiplex of multiplex is
Begin
S <= E1 when SEL = "00" Else
E2 when SEL = "01"Else
E3 when SEL = "10"Else
E4;
End desc_multiplex;

25
On aurais pu écrire aussi :
Library ieee;
USE iee.std_logic_1134.all
Entity multiplex is
Port ( E : in std_logic_vector (3 downto 0);
SEL : in std_logic_vector (1 downto 0);
S : out std_logic );
End multiplex;

Architecture desc_multiplex of multiplex is Begin


S <= E(0) when SEL = "00"
Else E(1) when SEL = "01"
Else E(2) when SEL = "10"
Else E(3);
End desc_multiplex;

26
1.2.5.2. Affectation selective
Cette instruction permet d'affecter différentes valeurs à un signal selon les valeurs prises par un signal de sélection

With signal_de_selection select


signal <= expression when valeur_de_selection
expression when valeur_de_selection
expression when others;

Exemple N°1 : Réaliser le programme d'un multiplexeur 1 vers 4 avec entrée de sélection SEL et sortie
de validation Enable active sur l'état bas
Library ieee;
USE iee.std_logic_1164.al;
Entity demultiplex is
Port ( SEL : in std_logic_vector (1 downto 0);
S1 SEL S E : in std_logic
E DEMX Enable : in std_logic;
S2 00 S1 S1,S2,S3,S4 : out std_logic;);
S3 01 S2 End demultiplex;
S4 10 S3 Architecture desc_multiplex of multiplex is
en 11 S4 Begin
S <= S1 when "00"
SEL[1..0]
S2 when "01"
S3 when "10"
S4 when "11"
27
'0' when others;
End desc_multiplex;
1.2.6. Les instructions du mode séquentiel

1.2.6.1. Définition d’un process : <=

Un process est une partie de la description d'un circuit dans laquelle les instructions sont exécutées séquentiellement.
L'exécution d'un process est déclenché par un ou des changements d'états de signaux logiques. Le nom de ces signaux est
défini dans la liste de sensibilité lors de la déclaration du process.

[nom_du_process :] Process ( liste_de_sensibilite )


Begin
… instruction_du_process … ;
End process;

Le nom du process est facultatif.

28
1.2.6.2. Règle de fonctionnement d'un process

A) L'exécution d'un process

• L'exécution d'un process a lieu à chaque changement d'état d'un signal de la liste desensibilité
• L'instruction du process s'exécute séquentiellement
• Les changements d'état des signaux par les instructions du process sont prises en compteà la fin du process
• 2 process d'une architecture ayant la même liste de sensibilité vont être exécutés en même temps

Exemple N°1 :

Process (C,D)
Begin
A <= 2 ;
B <= A + C ;
A <= D + 1 ;
E <= A * 2 ;
End process;

29
Exemple N°2 : Déclaration d’une bascule D
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
entity BASCULED is
port ( d,clk : in std_logic;
q : out std_logic);
end BASCULED;
architecture DESCRIPTION of BASCULED is
begin
PRO_BASCULED : process (clk)
begin
if (clk'event and clk ='1') then
q <= d;
end if;
end process PRO_BASCULED;
end DESCRIPTION;

30
Exemple N°3 : La bascule D avec un reset asynchrone

Complétons la description de la bascule précédente pour y ajouter un reset asynchrone.

library ieee;
use ieee.std_logic_1164.all;

ENTITY Bascule_D IS
PORT ( D : IN STD_LOGIC;
CLK Q
CLK : IN STD_LOGIC;
Q : OUT STD_LOGIC);
END Bascule_D; D
Bascule_D
ARCHITECTURE archdff OF Bascule_D IS RESET
BEGIN
p1: PROCESS (clk,reset)
BEGIN
IF (RESET='1') THEN
Q <= '0';
ELSIF (CLK'event AND CLK='1') THEN
Q <= D;
END IF;
END PROCESS p1;
END archdff;

31
Remarques:

- Seul le signal CLK fait partie de la liste de sensibilité. D’après les règles de fonctionnement énoncées précédemment, seul un
changement d’état du signal CLK va déclencher le process et par conséquent évaluer les instructions de celui-ci.
- L’instruction if (CLK'event and CLK='1') then permet de détecter un front montant du signal CLK. La détection de front est
réalisée par l’attribut event appliqué à l’horloge CLK. Si on veut un déclenchement sur un front descendant, il faut écrire
l’instruction suivante : if (CLK'event and CLK='0').
- Les bibliothèques IEEE possèdent deux instructions permettant de détecter les fronts montants rising_edge(CLK) ou descendants
falling_edge(CLK).
- Si la condition est remplie alors le signal de sortie S sera affecté avec la valeur du signal d’entrée D.

B) Les principales structures du mode séquentiel

• A l'intérieur d'un process, on peut utiliser des "if" et/ou des "case". L'exécution est alorsséquentielle.
• De même on peut utiliser des boucles pour contrôler l'exécution. Les "for" sont à bornes fixes, alors que les "while“ ne le
sont pas.

B.1) Le fonctionnement du "If“

La combinaison IF THEN permet d'effectuer un test d'une expression logique. La suite dudéroulement dépend du résultat.
Deux imbrications sont possibles : ELSIF suivi d'un autre test et ELSE qui contrôle les résultats FALSE.

32
Syntaxe : If condition then instructions ;
Else if Condition then instructions ;
Else Instructions;
End if;

Exemple N°1 : Multiplexeur

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux IS
PORT (E1,E2,sel : IN std_logic;
S : OUT std_logic);
END mux;
ARCHITECTURE behavior OF mux IS
BEGIN
PROCESS (sel,E1,E2) -- liste de sensibilité
BEGIN
IF sel = '0' THEN -- test si sel vaut 0
S <= E1;
ELSIF sel = '1' THEN -- test si sel vaut 1
S<= E2;
ELSE
y <= 'X'; -- si sel n'est ni à 1 ni à 0, on affecte X à S
END IF;
END PROCESS;
END behavior;
B.2) Le fonctionnement du “case“

On utilise CASE pour permettre le choix entre plusieurs actions. Cet instruction est très utile dans les machines d'états. En fin de
liste, on peut ajouter WHEN OTHERS qui permet de donner une action à tous les choix qui n'ont pu être trouvés dans la liste.

Syntaxe : Case signal de selection is


When valeur_de_selection => instruction;
When valeur_de_selection => instruction;

When others => instruction;
End case;

34
Library ieee;
USE ieee.std_logic_1164.all;
Entity demultiplex is
Port( SEL : in std_logic_vector (1 downto 0);
E : in std_logic
Enable : in std_logic;
S1,S2,S3,S4 : out std_logic);
End demultiplex;
Architecture desc_demultiplex of demultiplex is
Begin
Process (SEL, ENABLE, E) --Liste de sensibilité
Begin
If ENABLE = '0' then
Case SEL is
When "00" => S1 <= E ;
When "01" => S2 <= E ;
When "10" => S3 <= E ;
When others => S4 <= E ;
End case;
Else S1<='Z'; S2<='Z';S3<='Z'; S4<='Z';
End if ;
End process ;
End desc_demultiplex ;

35
B.3) Le fonctionnement du “for“

Syntaxe : FOR parametre IN intervalle (Ex : 0 to 5) LOOP


instruction;
End LOOP;

Exemple N°1 : codage de données :Le cahier des charges est le suivant :
s0 = a0
Pour i > 0 𝑎 𝑖 ∗ 𝑎 𝑖 − 1 + 𝑎ത 𝑖 ∗ 𝑎ത 𝑖 − 1

ENTITY codage IS
a : IN std_logic_vector (3 downto 0) ;
s : OUT std_logic_vector (3 downto 0) ;
END codage
Architecture archi of codage is
Begin
Process
Begin
s(0) <= a(0);
FOR i IN 1 to 3 LOOP
s(i)<=(a(i) AND a(i-1)) OR ((NOT a(i) AND NOT a(i-1));
END LOOP;
END process ;
END archi;
36
B.3) Le fonctionnement du “After“

AFTER spécifie un temps de réponse d'un signal par rapport à son événement. Deux modes de délai sont possibles INERTIAL
(défaut) ou TRANSPORT. Le mode INERTIAL ne propage pas les impulsions plus courtes que le temps de propagation.

Syntaxe :
sigal_name <= [INERTIAL/TRANSPORT] expression AFTER time_expression

Exemple N°1 : propage pas les impulsions plus courtes que le temps de propagation

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity porte_and is
Port ( a : in STD_LOGIC;
b : in STD_LOGIC;
z : out STD_LOGIC);
end porte_and;
architecture Behavioral of porte_and is
begin
PROCESS(a,b)
BEGIN
z <= a and b AFTER 10 ns; -- temps de propagation est de 10ns
END PROCESS ;
end Behavioral;

37

Vous aimerez peut-être aussi