Cours VHDL 10 Partie2 Structure Programme PDF
Cours VHDL 10 Partie2 Structure Programme PDF
Cours VHDL 10 Partie2 Structure Programme PDF
Denis Giacona
ENSISA
École Nationale Supérieure d'Ingénieur Sud Alsace
12, rue des frères Lumière
68 093 MULHOUSE CEDEX
FRANCE
Tél. 33 (0)3 89 33 69 00
© D.Giacona
VHDL – Logique programmable 2/47 Partie 2 – La structure d’un programme VHDL
© D.Giacona
VHDL – Logique programmable 3/47 Partie 2 – La structure d’un programme VHDL
3. Le corps d'architecture ...................................................................................................................................................................................... 36
3.1. Syntaxe ................................................................................................................................................................................................................ 36
3.2. Déclarations dans l’architecture ................................................................................................................................................................ 37
3.3. Instructions concurrentes ........................................................................................................................................................................... 39
3.3.1. Propriétés .................................................................................................................................................................................................. 39
3.3.2. Classification des styles de description ............................................................................................................................................ 40
3.3.3. Exemple 1 : architecture comportant des styles différents ........................................................................................................ 43
3.3.4. Exemple 2 : styles différents pour un même bloc logique ............................................................................................................. 45
3.3.5. Exemple 3 : fonction opposé arithmétique opposite_n................................................................................................................... 47
© D.Giacona
VHDL – Logique programmable 4/47 Partie 2 – La structure d’un programme VHDL
Logiciel de simulation
Logiciel de synthèse
(configuration de
circuits logiques
programmables)
© D.Giacona
VHDL – Logique programmable 5/47 Partie 2 – La structure d’un programme VHDL
Syntaxe complexe
o pour aider le concepteur, les outils de développement proposent des modèles
VHDL (templates) et des convertisseurs de schémas en code VHDL
Langage strict par rapport aux types et aux dimensions des données
o avantage : élimination d’un grand nombre d’erreurs de conception dès la
compilation
© D.Giacona
VHDL – Logique programmable 6/47 Partie 2 – La structure d’un programme VHDL
Les instructions ressemblent à celles d’un langage impératif, mais, alors que
pour certaines, l’ordre d’écriture est déterminant, pour d’autres, l’ordre n’a pas
d’importance.
© D.Giacona
VHDL – Logique programmable 7/47 Partie 2 – La structure d’un programme VHDL
© D.Giacona
VHDL – Logique programmable 8/47 Partie 2 – La structure d’un programme VHDL
© D.Giacona
VHDL – Logique programmable 9/47 Partie 2 – La structure d’un programme VHDL
© D.Giacona
VHDL – Logique programmable 10/47 Partie 2 – La structure d’un programme VHDL
tempo1ms t
Signal externe
control cnt10
rst ar
ar
a up_cnt10
en cnt(9:0)
sr_cnt10
sr
clk clk
clk
compare
cnt10(9:0)
max_cnt10
(d = max) d(9:0)
Signal interne
© D.Giacona
VHDL – Logique programmable 11/47 Partie 2 – La structure d’un programme VHDL
-- description du comportement
architecture tempo1ms_arch of tempo1ms is
...
Déclaration des signaux internes
begin
-- description du compteur
cnt10_proc: process (rst,clk) …
-- description du contrôleur
control_proc: process (rst, clk) …
-- description du comparateur
compare: max_cnt10 <= ‘1’ when …
end tempo1ms_arch;
© D.Giacona
VHDL – Logique programmable 12/47 Partie 2 – La structure d’un programme VHDL
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)
© D.Giacona
VHDL – Logique programmable 13/47 Partie 2 – La structure d’un programme VHDL
© D.Giacona
VHDL – Logique programmable 14/47 Partie 2 – La structure d’un programme VHDL
bit : énuméré dont les deux seules valeurs possibles sont ‘0’ et ‘1’
boolean : énuméré dont les deux valeurs possibles sont false et true
© D.Giacona
VHDL – Logique programmable 15/47 Partie 2 – La structure d’un programme VHDL
Pour utiliser ces types il faut inclure les directives suivantes dans le code source.
library ieee;
use ieee.std_logic_1164.all;
© D.Giacona
VHDL – Logique programmable 16/47 Partie 2 – La structure d’un programme VHDL
© D.Giacona
VHDL – Logique programmable 17/47 Partie 2 – La structure d’un programme VHDL
library ieee;
use ieee.std_logic_1164.all; constant hexa_7seg_table : truth_table_4 :=
-- outputs abcdefg (segments) hexa inputs
entity hexa_to_7seg is port ( --------------------------------------------
hexain: in bit_vector (3 downto 0); (((("1111110", -- 0000
seg: out bit_vector (0 to 6)); "0110000"), -- 0001
end hexa_to_7seg; ("1101101", -- 0010
"1111001")), -- 0011
architecture arch_hexa_to_7seg of hexa_to_7seg is (("0110011", -- 0100
type segment is (a, b, c, d, e, f, g); "1011011"), -- 0101
type truth_table_4 is array (bit, bit, bit, bit) of ("1011111", -- 0110
bit_vector(a to g); "1110000"))), -- 0111
((("1111111", -- 1000
"1111011"), -- 1001
("1110111", -- 1010
"0011111")), -- 1011
(("1001110", -- 1100
"0111101"), -- 1101
("1001111", -- 1110
"1000111")))); -- 1111
begin
seg <= exa_7seg_table(hexain(3),hexain(2),hexain(1),hexain(0));
end arch_hexa_to_7seg;
© D.Giacona
VHDL – Logique programmable 18/47 Partie 2 – La structure d’un programme VHDL
conv_integer (a)
o pour convertir un std_logic_vector a en un integer
conv_unsigned (x,n)
o pour convertir un std_logic_vector, integer, unsigned ou signed x en un unsigned de n
bits (réalise un changement de taille)
conv_signed (x,n)
o pour convertir un std_logic_vector, integer, signed ou unsigned x en un signed de n bits
(réalise un changement de taille)
conv_std_logic_vector (x,n)
o pour convertir un integer, unsigned ou signed x en un std_logic_vector de n bits
© D.Giacona
VHDL – Logique programmable 19/47 Partie 2 – La structure d’un programme VHDL
© D.Giacona
VHDL – Logique programmable 20/47 Partie 2 – La structure d’un programme VHDL
Les bits
‘0’, ‘1’ -- type bit
‘0’, ‘1’ ,‘U’, ‘X’, ‘H’, ‘L’, ‘W’, ‘Z’, ‘-’ -- type std_logic
Les caractères
‘a’
© D.Giacona
VHDL – Logique programmable 21/47 Partie 2 – La structure d’un programme VHDL
Les opérateurs logiques sont définis pour les types boolean, bit, std_logic et les vecteurs correspondants
and or not nand nor xor
Les opérateurs arithmétiques sont définis pour les types entiers et réels
+ - * / ** mod rem abs
© D.Giacona
VHDL – Logique programmable 22/47 Partie 2 – La structure d’un programme VHDL
© D.Giacona
VHDL – Logique programmable 23/47 Partie 2 – La structure d’un programme VHDL
a <= “11110000”;
b <= “11110000”;
© D.Giacona
VHDL – Logique programmable 24/47 Partie 2 – La structure d’un programme VHDL
Les opérations ne sont pas admises sur des données de types différents sauf si l’on
redéfinit l’opérateur (ce procédé est appelé surcharge).
Opérateur + défini
par le concepteur
Opérateur + prédéfini
pour les entiers
© D.Giacona
VHDL – Logique programmable 25/47 Partie 2 – La structure d’un programme VHDL
library ieee ;
use ieee.std_logic_unsigned.all ;
Parce qu’il s’agit d’une division par 10, ce code génère, avec Xilinx ISE, l’erreur suivante :
Operator <DIVIDE> must have constant operands or first operand must be power of 2
On peut décrire la division à l’aide d’un système séquentiel que l’on intègre dans un composant
VHDL et que l’on range dans une bibliothèque.
© D.Giacona
VHDL – Logique programmable 26/47 Partie 2 – La structure d’un programme VHDL
Les attributs sont des propriétés spécifiques que l’on peut associer aux signaux et aux types. La
valeur d’un attribut peut être exploitée dans une expression.
Attribut valeur sur des types scalaires ou des éléments (signaux, constantes, variables) de
type scalaire
'left, 'right, 'high, 'low, 'length
© D.Giacona
VHDL – Logique programmable 27/47 Partie 2 – La structure d’un programme VHDL
library ieee;
use ieee.std_logic_1164.all;
x(0) = vector_dwn(15)
entity attributs is port( x(1) = vector_dwn(0)
vector_dwn : in std_logic_vector(15 downto 0); x(2) = vector_up(0)
vector_up : in std_logic_vector(0 to 7); x(3) = vector_up(7)
x : out std_logic_vector(7 downto 0); x(4) = vector_dwn(15)
x(5) = vector_dwn(0)
y : out std_logic_vector(0 to 11); x(6) = vector_up(7)
z : out std_logic_vector(7 downto 0)); x(7) = vector_up(0)
end attributs;
y(0) = GND
y(1) = GND
architecture arch_attributs of attributs is
y(2) = GND
begin y(3) = GND
x(0) <= vector_dwn(vector_dwn'left); y(4) = VCC
x(1) <= vector_dwn(vector_dwn'right); y(5) = VCC
y(6) = VCC
x(2) <= vector_up(vector_up'left);
y(7) = VCC
x(3) <= vector_up(vector_up'right);
x(4) <= vector_dwn(vector_dwn'high); z(0) = VCC
x(5) <= vector_dwn(vector_dwn'low); z(1) = VCC
x(6) <= vector_up(vector_up'high); z(2) = GND
z(3) = GND
x(7) <= vector_up(vector_up'low); z(4) = VCC
y(vector_up'range) <= "00001111"; z(5) = VCC
z(vector_up'reverse_range) <= "00110011"; z(6) = GND
z(7) = GND
end arch_attributs;
© D.Giacona
VHDL – Logique programmable 28/47 Partie 2 – La structure d’un programme VHDL
2. La déclaration d'entité
La déclaration d’entité décrit une interface externe, unique, à la manière des entrées-
sorties d’une boîte noire
La déclaration comprend :
o éventuellement, une liste de paramètres génériques
o la définition des ports, c.-à-d. une liste de signaux d’entrée et de signaux de
sortie ; chaque signal possède un nom, un mode et un type
port (
[signal] nom_signal {,nom_signal}: [mode] type_signal
{;[signal] nom_signal {,nom_signal}: [mode] type_signal}
);
© D.Giacona
VHDL – Logique programmable 29/47 Partie 2 – La structure d’un programme VHDL
tempo1ms t
Signal externe
control cnt10
rst ar
ar
a up_cnt10
en cnt(9:0)
sr_cnt10
sr
clk clk
clk
compare
cnt10(9:0)
max_cnt10
(d = max) d(9:0)
Signal interne
© D.Giacona
VHDL – Logique programmable 30/47 Partie 2 – La structure d’un programme VHDL
Mode du signal
Nom de l’entité
port (
Nom du signal a : in std_logic;
rst, clk : in std_logic;
t : out std_logic);
end tempo1ms;
© D.Giacona
VHDL – Logique programmable 31/47 Partie 2 – La structure d’un programme VHDL
entity nom_entité is
generic (
nom_paramètre {, nom_paramètre }: type_paramètre
[ := expression_statique]
{; nom_paramètre {, nom_paramètre }: type_paramètre
[ := expression_statique]}
port (
[signal] nom_signal {,nom_signal}: [mode] type_signal
{;[signal] nom_signal {,nom_signal}: [mode] type_signal}
);
© D.Giacona
VHDL – Logique programmable 32/47 Partie 2 – La structure d’un programme VHDL
opposite_3
inverse s
b HA y(0)
a(0) c(0)
a co
x(0)
b HA s y(1)
a(1) c(1)
a co
x(1)
b HA s y(2)
a(2) c(2)
a co
x(2)
© D.Giacona
VHDL – Logique programmable 33/47 Partie 2 – La structure d’un programme VHDL
Paramètre générique
entity opposite_n is
Valeur par défaut
generic (n : integer := 3);
port (
x : in std_logic_vector(n-1 downto 0);
inverse : in std_logic;
y : out std_logic_vector (n-1 downto 0));
end opposite_n;
© D.Giacona
VHDL – Logique programmable 34/47 Partie 2 – La structure d’un programme VHDL
VHDL définit quatre modes qui déterminent le sens de transfert d’une donnée au travers du
port :
out L’entité fournit un signal de sortie, mais ne peut pas relire ce signal
© D.Giacona
VHDL – Logique programmable 35/47 Partie 2 – La structure d’un programme VHDL
In
Out
Buffer
In Inout
In
Out
© D.Giacona
VHDL – Logique programmable 36/47 Partie 2 – La structure d’un programme VHDL
3. Le corps d'architecture
3.1. Syntaxe
© D.Giacona
VHDL – Logique programmable 37/47 Partie 2 – La structure d’un programme VHDL
opposite_3
inverse lsb
b HA s y(0)
a(0) c(0)
a co
x(0)
b HA s y(1)
a(1) c(1)
a co
x(1)
s msb
b HA y(2)
a(2) c(2)
a co
x(2)
© D.Giacona
VHDL – Logique programmable 38/47 Partie 2 – La structure d’un programme VHDL
-- déclaration de composant
component ha port(
a, b : in std_logic;
co, s : out std_logic);
end component;
-- déclaration d’alias
alias lsb : std_logic is y(0) ;
alias msb : std_logic is y(n-1) ;
begin
...
end behavioral ;
© D.Giacona
VHDL – Logique programmable 39/47 Partie 2 – La structure d’un programme VHDL
3.3.1. Propriétés
Une instruction concurrente décrit une opération qui porte sur des signaux (entrée, interne)
pour produire d’autres signaux (interne, sortie)
Tous les signaux mis en jeu dans l’architecture sont disponibles au même moment
Le style n’est pas imposé par le type de logique (combinatoire ou séquentielle) ou le type de
traitement des données (parallèle ou séquentiel)
Le style est choisi pour apporter concision ou par préférence personnelle
© D.Giacona
VHDL – Logique programmable 40/47 Partie 2 – La structure d’un programme VHDL
Description de la manière dont les données circulent de signal en signal, ou d’une entrée vers
une sortie
étiquette : … <= …
étiquette : … <= … when … else …
étiquette : with … select … <= … when …
© D.Giacona
VHDL – Logique programmable 41/47 Partie 2 – La structure d’un programme VHDL
Interconnexion de composants (components), à la manière d’un schéma, mais sous forme d’une
liste
Dans l’architecture utilisatrice, un composant peut être considéré comme une boîte noire
Un composant est instancié à l’aide d’une instruction d’appel de composant :
étiquette : nom_composant port map ( liste_des_entrées_et_sorties );
© D.Giacona
VHDL – Logique programmable 42/47 Partie 2 – La structure d’un programme VHDL
Certains comportements peuvent être décrits de façon algorithmique ; il faut alors les définir comme
des processus
Dans l’architecture utilisatrice, un processus est considéré comme une instruction concurrente
Instruction d’appel de processus :
étiquette: process déclarations begin instructions_séquentielles end process;
© D.Giacona
VHDL – Logique programmable 43/47 Partie 2 – La structure d’un programme VHDL
© D.Giacona
VHDL – Logique programmable 44/47 Partie 2 – La structure d’un programme VHDL
B1 : x <= a and b;
...
end process;
-- B3 (Description structurelle)
end arch_systeme;
© D.Giacona
VHDL – Logique programmable 45/47 Partie 2 – La structure d’un programme VHDL
© D.Giacona
VHDL – Logique programmable 46/47 Partie 2 – La structure d’un programme VHDL
Résultat de compilation
Dans cet exemple, quel que soit le style de description employé, les équations générées par le
compilateur sont les mêmes.
x = d * s(0) * s(1)
+ c * /s(0) * s(1)
+ b * s(0) * /s(1)
+ a * /s(0) * /s(1)
© D.Giacona
VHDL – Logique programmable 47/47 Partie 2 – La structure d’un programme VHDL
opposite_3
inverse s
b HA y(0)
a(0) c(0)
a co
x(0)
b HA s y(1)
a(1) c(1)
a co
x(1)
b HA s y(2)
a(2) a c(2)
co
x(2)
begin
a(0) <= x(0) xor inverse;
ha0 : ha port map (a(0),inverse,c(0),y(0));
© D.Giacona