0% ont trouvé ce document utile (0 vote)
45 vues23 pages

Cours VHDL

Le document présente le langage VHDL, utilisé pour la programmation de circuits logiques programmables tels que les PLDs et FPGAs. Il décrit la structure d'une description VHDL, incluant l'entité et l'architecture, ainsi que les instructions de base pour la logique combinatoire. Des exemples pratiques illustrent l'utilisation de VHDL pour modéliser des circuits comme un demi-additionneur et un multiplexeur.

Transféré par

mokhtarseba36
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
45 vues23 pages

Cours VHDL

Le document présente le langage VHDL, utilisé pour la programmation de circuits logiques programmables tels que les PLDs et FPGAs. Il décrit la structure d'une description VHDL, incluant l'entité et l'architecture, ainsi que les instructions de base pour la logique combinatoire. Des exemples pratiques illustrent l'utilisation de VHDL pour modéliser des circuits comme un demi-additionneur et un multiplexeur.

Transféré par

mokhtarseba36
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

Lycée Ibn Sina BTS 1er année EII

Langage VHDL

I. Introduction
La programmation des circuits logiques programmable comme les PLDs
(Programmable Logic Array), les ASICs (Application Specific Integrated Circuit) et
les FPGAs (Filed Programmable Gate Array) nécessitent des logiciels adéquats, ces
logiciels utilisent des langages de description Hardware comme VHDL ou
VERILOG. De plus ces logiciels permettent la synthèse VHDL, c’est-à-dire passer
directement de la description du schéma logique souhaité à son intégration dans le
composant choisi, notamment les PLDs et les FPGAs.

Le langage VHDL n’est pas un langage informatique, mais un langage au


service de l’électronique. Il en résulte pour l’électronicien ou l’informaticien des
concepts nouveaux quelquefois difficiles à saisir.

L’abréviation VHDL signifieVHSIC Hardware Description Langage (VHSIC:


VeryHigh Speed Integrated Circuit). Ce langage a été écrit dans les années 70 pour
réaliser la simulation de circuits électroniques. On l’a ensuite étendu en lui rajoutant
des extensions pour permettre la conception (synthèse) de circuits logiques
programmables (P.L.D. Programmable Logic Device).

Auparavant pour décrire le fonctionnement d’un circuit électronique


programmableles 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.

Actuellement la densité de fonctions logiques (portes et bascules) intégrée


dans lesFPGAsest telle (plusieurs millions de portes) qu’il n’est plus possible
d’utiliser les outils d’hier pour développer les circuits d’aujourd’hui.

Les sociétés de développement et les ingénieurs ont voulu s’affranchir des


contraintestechnologiques 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 FPGAs.

Ils permettent au code écrit d’être portable, c’est à dire qu’une description
écrite pourun circuit peut être facilement utilisée pour un autre circuit.

Il faut avoir à l’esprit que ces langages dits de haut niveau permettent de
matérialiserles structures électroniques d’un circuit.

En effet les instructions écrites dans ces langages se traduisent par une
configurationlogique de portes et de bascules qui est intégrée à l’intérieur des
circuits FPGAs.

Préparé par Souhail Rachid Page 1

16
Lycée Ibn Sina BTS 1er année EII

II. Structure d’une description VHDL simple


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

 L’entité (ENTITY), elle définit les entrées et les sorties avec leurs noms,
c’est la vue externe.
 L’architecture (ARCHITECTURE), elle contient les instructions VHDL
permettant de réalisée le fonctionnement attendu, c’est-à-dire une
équation pour chacune des sorties, ce qui décrit le comportement de
chaque circuit, c’est la vue interne.

Exemple d’un demi-additionneur

La table de vérité d’un demi-additionneur est comme suit :

A B S R On obtient les équations suivantes :


0 0 0 0
0 1 1 0 𝑆 =𝐴⊕𝐵
1 0 1 0
1 1 0 1 𝑅 = 𝐴. 𝐵

Avec A et B sont des entrées, S la sortie et R la retenue.

Ce circuit peur être modélisé par une vue externe « l’entité » et par une vue
interne « l’architecture ».

A R
Demi-
additionn
eur
B S

Vue externe Vue interne


La description de ce composant en langage VHDL est comme suit :

library ieee; Déclaration des bibliothèques


Use ieee.std_logic_1164.all;
--demi-additionneur Commentaires, en VHDL ils
entity demi_add is commencent par - -
port(A, B: in bit; R, S: out bit);
end demi_add;
Déclaration de l’entité dudemi-
architecture DESCRIPTION of demi_add is additionneur
begin
S <= A xor B;R<= A and B; Déclaration de l’architecture du
demi-additionneur
end DESCRIPTION;

Préparé par Souhail Rachid Page 2

17
Lycée Ibn Sina BTS 1er année EII

III. Déclaration des bibliothèques


Le type bit ne possède que deux valeurs 0 ou 1, ce qui est insuffisant pour la
simulation. Celle-ci nécessite au moins l’état non initialisé U (Unitialized), l’état
haute impédance Z et l’état X qui est leforçage à une valeur indéterminée 0 ou 1.
Jusqu’en 1992, chaque concepteur se définissait des types multi-valeurs appelés
MVL (Multi-Valued-Logic). Depuis 1992, un standard a été défini et agréé par
IEEE : c’est le standard IEEE 1164 qui comporte neuf états, des fonctions et sous
programmes permettant de réaliser des opérations arithmétiques et logiques.

Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
-- cette dernière bibliothèque est souvent utilisée pour l’écriture de
compteurs

La directive Use permet de sélectionner les bibliothèques à utiliser.

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


Elle permet de définir le NOM de la description VHDL ainsi que les entrées
sorties utilisées, l’instruction qui les définit c’est PORT :

 Syntaxe:

entity NOM_DE_L_ENTITE is
port ( Description des signaux d’entrées /sorties …);
end NOM_DE_L_ENTITE;

Exemple :

entityD_Latch is
port (
D : in std_logic;
E : in std_logic;
Q : out std_logic );
endD_Latch;

Remarque : Après la dernière définition de signal de l’instruction port il ne


faut jamais mettre de point-virgule.

Préparé par Souhail Rachid Page 3

18
Lycée Ibn Sina BTS 1er année EII

 L’instruction PORT
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.

IV.1. Le nom du signal


 Il n’y a pas de différence entre minuscules et majuscules ;
 La longueur d’un identificateur est limitée à celle d’une ligne ;
 Un identificateur est composé de lettres, du symbole « _ »
(« underscore » et non tiret) et de chiffres mais il doit commencer par
une lettre ; il n’accepte pas deux symboles « _ » successifs.

IV.2. Le sens du signal


 In : pour un signal en entrée
 Out : pour un signal en sortie
 Inout : pour un signal en entrée sortie
 Buffer : pour un signal en sortie mais utilisé comme entrée dans la
description.

IV.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.

Préparé par Souhail Rachid Page 4

19
Lycée Ibn Sina BTS 1er année EII

Exemple :
Bus : out std_logic_vector (3 downto 0);

Exprime la juxtaposition suivante : Bus(3)Bus(2)Bus(1)Bus(0).

Entree_A :In std_logic_vector (0 to 3);

Exprime la juxtaposition suivante :


Entree_A(0)Entree_A(1)Entree_A(2)Entree_A(3).

L’affectation d’une valeur à un signal se fait par l’instruction <= et peut être
faite à tout moment. Un signal peut être lié à un autre par cette instruction <=, ainsi
A<=B établit un lien permanent entre les signaux A et B, ce qui exige que ces
derniers aient le même type.

V. Déclaration de l’architecture correspondante à l’entité :


description du fonctionnement.
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. Dans le cas de simples PLDs on trouve souvent un seul
module.

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

Exemples :

--Multiplexeur 4*1
entity Mux1 is E0
Port (E0, E1, E2, E3: in std_logic ; E1 MUX1 S
SEL : in std_logic_vector (1 downto 0) ; E2
S :out std_logic); E3

end MUX1;
SEL

Préparé par Souhail Rachid Page 5

20
Lycée Ibn Sina BTS 1er année EII

architecture behavioral of MUX1 is


begin
process
begin
case SEL is
when “00” =>S<=E0;
when “01” =>S<=E1;
when “10” =>S<=E2;
when “11” =>S<=E3;
end case;
wait on E0, E1, E2, E3,SEL;
end process;
end behavioral;

--Décodeur 3 vers 8 S7
E2
entity DECODEUR is
Port (E: in std_logic_vector (2 downto 0); E1 Decodeur
S : out std_logic_vector (7 downto 0));
E0
end DECODEUR; S0

architecture behavioral of DECODEUR is


begin
process (E)
begin
case E is
when “000” =>S<=“00000001”;
when “001” =>S<=“00000010”;
when “010” =>S<=“00000100”;
when “011” =>S<=“00001000”;
when “100” =>S<=“00010000”;
when “101” =>S<=“00100000”;
when “110” =>S<=“01000000”;
when “111” =>S<=“10000000”;
end case;
end process;
end behavioral;

Préparé par Souhail Rachid Page 6

21
Lycée Ibn Sina BTS 1er année EII

VI. Les instructions de base (mode « concurrent »), logique


combinatoire.
Entre le BEGIN et le END de l’architecture on est dans un contexte
d’instructions concurrentes ou plutôt d’objets concurrents. Ce qui les caractérise :
 L’ordre des instructions concurrentes est indifférent.
 Pour le compilateur, chaque objet concurrent est en fait un processus
 Les objets concurrents (partie d’un circuit) sont reliés entre eux par des
signaux.
Par exemple avec le demi-additionneur précèdent, l’ordre des instructions n’a
aucune importance :

S <= A xor B; R <= A and B;


R <= A and B; S <= A xor B;

VI.1. Les opérateurs de base sur les objets

Le langage VHDL comporte six classes d’opérations avec un niveau de


priorité pour chaque classe. Lors de l’évaluation d’une expression, l’opération dont
la classe a la plus haute priorité est effectuée en premier. Néanmoins, il est conseillé
de faciliter la tâche du logiciel et d’améliorer la lisibilité de l’écriture par l’usage de
parenthèses.

VI.1.1. L’affectation simple

Dans une description VHDL, c’est certainement l’opérateur le plus utilisé. En


effet il permet de modifier 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 ;

Pour les signaux composés de plusieurs bits on utilise les guillemets « … »,


voir les exemples ci-dessous :

Les bases numériques utilisées pour les bus peuvent être :

 BINAIRE, exemple : BUS <= "1001" ; -- BUS = 9 en décimal


 HEXA, exemple : BUS <= X"9" ; -- BUS = 9 en décimal
 OCTAL, exemple : BUS <= O"11" ; -- BUS = 9 en décimal
VI.1.2. Les opérations logiques

Les opérations logiques « tableau ci-dessous » ayant le niveau de priorité le


plus faible. Ils ont la même priorité, d’où l’intérêt et quelquefois la nécessité de
parenthèses.

Préparé par Souhail Rachid Page 7

22
Lycée Ibn Sina BTS 1er année EII

Ainsi, l’opération A or B and C est impossible à interpréter sans parenthèses.

Opérateur VHDL
ET and
NON ET nand
OU or
NON OU nor
OU EXCLUSIF xor

Notons qu’il n’y a pas l’opérateur xnorni l’opérateur not, ce dernier faisant
partie de la classe de plus haute priorité. Ces opérations portent sur des opérandes de
type bit ou booléen. Ils portent aussi sur des chaines de bits (type bit_vector ou
std_logic_vector).

VI.1.3. Les opérations relationnelles

Le résultat de la comparaison est de type booléen, la relation concernée ne


pouvant qu’être vraie ou fausse.

Opérateur Signification VHDL


égal =
inégal /=
Plus petit <
Plus petit ou égal <=
Plus grand >
Plus grand ou égal >=

VI.1.4. Les opérations d’addition

Elles sont au nombre de trois : l’addition, la soustraction et la concaténation de


symboles respectifs : +,- et &. La concaténation est définie pour des chaines de bits
et des chaines de caractères. C’est une simple juxtaposition des valeurs.

Exemple
entityconcatenation is
Port (A, B: in std_logic_vector (2 downto 0);
S : out std_logic_vector (4downto 0));
endconcatenation;
architecture behavioral of concatenation is
signal S1:std_logic_vector (4 downto 0);--le signal se déclare ici
begin
S1<=A&B;
S<=S1;
end behavioral;

Préparé par Souhail Rachid Page 8

23
Lycée Ibn Sina BTS 1er année EII

VI.1.5. Les opérations de signe

Ce sont les signes + ou -. Ces opérations sont définies, c’est-à-dire valides,


pour des objets de type entier ou flottant.

Remarque : l’opérateur signe est moins prioritaire que l’opérateur


multiplication qui est *. Ainsi 5*-2(5 multiplié par -2) est une opération impossible.
Il faut écrire : 5*(-2).

VI.1.6. Les opérations de multiplication

Opérateur Signification VHDL


Multiplication *
Division /
Modulo mod
Reste (remainder) rem

Elles sont définies sur les types entier et flottant.

Exemple :

Soit deux entiers A et B de valeur respective 25 et 7.

AmodB est égal à 25-3*7=4, 3 étant le maximum de fois que l’on peut
retrancher 7 de 25.

A/B est égal à 3 car la partie fractionnaire de résultat est tronquée.

AremB est le reste de la division A/B donc notre exemple c’est 4 car
25=3*7+4.
L’opération AmodBa le signe de A par contre l’opération AremB a le signe
de B.

VI.1.7. Les opérations NOT, ABS et **

Ce sont les trois opérations de plus haute priorité. L’opération NOT prend le
complément de la valeur d’un objet de type bit, booléen, bit_vector.

Exemples :

C<= not A; -- C=complément A


C<= not(A or B); -- C=complément de (A+B), les parenthèses est
nécessaire ici.
L’opération ABS rend la valeur absolue. Elle est définie sur les entiers et les
flottants.

Préparé par Souhail Rachid Page 9

24
Lycée Ibn Sina BTS 1er année EII

L’opération ** est l’exponentiation, c’est-à-dire l’élévation de l’opération de


gauche à la puissance définie par l’opérande de droite. Ce dernier doit être un
nombre entier tandis que l’opérande de gauche doit être de type entier ou flottant.
Exemple :

𝐴 ∗∗ 𝐵 est égal à 𝐴 .

VI.2. Les instructions du mode « concurrent »


VI.2.1. Affectation conditionnelle
Cette instruction modifie l’état d’un signal suivant le résultat d’une condition
logique entre un ou des signaux.

SIGNAL <= expression when condition


[else expression when condition]
[else expression];

Remarque : l’instruction [else expression] n’est pas obligatoire mais elle est
fortement conseillée, elle permet de définir la valeur du SIGNAL dans le cas où la
condition n’est pas remplie.

Exemple
-- Structure d’un multiplexeur-
- 2 vers 1
S <= E1 when (SEL= 0)
Else E2;
VI.2.2. Affectation sélective

Cette instruction permet d’affecter différentes valeurs à un signal, selon les


valeurs prises par un signal dit de sélection.

with SIGNAL_DE_SELECTION select


SIGNAL <= expression when valeur_de_selection,
[expressionwhenvaleur_de_selection,]
[expression when others];

Remarque: l’instruction [expression whenothers] n’est pas obligatoire mais


fortement conseillée, elle permet de définir la valeur du SIGNAL dans le cas où la
condition n’est pas remplie.

Exemple 1 :

Préparé par Souhail Rachid Page 10

25
Lycée Ibn Sina BTS 1er année EII

entity ADDI is
port( A, B, Ri : in std_logic; S, R out std_logic);
end ADDI;
architecture behavioral of ADDI is
signal AUX: std_logic_vector (0 to 1);
begin
withRi&B&A select
AUX<= “00” when “000”,
“10” when “001”,
“10” when “010”,
“01” when “011”,
“10” when “100”,
“01” when “101”,
“01” when “110”,
“11” when “111”;
S<= AUX (0);
R<=AUX (1);
End ADDI;

VI.2.3. Le processus

architecture ARCH of ENTITE is


begin
--instructions concurrentes éventuelles
LABEL1: process
--déclaration éventuelle de variable et de constantes
begin
--initialisation éventuelle d’une variable intermédiaire utilisée
--uniquement dans le processus
--instruction séquentielles
Wait on liste_de_sensibilité ;
End process LABEL1 ;
--instruction concurrentes éventuelles
End ARCH ;

Préparé par Souhail Rachid Page 11

26
Lycée Ibn Sina BTS 1er année EII

Un processus est une instruction concurrente mais il est uniquement décrit par
des instructions séquentielles. L’exécution complète d’un processus, qui correspond
à un cycle de ce processus, comprend l’exécution de toutes les instructions situées
entre les mots begin et end process. Ainsi un processus s’exécute au moins une fois
à l’initialisation jusqu’à l’instruction wait qu’il est préférable de mettre plutôt que de
donner la liste de sensibilité après le mot process. Dès qu’un signal de cette liste
change d’état, l’exécution d’un nouveau cycle du processus a lieu depuis
l’instruction begin. Il s’en suit qu’une variable utilise uniquement à l’intérieur de ce
processus et devant avoir une valeur donnée au début de chaque cycle, doit être
initialisée juste après le mot begin. Par contre, elle doit être déclarée avant. La
structure d’un processus est définit dans la page précédente :

Remarques

 L’affectation d’une valeur à une variable ou à une constante se fait par le


symbole :=. La valeur d’un objet de type bit est donnée entre deux
apostrophes, exemple : ‘1’ ; la valeur d’un objet de type bit_vector est
donnée entre deux double-apostrophes exemple : « 1001 ».
 A l’intérieur d’un processus, une instruction d’affectation <= est
séquentielle.
 Toute initialisation d’un objet de fait par :=, même pour un signal.

Exemple :
constante PI : real :=3.1416 ; -- real est le type réel
variable VARI : bit :=’0’ ;
signal SIG : integer :=6 ;
 En dehors de l’initialisation, l’affectation d’une valeur à une constante ne se
fait jamais.
 En dehors de l’initialisation, l’affectation d’une valeur à une variable se fait
par := à tout moment à l’intérieur d’un processus, la variable étant déclarée
entre les mots process et begin.
 En dehors de l’initialisation, l’affectation d’une valeur à un signal se fait par
<=, le signal étant déclaré avant le mot begin de l’architecture.
 A l’intérieur d’un processus l’affectation d’une valeur à une variable a lieu
dès que l’instruction d’affectation est exécutée alors que l’affectation d’une
valeur à un signal a lieu au début de l’exécution de l’instruction wait, si
celle-ci existe, ou de l’instruction « end process » si l’instruction wait n’existe
pas.
 L’instruction wait on est suivie d’une liste d’objets devant déclencher un
nouveau cycle de calcul du processus sur toute modification de leur valeur.
Cette liste est appelée liste de sensibilité ». il est possible de se passer de
l’instruction wait on en indiquant la liste de sensibilité entre parenthèses
derrière le mos process, avec ou sans label.

Préparé par Souhail Rachid Page 12

27
Lycée Ibn Sina BTS 1er année EII

VII. Les différentes descriptions d’une architecture


Nous avons vu qu’un modèle, donc une entité, est décrit par sa vue externe qui
est la spécification d’entité et par sa vue interne qui est une description. Nous savons
aussi qu’il y a plusieurs types de description pour une architecture. En réalité, il y a
trois descriptions différentes et des descriptions mixtes possibles. S’y ajoute
également une architecture de test.

VII.1. La description de type flot de données

Elle est appelée « flot de données » parce que le comportement est décrit à
partir du flot des données transitant à l’intérieur de la boite noire que constitue la vue
externe. Mais elle est aussi appelée description fonctionnelle parce que l’objectif est
d’exprimer les fonctions des sorties par des équations booléennes.

Exemple
--Meme entité que ci-contre
entity ADDI is
architecture FLOT1 of ADDI is
port( A, B, Ri :in std_logic ;
signal S1, S2, S3: std_logic;
S, R : out std_logic) ;
begin
end ADDI;
S1<=A xor B;
architecture FLOT of ADDI is
S2<= A and B;
begin
S3<= S1 and Ri;
S<=(A xor B) xor Ri;
S<= S1 xor Ri;
R<=(A and B) or ((A xor B) and Ri);
R<=S2 or S3;
end FLOT;
end FLOT1;

C’est donc une description basée sur les opérateurs logiques. A titre
d’exemple, la figure ci-dessous donne la spécification d’entité et l’architecture de
type flot de données d’un multiplexeur, appelé MUX, à quatre entrées E0, E1, E2,
E3, une sortie S et deux signaux de sélection de voie SEL0 et SEL1.

Préparé par Souhail Rachid Page 13

28
Lycée Ibn Sina BTS 1er année EII

SEL1 SEL0 S=
0 0 E0 E0
0 1 E1 E1 MUX S
1 0 E2 E2
1 1 E3
E3

SEL0 SEL1

entity MUX is
port( E0,E1, E2, E3,SEL0, SEL1 :in std_logic ;
S : out std_logic) ;
endMUX;
architecture FLOT_MUX of MUX is
begin
S<=((not SEL0) and (not SEL1) and E0) or (SEL0 and (not SEL1) and E1) or ((not
SEL0) and SEL1 and E2) or (SEL0 and SEL1 and E3);
end FLOT_MUX;

VII.2. La description de type comportemental ou procédural


VII.2.1. Description par l’instruction IF

L’architecture est décrite sous forme d’un petit programme informatique avec
des instructions séquentielles constituant un processus et traduisant un algorithme.

La structure de l’instruction est la suivante :


if condition_booléennes_1 then
séquence_1_instructions ;
elsif condition_booléenne_2 then
séquence_2_instruction ;
elsif condition_booléenne_3 then
séquence_3_instructions ;
end if ;

Chaque séquence d’instructions n’est exécutée que si la condition booléenne


associée est vraie.

Préparé par Souhail Rachid Page 14

29
Lycée Ibn Sina BTS 1er année EII

Exemple de description d’une bascule D flip-flop

entity BASCULE_D is
port ( D,CLK : in std_logic;
S : out std_logic);
end BASCULE_D;
architecture DESCRIPTION of BASCULE_D is
begin
PRO_BASCULED : process (CLK)
begin
if (CLK'event and CLK ='1') then
S <= D;
end if;
end process PRO_BASCULED;
end DESCRIPTION;

Remarques :

 Dans la forme elsif, si la condition booléenne associée au dernier elsif


englobe tous les autres cas encore envisagés, l’instruction elsif…
derniére_condition_boolénne peut être remplacée par else sans indiquer
de condition. Exemple :

if condition_booléennes_1 then
séquence_1_instructions ;
elsif condition_booléenne_2 then
séquence_2_instruction ;
else
séquence_3_instructions ;
end if ;

 Sequence_3_instructions sera exécutée si les deux conditions


booléennes sont fausses.
 Dans la forme elsif sans aucun else, le cas où toutes les conditions
booléennes sont fausses est envisageable, et aucune séquence
d’instruction ne sera exécutée.
 Dans la forme elsif, la première condition booléenne trouvée vraie
donne lieu à l’exécution de la séquence d’instructions associée et met fin
à l’instruction if, même si une autre condition booléenne se trouve

Préparé par Souhail Rachid Page 15

30
Lycée Ibn Sina BTS 1er année EII

également vraie, ce qui n’est pas interdit. L’ordre des séquences


d’instruction établit donc une priorité.
 Si la forme if se limite à :

if condition_booléennes_1 then
séquence_1_instructions ;
else
séquence_2_instructions ;
end if ;
Il y aura toujours une séquence à exécuter.

 Si la forme if se limite à :

if condition_booléennes_1 then
A<=B ;
end if ;

Il faut bien savoir que A conservera sa valeur si la condition n’est pas vraie.

VII.2.2. Description par l’instruction CASE


Une séquence d’instructions est sélectionnée parmi plusieurs alternatives, en
fonction de la valeur d’une expression par la syntaxe :

case expression is
when valeur_1 => séquence_1_instructions;
when valeur_2 => séquence_2_instructions;
when valeur_3 => séquence_3_instructions;
whenothers => séquence_4_instructions;
end case;

Bien entendu, le signe => signifie « then » (alors). L’ordre des alternatives n’a
pas d’importance, toutefois « whenothers » doit être la dernière. La structure case
exige qu’un seul choix soit possible mais que ce choix existe. C’est l’intérêt de
l’alternative « whenothers » qui regroupe toutes les valeurs non encore envisagées.
Donc, si toutes les valeurs de l’expression ne sont pas énumères, il faut utiliser
« whenothers ».

Préparé par Souhail Rachid Page 16

31
Lycée Ibn Sina BTS 1er année EII

Exemples : décodeur vus précédemment 3 vers 8

architecture behavioral of DECODEUR is


begin
process (E)
begin
case E is
--Décodeur 3 vers 8
when “000” =>S<=“00000001”;
entity DECODEUR is
when “001” =>S<=“00000010”;
Port (E: in std_logic_vector
when “010” =>S<=“00000100”;
(2 downto 0);
when “011” =>S<=“00001000”;
S: out std_logic_vector
when “100” =>S<=“00010000”;
(7 downto 0));
when “101” =>S<=“00100000”;
end DECODEUR;
when “110” =>S<=“01000000”;
when “111” =>S<=“10000000”;
end case;
end process;
end behavioral

VII.2.3. Description par l’instruction for

Le décodeur que nous venons de voir précédemment peut aussi être décrit par
l’instruction séquentielle FOR, qui est une instruction de boucle. Mais cette
instruction est basée sur un indice I de type entier. Cela nous conduit à calculer la
valeur décimale du mot binaire constitué par E2 E1 E0. Pour le calculer, nous
utiliserons une variable intermédiaire N.

Préparé par Souhail Rachid Page 17

32
Lycée Ibn Sina BTS 1er année EII

architecture behavioral of DECODEUR1 is


begin
process (E0, E1, E2)
variable N: integer range 0 to 7;
begin
--Décodeur 3 vers 8
N:= 0;
entity DECODEUR1 is
if E0=’1’ then N:=N+1; end if;
Port (E0, E1, E2: in std_logic;
if E1=’1’ then N:=N+2; end if;
S: out std_logic_vector
if E2=’1’ then N:=N+4; end if;
(7 downto 0));
S<=”00000000”;
end DECODEUR1;
for I in 0 to 7 loop
if (I=N)then
S(I)<=’1’
end if;
endloop;
end process;
end behavioral

Comme nous l’avons vu pour un processus, un label peut être affecté à une
boucle ; l’instruction de fin de boucle pourra ou non rappeler ce label.

Boucle: for INDICE in 0 to (n-1) loop


-- Instructions
end loop Boucle; -- ou end loop;

VII.2.4. Description par l’instruction WHILE

La structure de boucle que nous venons de voir avec l’instruction FOR a une
variante obtenue avec l’instruction WHILE. Pour cette dernière, l’incrémentation de
la variable de boucle se fait tant qu’une condition booléenne associée est vraie.
Mais, contrairement à ce qui se passe pour la boucle FOR, l’indice doit être déclaré,
initialisé et incrémenté, ce qui rend peu attrayante cette instruction. Ainsi la boucle
de DECODEUR1, que nous venons de voir avec l’instruction FOR, s’écrit avec
l’instruction WHILE, le label étant facultatif:

Préparé par Souhail Rachid Page 18

33
Lycée Ibn Sina BTS 1er année EII

process(E0, E1, E2)


variable INDICE : integer range 0 to 7;
begin
INDICE:=0;
boucle : while INDICE<8 loop
if(INDICE=N)then
S(INDICE)<=’1’;
end if;
INDICE:=INDICE+1;
end loop boucle;

VII.3. La description de type structurel

Les deux premières descriptions d’une architecture que nous venons d’étudier,
à savoir la description de type flot de données et la description de type
comportemental, sont les descriptions de base pour décrire le fonctionnement d’un
circuit électronique. La description de type structurel est plutôt un complément qui
va permettre de décrire un assemblage de différents circuits électroniques, chacun de
ceux-ci étant une « boite noire » donc une entité. A partir d’un certain niveau de
complexité d’un système logique, il est très difficile de ne pas faire appel à une
description de type structurel des différents blocs, chacun d’eux étant une entité
donnant lieu à une architecture décrite dans le type flot de données ou le type
comportemental. Ainsi, notre additionneur 1 bit vu précédemment a pu être
totalement décrit dans le type flot de données parce que qu’il s’agit d’un circuit très
simple. Mais d’une façon plus systématique, nous pouvons le considérer comme
constitué de trois blocs, ou « boites noires », connectés entre eux :

Nous avons vu que le schéma d’un demi additionneur est comme suit :

Préparé par Souhail Rachid Page 19

34
Lycée Ibn Sina BTS 1er année EII

Donc on peut conclure que :

 INSTANCE1 est un DEMI_ADDI,


 INSTANCE2 est un DEMI_ADDI,
 INSTANCE est une PORTE_OU.

Les trois composants (components) sont reliés entre eux par les signaux S1, S2
et S3.

Pour réaliser une description structurelle d’un additionneur 1 bit, il faut créer
une description de flot de donnés d’un DEMI_ADDI et une description d’une porte
logique OUPORTE_OU, puis faire appel de ces descriptions par l’instruction
componentet faire correspondance entre les composants par des signaux, cette
dernière opération s’appelle instanciation.

S2
A A INSTANCE1 R E2 INSTANCE
De De Z R
B B DEMI_ADDI S E1 PORTE_OU
S1 S3

INSTANCE2 R
A
De
DEMI_ADDI
Ri B S S

entityDEMI_ADDI is entity PORTE_OU is


port(A, B: in std_logic; port(E1, E2: in std_logic ;
S, R: out std_logic); Z: out std_logic);
endDEMI_ADDI; endPORTE_OU;
architecture DESCRIPTION of architecture DESCRIPTION of
DEMI_ADDI is begin PORTE_OU is begin
S <= A xor B; R <= A and B; Z<= E1 or E2;
end DESCRIPTION; end DESCRIPTION;

Préparé par Souhail Rachid Page 20

35
Lycée Ibn Sina BTS 1er année EII

entityADDi is
port( A, B, Ri : in std_logic; S, R : out std_logic);
end ADDI;

architecture STRUCTURE of ADDI is


component DEMI_ADDI
port (A, B : in std_logic; S, R : out std_logic);
end component;

component PORTE_OU
port (E1, E2 : in std_logic; Z : out std_logic);
end component;

signal S1, S2, S3 : std_logic;


begin
INSTANCE1 : DEMI_ADDI port map( A, B, S1, S2);
INSTANCE2 : DEMI_ADDI port map( S1, Ri, S, S3);
INSTANCE : PORTE_OU port map( S3, S2, R);
end STRUCTURE;

VIII. La description d’une architecture de test


Pour tester une fonction totalement décrite par son entité, il faut créer une
entité de test. Cette entité n’a ni entrée, ni sortie ; en conséquence sa vue externe,
donc sa spécification d’entité, est vide. Mais cette entité sans port possédé des
signaux d’entrée qui sont des stimuli et des signaux de sorti, aussi elle a une
architecture.

Néanmoins, les stimuli d’une entité de test peuvent être générés par une entité
dont la vue externe ne possède que des sorties. Les stimuli sont générés sur ces
sorties. La vue externe de cette entité existe et donc se spécification d’entité n’est
pas vide.

Exemple : on applique aux entrées du composant additionneur 1 bit les


signaux a_test, b_test et ri_test montrés dans le chronogramme ci-dessous, avec
ri_test un signal qui se change chaque 100ns, b_test se change chaque 200ns puis
a_test se change chaque 400ns. Les résultats du test sont retenus sur les sortiess_test
et r_test.

Préparé par Souhail Rachid Page 21

36
Lycée Ibn Sina BTS 1er année EII

entity TEST_ADDI is
end TEST_ADDI;
architecture ARCH1 of TEST_ADDI is
component ADDI
port (A, B, Ri : in std_logic; S, R : out std_logic);
end component;
signala_test, b_test, ri_test, s_test, r_test : std_logic;
begin
INSTANCE1: ADDI port map ( a_test, b_test, ri_test, s_test, r_test);
ri_test<= not ri_test after 100ns;
b_test<= not b_test after 200ns;
a_test<= not a_test after 400ns;
end ARCH1;
Toutefois il existe une autres possibilité qui consiste à :

 Créer une entité générant les stimuli, cette entité étant donc un
composant. Nous appellerons STIMUL cette entité ;
 Coupler l’entité STIMUL à l’entité à tester qui est ADDI, dans l’entité
TEST_ADDI de niveau supérieur sans entrées/sorties.
entity STIMUL is
port ( STIM : out std_logic_vector(2 downto 0));end STIMUL;
architecture COMPOR_STIMUL of STIMUL is
begin
process
begin
STIM<= “000”, “0001” after 100ns, “010” after 200ns, “011”
after 300ns, “100” after 400ns, “101” after 500ns, “110”
after 600ns, “111” after 700ns;
wait ; -- instruction nécessaire pour arrêter le processus
end process ; endCOMPOR_STIMUL;

Préparé par Souhail Rachid Page 22

37
Lycée Ibn Sina BTS 1er année EII

entity TEST_ADDI is
end TEST_ADDI;

architecture ARCH2 of TEST_ADDI is


signal S_T: std_logic_vector( 2 downto 0);
signalS_test, R_test : std_logic;

component ADDI
port (A, B, Ri : in std_logic; S, R : out std_logic);
end component;

component STIMUL
port (STIM : out std_logic_vector( 2 downto 0));
end component;

--configuration implicite pour ADDI et STIMUL


--instanciation
Begin
INST1 : ADDI port map (S_T(0), S_T(1), S_T(2), S_TEST, R_TEST);
INST2 : STIMUL port map (S_T);
end ARCH2;

Préparé par Souhail Rachid Page 23

38

Vous aimerez peut-être aussi