Académique Documents
Professionnel Documents
Culture Documents
Licence professionnelle
Semestre 6
Module : Conception des
Systèmes Embarqués
Chapitre 3 :
Synthèse VHDL d’Architectures
▪ Auparavant pour décrire le fonctionnement d’un circuit électronique programmable les 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.
▪ Les sociétés de développement et les ingénieurs ont voulu s’affranchir des contraintes technologiques 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 PLDs.
▪ L’abréviation VHDL signifie VHSIC Hardware Description Language (VHSIC : Very High Speed Integrated Circuit).
Ce langage a été écrit dans les années 70 pour réaliser la simulation de comportement des circuits électroniques et
la configuration physique des circuits FPGA ou CPL.
2
1.2. Structure d'un programme en VHDL
3
1.2.1. Déclaration des bibliothèques
La première chose à faire est de définir les librairies qui seront utilisées dans le code.
Library IEEE ;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
Cela se fait de la manière suivante :
Tout d’abord, la librairie principale (en générale, IEEE), ensuite, le mot clé « use », qui indique quelle package de la librairie
nous allons utiliser. Après cela, le nom du package. Enfin, le « .all » signifie que l’on souhaite utiliser tout ce qui se trouve dans
ce package. Lorsque le nom de la librairie est précédé de IEEE, cela signifie que c’est une librairie qui est définie dans la
norme IEEE, et que l’on retrouvera donc normalement dans tout logiciel. A l’inverse, il faut se méfier des librairies qui ne sont
pas IEEE, car elles sont en générale spécifiques à un logiciel. Les librairies IEEE principales sont :
• IEEE.std_logic_1164
• IEEE.numeric_std
• IEEE.std_logic_arith,...
4
1.2.2.Déclaration de l’entité et des entrées / sorties (I/O)
La déclaration de l'entité permet de définir le nom de la description VHDL, les entrées, les sorties et l'instruction qui les est
défini se nomme par « PORT »
Remarque : Après la dernière définition du signal de l’instruction port il ne faut jamais mettre de point virgule.
1.Le nom du signal est composé de caractères : les premier caractère est une lettre
2.Le sens du signal :
• in = signal d'entrée
• out = signal de sortie
• inout : signal en entrée/sortie
3.le type du signal : les types prédéfinis par le langage VHDL sont assez nombreux et le langage permet la
création de ses propres types ou sous types. Pour le moment, on va utiliser std_logic pour un signal et
std_logic_vector pour un bus.
Constantes: Les constantes sont utilisées pour référencer une valeur ou un type spécifique. Elles permettent une meilleur
lecture et maintenance d'une source. De tous types, elles sont utilisées dans les entités, architectures ou packets.
Syntaxe
CONSTANT const_name {, const_name} : type := value;
6
Exemple N°3 : constant BUS_WIDTH : integer := 8;
Generic: La section GENERIC_DECLARATIONS dans l'entête ENTITY permet de définir des paramètres
exploitables dans l'architecture.
Syntaxe
ENTITY entity_name IS
[generic_declarations][port_declarations]
END [entity_name];
7
1.2.2.1. Le NOM_DU_SIGNAL
Il est composé de caractères, le premier caractère doit être une lettre, sa longueur est quelconque, mais elle ne doit pas
dépasser une ligne de code. VHDL n’est pas sensible à la « casse », c’est à dire qu’il ne fait pas la distinction entre les
majuscules et les minuscules.
L’instruction port.
Syntaxe: NOM_DU_SIGNAL : sens type;
Exemple: CLOCK: in std_logic;
BUS : out std_logic_vector (7 downto 0);
8
1.2.2.2. Le SENS du signal (les modes de ports)
VHDL définit 4 modes qui déterminent le sens de transfert d’une donnée à travers le port.
1.2.2.3. Le TYPE
Le TYPE utilisé pour les signaux d’entrées/sorties est :
Exemple N°2 : Soit le signal d’entrée A de 8 bits, on le déclarera en VHDL comme suit:
b) Conversions de type
Les environnements de développement fournissent en général des paquetages comportant des fonctions de conversion de
type. Par exemple, la bibliothèque de Xilinx ISE contient :
Pour utiliser ces fonctions, il suffit d’accéder au paquetage std_logic_arith de la bibliothèque IEEE
11
1.2.2.4. Les identificateurs
Les identificateurs sont des appellations d’objets du langage (données et types).
– 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)
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.
Trois grands formalismes coexistent pour décrire les architectures :
•Flot de données : Le circuit est décrit par une liste d’instruction concurrenes, d’affectation de signaux, une
expression conditionnelle ou une expression sélective;
•Structurel : on décrit le circuit comme une série de boîtes noires interconnectées au moyen de signaux (utilisé pour
des circuits moyens ou grands) ; on procèdera de cette manière pour synthétiser un additionneur complet à l'aide de
deux demi-additionneurs;
•Comportemental: de manière très semblable à un langage de programmation informatique, on précise le
fonctionnement voulu à l'aide d'une suite d'instructions de contrôles plus ou moins évoluées (conditions, boucles,
etc.), dans un process
L’architecture établit à travers les instructions et les relations entre les entrées et les sorties. On peut avoir un fonctionnement
purement combinatoire, séquentiel ou bien les deux (séquentiel et combinatoire).
14
Exemple N°2 : Réaliser un additionneur;
𝑆 = 𝐴⨁𝐵⨁𝐶𝑖𝑛
𝐶𝑜𝑢𝑡 = 𝐴𝐵 + 𝐶𝑖𝑛𝐴 + 𝐶𝑖𝑛𝐵
Library ieee;
USE ieee.std_logic_1164.all;
Entity addi is
Port (A : in std_logic;
B : in std_logic;
Cin : in std_logic;
Cout : out std_logic;
S : out std_logic);
End addi;
15
1.2.4.Les opérateurs
Dans une description VHDL, c’est certainement l’opérateur le plus utilisé. En effet il permet demodifier l’état d’un signal en
fonction d’autres signaux et/ou d’autres opérateurs.
use ieee.numeric_std.all
use ieee.std_logic_arith.all
1.2.4.3. Opérateur logiques
Les opérateurs logiques ont priorités sur la concaténation.
Opérateur VHDL
ET AND
Décalage à Gauche SLL Remplacement par des 0
NON ET NAND
OU OR Décalage à Droite SRL Remplacement par des 0
NON OU NOR
Rotation à Gauche ROL Le caractère de gauche est mis à droite
OU EXCLUSIF XOR
NON OU EXCLUSIF XNOR Rotation à Droite ROR Le caractère de droite est mis à gauche
NON NOT
17
Exemple N°2 : A <= “1010011”
“1001100”
18
Exemple N°2 : A <= “1010011”
A SRL 3 → “1010011”
MSB
“0001010”
19
Exemple N°2 : A <= “1010011”
“0111010”
20
Exemple N°2 : A <= “1010011”
A ROR 2 →MSB “ 1 0 1 0 0 1 1 ”
“1110100”
21
1.2.4.4. Opérateurs d’assignation et d’association
signal b : std_logic_vector (7 downto 0); a(0) a(1) a(2) a(3) a(4) a(5) a(6) a(7)
a <= “11110000”; 1 1 1 1 0 0 0 0
b <= “11110000”;
b(7) b(6) b(5) b(4) b(3) b(2) b(1) b(0)
1 1 1 1 0 0 0 0
Remarque : l'utilisation de ces opérateurs avec des signaux de grandes tailles peut générer de grandes structures électronique.
Exemple N°1 :
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 : Un commentaire débute par deux traits (signe moins) : --
Remarque : la dernière ligne "else expression" n'est pas obligatoire mais elle est fortement conseillée.
Exemple N°1 : Réaliser le programme VHDL d'un multiplexeur 4 vers 1 avec entrée de sélection
24
E1 SEL S
E2 S
00 E1
E3 MUX
01 E2
E4 10 E3
11 E4
SEL[1..0]
Library ieee;
USE ieee.std_logic_1164.all;
Entity multiplex is
Port ( E1,E2,E3,E4 : in std_logic;
SEL : in std_logic_vector (1 downto 0);
S : out std_logic );
End multiplex;
Architecture desc_multiplex of multiplex is
Begin
S <= E1 when SEL = "00" Else
E2 when SEL = "01"Else
E3 when SEL = "10"Else
E4;
End desc_multiplex;
25
On aurais pu écrire aussi :
Library ieee;
USE iee.std_logic_1134.all
Entity multiplex is
Port ( E : in std_logic_vector (3 downto 0);
SEL : in std_logic_vector (1 downto 0);
S : out std_logic );
End multiplex;
26
1.2.5.2. Affectation selective
Cette instruction permet d'affecter différentes valeurs à un signal selon les valeurs prises par un signal de sélection
Exemple N°1 : Réaliser le programme d'un multiplexeur 1 vers 4 avec entrée de sélection SEL et sortie
de validation Enable active sur l'état bas
Library ieee;
USE iee.std_logic_1164.al;
Entity demultiplex is
Port ( SEL : in std_logic_vector (1 downto 0);
S1 SEL S E : in std_logic
E DEMX Enable : in std_logic;
S2 00 S1 S1,S2,S3,S4 : out std_logic;);
S3 01 S2 End demultiplex;
S4 10 S3 Architecture desc_multiplex of multiplex is
en 11 S4 Begin
S <= S1 when "00"
SEL[1..0]
S2 when "01"
S3 when "10"
S4 when "11"
27
'0' when others;
End desc_multiplex;
1.2.6. Les instructions du mode séquentiel
Un process est une partie de la description d'un circuit dans laquelle les instructions sont exécutées séquentiellement.
L'exécution d'un process est déclenché par un ou des changements d'états de signaux logiques. Le nom de ces signaux est
défini dans la liste de sensibilité lors de la déclaration du process.
28
1.2.6.2. Règle de fonctionnement d'un process
• L'exécution d'un process a lieu à chaque changement d'état d'un signal de la liste desensibilité
• L'instruction du process s'exécute séquentiellement
• Les changements d'état des signaux par les instructions du process sont prises en compteà la fin du process
• 2 process d'une architecture ayant la même liste de sensibilité vont être exécutés en même temps
Exemple N°1 :
Process (C,D)
Begin
A <= 2 ;
B <= A + C ;
A <= D + 1 ;
E <= A * 2 ;
End process;
29
Exemple N°2 : Déclaration d’une bascule D
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.numeric_std.all;
Use ieee.std_logic_unsigned.all;
entity BASCULED is
port ( d,clk : in std_logic;
q : out std_logic);
end BASCULED;
architecture DESCRIPTION of BASCULED is
begin
PRO_BASCULED : process (clk)
begin
if (clk'event and clk ='1') then
q <= d;
end if;
end process PRO_BASCULED;
end DESCRIPTION;
30
Exemple N°3 : La bascule D avec un reset asynchrone
library ieee;
use ieee.std_logic_1164.all;
ENTITY Bascule_D IS
PORT ( D : IN STD_LOGIC;
CLK Q
CLK : IN STD_LOGIC;
Q : OUT STD_LOGIC);
END Bascule_D; D
Bascule_D
ARCHITECTURE archdff OF Bascule_D IS RESET
BEGIN
p1: PROCESS (clk,reset)
BEGIN
IF (RESET='1') THEN
Q <= '0';
ELSIF (CLK'event AND CLK='1') THEN
Q <= D;
END IF;
END PROCESS p1;
END archdff;
31
Remarques:
- Seul le signal CLK fait partie de la liste de sensibilité. D’après les règles de fonctionnement énoncées précédemment, seul un
changement d’état du signal CLK va déclencher le process et par conséquent évaluer les instructions de celui-ci.
- L’instruction if (CLK'event and CLK='1') then permet de détecter un front montant du signal CLK. La détection de front est
réalisée par l’attribut event appliqué à l’horloge CLK. Si on veut un déclenchement sur un front descendant, il faut écrire
l’instruction suivante : if (CLK'event and CLK='0').
- Les bibliothèques IEEE possèdent deux instructions permettant de détecter les fronts montants rising_edge(CLK) ou descendants
falling_edge(CLK).
- Si la condition est remplie alors le signal de sortie S sera affecté avec la valeur du signal d’entrée D.
• A l'intérieur d'un process, on peut utiliser des "if" et/ou des "case". L'exécution est alorsséquentielle.
• De même on peut utiliser des boucles pour contrôler l'exécution. Les "for" sont à bornes fixes, alors que les "while“ ne le
sont pas.
La combinaison IF THEN permet d'effectuer un test d'une expression logique. La suite dudéroulement dépend du résultat.
Deux imbrications sont possibles : ELSIF suivi d'un autre test et ELSE qui contrôle les résultats FALSE.
32
Syntaxe : If condition then instructions ;
Else if Condition then instructions ;
Else Instructions;
End if;
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mux IS
PORT (E1,E2,sel : IN std_logic;
S : OUT std_logic);
END mux;
ARCHITECTURE behavior OF mux IS
BEGIN
PROCESS (sel,E1,E2) -- liste de sensibilité
BEGIN
IF sel = '0' THEN -- test si sel vaut 0
S <= E1;
ELSIF sel = '1' THEN -- test si sel vaut 1
S<= E2;
ELSE
y <= 'X'; -- si sel n'est ni à 1 ni à 0, on affecte X à S
END IF;
END PROCESS;
END behavior;
B.2) Le fonctionnement du “case“
On utilise CASE pour permettre le choix entre plusieurs actions. Cet instruction est très utile dans les machines d'états. En fin de
liste, on peut ajouter WHEN OTHERS qui permet de donner une action à tous les choix qui n'ont pu être trouvés dans la liste.
34
Library ieee;
USE ieee.std_logic_1164.all;
Entity demultiplex is
Port( SEL : in std_logic_vector (1 downto 0);
E : in std_logic
Enable : in std_logic;
S1,S2,S3,S4 : out std_logic);
End demultiplex;
Architecture desc_demultiplex of demultiplex is
Begin
Process (SEL, ENABLE, E) --Liste de sensibilité
Begin
If ENABLE = '0' then
Case SEL is
When "00" => S1 <= E ;
When "01" => S2 <= E ;
When "10" => S3 <= E ;
When others => S4 <= E ;
End case;
Else S1<='Z'; S2<='Z';S3<='Z'; S4<='Z';
End if ;
End process ;
End desc_demultiplex ;
35
B.3) Le fonctionnement du “for“
Exemple N°1 : codage de données :Le cahier des charges est le suivant :
s0 = a0
Pour i > 0 𝑎 𝑖 ∗ 𝑎 𝑖 − 1 + 𝑎ത 𝑖 ∗ 𝑎ത 𝑖 − 1
ENTITY codage IS
a : IN std_logic_vector (3 downto 0) ;
s : OUT std_logic_vector (3 downto 0) ;
END codage
Architecture archi of codage is
Begin
Process
Begin
s(0) <= a(0);
FOR i IN 1 to 3 LOOP
s(i)<=(a(i) AND a(i-1)) OR ((NOT a(i) AND NOT a(i-1));
END LOOP;
END process ;
END archi;
36
B.3) Le fonctionnement du “After“
AFTER spécifie un temps de réponse d'un signal par rapport à son événement. Deux modes de délai sont possibles INERTIAL
(défaut) ou TRANSPORT. Le mode INERTIAL ne propage pas les impulsions plus courtes que le temps de propagation.
Syntaxe :
sigal_name <= [INERTIAL/TRANSPORT] expression AFTER time_expression
Exemple N°1 : propage pas les impulsions plus courtes que le temps de propagation
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity porte_and is
Port ( a : in STD_LOGIC;
b : in STD_LOGIC;
z : out STD_LOGIC);
end porte_and;
architecture Behavioral of porte_and is
begin
PROCESS(a,b)
BEGIN
z <= a and b AFTER 10 ns; -- temps de propagation est de 10ns
END PROCESS ;
end Behavioral;
37