Académique Documents
Professionnel Documents
Culture Documents
avec Quartus
MASTERS (ETC, TSE, MECA) /M1
Responsable
Naima Amar Touhami
VHDL est un langage de description de matériel, utilisé pour décrire un système numérique
matériel, comme, par exemple, une bascule D ou un microprocesseur. Il peut modéliser un
système par n'importe quelle vue, structurelle ou comportementale, à tous les niveaux de
description.
De plus il peut servir non seulement à simuler un système mais aussi à le synthétiser, c'est-à-dire
être transformé par des logiciels adaptés (synthétiseurs) en une série de portes logiques prêtes à
être gravées sur du silicium.
Le but des ces séances de travaux pratiques est d’intégrer les différentes notions vues en cours
concernant l’apprentissage du langage VHDL et de donner une initiation simple au langage
VHDL qui permettra une meilleure compréhension des différents aspects du langage. Afin de
prendre en main le langage et les différents outils logiciels que nous devrons utiliser, une
présentation de chacun vous est présentée. Ils sont tous intégrés dans l’environnement Quartus
qui propose à la fois éditeur de texte, synthétiseur logique, simulateur, implémentation et
programmation des composants logiques (FPGA).
Enfin, nous conseillons de bien lire la partie théorique avant de passer aux exemples proposés
dans le but d’éviter tout problème du à une mauvaise connaissance des règles d’écriture, des types
et tout ce qui en à avoir avec l’organisation du langage.
Chaque binôme rendra un rapport de type industriel sur le mini projet. La notation tiendra
compte des différents fonctionnements réalisés lors des travaux pratiques et du rapport sur le
mini-projet.
Ce rapport devra contenir :
- Une vue d’ensemble du système.
- Les réponses au cahier des charges.
- Les simulations.
- Les codes sources en annexe.
1. ORGANISATION DU LANGAGE
1.1 Principes d’utilisation du langage
Pour simuler ou effectuer la synthèse logique d'un modèle VHDL, il faut d'abord le compiler (on
dit analyser pour le VHDL). Les résultats d'analyse sont stockés dans une bibliothèque qu’il
faut préciser au compilateur. Dans un programme VHDL, on peut ainsi faire référence à un objet
déjà analysé en précisant dans quelle bibliothèque il se trouve.
1.4 Bibliothèques
Les bibliothèques permettent à plusieurs concepteurs de travailler ensemble sur le même projet et
rendent le langage indépendant du système d’exploitation de la machine. Pour accéder à la
bibliothèque BIB il est nécessaire de la déclarer :
library BIB;
La bibliothèque par défaut est WORK qui est aussi le nom symbolique de la bibliothèque dans
laquelle sont stockés les résultats. La bibliothèque STD est une bibliothèque standard fournie avec le
langage, elle contient les définitions des types et des fonctions de base (integer, BIT,
BOOLEAN,...)
Par défaut, les bibliothèques STD et WORK n’ont pas besoin d’être déclarées pour être utilisables.
Tout se passe comme si un programme VHDL commençait toujours par :
Library STD;
library WORK;
1.5 Entité
L'entité est la description de l'interface externe du circuit.
L'entité précise :
· le nom du circuit
· Les ports d'entrée-sortie :
o Leur nom
o Leur direction (in, out, inout,...)
o Leur type (bit, bit_vector, integer, std_logic,...)
L'écriture de l'entité pour l'additionneur 1 bit FA (la figure en dessous) peut être la suivante :
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity FA is
port (
a, b, cin : in std_logic;
s, cout : out std_logic);
end FA;
Il faut noter la déclaration préalable de la bibliothèque IEEE et des paquetages qui permet d'utiliser
le type std_logic. (std_logic_1164) et des fonctions arithmétiques (numeric_std).
1.6 Architecture
L'architecture est la description interne du circuit. Elle est toujours associée à une entité. Une même
entité peut avoir plusieurs architectures. L'exemple suivant montre un schéma de l'additionneur 1 bit
FA et 2 architectures possibles écrites en VHDL :
architecture arc2 of ADD1 is
begin
s <= a xor b xor cin;
cout <= (a and b) or ((a xor b) and
cin);
end arc1;
Dans une architecture il est nécessaire de déclarer les objets utilisés et leur type avant la zone
décrivant l'architecture (avant begin). Parmi les objets très utilisés, figurent les composants
(correspondent effectivement aux composants dont on a besoin dans l'architecture pour une
description structurelle) et les signaux.
2. TYPES-EXPRESSIONS
VHDL est un langage typé où il est obligatoire de spécifier le type des objets utilisés. Le schéma ci
dessous illustre la classification des types du langage VHDL :
3. DESCRIPTION STRUCTURELLE
3.1 Eléments de base
VHDL permet l'assemblage de "composants" ce qui constitue une description structurelle. Ce
composant peut être appelé plusieurs fois dans un même circuit. Pour différencier ces mêmes
composants, il est nécessaire de leur donner un nom d'"instance". L'appel d'un composant se dit
aussi "instanciation"
De façon à instancier un composant il est nécessaire de connaître:
· Le prototype du composant (ses ports d'entrée et de sortie). La directive component peut être
utilisée.
·A quelle entité et architecture est liée chaque instance de composant.
Il est important de noter :
· La déclaration du composant (directive component) est redondante textuellement avec celle de
l'entité associée mais permet :
1. Une compilation indépendante entre l'entité associée au composant et le circuit utilisant le
composant.
2. La conception descendante. Le composant peut être déclaré avant l'entité associée.
· La configuration est une unité de compilation optionnelle, très utile pour les gros circuits. Par
exemple pour accélérer la simulation, un même composant peut être associé à un couple
entité/architecture détaillé et synthétisable ou un autre couple plus abstrait et plus rapide à simuler.
Pour ne pas utiliser de configuration, une règle fréquente est d'utiliser le même nom pour le
composant et l'entité associée.
3.2.2 Instanciation
L'instanciation d'un composant se fait dans le corps de l'architecture de cette façon :
<NOM_INSTANCE>:<NOM_COMPOSANT> port map(LISTE DES CONNEXIONS);
Exemple:
entity AND_3 is Dans cet exemple, 2 instances de composant
port( e1 : in bit; "and2" sont appelées pour créer une porte ET à
e2 : in bit; 3 entrées.
e3 : in bit; L'association des ports du composant aux
s : out bit); signaux de l'instance se fait à l'aide de la clause
end entity; port map.
architecture arc of AND_3 is La syntaxe des associations est soit :
signal z : bit; 1. par nom où chaque broche du composant est
component and2 associée à un signal : cas de inst_1
port ( a : bit; 2. positionnelle où l'ordre des signaux correspond
b : bit; à l'ordre des broches : cas de inst_2
s : bit);
end component;
begin
inst1 : and2 port map
(a=>e1, b=>e2 , s=>z);
inst2 : and2 port map (z, e3, s);
end arc
4.DESCRIPTION COMPORTEMENTALE
4.1 Instructions concurrentes et séquentielles
Comme tout langage de description de matériel, le VHDL décrit des structures par assemblage
d'instructions concurrentes dont l'ordre d'écriture n'a aucune importance, contrairement aux
instructions séquentielles qui sont exécutées les unes après les autres.
VHDL offre cependant la possibilité d'utiliser des instructions séquentielles, plus naturelles pour
l'homme, par le biais de processus. Les processus peuvent avoir leurs propres variables locales.
Il existe 3 principales instructions concurrentes :
1. Les processus, qui offrent la possibilité d'utiliser des instructions séquentielles.
2. Les instanciations de composants
3. les affectations concurrentes de signaux, qui peuvent être conditionnelles
4.2 Processus
Les différentes tâches d'un programme VHDL s'exécutent en parallèle les unes des autres. Ces tâches
sont appelées processus. Toutes les instructions concurrentes sont en fait des processus mais la
déclaration explicite de processus par le mot clé process permet de construire sa propre instruction
par le biais d'instructions séquentielles internes au processus. Un processus peut avoir des variables
locales. Le fonctionnement du processus est régi par les règles suivantes :
1. Un processus est une boucle infinie, lorsqu'il arrive à la fin du code, il reprend automatiquement au
début.
2. Un processus doit être sensible des points d'arrêt de façon à le synchroniser. La synchronisation
est donc indiquée par un point d'arrêt qui est un évènement particulier. Il existe 2 types de points
d'arrêts :
o Le processus est associé à une "liste de sensibilité" qui contient une liste de signaux qui
réveillent le processus lors d'un changement d'un des signaux. Sa syntaxe est
process(liste de signaux)
o Le processus a des instructions d'arrêt wait dans sa description interne. Le wait est sensible
soit à un signal soit à un temps physique.
3. Les variables sont internes au processus et sont affectées immédiatement, contrairement aux
signaux qui eux ne sont pas affectés directement et qui sont mis à jour en fin de processus avec la
nouvelle valeur.
L'instruction WAIT permet de mettre des points d'arrêt dans le corps du processus. La syntaxe de
l'instruction est la suivante :
wait [on S1,S2,...] [until CONDITION] [for DUREE]
S1 et S2 sont des signaux, CONDITION est une expression générant un booléen, et DUREE est le
temps physique d'attente.
La liste des signaux réveillant le processus est indiquée dans la liste de sensibilité suivant cette syntaxe
Process (liste de sensibilité).
1. Introduction
Quartus est un logiciel développé par la société Altera, permettant la gestion complète d'un flot
de conception des circuits logiques programmables CPLD ou FPGA . Ce logiciel permet de faire
une saisie graphique ou une description HDL (VHDL ou verilog) d'architecture numérique, d'en
réaliser une simulation, une synthèse et une implémentation sur cible reprogrammable.
VHDL est un langage de description de matériel destiné à représenter le comportement ainsi que
l'architecture d’un système électronique numérique. Son nom complet est VHSIC (Very High
Speed Integrated Circuit) Hardware Description Language.
2. Création d'un projet
Quartus est un logiciel qui travaille sous forme de projets c'est à dire qu'il gère un design sous
forme d'entités hiérarchiques. Un projet est l'ensemble des fichiers d'un design que ce soit des
saisies graphiques ou des fichiers VHDL ou bien encore des configurations de composants.
Pour lancer le logiciel, on cliquera sur :
Quand la fenêtre EDA Tool Settings apparaît cliquer sur Next. Une fenêtre récapitulative
apparaît:
Valider les choix par Finish ou bien faire Back pour des modifications éventuelles. Dans le
navigateur de Projet, un onglet avec le type composant et l'entité maître apparaît :
3. Saisie d'un projet
Cette étape permet de définir et configurer les différentes parties du projet. Quartus accepte
plusieurs types de saisie à savoir :
- une saisie graphique en assemblant des symboles,
- une saisie textuelle à l'aide de différents langages (VHDL, Verilog, AHDL,...)
3.1. Saisie graphique
Pour saisir un projet en mode graphique, aller dans le menu : File —>New
La fenêtre suivante apparaît :
Choisir Block Diagram/Schematic File et faire OK. Une feuille blanche se crée intitulée
Block1.bdf.
On prendra soin de sauver cette feuille sous le nom de l'entité maître (ALU). C'est cette
feuille de saisie graphique qui a la hiérarchie la plus haute dans le projet.
Il convient après d'insérer des symboles dans notre feuille. Pour cela, nous pouvons soit choisir
des composants de la librairie Altera soit en créer en les décrivant en VHDL, ce qui sera l’objet
de l’étape suivante.
3.2. Saisie textuelle en VHDL
La saisie d'un composant VHDL se fait de la même manière que précédemment. Pour cela, aller
dans le menu :
File —>New
Comme exemple, on va créer un petit composant réalisant un ET logique sur 2 bits par le
programme suivant :
library ieee;
use ieee.std_logic_1164.all;
ENTITY ET IS
PORT (
a, b : IN bit;
s : OUT bit);
END ET ;
ARCHITECTURE data OF ET IS
BEGIN
s<= a AND b;
END data;
Une fois le code VHDL saisie, il faut le sauver: (File —>Save as ).
Il est important de sauver le fichier sous le même nom que l'entité. Dans notre cas, l'entité
s'appelle ET donc nous sauverons le fichier sous ET.vhdl. On prendra aussi garde à ne pas
appeler une entité du même nom qu'un composant natif Altera comme par exemple AND.
Vérifier ensuite la syntaxe, en cliquant sur:
Processing → Analyse Current File
Une fois que le fichier est OK (aucune erreur détectée), on peut alors créer un symbole graphique
qui nous permettra d'insérer le composant dans la feuille graphique initiale (logic1).
Pour cela, aller dans:
File —»Create/Update —>Create Symbol File from Current File
Le symbole correspondant à notre composant VHDL est maintenant créé. Nous pouvons
l'instancier dans la feuille graphique ALU.
L'insertion d'un symbole se fait alors en cliquant dans la feuille graphique avec le bouton de
droite et en allant dans:
Insert —>Symbol.
La fenêtre suivante s'ouvre :
4. Compilation
Cette étape consiste maintenant à compiler le schéma précédemment réalisé.
Pour lancer la compilation, cliquer sur :
Processing —>Compiler Tool.
La fenêtre suivante apparait. On cliquera sur Start pour la compilation.
Normalement, il ne doit pas y avoir de warning ou d'erreur. Si ce n'est pas le cas vérifiez dans la
zone Processing (en bas où s'affichent les messages) la source du problème.
Dans certains cas, la compilation réussit même avec la présence de certains wanings qui n’ont pas
d’effet sur l’exécution.
on pourra ensuite lancer la commande:
Tools —> Netlist Viewers—> RTL Viewer
qui permet de voir comment le schéma (ALU) contenant le code VHDL a été transformé en
portes et bascules. Cela permet de voir comment la synthèse logique s'est déroulée.
La première fenêtre qui apparaît est:
5. Simulation
Afin de simuler le design réalisé, il convient de lui injecter des stimuli. Lorsque ces stimuli sont
générés à partir d'un fichier on dit que l'on utilise un fichier de Bench.
Dans le cas présent, nous allons simuler notre schéma en générant les stimuli à partir du Wave
Editor.
Pour cela, appliquer: File —>New, aller dans l'onglet Other Files et sélectionnez Vector
Waveform File (Fichier de simulation).
Faire une sauvegarde du fichier par File —> Save en lui donnant le nom (ALU ). Le fichier
sera du type .vwf.
Aussi pour réaliser des zooms ou voir toute la simulation, il est possible de cliquer dans la fenêtre
avec le bouton de droite et de choisir Zoom dans le menu et Fit window
Insérer ensuite les différents signaux de simulation c'est à dire les signaux d'entrée et les sorties.
Pour cela, on fera:
Edit —>Insert Node or Bus.
Dans la fenêtre ci-dessus, cliquer sur Node Finder, ce qui permet de lancer le navigateur de
signaux
Dans le Node Finder, cela se déroule en 5 étapes :
1. Cliquer sur list afin de faire apparaître les signaux du design,
2. Sélectionner les signaux voulus,
3. Cliquer sur la flèche correspondante
4. Vérifier que tous les signaux que vous voulez visualiser sont dans Selected Nodes
5. Valider par OK puis Cliquer sur OK dans la fenêtre Insert Node or Bus
Afin de donner des valeurs de stimuli, on sélectionne avec la souris une partie du signal (en blue)
et on clique dessus deux fois. Une fenêtre apparait et on peut choisir les états logiques en binaire.
On notera la possibilité d'insérer automatiquement une horloge (clock) par exemple.
Les signaux d’entrée a et b choisis sont comme suit: