Introduction au VHDL en Génie Électrique
Introduction au VHDL en Génie Électrique
Le langage VHDL
B. HAJJI
• Description comportementale
• Description structurelle
• Description de flot de données
Instructions concurrentes & séquentielles
Test
Objets et leurs types
Eléments de langages
Les attributs
Testbench
VHDL : langage de description matérielle, décrit la structure et le comportement d’un circuit numérique
Filière Génie Electrique
bloc1 bloc2
bloc3
RTL
Description au niveau
logique
Description Simulateur
VHDL physique
Placement-
routage Test des
prototypes
Analyse de
timing Fabrication
en série
15/10/2010 ECOLE NATIONALE DES SCIENCES APPLIQUEES 8
Vérification /Synthèse (RTL)
La vérification du système est faite pour valider le code de description en
fonction de spécifications
On utilise généralement la simulation
Utilise les délais des portes et les délais dans les interconnexions pour
calculer la vitesse maximale
Filière Génie Electrique
Placement
divise et place les gros blocs de la puce
Forme des rangées pour placer les cellules
Laisse un espace pour le routage
Ajuste l’espace, la forme, la densité, etc
Test:
Filière Génie Electrique
Structurel:
Vérification de défauts physique ( de fabrication)
Ex: une connexion de métal défectueuse
Fonctionnel:
Validation des spécification
Le circuit rencontre les spécifications?
Ex: fréquence d’horloge maximale
Une configuration
Library IEEE;
Use IEEE.std_logic_1164.all;
Use IEEE.std_logic_arith.all;
Use : indique quelle package de la librairie nous allons utiliser, après cela le
nom du package
Le .all : signifie que l’on souhaite utiliser tout ce qui se trouve dans ce package.
Les librairies principales sont:
• [Link]
• IEEE.std_logic_1164
Contient les types Std_logic et Std_logic_vector ainsi que les opérateurs logiques:
and, nand, or, nor, xor, xnor, not
IEEE.std_logic_arith
Contient un groupe d’opérateurs arithmétiques : "+", "-", "abs", "*", "<",
">", "<=", ">=", "/=", "=", shr, shl, conv_integer etc..
std_logic_signed :
contient des opérateurs sur nombres entiers signés.
Filière Génie Electrique
std_logic_unsigned :
contient des opérateurs sur nombres entiers non signés.
IEEE.numeric_std
Il ne permettent pas de représenter tous les états réels d’un signal, en plus des
états ‘0 et ‘1’ :
Un modèle VHDL est toujours défini par une spécification d’entité (ENTITY ) et
une ou plusieurs architectures (ARCHITECTURE)
L’architecture (ARCHITECTURE) :
• décrit le fonctionnement du modèle
• Elle contient des instructions concurrentes, des instructions séquentielles
et des instanciations de composants
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY black_box IS PORT (
clk, rst: IN std_logic;
d: IN std_logic_vector(7 DOWNTO 0);
Filière Génie Electrique
MODE
TYPE BLACK_BOX
rst
q[7:0]
d[7:0]
co
clk
entity adder is
port(
A: in std-logic;
B: in std_logic;
Filière Génie Electrique
type
mode
Entité
architecture comportementale of
mux2_1 is
entree1
begin
Filière Génie Electrique
sortie
process(entree1,entree2,sel)
begin
entree2 if sel=‘0’ then
sortie<=entree1;
else
sortie<=entree2;
sel end if;
component et
sel nonsel
port(a,b : in bit; s:out bit);
end component;
component OU
port(a,b : in bit; s:out bit); sele1
entree1 &
Filière Génie Electrique
end component;
sortie
component NON >=1
port(a: in bit; s: out bit);
end component;
begin
sortie<= sel0 or sel1;
sel0<=entree0 and not sel;
sel1<=entree1 and sel;
end flot;
15/10/2010 ECOLE NATIONALE DES SCIENCES APPLIQUEES 31
Exemple 2: Description de flot de données
Exemple: Comparateur
Filière Génie Electrique
L’ordre dans lequel sont écrites les instructions n’a aucune importance.
Toutes les instructions sont évaluées et affectent les signaux de sortie en même
temps
C’est la différence majeur avec un langage informatique
L’architecture ci-dessous est équivalente:
Exemple 1
signal sel0,sel1:bit;
Filière Génie Electrique
s
x <= a when (s = “00”) else
2
b when (s = “01”) else
c when (s = “10”) else a
Filière Génie Electrique
d; b x
mux
c
d
Exemple 1
Filière Génie Electrique
WITH s SELECT
x <= a WHEN “00”, -- means when s=“00”
b WHEN “01”,
Filière Génie Electrique
c WHEN “10”,
d WHEN OTHERS;
s
2
a
b x
mux
c
d
Forcer un message:
Assert false report Toujours à l’ écran Severity note:
Report Toujours à l’ écran Severity note:
Test en contecte séquentiel
Assert s = ‘1’ Report la sortie vaut ‘0’ et ce n’est pas normal Severity
warning; -- mentionne un warning
Assert s = ‘1’ Report la sortie vaut ‘0’ et ce n’est pas normal Severity failure; --
mentionne une erreur et arrête l’exécution
entity latch
port(D, clk : in bit:
Q: out bit:=‘0’;
Qb: out bit:=‘1’;
end latch;
architecture data_flow of latch is
constant TP:time:=10ns;
begin
Bloc:block(CLK=‘1’)
begin
Q<=guarded D after TP;
QB<=guarded (not D) after TP;
end block bloc;
15/10/2010 end data_flow ECOLE NATIONALE DES SCIENCES APPLIQUEES 48
L’instruction Generic
entity N_adder is
generic(N: integer);
port(a,b:in bit_vector(N-1 downto 0);
Cin: in bit;
s: out bit_vector(N-1 downto 0);
cout:out bit);
end N_adder;
Les instanciations et les port maps sont également dans le code principal
• après le mot clé begin
Y : OUT BIT
);
END COMPONENT; I1
Y
BEGIN
I2
U1: xor2 PORT MAP ( I1 => A, XOR2
I2 => B,
Y => U1_OUT);
U1_OUT
U2: xor2 PORT MAP ( I1 => U1_OUT,
I2 => C, A
Y => Result); B RESULT
END structural; C
XOR3
15/10/2010 ECOLE NATIONALE DES SCIENCES APPLIQUEES 51
L’instruction Generate
Cette instruction peut être utilisée sous deux formes
• La forme itérative
Exemple
Label: for variable_boucle IN valeur_initiale TO
valeur_finale
GENERATE{instructions parallèles}
End GENERATE label;
Filière Génie Electrique
• La forme conditionnelle
Exemple:
Label: if condition_booléenne GENERATE
{instructions concurrentes;}
end GENERATE label;
A(0)
S(0)
B(0)
Filière Génie Electrique
• La forme conditionnelle
Exemple:
Label: if condition_booléenne GENERATE
{instructions concurrentes;}
end GENERATE label;
entity N_adder is
generic (N:integer);
Port(A,B: in bit_vector(N-1 downto 0); C(0)
cin: in bit;
s: out bit_vector(N-1 downto 0);
A(0)
cout: out bit; S(0)
B(0)
Filière Génie Electrique
end N_adder;
C(1)
architecture structurelle of n_adder is A(1)
component adder S(1)
(a,b,cin:out bit; B(1)
s, cout: out bit);
end component; A(2) S(2)
signal c: bit_vector(N downto 0); B(2)
begin
label1: for i in 0 to N-1 generate
instance: adder port map (a(i),b(i),c(i),S(i),c(i+1));
end generate;
cout<=c(N); C(N-1)
end structurelle;
A(N-1) S(N-1)
B(N-1)
C(N)
Si trigger change à t = 10, tous les signaux sont mis à jour t = 10 + : sig1 = 5, sig2 =
1, sig3 = 2 et sum = 6
signal.
Opérateurs d’affection
─ := variables
─ <= signaux
Partie exécutive
Contient les instructions séquentielles à exécuter à chaque fois que le process
est lancé
Filière Génie Electrique
visée
Utiliser les processes librement dans les autres cas (testbench notamment)
Il est également possible de se passer de la liste de sensibilité
• Dans ce cas, il faut obligatoirement une instruction WAIT
process(A,B) process
begin begin
C<=A and B; C<=A and B;
D<=A and C; D<=A and C;
end process; wait on A,B;
end process;
P1: process()
begin
Filière Génie Electrique
P2: process()
begin
end process P2;
P3: process()
begin
end process P3;
Le ‘Process’ mux est sensible aux signaux a, b, et s. Chaque fois l’un des signaux
change de valeurs, le processus se met en état de veille, les états séquentielles
s’exécutent et l’output x est mise à jour
L’ordre des signaux dans la liste de sensibilité n’a pas d’importance
ELSE x <= d ;
END IF;
END PROCESS mux4_1 ;
Anytime you want to use IF-THEN-ELSE, then you MUST use a process,
because it is a sequential statement
CASE S IS
WHEN "00" => x <= a;
Filière Génie Electrique
Exemple 2:
case a&b is
when "00" => s_and<='0';
when "01" => s_and<='0';
when "10' => s_and<='0';
when others => s_and<='1';
END case;
15/10/2010 ECOLE NATIONALE DES SCIENCES APPLIQUEES 73
Process synchrone
Ici, les variables sont des simples fils: elles ne génèrent aucun
élément.
WAIT on : L'exécution reprend dès qu'un des signaux précisés change d'état.
• Exemple :
WAIT on A,B,Cin;
WAIT until : La suspension a lieu jusqu'à ce que la condition devienne VRAIE
• Exemple
UNTIL CLK='1';
WAIT UNTIL CLK='1' FOR 10 ms;
Variables:
• Les variables s’utilisent exclusivement au sein des processes.
• Elle est mise à jour instantanément.
• Elles ont une utilisation semblable aux variables dans un langage de
programmation classique
• Exemple :
d est le driver
delay est le délai
Les signaux peuvent être utilisés dans les process et en dehors
En synthèse, il sont apparentés à des fils
signal
X
+
Affectation de signaux:
Filière Génie Electrique
entity mon_entite is …
…
end mon_entite;
begin
… Zone déclarative de l'architecture
end archi;
process(clk)
begin
if clk'event and clk='1' then
int_cnt<=next_cnt;
end if;
end process;
cnt<=int_cnt;
END mixte;
Déclaré dans l'entité
Types
boolean string
15/10/2010
bit ECOLE NATIONALE DES SCIENCES APPLIQUEES 95
Types scalaires
Types
• Discrets
• Flottants
• Physiques
Ils sont définis :
• Par une liste de valeurs
Filière Génie Electrique
S exposant mantisse
1 8 23
tab2<=tab1(0 to 1);
sortie<=tab1(3);
Repérage des indices dans une chaîne (to et downto)
Eléments du langage
Le caractère espace ou le
retour chariot sont traités de la
même façon
Filière Génie Electrique
Exemple:
if (a=b) then
ou
if (a=b) then
ou
if (a =
b) then
sont équivalents
Les attributs
Valeur_bus’pos(‘1’)vaut 2
Valeur_bus’val(0) vaut ‘U’
Valeur_bus’rightof(‘1’) vaut ‘Z’
Valeur_bus’leftof(‘1’) vaut ‘0’
Valeur_bus’succ(2) vaut ‘Z’
Valeur_bus’prec(2) vaut ‘0’
variation de s
s’last_value valeur précédente de s
s’quiet(t) signal booléen vrai s’il n’y a pas eu de transaction sur s depuis t
s’active valeur booléenne s’il y a eu une transaction sur s dans le cycle
courant
s’last_active durée depuis la dernière transaction sur s
s’transaction signal de type bit qui change à chaque transaction sur s
Sorties observées
Testbench
Générateurs
Design Under
de Test (DUT)
Filière Génie Electrique
stimuli
Un testbench applique des stimuli sur les entrées du DUT (Design Under Test)
et récupère la valeur des sorties pour validation
Les résultats sont visualisés sous forme de chronogrammes ou dans un fichier.
Comme le testbench est écrit en VHDL, il est très portable et ne dépend pas
de l’outil de simulation (portabilité)
Le même testbench peut être utilisé pour tester le fonctionnement d’un
module ayant plusieurs architectures
ARCHITECTURE arch_tb OF tb IS
testSequence: PROCESS
-- Stimuli d’entrée
END PROCESS;
END arch_tb;
ENTITY xor3_tb IS
END xor3_tb;
PORT(
A : IN STD_LOGIC;
B : IN STD_LOGIC;
C : IN STD_LOGIC;
Result : OUT STD_LOGIC );
END COMPONENT;
State Machines