Académique Documents
Professionnel Documents
Culture Documents
Lors de la séance précédente, notre description ne comprenait qu’un fichier VHDL ; nous allons
maintenant voir comment gérer un projet comprenant plusieurs sous-ensembles, à travers
l’implantation d’un chronomètre sur notre carte de développement.
oscillateur diviseur
compteur décodeur
à quartz de
BCD BCD / 7 segments
25,175 MHz fréquence
CPLD
Il va donc être nécessaire que notre description générale soit synchrone, tous les sous-ensembles
séquentiels devant avoir la même horloge.
1.2 Ouverture d’un nouveau projet
Ouvrir un nouveau projet que l’on nommera CHRONO par exemple, au sein du répertoire du même
nom ; à l’aide de l’assistant, y inclure le fichier du diviseur VHDL de la séance précédente (div.vhd),
ainsi que le fichier de décodage (decodeur.vhd) que l’on trouvera au sein du répertoire
RESSOURCE\TP2. Le circuit cible est toujours le EPM7128LC84-7 pour une carte UP1 ou UP2 et le
EP2C35F896C6 pour la carte DE2 ou EP2C70F896C6 pour la carte DE2-70.
Sauvegarder les deux fichiers VHDL dans le répertoire du projet et supprimer du projet les fichiers du
répertoire RESSOURCE\TP2.
1.3 Navigation dans le projet
Contrairement à la séance précédente où notre projet était décrit par un unique fichier VHDL, nous
allons cette fois travailler avec plusieurs descriptions au sein d’un même projet comme on peut le
Denis Rabasté Programmation des CPLD et FPGA en VHDL avec Quartus II 1/11
IUFM Aix Marseille
constater dans la fenêtre du « Project Navigator », onglet « Files ». Il est donc primordial de savoir à
un instant donné quelle description nous compilons ou nous simulons.
Une seule description est active à un instant donné, celle placée en haut de la hiérarchie, que l’on
retrouve donc dans la fenêtre du « Project Navigator », onglet « Hierarchy ».
L’opération décrite ci-après, peut se faire plus simplement en tapant « Ctrl Shift J » dans la fenêtre de
la de la description que l’on souhaite rende active.
Pour éviter toute confusion, avant de lancer une « analyse et synthèse » ou une
compilation, il est conseillé de systématiquement faire « Ctrl Shift J » afin de placer
la description active (donc celle que vous avez sous les yeux sur votre écran) en
haut de la hiérarchie du projet.
Effectuer les modifications nécessaires et tester votre solution en imposant par exemple un modulo de
6 pour la simulation (en cas de problème, voir un exemple de solution en annexe).
La fenêtre de la description VHDL étant active, créer un symbole graphique associé à ce fichier ; ce
symbole nous servira pour la description générale de notre projet.
Denis Rabasté Programmation des CPLD et FPGA en VHDL avec Quartus II 2/11
IUFM Aix Marseille
1.5 Analyse du décodeur
Etudier le programme VHDL associé au décodeur, puis lancer une « analyse et synthèse » par
« Ctrl Shift J » puis « Ctrl K » et créer un symbole pour cette description.
1.6 Implantation de la description générale
Pour cette description, nous allons ouvrir un « fichier schéma » :
Par un clic droit au centre de la feuille qui vient de s’ouvrir, nous pouvons implanter les symboles
associés à notre diviseur et à notre décodeur, créés précédemment.
Lancer ensuite l’assistant de configuration en double cliquant sur le nom du composant choisi.
Denis Rabasté Programmation des CPLD et FPGA en VHDL avec Quartus II 3/11
IUFM Aix Marseille
Paramétrer un compteur 4 bits de modulo 10 avec une entrée d’autorisation de comptage (qui sera la
sortie de retenu de notre diviseur).
Denis Rabasté Programmation des CPLD et FPGA en VHDL avec Quartus II 4/11
IUFM Aix Marseille
Sur les fenêtres suivantes cliquer sur Next et Finish pour implanter notre compteur.
1.8 Synthèse générale
Nous complèterons ensuite le graphique au moyen d’entrée sortie (bibliothèques
altera / 72 / quartus / librairies / primitive / pin), puis en traçant les connections à l’aide des outils
« Orthogonal Nodes Tools » pour les lignes simples et « Orthogonal Bus Tools » pour les bus
(attention à ne pas confondre avec « line tool » qui sert simplement à tracer des lignes).
Après avoir sélectionné un bus ou une ligne, on peut lui attribuer un nom en le tapant au clavier ;
toutes les lignes de même nom sont reliées électriquement. Attention à la syntaxe pour les bus :
SEGU[6..0] est un bus de nom SEGU dont le bit de poids fort de SEG[6].
Pour vérifier si un nom est bien attribué à un nœud, sélectionner ce dernier, le nom doit aussi
s’afficher en sur brillance.
A l’aide de la loupe, on peut agrandir (clic gauche) ou rétrécir à volonté la feuille suivant le nombre de
composant à placer.
On obtient alors le schéma suivant, que l’on va enregistrer par exemple sous le nom
Plan_gnl_simul.bdf qui va nous servir pour une simulation fonctionnelle :
Les sorties Q et C_OUT permettent de visualiser simplement ces signaux sans avoir à faire une
recherche au niveau RTL.
Remarque : par un clic sur le signe « + » devant le nom d’un bus, on peut « déplier » ce bus pour
accéder à chaque signal, ce qui peut faciliter l’interprétation du bus SEGU.
Modifier ensuite le schéma comme ci-après et affecter les entrées sorties à des numéros de broches ;
sauvegarder sous un nom différent du précédent (Plan_gnl.bdf par exemple) afin de pouvoir refaire
Denis Rabasté Programmation des CPLD et FPGA en VHDL avec Quartus II 5/11
IUFM Aix Marseille
une simulation le cas échéant (le symbole Vcc de mise à 1 se trouve dans la bibliothèque
« altera / 72 / quartus / librairies / primitive / other »).
Par un double clic sur le symbole du diviseur, ouvrir le fichier div.vhd, remettre le modulo à 25175000
ou 50000000 suivant la carte utilisée et lancer une « Analyse et vérification »
Remarques :
- il est possible de s’affranchir de la mise au NL1 du bus SEGD en demandant au compilateur
de mettre les entrées non utilisées en haute impédance, comme lors de la séance précédente
(« Assignments / Settings / Device / Device and Pins Options / Unused Pins » puis
« Reserve All Unused Pin : As Input Tristated ») ;
- l’assignement du numéro de broches des entrées sorties peut être simplifié en leur donnant le
même nom que le constructeur de la carte DE2, puis « Assignments / Import
Assignments » en précisant la localisation de DE2_pins_assignments.csv.
1.9 Chronomètre à 2 chiffres
On souhaite maintenant compter de 0 à 99 sur les deux afficheurs en utilisant deux compteurs et deux
décodeurs identiques.
Modifier le paramétrage du compteur (on rappelle que le système doit rester synchrone) en double
cliquant sur son symbole puis modifier le schéma général (garder l’ancienne version pour pouvoir
éventuellement y revenir). Tester votre solution.
Remplacer ensuite le compteur par une description VHDL et tester votre solution.
Denis Rabasté Programmation des CPLD et FPGA en VHDL avec Quartus II 6/11
IUFM Aix Marseille
Annexe 1 : programme VHDL du décodeur
entity DECODEUR is
port (BCD : in STD_LOGIC_VECTOR (3 downto 0);
SEG : out STD_LOGIC_VECTOR ( 6 downto 0) );
end DECODEUR;
-- ----------------
-- l 0 l
-- 5 l l1
-- l l
-- -----------------
-- l 6 l
-- 4 l l2
-- l l
-- -----------------
-- 3
end ARCH_DEC ;
Denis Rabasté Programmation des CPLD et FPGA en VHDL avec Quartus II 7/11
IUFM Aix Marseille
Annexe 2 : exemple de solution pour le diviseur
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
--les paquetages std_logic_1164 et std_logic_unsigned de la bibliothèque ieee
--permettent respectivement l'utilisation du type std_logic et l'addition avec ce type
ENTITY div IS
port ( H : IN STD_LOGIC;
C_OUT : OUT STD_LOGIC;
S : OUT STD_LOGIC);
END div;
BEGIN
PROCESS (H)
BEGIN
--compteur modulo M
IF (H'EVENT AND H = '1') THEN
IF X >= M-1 THEN X <= (others=>'0');
--mise à 0 de tous les bits de X
ELSE X <= X + 1 ;
END IF;
END IF;
END PROCESS;
END archdiv;
Denis Rabasté Programmation des CPLD et FPGA en VHDL avec Quartus II 8/11
IUFM Aix Marseille
Annexe 3 : exemple de solution pour le schéma général sur 2
chiffres
Denis Rabasté Programmation des CPLD et FPGA en VHDL avec Quartus II 9/11
IUFM Aix Marseille
Annexe 4 : exemple de solution pour la description VHDL du
compteur
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
--les paquetages std_logic_1164 et std_logic_unsigned de la bibliothèque ieee
--permettent respectivement l'utilisation du type std_logic et l'addition avec ce type
ENTITY compteur IS
port ( H : IN STD_LOGIC;
C_IN : IN STD_LOGIC;
C_OUT : OUT STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR (3 downto 0));
END compteur;
BEGIN
PROCESS (H)
BEGIN
--compteur modulo M
IF (H'EVENT AND H = '1') THEN
IF C_IN='1' THEN IF QX >= 9 THEN QX <= (others=>'0');
ELSE QX <= QX + 1 ;
END IF;
ELSE QX<=QX;
END IF;
END IF;
END PROCESS;
END archdiv;
Denis Rabasté Programmation des CPLD et FPGA en VHDL avec Quartus II 10/11
IUFM Aix Marseille
Annexe 5 : exemple de solution ne fonctionnant pas (système
asynchrone)
Circuit may not operate. Detected <number> non-operational path(s) clocked by clock
"<name>" with clock skew larger than data delay. See Compilation Report for details.
CAUSE: The clock skew of the specified number of non-operational path(s), clocked by the
specified clock between two registers, is greater than the delay between the same two
registers plus the tCO and tSU. As a result, the circuit may not operate. In addition, this
warning may appear if either the source register or the destination register is controlled
by an inverted undefined clock. When this condition occurs, the Classic Timing Analyzer
cannot accurately compute the correct hold relationship without a specified clock
requirement.
ACTION: View the timing analysis results in the Report window and list the specified paths in the
Messages window. If possible, correct the clock skew in the design by using internally
registered write/read enables, or by adding LCELL primitives to increase the data path
delay. If the warning is related to an undefined, inverted clock, Altera recommends
defining the clock by specifying clock settings or by specifying a global default required
fMAX before rerunning timing analysis.
Denis Rabasté Programmation des CPLD et FPGA en VHDL avec Quartus II 11/11
IUFM Aix Marseille