Académique Documents
Professionnel Documents
Culture Documents
pour un langage qui permettrait de décrire tous les systèmes électroniques utilisés.
• Enfin en 1985 une première version officielle de VHDL (version 7.2) a vu le jour. Puis pour son
• Le deuxième langage similaire c’est le Verilog qui a été inventé par Gateway Design Automation
ü Ces deux langages font abstraction des contraintes technologies des circuits PLDs.
ü Ils permettent au code écrit d’être portable, c’est à dire qu’une description écrite pour un circuit peut être
ü Ces langages dits de haut niveau permettent de matérialiser les structures électroniques d’un circuit.
ü En effet les instructions écrites dans ces langages se traduisent par une configuration logique de portes et de
ü C’est pour cela que en parle de description VHDL ou VERILOG que de langage.
La Programmation VHDL
q Schéma fonctionnel d’implantation de descriptions VHDL dans un circuit logique
programmable.
• Lors de la phase de synthèse chaque bloc sera matérialisé par des portes et/ou, des bascules ou des LUT et des
multiplexeurs. On peut remarquer sur le schéma la fonction particulière du bloc VHDL N°1.
• En effet dans la description fonctionnelle d’un PLD on a souvent besoin d’une fonction qui sert à cadencer le
fonctionnement de l’ensemble, celle-ci est très souvent réalisée par une machine d’états synchronisée par une
horloge.
La Programmation VHDL
q Organisation fonctionnelle de développement d’un PLD.
entity NOM_DE_L_ENTITE is
port ( Description des signaux d’entrées
/sorties …);
end NOM_DE_L_ENTITE;
La Programmation VHDL
Exemples:
Pour chaque signal on doit définir: le NOM_DU_SIGNAL, le sens et le type.
CLK: in std_logic;
v Le NOM_DU_SIGNAL.
BUS : out std_logic_vector (31 downto 0);
Il est composé de caractères, le premier caractère doit être une lettre.
entity COUNT is VHDL n’est pas sensible la <<casse>> ,
port(CLK, RST:in std_logic; v Le SENS du signal.
CNT: inout std_logic_vector(2downto 0)); - in : signal en entrée.
TYPE PHYSIQUE :
• Un type physique est la combinaison d'un type entier et d'un système d'unité .
Le type TIME, est le seul type physique prédéfini :
type time is range $- to $+ -- l'intervalle dépend de la machine
units
fs;
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns;
Ms = 1000 us;
sec = 1000 ms;
min = 60 sec;
hr = 60 min;
end units;
• Les simulateurs VHDL utilsent la fonction now, de la bibliothèque STD , qui retourne le temps physique de type
TIMETYPES FICHIERS :
• Les types fichiers FILE permet l’échange de données entre l’extérieur et le simulateur VHDL.
• Il est utilisé principalement pour créer des fichiers de test ou TESTBENCH de modèles.
• Le paquetage TEXTIO de la bibliothèque STD définit un type fichier texte TEXT et des procédures pour accéder aux
lignes du fichier et aux chaînes dans la ligne.
• Pour l'utiliser il est nécessaire de le déclarer en début de fichier (USE
STD.TEXTIO.ALL;
La Programmation VHDL
q Déclaration de l’architecture correspondante à l’entité:
entity PORTES is
port (A,B :in std_logic;
Y1,Y2,Y3,Y4,Y5,Y6,Y7:out std_logic);
end PORTES;
architecture DESCRIPTION of PORTES is
begin
Y1 <= A and B;
Y2 <= A or B;
Y3 <= A xor B;
Y4 <= not A;
Y5 <= A nand B;
Y6 <= A nor B;
Y7 <= not(A xor B);
end DESCRIPTION;
La Programmation VHDL
Exemples :
Décodeurs 7 segments
entity DEC7SEG4 is
port (DEC :in std_logic_vector(3 downto 0);
SEG:out std_logic_vector(0 downto 6));
end DEC7SEG4;
architecture DESCRIPTION of DEC7SEG4 is
begin
SEG <= "1111110" when DEC = 0
else "0110000" when DEC = 1
else "1101101" when DEC = 2
else "1111001" when DEC = 3
else "0110011" when DEC = 4
else "1011011" when DEC = 5
else "1011111" when DEC = 6
else "1110000" when DEC = 7
else "1111111" when DEC = 8
else "1111011" when DEC = 9
else "-------";
end DESCRIPTION;
La Programmation VHDL
Décodage d’adresses
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
entity DECODAGE is
port (
A15, A14, A13, A12, A11, A10 : in std_logic;
RAM0 : out std_logic;
RAM1 : out std_logic;
RAM2 : out std_logic;
RAM3 : out std_logic;
ROM : out std_logic;
INTER1 : out std_logic;
INTER2 : out std_logic;
INTER3 : out std_logic);
end DECODAGE;
architecture DESCRIPTION of DECODAGE is
signal ADRESSE: std_logic_vector(15 downto 0);
begin
ADRESSE <= A15 & A14 & A13 & A12 & A11 & A10 & "----------";
-- definition du bus d’adresses
ROM <= '0' when (ADRESSE >= x"E000") and (ADRESSE <= x"FFFF") else '1';
RAM0 <= '0' when (ADRESSE >= x"0000") and (ADRESSE <= x"03FF") else '1’;
RAM1 <= '0' when (ADRESSE >= x"0400") and (ADRESSE <= x"07FF") else '1';
RAM2 <= '0' when (ADRESSE >= x"0800") and (ADRESSE <= x"0BFF") else '1';
RAM3 <= '0' when (ADRESSE >= x"0C00") and (ADRESSE <= x"0FFF") else '1';
INTER1 <= '0' when (ADRESSE >= x"8000") and (ADRESSE <= x"8001") else '1';
INTER2 <= '0' when (ADRESSE >= x"A000") and (ADRESSE <= x"A001") else '1';
INTER3 <= '0' when (ADRESSE >= x"C000") and (ADRESSE <= x"C00F") else '1';
end DESCRIPTION;
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
ü Dans le mode concurent pour une description VHDL toutes les instructions sont évaluées et affectent les
signaux de sortie en même temps.
ü L’ordre dans lequel elles sont écrites n’a aucune importance. En effet la description génère des structures
électroniques, c’est la grande différence entre une description VHDL et un langage informatique
classique.
ü Dans un système à microprocesseur, les instructions sont exécutées les unes à la suite des autres.
ü Avec VHDL une structure sous forme d’un schéma logique va être générée par le synthétiseur.
Exemple : Pour le décodeur 1 parmi 4, l’ordre dans lequel seront écrites les instructions n’a aucune importance.
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
§ Opérateurs logiques.
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
§ Opérateurs logiques.
Exemple S1 <= A sll 2 ; -- S1 = A décalé de 2 bits à gauche.
S2 <= A rol 3 ; -- S2 = A avec une rotation de 3 bits à gauche
S3 <= not (R); -- S3 = /R
Remarque : Pour réaliser des décalages logiques en synthèse logique, il est préférable d’utiliser les instructions suivantes :
Décalage à droite :
-- Si A est de type std_logic_vector(7 downto 0)
S1 <= ‘0’ & A(7 downto 1); -- décalage d’un bit à droite
S1 <= "000" & A(7 downto 3); -- décalage de trois bits à droite
Décalage à gauche :
-- Si A est de type std_logic_vector(7 downto 0)
S1 <= A(6 downto 0) & ‘0’; -- décalage d’un bit à gauche
S1 <= A(4 downto 0) & "000"; -- décalage de trois bits à gauche
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
§ Opérateurs arithmétiques.
Remarque N°1 : Pour pouvoir utiliser les opérateurs ci-dessus il faut rajouter les
Bibliothèques suivantes au début du fichier VHDL:
Use ieee.numeric_std.all ;
Use ieee.std_logic_arith.all ;
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
§ Opérateurs arithmétiques.
Exemples :
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 N°2 : Attention l’utilisation de ces opérateurs avec des signaux comportant un
nombre de bits important peut générer de grandes structures électroniques.
Exemples :
S1 <= A * B ;-- S1 = A multiplié par B : A et B sont codés sur 4 bits
S2 <= A / B ;-- S2 = A divisé par B : A et B sont codés sur 4 bits
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
§ Opérateurs relationnels.
Ils permettent de modifier l’état d’un signal ou de signaux suivant le résultat d’un test
ou d’une condition. En logique combinatoire ils sont souvent utilisés avec les
instructions :
- when … else …
- with …. Select ….
Affectation conditionnelle :
Cette instruction modifie l’état d’un signal suivant le résultat d’une condition logique entre un ou des signaux, valeurs, constantes.
SIGNAL <= expression when condition
[else expression when condition]
[else expression];
Remarque : l’instruction [else expression] n’est pas obligatoire mais elle fortement
conseillée, elle permet de définir la valeur du SIGNAL dans le cas où la
condition n’est pas remplie.
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
§ Opérateurs relationnels.
Exemple :
-- S1 prend la valeur de E2 quand E1=’1’ sinon S1 prend la --
valeur ‘0’
S1 <= E2 when ( E1= ‘1’) else ‘0’;
Schéma correspondant :
Exemple N°2 :
-- Structure évoluée d’un multiplexeur 4 vers 1
S2 <= E1 when (SEL="00" ) else
E2 when (SEL="01" ) else
E3 when (SEL="10" ) else
E4 when (SEL="11" )
else ‘0’;
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
§ Opérateurs relationnels.
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,
[expression when valeur_de_selection,]
[expression when others];
Remarque: l’instruction [expression when others] 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.
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
§ Opérateurs relationnels.
Exemple :
-- Multiplexeur 4 vers 1
with SEL select
S2 <= E1 when "00",
E2 when "01",
E3 when "10",
E4 when "11",
'0' when others;
Remarque: when others est nécessaire car il faut toujours définir les autres cas du
signal de sélection pour prendre en compte toutes les valeurs possibles de celui-ci.
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
§ Opérateurs relationnels.
En conclusion, les descriptions précédentes donnent le même schéma, ce qui est rassurant. L’étude des deux
instructions montre toute la puissance du langage VHDL pour décrire un circuit électronique, en effet si on avait
été obligé d’écrire les équations avec des opérateurs de base pour chaque sortie, on aurait eu les instructions
suivantes :
S2 <= (E1 and not(SEL(1)) and not(SEL(0))) or (E2 and not SEL(1) and
(SEL(0)) or (E3 and SEL(1) and not(SEL(0))) or (E4 and SEL(1) and SEL(0));
L’équation logique ci-dessus donne aussi le même schéma, mais elle est peu compréhensible, c’est pourquoi on
préfère des descriptions de plus haut niveau en utilisant les instructions VHDL évoluées.
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
§ Opérateurs relationnels.
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
entity TABLE1 is
port (
E1,E2 : in std_logic;
SEL : in std_logic_vector(1 downto 0);
S2 : out std_logic);
end TABLE1;
architecture DESCRIPTION of TABLE1 is
begin
with SEL select
S2 <= E1 when "00",
E2 when "01",
'0' when others; -- Pour les autres cas de SEL S2
-- prendra la valeur 0 logique
end DESCRIPTION;
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
§ Opérateurs relationnels.
Exemple : Affectation sélective avec les autres cas forcés à un ‘1’.
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
entity TABLE2 is
port (
E1,E2 : in std_logic;
SEL : in std_logic_vector(1 downto 0);
S2 : out std_logic);
end TABLE2;
architecture DESCRIPTION of TABLE2 is
begin
with SEL select
S2 <= E1 when "00",
E2 when "01",
'1' when others; -- Pour les autres cas de SEL
S2
-- prendra la valeur 1 logique
end DESCRIPTION;
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
§ Opérateurs relationnels. Affectation simple
L’affectation simple traduit une simple interconnexion entre deux équipotentielles.
L’opérateur d’affectation de signaux (<=) :
nom_de_signal <= expression_du_bon_type ;
Affectation conditionnelle
cible <= source_1 when condition_booléenne_1 else
Exemple :
L’implémentation d’un additionneur 4 bits avec en utilisant 4 additionneurs complet 1 bit le schéma :
Remarque :
C1, C2 et C3 sont déclarés comme signaux binaire (std_logic), servent à connecter les différents blocs.
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
Le programme VHDL
library IEEE;
begin
use IEEE.std_logic_1164.all;
entity adder4 is stage0:fulladd port
port (cin : in std_logic; x3,x2,x1,x0 : in
std_logic; map(cin,x0,y0,s0,c1);
y3,y2,y1,y0:in std_logic;s3,s2,s1,s0 : out
std_logic; stage1:fulladd port
cout : out std_logic); map(c1,x1,y1,s1,c2);
end adder4;
architecture structural of adder4 is stage2:fulladd port
signal c1,c2,c3: std_logic;
component fulladd --déclaration d instance de map(c2,x2,y2,s2,c3);
add 1 bit stage3:fulladd port
port(cin : in std_logic; x:in std_logic; y: in
std_logic; s : out std_logic; cout : out map(c3,x3,y3,s3,cout);
std_logic);
end component; end structural;
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
library IEEE;
use IEEE.std_logic_1164.all;
entity fulladd is
port (cin : in std_logic; x:in std_logic;
y: in std_logic;
s : out std_logic; cout : out std_logic);
end fulladd;
-- description concurrente ---
Architecture logic_func of fulladd is
begin
s <= (x xor y) xor cin ;
cout <= (x and y) or (cin and x) or (cin
and y);
end logic_func;
La Programmation VHDL
q Les instructions concurrent pour circuit combinatoire.
• Les opérateurs.
Le TESTBENCH :
• Un testbench (banc d’essai) VHDL est un code VHDL destiné à la vérification, par
VHDL.
Exemple :