• Aucun résultat trouvé

Démarche de projet avec Quartus II

N/A
N/A
Protected

Academic year: 2022

Partager "Démarche de projet avec Quartus II"

Copied!
11
0
0

Texte intégral

(1)

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 à quartz 25,175 MHz

CPLD diviseur

de fréquence

compteur BCD

décodeur BCD / 7 segments

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

(2)

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.

(3)

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.

(4)

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 :

(5)

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

(6)

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.

(7)

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 l 1

-- l l

-- ---

-- l 6 l

-- 4 l l 2

-- 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 ;

(8)

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;

(9)

Annexe 3 : exemple de solution pour le schéma général sur 2

chiffres

(10)

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;

(11)

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.

Références

Documents relatifs

- Il permet l’articulation entre les objectifs du projet d’école, les programmes définis pour chaque cycle, les compétences à acquérir dans chaque cycle. - Il doit respecter

cherchent ailleurs et nous pourrons tou- jours leur faire savoir que nous leur serons utiles lorsqu'ils se sentiront en état de malaise ... Ueberschlag dans un

Evoquant la tendance prédominante dans le domaine péda - gogique contempora in de ((l'éducation spécialisée )) qui impose une ((pédagogie curative)) , cette vague

Les chiffres so nt là.. Qu e je

Denis Rabasté Programmation des CPLD et FPGA en VHDL avec Quartus II 5/25 Par le menu contextuel (clic droit sur le nom du fichier dans le navigateur), enlever le fichier ressource

Sauvegarder ensuite le schéma, sous le nom par exemple de fct_ET ; votre schéma sera alors sauvegardé sous le nom fct_ET.bdf (pour Block Description File) au sein

 Se donner les moyens de répondre à quelques questions sur la mise en œuvre du projet (comment s’est déroulée l’action ? Quelle a été l’implication

Le développement contemporain de la formation en éthique dans les facultés de médecine s’inscrit dans le contexte du développement de la bioéthique dont la définition même