Cours VHDL
Cours VHDL
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.
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.
16
Lycée Ibn Sina BTS 1er année EII
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.
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
17
Lycée Ibn Sina BTS 1er année EII
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
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;
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);
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.
19
Lycée Ibn Sina BTS 1er année EII
Exemple :
Bus : out std_logic_vector (3 downto 0);
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.
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
20
Lycée Ibn Sina BTS 1er année EII
--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
21
Lycée Ibn Sina BTS 1er année EII
22
Lycée Ibn Sina BTS 1er année EII
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).
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;
23
Lycée Ibn Sina BTS 1er année EII
Exemple :
AmodB est égal à 25-3*7=4, 3 étant le maximum de fois que l’on peut
retrancher 7 de 25.
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.
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 :
24
Lycée Ibn Sina BTS 1er année EII
𝐴 ∗∗ 𝐵 est égal à 𝐴 .
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
Exemple 1 :
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
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
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.
27
Lycée Ibn Sina BTS 1er année EII
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.
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;
L’architecture est décrite sous forme d’un petit programme informatique avec
des instructions séquentielles constituant un processus et traduisant un algorithme.
29
Lycée Ibn Sina BTS 1er année EII
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 :
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 ;
30
Lycée Ibn Sina BTS 1er année EII
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.
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 ».
31
Lycée Ibn Sina BTS 1er année EII
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.
32
Lycée Ibn Sina BTS 1er année EII
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.
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:
33
Lycée Ibn Sina BTS 1er année EII
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 :
34
Lycée Ibn Sina BTS 1er année EII
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
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;
component PORTE_OU
port (E1, E2 : in std_logic; Z : out std_logic);
end component;
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.
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;
37
Lycée Ibn Sina BTS 1er année EII
entity TEST_ADDI is
end TEST_ADDI;
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;
38