Vous êtes sur la page 1sur 61

circuits logiques programmables

Objectifs du cours
Savoir utiliser les outils de synthèse
logique afin de concevoir un système
matériel numérique sur FPGA
Maitriser les bases du langage VHDL

1
circuits logiques programmables

Pré-requis :
Cours d’électronique et de logique
logique booléenne, portes logiques
fonctions combinatoires et séquentielles
machine à états, représentation des
nombres en binaire,…

2
circuits logiques programmables

Objectif

Réaliser une fonction numérique

3
Vocabulaire

ASIC : Application Specific Integrated


Circuit
PLD : Programmable Logic Device

EPLD : Erasable Programmable Logic


Device
CPLD : Complex Programmable Logic
Device
FPGA : Field Programmable Gate Array 4
VHDL

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 circuits électroniques. On l’a ensuite étendu
en lui rajoutant des extensions pour permettre la
conception (synthèse) de circuits logiques programmables
(P.L.D. Programmable Logic Device).
Actuellement la densité de fonctions logiques (portes et
bascules) intégrée dans les PLDs est telle (plusieurs
milliers de portes voire millions de portes) qu’il n’est plus
possible d’utiliser les outils d’hier pour développer les
circuits d’aujourd’hui.
5
VHDL

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.
Il faut avoir à l’esprit que 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 bascules qui est intégrée à l’intérieur des
circuits PLDs. C’est pour cela que je préfère parler de
description VHDL ou VERILOG que de langage.

6
2.Structure d'un module VHDL (Unité de conception )

L’unité de conception (design unit) est le plus petit


module compilable séparément. VHDL offre cinq types
d’unités de conception :

la déclaration d’entité,
le corps d’architecture,
la déclaration de configuration
la déclaration de paquetage
le corps de paquetage.

7
2.Structure d’une description VHDL simple

Une description VHDL simple est composée de 2


parties indissociables à savoir
L’entité (ENTITY), elle définit les entrées et sorties.
L’architecture (ARCHITECTURE), elle contient les
instructions VHDL permettant de réaliser le
fonctionnement attendu.
Déclaration de l'Entity (non générique):
définie les signaux d’entrées-sorties, leur type ainsi que
leur mode (lecture seule, écriture seule, lecture-
écriture)

8
2.Structure d’une description VHDL simple

Syntaxe:
entity NOM_DE_L_ENTITE is
port ( Description des signaux d’entrées /sorties
…);
end NOM_DE_L_ENTITE;
Exemple :
entity SEQUENCEMENT is
port (
CLOCK : in std_logic;
RESET : in std_logic;
Q : out std_logic_vector(1 downto 0) );
end SEQUENCEMENT; 9
2.Structure d’une description VHDL simple

L’instruction port .
Syntaxe: NOM_DU_SIGNAL : sens type;
Exemple: CLOCK: in std_logic;
BUS : out std_logic_vector (7 downto 0);
On doit définir pour chaque signal : le NOM_DU_SIGNAL,
le sens et le type.

10
2.Structure d’une description VHDL simple

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.
Par exemple un bus bidirectionnel de 5 bits s’écrira :
LATCH : inout std_logic_vector (4 downto 0) ;
Où LATCH(4) correspond au MSB et LATCH(0) correspond
au LSB.
Les valeurs que peuvent prendre un signal de type
std_logic sont
‘0’ ou ‘L’ : pour un niveau bas.
‘1’ ou ‘H’ : pour un niveau haut.
‘Z’ : pour état haute impédance.
11
‘-‘ : Quelconque, c’est à dire n’importe quelle valeur.
2.Structure d’une description VHDL simple

Le SENS du signal
in : pour un signal en entrée.
out : pour un signal en sortie.
inout : pour un signal en entrée sortie
buffer : pour un signal en sortie mais utilisé comme
entrée dans la description.

12
2.Structure d’une description VHDL simple

Déclaration de l’architecture correspondante à l’entité


L’architecture décrit le fonctionnement souhaité pour un
circuit ou une partie du circuit. 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.
Syntaxe:
architecture nom-architecture of nom-entité is
{ déclaration_de_composant | déclaration_de_constante
| déclaration_de_signal_interne| déclaration_de_type
| déclaration_de_type| déclaration_d'alias}
13
begin
{ instruction-concurrente:
instruction_concurrente_d'assignation_de_signal
instruction_concurrente_d'instanciation_de_composant
instruction_concurrente_de_processus}
end nom-architecture;

14
2.Structure d’une description VHDL simple

Exemples :
-- Opérateurs logiques de base
entity PORTES is
port (A,B :in std_logic;
Y1,Y2,Y3:out std_logic);
end PORTES;
architecture DESCRIPTION of PORTES is
begin
Y1 <= A and B;
Y2 <= A or B;
Y3 <= A xor B;
end DESCRIPTION; 15
4.Les instructions de base (mode « concurrent »)
logique combinatoire

Qu’est ce que le mode « concurrent » ?


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 il faut
essayer de penser à la structure qui va être générée par le
synthétiseur pour écrire une bonne description, cela n’est
pas toujours évident.
16
4.Les instructions de base (mode « concurrent »)
logique combinatoire

Exemple : Pour le décodeur 1 parmi 4 l’ordre dans lequel seront


écrites les instructions n’a aucune importance.

17
4.1 Présentation des instructions concurrentes
d’assignation de signal

Instruction d’assignation(affectation) inconditionnelle … <= …

Instruction d’assignation conditionnelle … <= … when … else …

Instruction d’assignation sélective with … select … <= … when …

18
4.1.1 Instruction concurrente d’assignation
inconditionnelle de signal <=

Dans une description VHDL, c’est certainement l’opérateur le plus utilisé.


En effet il permet de modifier l’état d’un signal en fonction d’autres
signaux et/ou d’autres opérateurs.
Exemple avec des portes logiques : S1 <= E2 and E1 ;

Les valeurs numériques que l’on peut affecter à un signal sont les
suivantes :
‘1’ ou ‘H’ pour un niveau haut avec un signal de 1 bit.
‘0’ ou ‘L’ pour un niveau bas avec un signal de 1 bit.
‘Z’ pour un état haute impédance avec un signal de 1 bit.
‘-’ pour un état quelconque, c’est à dire ‘0’ ou ‘1’. Cette valeur est très
utilisée avec les instructions : when … else et with …. Select ….

19
Instruction concurrente d’assignation inconditionnelle
de signal <=

Pour les signaux composés de plusieurs bits on utilise les


guillemets " …
Les bases numériques utilisées pour les bus peuvent être :
BINAIRE, exemple : BUS <= "1001" ; -- BUS = 9 en décimal
HEXA, exemple : BUS <= X"9" ; -- BUS = 9 en décimal
OCTAL, exemple : BUS <= O"11" ; -- BUS = 9 en décimal
Remarque : La base décimale ne peut pas être utilisée lors de
l’affectation de signaux. On
peut seulement l’utiliser avec certains opérateurs, comme + et –
pour réaliser des compteurs

20
Instruction concurrente d’assignation inconditionnelle
de signal <=

Assignation simples Exemple 2


Exemple 1 library IEEE;
library IEEE; use IEEE.std_logic_1164.all;
use IEEE.std_logic_1164.all;
--librairie pour inclure type std_logic entity example is
port(
--portes ET E:IN std_logic_vector(2 downto 0);
--3 entrées E2 E1 E0 S1:OUT std_logic; --1 fil
-- 1 sortie S0 Bit Poid S2,S3:OUT std_logic_vector(3 downto 1); --3 fils
Bit Poid
entity ET3 is faible S1[3:1]
Fort
port( S4:OUT std_logic_vector(2 downto 0)
E:IN std_logic_vector(2 downto 0); );
S:OUT std_logic end example;
);
end ET3; --definition de l'architecture
architecture arch_example of example is
--definition de l'architecture begin
architecture arch_ET3 of ET3 is S1<='0';
begin S2<='1'& E(1 downto 0);
S<=E(2) and E(1) and E(0); -- E(2) accès au fil 2 -- operateur COLLER (ou CONCATENE) &
end arch_ET3; -- S2(3) S2(2) S2(1)

-- '1' E(1) E(0)


S3<="101";
S4<= "111" XOR E; --manip sur les bus directement
21
end arch_example;
4.1.2 Instruction concurrente d’assignation
conditionnelle de signal … <= … when … else …

Cette instruction modifie l’état d’un signal suivant le


résultat d’une condition logique entre un ou des
signaux, valeurs, constantes.
Syntaxe
SIGNAL <= expression_1 when condition1
.
.
[else expression_n when conditionN]
[else expression_t];

22
Instruction concurrente d’assignation conditionnelle de
signal … <= … when … else …

23
4.1.3 Instruction concurrente d’assignation sélective de
signal with …select … <= … when …

Cette instruction permet d’affecter différentes valeurs à


un signal, selon les valeurs prises par un signal dit de
sélection.
Syntaxe
with signal_de_selection select
signal<= expression_1 when valeur_de_selection1,
expression_2 when valeur_de_selection2,
------
expression_n when others ;

24
Instruction concurrente d’assignation sélective de signal
with …select … <= … when …

25
Déclaration et instanciation de composants non
génériques

Déclaration
Les déclarations des composants non génériques ne comportent que des
données dont les dimensions sont fixées à l’avance
Syntaxe
component nom_composant IS
port (Description des signaux d’entrées /sorties );
end component;

Remarque:
La déclaration est faite dans la zone de déclaration d'une architecture
Le mot clé component sert à déclarer le prototype d'interconnexion. La
syntaxe est presque identique à celle de l'entité

26
Déclaration et instanciation de composants non
génériques

Exemple
component AND_2
port ( a : in STD_LOGIC;
b : in STD_LOGIC;
s : out STD_LOGIC);
end component;

27
Déclaration et instanciation de composants non
génériques

Instanciation d'un composant non générique, avec


association des signaux par la position
étiquette : nom_composant port map (
nom_de_signal_1,

nom_de_signal_n);

Remarque :Pour chaque instance, il convient de lister les


signaux dans l'ordre défini dans la déclaration
(component).

28
Déclaration et instanciation de composants non
génériques

Instanciation d’un composant non générique - association des


paramètres et des signaux par leur nom
étiquette : nom_composant port map (
nom_de_signal_ component => nom_de_signal_circuit,

);
Exemple 1
Dans cet exemple , 2 instances de composant "and2" sont appelées pour
créer une porte ET à 3 entrées.
L'association des ports du composants aux signaux de l'instance se fait
à l'aide de la clause port map.
La syntaxe des associations est soit par
nom où chaque broche du composant est associée à un signal : cas de
inst_1
positionnelle où l'ordre des signaux correspond à l'ordre des broches :
cas de inst_2
29
Déclaration et instanciation de composants non
génériques

entity AND_3 is
port(
e1 : in STD_LOGIC; e2 : in STD_LOGIC; e3 : in STD_LOGIC;
s : out STD_LOGIC );
end AND_3 ;
architecture arc of AND_3 is
signal z : STD_LOGIC;
component and2 is
port ( a : in STD_LOGIC; b : in STD_LOGIC; s : out STD_LOGIC);
end component;
begin
inst1 : and2 port map (a=>e1, b=>e2 , s=>z);
inst2 : and2 port map (z, e3, s);
end arc

30
Déclaration et instanciation de composants

Instanciation de multiples composants


on peut aussi vouloir instancier un nombre variable de composants (en
fonction d'un paramètre, par exemple). Ceci est fait au moyen des mot-
clef for generate et if generate.
Exemple
G: for I in 0 to N-1 generate
inst: FA port map(A(I), B(I), C(I), sum(I), C(I+1));
end generate G;

31
4.Les instructions de base (mode « concurrent »)
d’appel de processus (logique séquentielle)

Propriétés générales des processus


Du point de vue d’une architecture utilisatrice, un processus prend la place
d’une instruction concurrente
D’un point de vue « interne », un processus est constitué d'instructions
séquentielles, comme les instructions d'un langage classique (C, …)
Pour le concepteur, ces instructions séquentielles permettent l’élaboration
d’un raisonnement (algorithme), « comme si » la logique décrite était
exécutée par un simulateur sur un ordinateur
Les variables d’un processus ne sont pas toutes synthétisables, certaines
(par ex. des compteurs) peuvent être transformées par le compilateur en
signaux réels (registres), d’autres (par ex. les indices de boucle, les états
intermédiaires) ne sont pas matérialisées car elles ne servent qu’à la
logique de l’algorithme

32
4.Les instructions de base (mode « concurrent »)
d’appel de processus (logique séquentielle)

Structure d'un processus


étiquette : process (liste_de_sensibilité)
{ déclaration_de_type | déclaration_de_constante | déclaration_de_variable
| déclaration_d’alias}
begin
{ instruction_d’assignation_de_signal |
instruction_d’assignation_de_variable
| instruction_if | instruction_case | instruction_for_loop}
| instruction_while_loop}
end process [étiquette];

33
4.Les instructions de base (mode « concurrent »)
d’appel de processus (logique séquentielle)

Exemple 1

34
4.Les instructions de base (mode « concurrent »)
d’appel de processus (logique séquentielle)

EXEMPLE 2

35
4.Les instructions de base (mode « concurrent »)
d’appel de processus (logique séquentielle)

Il faut raisonner comme si le processus correspondait à un programme


d'instructions séquentielles exécutées par un simulateur
Un processus est activé à chaque changement d’état de l'un quelconque
des signaux auxquels il est déclaré sensible
Une liste de sensibilité est constituée
pour les fonctions combinatoires : de tous les signaux lus (les entrées qui
peuvent changer) pour les fonctions séquentielles : de l'horloge et tous
les signaux asynchrones (set, reset)
Le processus se déroule à partir de la première instruction qui suit le mot
clé begin

36
- 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).
37
38
39
40
41
42
43
44
45
46
CMP<= "0000";
une autre façon d’écrire cette instruction est :
CMP<= (others => ’0’) ;

47
48
49
50
51
4.1.2 Instruction concurrente d’assignation
conditionnelle de signal … <= … when … else …

3 niveaux de descriptions peuvent être utilisés :


Comportemental: process
flot de données: utilisation d'équations concourantes
structurel

52
LA SEMANTIQUE DU LANGAGE VHDL

Les mots réservés


Les identifieurs
Les commentaires
Littéraux
Les objets et leurs types

53
Les identifieurs
Les identificateurs sont des appellations d’objets
du langage (données et types). Un identificateur
est suite de lettres, chiffres et underscore "_«
Le premier caractère doit être une lettre
VHDL ne fait aucune différence entre majuscules et
minuscules
Le dernier caractère doit être différent de _
Le nom ne doit pas être un mot réservé
EXEMPLES
Corrects : NON_ET Bascule_JK NE555
Interdits : A#2 2A A$2 A__2
54
Les mots réservés
Les mots-clés sont réservés, c'est-à-dire qu'on ne peut pas s'en servir
comme identificateurs
abs configuration inout others transport
access constant is out type
after disconnect label package units
alias downto library port until
all else linkage procedure use
and elsif loop process variable
architectur end map range wait
e entity mod record when
array exit nand register while
assert file new rem with
attribute for next report xor
begin function nor return
block generate not select
body generic null severity
buffer guarded of signal
bus if on subtype
case in open then
component or to

55
les commentaires
Ils sont liés à la ligne
Ils commencent par deux tirets "--" et finissent à la fin
de la ligne
Ils sont nécessaires à la compréhension du modèle
mais totalement ignorés par le compilateur
EXEMPLES
-- Ceci est un commentaire !!!
q <= data2; -- affectation de la sortie

56
Littéraux
Les littéraux sont les représentations de valeurs
attribuées aux objets données et aux objets types.
EXEMPLES
Valeurs décimales: 12
Notation basée: 2#11111111# 16#FF# valeur 255
Caractères (Notés entre apostrophes): 'x' 'P' '2'
Chaines de caractères: "Bonjour..."
Chaines de bits:
X"FFF" -- base hexadécimale, longeur 12 bits
B"1111_1111_1111" -- base binaire , longeur 12 bits
O"17" -- base octale, longeur 6 bits
57
Les opérateurs prédéfinis
Les opérateurs relationnels:
permettent de comparer des opérandes demême type et
d’indiquer l’égalité, l’inégalité ou leur relation d’ordre.
Ils sont utilisés dans des instructions de test. Ils
rendent une valeur booléenne(falseou true).
= < <= > >= /=
Les opérateurs logiques
Les opérateurs logiques sont définis pour les types
boolean, bit,std_logic et les vecteurs correspondants
and or not nand nor xor
And n’est pas prioritaire par rapport à or (utiliser des
parenthèses) 58
Les opérateurs prédéfinis
Les opérateurs arithmétique
Les opérateurs arithmétiques sont définis pour les types
entiers et réels
+ - * / ** mod rem abs
Les opérateurs de concaténation et d’agrégation
Groupent des éléments de même type
& (,…,)
Les opérateurs de décalage et de rotation
Les opérateurs de décalageet de rotationsont définis sur
le type bit_vector
sll srl sla sra ror rol
59
Opérateurs d’assignation et d’association

Assignation de variable
nom_variable :=expression ;
à l’intérieur d’un processus sont liés à la ligne
Assignation de signal(dynamique)
nom_signal <=expression ;
dans la zone d’instructions d’une architecture
Assignation de signal(statique)
signal nom_signal_interne :type_signal := valeur_initiale ;
dans la zone de déclaration d’une architecture

60
Opérateurs d’assignation et d’association

Association de signaux
nom_signal_formel =>nom_signal_effectif ;
connecteur de signaux dans une instanciation de
composant

61