Vous êtes sur la page 1sur 11

Démarche de projet avec Quartus II

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.

1 Description d’un chronomètre

1.1 Structure du projet


Dans un premier temps, l’affichage de notre chronomètre se fera sur un seul afficheur, puis nous
ferons évoluer notre projet vers un affichage sur deux chiffres:

oscillateur diviseur
compteur décodeur
à quartz de
BCD BCD / 7 segments
25,175 MHz fréquence

CPLD

Un diviseur de fréquence semblable à celui de la séance précédente permettra d’abaisser la


fréquence de 25 MHz à 1 Hz, puis un compteur BCD attaquera un décodeur BCD / 7 segments pour
commander l’afficheur.
Bien que pour un projet aussi simple il serait facile d’avoir un seul fichier VHDL décrivant l’ensemble,
nous nous imposerons dans un premier temps l’assemblage d’éléments simple.
Le diviseur et le décodeur seront décrits par deux fichiers VHDL, alors que pour le compteur nous
utiliserons une fonction disponible dans les bibliothèques du logiciel. L’ensemble sera assemblé au
sein d’un graphique.
Pour réaliser notre projet de chronomètre, la solution la plus simple consisterait à faire attaquer
l’horloge d’un compteur par la sortie S du diviseur. Cette solution conduirait à un système asynchrone,
ce qui n’est pas très gênant aux fréquences où nous travaillons.
Cette possibilité parfaitement réalisable avec le logiciel Maxplus+ II (la génération précédente chez
Altera) ne fonctionne pas avec Quartus si le rapport de division est aussi élevé. Le compilateur de
Quartus a été optimisé pour les FPGA et non pour des CPLD comme notre circuit cible (voir détails en
annexe).

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.

1.4 Modification du diviseur


Pour rendre synchrone notre projet, nous allons modifier la description du diviseur afin qu’il génère un
signal C_OUT (pour Carry Out) autorisant le comptage du compteur. Ce signal passera à 1 lorsque le
signal X du diviseur est au maximum ( soit M-1) et reste à 0 le reste du temps.
On gardera le signal S du diviseur afin de faire clignoter les points décimaux des afficheurs (cartes
UP) ou une DEL (cartes DE2), mais on supprimera le signal SEG (les bornes non utilisées pourront
être placées en haute impédance au niveau du compilateur par exemple).

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.

1.7 Synthèse du compteur


Le logiciel Quartus II propose des bibliothèques de fonctions complexes (mémoires, multiplieurs,
comparateurs etc…) paramétrables, sous le nom de « LPM functions » (Library of Parameterized
Modules). Notre compteur sera réalisé à l’aide de la LPM_COUNTER à laquelle on accède par la
même méthode que précédemment, en suivant ensuite
« altera / 72 / quartus / librairies / megafunctions / arithmetic ».

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).

La documentation permet de voir l’effet de chaque entrée sortie sélectionnée :

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.

Vérifier que la simulation répond bien à vos attentes.

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 »

Compiler l’ensemble et programmer le circuit cible.

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.

Remarque : le paramétrage de « lpm_counter » laisse trois possibilités pour l’entrée de validation de


comptage : « Clock Enable », « Count Enable » et « Carry-in ».
Bien que ces trois entrées ont la même fonctionnalité d’autorisation du comptage lorsqu’elles passent
au NL1 (générer les chronogrammes dans la documentation en ligne pour s’en convaincre), seule
l’entré « Carry-in » fonctionne correctement dans tous les cas de figure.

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

-- la bibliothèque ieee contient les paquetages dont la déclaration suit


library ieee;
--ce paquetage permet l'utilisation des types STD_LOGIC et STD_LOGIC_VECTOR
use ieee.std_logic_1164.all;
-- permet d'utiliser le type STD_LOGIC_VECTOR avec des entiers
use ieee.std_logic_unsigned.all;

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

architecture ARCH_DEC of DECODEUR is


begin

-- attention les leds s'allument pour une sortie à 0


SEG <= "1000000" when BCD=0 else
"1111001" when BCD=1 else
"0100100" when BCD=2 else
"0110000" when BCD=3 else
"0011001" when BCD=4 else
"0010010" when BCD=5 else
"0000010" when BCD=6 else
"1111000" when BCD=7 else
"0000000" when BCD=8 else
"0010000" when BCD=9 else
"1111111" ;

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

--H est le signal d'horloge à 25,175 MHz (carte UP1 et UP2)


--S est le résultat de la division de la fréquence de H par 25 175 000
-- pour l’horloge à 50 MHz de la carte DE2, passer M à 50 000 000
-- et le nombre de bit de X à 26

port ( H : IN STD_LOGIC;
C_OUT : OUT STD_LOGIC;
S : OUT STD_LOGIC);

END div;

ARCHITECTURE archdiv OF div IS


--pour compter jusqu'a (25 175 000 -1) il faut 25 bits (2^25=33 554 432)
SIGNAL X : STD_LOGIC_VECTOR (24 downto 0);
CONSTANT M: INTEGER :=25175000 ;

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;

--à la moitié du comptage on change la valeur de S (rapport cyclique 1/2)


S<='1' when X>=M/2 else '0';
--mise à 1 de la retenue lorsque X passe à 0
C_OUT<='1' when X=M-1 else '0';

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;

ARCHITECTURE archdiv OF compteur IS


SIGNAL QX : STD_LOGIC_VECTOR (3 downto 0);

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;

C_OUT<='1' when QX=9 and C_IN='1' else '0';


Q<=QX;

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)

Message d’avertissement généré par le compilateur :

Aide associée à ce message :

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

Vous aimerez peut-être aussi