Sie sind auf Seite 1von 32

Begin

Process(clk)
Begin
Le langage VHDL
If rising-edge(clk) Ahmed AOUCHAR
Then
C <= c + 1 ;
End if ;
End process ;

L’École des INGÉNIEURS Scientifiques

1.1. PRÉSENTATION

 Vhsic Hardware Description Langage (Vhsic = Very High Speed Integrated Circuit)
est un langage de description de matériel et non un langage software comme le C.
 Standardisé en 1987 par l ’IEEE (Institute Of Electrical and Electronics Engineers)
sous la référence IEEE 1076-87. Une mise à jour importante a été faite en 1993 :
IEEE 1076-93 est supportée par tous les outils. Dernière révision en 2008.
 Utilisé au début pour la modélisation et la simulation avant d’être adopté pour la
synthèse logique. Toute la syntaxe n’est pas synthétisable !!!
 Permet de décrire un système avec un niveau d’abstraction élevé « algorithmique »
ou un niveau proche du matériel « gate level ». Entre les deux se trouve le niveau
RTL « Register Transfert Level » qui décrit le système sous forme de machine
d’états.
 C’est le niveau RTL qui est utilisé pour la synthèse car il est moins lourd que le
niveau « gate level » et il est indépendant de la cible. Le niveau « algorithmique »
n’est pas forcément synthétisable.

2
1.2. LA SYNTHÈSE LOGIQUE

 La synthèse logique est l’opération qui


consiste à traduire le code VHDL en
fonctions logiques et bascules prêtes à
être connectées dans le silicium.

1.3.1. SIMULATION / SYNTHÈSE

 On rencontre deux langages de description de matériel : VHDL (populaire en


Europe, proche de Ada « pgm objet ») et Verilog (populaire aux US, proche du C).
 Le langage VHDL permet de :
1. Modéliser des circuits pour la simulation
2. Décrire des applications pour circuits ASIC ou programmables (FPGA)

Modélisation pour la simulation Description de système matériel

Norme IEEE 1076 Norme IEEE 1076

La totalité de la norme peut être Une partie seulement peut


utilisée pour la modélisation être utilisée pour la synthèse

X <= ‘1’ after 100 ns; Les instructions de gauche ne


Wait for 200 ns; peuvent pas être utilisées
Signal ent_s : std_logic := ‘0’ pour la synthèse
4
1.3.2. BEHAVIORAL / RTL

 Une description comportementale « behavioral » décrit un algorithme sans rentrer


dans les détails technologiques.
 Une description « RTL » donne les détails sur la connexion des registres avec la
logique combinatoire.

1.4. NIVEAUX D’ABSTRACTION

Peu de détails, temps


de développement
court

Détails technologiques,
description et
simulation fastidieuses

6
2.1. PREMIER EXEMPLE
commentaire

Appel librairies

a x
b portes y
c z

entité

architecture
7

2.2. DEUXIÈME EXEMPLE

clk
Clk_div div_out
reset

La nouveauté dans cet exemple


est le bloc « process ».
Ce bloc est très pratique pour
décrire des unités cadencées par
une horloge.
On peut écrire plusieurs process,
ils s’exécutent tous en parallèle

8
PROCESSUS IMPLICITE OU EXPLICITE

Equation logique
(processus implicite)

Début et fin
Bloc « process »
(processus explicite)

Connexion
(processus implicite)

2.3. TROIS RÈGLES DE BASE

Les commentaires
commencent par un
double tiret « -- » et se
terminent à la fin de la
ligne.

VHDL ne distingue pas les


majuscules des minuscules :
inter et INTER désignent le
même signal

Une instruction se termine par un « ; »


les espaces ne sont pas significatifs
10
2.4. LA LIBRAIRIE IEEE

 Le standard « IEEE.1164 » définit une librairie avec un certain nombre de packages


dont certains sont indispensables pour tout programme VHDL.
 Les packages doivent être appelés avant la déclaration de l’entité.

 L’extension « .all » du nom de la librairie signifie qu’on intègre tout le contenu.

11

2.4.1. LE PACKAGE STD_LOGIC_1164

 C’est ici qu’est défini le type « std_logic » qui est une extension du type « bit ».

 Les opérations applicables à ce type sont : and, nand, or, nor, xor, xnor, not.
 Le type « std_logic_vector » est un tableau de « std_logic ».

12
AGRÉGATS (RÉUNIONS D’ÉLÉMENTS)

13

CONCATÉNATION (BOUT À BOUT)

14
LA FONCTION « RISING_EDGE »

 Cette fonction, définie dans « std_logic_1164 », est très utile pour détecter les
fronts montants d’une horloge.
 Elle vérifie bien que le signal part de ‘0’ avant de passer à ‘1’.
 Il existe une fonction similaire qui teste les fronts descendants : « falling_edge »

15

2.4.2. LE PACKAGE « NUMERIC_STD »

 C’est ici que sont définis certains types pour représenter les entiers ainsi que les
opérations arithmétiques.

 On y trouve aussi quelques fonctions de conversion de type comme celle-ci :.

16
STD_LOGIC_UNSIGNED / STD_LOGIC_SIGNED

 Ces deux packages sont des extensions du package « numeric_std».


 Il ne faut appeler qu’un seul des deux à la fois !!!

STD_LOGIC_UNSIGNED :
 Dans ce package, les fonctions sont redéfinies pour traiter les nombres de type
« std_logic_vector » comme des entiers non signés.

STD_LOGIC_SIGNED :
 Dans ce package, les fonctions sont redéfinies pour traiter les nombres de type
« std_logic_vector » comme des entiers signés.
 Le complément à 2 est utilisé pour le représentation des nombres négatifs.

17

2.5. LE BLOC « ENTITY »

A circuit X
B
C Y

 L’entité donne une vue externe du circuit.


 Les signaux d’interface constituent dans la terminologie VHDL un « port ».
 Chaque signal doit posséder : un nom (choisi par l’utilisateur), un mode (in, out,
inout) et un type (std_logic, std_logic_vector, integer, boolean, …).
 On peut déclarer un paramètre générique avec une valeur par défaut, si une
architecture appelle cette entité elle pourra changer la valeur de N.

18
2.6. LE CHOIX DES NOMS

 Chaque élément manipulé par VHDL (signal, constante, bus, …) doit porter un nom.
Celui-ci doit respecter les règles suivantes :
1. Caractères admis : les 26 lettres de l’alphabet, les 10 chiffres décimaux et le
caractère ‘_’.
2. Le 1er caractère doit être une lettre.
3. Le caractère ‘_’ ne doit pas terminer un nom.
4. Un nom ne doit pas être un mot réservé.
5. La longueur d’un nom ne doit pas dépasser une ligne.

Il faut respecter une règle


simple : un nom doit
permettre de deviner le
type d’information
représentée

19

2.7. LE BLOC « ARCHITECTURE »

a x
portes
b y
c z

 Le bloc architecture décrit le système matériel à concevoir, cela peut être un


système combinatoire ou séquentiel, simple ou complexe.
 Il existe trois façons de décrire un circuit électronique en VHDL :
1. Description de bas niveau : on écrit des équations logiques
2. Description modulaire : il s’agit d’associer des blocs existants
3. Description comportementale : on décrit le comportement du circuit

20
2.8. DÉCLARATIONS / INSTRUCTIONS

Avant begin : déclaration


• Types
• Signaux
• Variables
• composants

Après begin : code


• affectations
• process

21

3.1. SYNTAXE HORS « PROCESS »

 Affectation inconditionnelle

 Affectation conditionnelle

 Affectation sélective

22
3.2. SYNTAXE DANS « PROCESS »

 Affectation inconditionnelle

 Affectation conditionnelle

 Affectation sélective

23

3.3. FONCTIONNEMENT CONCURRENT

 En dehors du PROCESS, toutes les instructions s’exécutent en parallèle. On parle de


fonctionnement concurrent, c’est le principe des systèmes combinatoires.
 L’ordre des instructions n’a aucune importance.

Ces deux solutions donnent le


même résultat après
compilation, c’est-à-dire le
schéma ci-dessus.

24
3.4. FONCTIONNEMENT SÉQUENTIEL

 Dans un « process », les instructions s ’exécutent de façon séquentielle.


 Le « process » s ’exécute à chaque changement d ’état d ’un des signaux de la liste
de sensibilité.
 La mise à jour des variables se fait au fur et à mesure que les instructions se
déroulent.
 La mise à jour des signaux se fait à la fin du « process », après le « end ».
 Tous les « process » se déroulent en parallèle.
 L’ordre d’écriture des process n’a aucune importance.

Le signal « count_s » ne sera mis


à jour qu’à la fin du « process »,
à la lecture du « end process »

25

4.1. ADDITIONNEUR (1ÈRE FAÇON)

ci b a co s
a s
b add2 0 0 0 0 0
co 0 0 1 0 1
ci
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1

26
4.2. ADDITIONNEUR (2ÈME FAÇON)

ci b a co s
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1

On écrit la table de vérité des


sorties de l’additionneur, l’outil
de synthèse trouvera la logique
nécessaire

27

4.3. ADDITIONNEUR (3ÈME FAÇON)

ci b a co s
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1

Autre façon d’écrire les tables de


vérité des sorties, une table par
sortie cette fois.

28
4.4. ADDITIONNEUR (4ÈME FAÇON)

ci b a co s
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1

Encore une table de vérité écrite


cette fois dans un process.
Rappelez-vous ! La syntaxe n’est
pas la même

29

4.5. ADDITIONNEUR MOTS À 2 BITS

30
DESCRIPTION MODULAIRE = SCHÉMA

 Un composant déclaré est comme


un circuit intégré placé sur une carte

s
co
b s(0)
ci a

c_sig

a(0) b(0)

 Les signaux agissent comme des pistes


imprimées sur la carte : les broches du
CI sont connectées aux pistes 31

4.6. ADDITIONNEUR MOTS À N BITS

 Voici un additionneur générique qui utilise l’opération arithmétique « + » du


package « numeric_std ».

32
4.7. COMPTEUR À N BITS

Variable générique

Signal intermédiaire

Liste de sensibilité
Front montant

Connexion de la sortie

33

4.8. COMPTEUR AVEC RESET ASYNCHRONE

Liste de sensibilité complète


Reset prioritaire = asynchrone

Mise à ‘0’ de tous les bits

34
4.9. COMPTEUR AVEC RESET SYNCHRONE

Liste de sensibilité réduite

Front d’horloge prioritaire =


Reset synchrone

35

4.10. COMPTEUR AVEC VALIDATION

« reset » prioritaire sur « ce »


« ce » valide le comptage

Pas de changement si ce = ‘0’

36
À PROPOS DU « RESET »

1ère règle : n’utiliser de signal « reset » que si cela est nécessaire !


 De toute façon, toutes les bascules sont remises à ‘0’ à la mise sous tension.
 Les bénéfices sont les suivants :
1. Moins de logique générée par le compilateur.
2. Moins de problème au moment du routage.

2ème règle : le signal « reset » doit être synchrone et local !


 La remise à zéro des bascules se fait au même moment sur front d’horloge comme
les autres changements d’état.
 Pas de reset global pour éviter les effets des retards différents d’une bascule à
l’autre.

37

4.11. DÉCODEUR 2 VERS 4

 Système combinatoire décrit hors « process » en utilisant la structure « when …


else »
38
4.12. MULTIPLEXEUR

 Système combinatoire décrit hors « process » en utilisant la structure « when …


else » 39

4.13. DÉCODEUR HEXA VERS 7 SEGMENTS

 Système combinatoire décrit hors « process » en utilisant la structure « with …


40
select ». C’est une façon d’écrire la table de vérité.
4.14. ENCODEUR DE PRIORITÉ

 Système combinatoire décrit dans un « process » en utilisant la structure « if… then


… else ». On peut décrire une fonction combinatoire dans un « process » ! 41

4.15. CALCUL DU BIT DE PARITÉ

 Système combinatoire décrit dans un « process » en utilisant la structure « for…


loop ». 42
4.16. DIVISEUR D’HORLOGE PAR 2N

 La division d’une fréquence se fait toujours avec un compteur synchrone. 43

4.17.1. CONVERSION BINAIRE VERS BCD

 L’algorithme de conversion utilise le fait que tous les chiffres compris entre 0 et 4
produisent un résultat sur un chiffre lorsqu'ils sont multipliés par 2.
 Par contre tous les chiffres compris entre 5 et 9 donnent un résultat sur 2 chiffres
lorsqu’ils sont multipliés par 2.

chiffre Chiffre*2 dizaines unités


0 0 0 0
1 2 0 2
2 4 0 4
3 6 0 6
4 8 0 8
5 10 1 0
6 12 1 2
7 14 1 4
8 16 1 6
9 18 1 8

44
4.17.2. APPLICATION DE L’ALGORITHME

0    4 5    9
En décimal : Exemple en décimal : 2 6 12
Nb Nb*2

0 0

1 2
En BCD : ajouter 3 et décaler à
2 4
gauche
3 6

4 8 diz uni
6 0000 0110
En BCD : un décalage à gauche
+3 0000 0011
Nb Nb*2
= 0000 1001
0000 0000
X2 0001 0010
0001 0010

0010 0100

0011 0110

0100 1000
45

4.17.3. ALGORITHME COMPLET

 Déclarer un registre de 20 bits : 4 + 4 + 4 + 8


 Les 8 bits de poids faible représente le mot binaire à convertir
 Suivent ensuite 3 quartets dans l’ordre : les unités, les dizaines puis les centaines du
résultat en BCD

Réaliser les étapes suivantes 8 fois


1. Si les unités sont ≥5 , ajouter 3. Faire la même chose pour les dizaines et les
centaines
2. Décaler tout le registre d’un bit vers la gauche

Operation Hundreds Tens Units Binary


HEX F F
Start 1 1 1 1 1 1 1 1

46
4.17.4. CONVERSION D’UN MOTS À 8 BITS

Mot binaire
décalage Opération CENT DIZ UNI 7654 3210
START 0000 0000 0000 1111 1111
1 SHIFT 0000 0000 0001 1111 1110
2 SHIFT 0000 0000 0011 1111 1100
3 SHIFT 0000 0000 0111 1111 1000
+3 0000 0000 1010 1111 1000
4 SHIFT 0000 0001 0101 1111 0000
+3 0000 0001 1000 1111 0000
5 SHIFT 0000 0011 0001 1110 0000
6 SHIFT 0000 0110 0011 1100 0000
+3 0000 1001 0011 1100 0000
7 SHIFT 0001 0010 0111 1000 0000
+3 0001 0010 1010 1000 0000
8 SHIFT 0010 0101 0101 0000 0000
2 5 5 47

4.17.5. CODE VHDL (BINAIRE VERS BCD)

48
5.1. MACHINE D’ÉTATS

 Une machine d’états est un séquenceur qui décrit le fonctionnement d’un système
séquentiel aussi complexe soit-il.
 On utilise des symboles : les bulles indiquent les états du système et les arcs
orientés définissent les possibilités d’évolution. Le passage d’un état à un autre est
régi par une condition (transition). Les sorties dépendent de l’état présent.

Etape S1=0
Etat 1
S2=0
a=1

Transition
S1=0 Etat 2 b=0
S2=1

b=1
Actions
S1=1 associées
Etat 3
S2=0
49

5.2. MACHINES DE MOORE ET DE MEALY

Machine de Moore
État futur État présent

Entrées
Combina Bascule Combina Sorties
-toire -toire

clk

Machine de Mealy

Entrées
Combina Bascule Combina Sorties
-toire -toire

clk
50
5.3. EXEMPLE D’UNE PERCEUSE

Arret = 1

Rotation = 0
stop Monte = 0
Descend = 0
Haut = 1 et dcy = 1

Rotation = 1
Monte = 0 down Haut = 1
Descend = 1
Bas = 1

Rotation = 1
up Monte = 1
Descend = 0

51

5.4.1. CODE VHDL (2 PROCESS)

Process synchrone
sensible aux signaux clk
et arret.
C’est ici qu’évolue le
système vers l’état suivant

52
SUITE CODE VHDL (2 PROCESS)

Process combinatoire qui


calcule le prochain état en
fonction de l’état actuel et
active les sorties.

53

RÉSULTAT DE LA SYNTHÈSE (2 PROCESS)

haut

descend

dcy
monte

bas rotation

arret

clk 54
5.4.2. CODE VHDL (1 PROCESS)

Ici, les sorties sont stockées


dans des bascules D

55

RÉSULTAT DE LA SYNTHÈSE (1 PROCESS)

haut descend

dcy monte

bas rotation

arret

clk 56
6.1. PRINCIPE DU « TESTBENCH »

 Tester un circuit revient à lui imposer des signaux en entrée « stimuli » et de


regarder comment évoluent les sorties . Si les réponses correspondent à ce que
l’on attend, le test est bon, sinon il y a erreur.
 Le « testbench » est un programme VHDL qui réalise toutes ces opérations .

57

6.2. CIRCUIT COMBINATOIRE À TESTER

 Nous avons affaire à un circuit combinatoire à 3 entrées et 2 sorties, il s’agit d’un


additionneur complet.
58
6.3. TESTBENCH : DÉCLARATIONS

 En début de programme, on déclare le composant à tester ainsi que les différents


signaux qui vont servir à connecter le composant.
59

6.4. TESTBENCH : SIMULATION

 La fin du programme sert à connecter le composant et lui imposer des « stimuli »


en entrée pour savoir comment il réagit.
60
6.5. CIRCUIT SÉQUENTIEL À TESTER

 Il s’agit de simuler un diviseur de fréquence par 8 qui utilise un compteur binaire


sur 3 bits. 61

6.6. TESTBENCH : DÉCLARATIONS

 En début de programme, on déclare le composant à tester ainsi que les différents


signaux qui vont servir à connecter le composant. 62
6.7. TESTBENCH : SIMULATION

 La fin du programme sert à connecter le composant et lui imposer des « stimuli »


en entrée pour savoir comment il réagit. 63

6.8. CONTRÔLE DES RÉSULTATS

 Assert …
 Report …
 Severity … 64

Das könnte Ihnen auch gefallen