Laboratoire CPLD

Transcription

Laboratoire CPLD
Electronique numérique
Année académique 2014 - 2015
Laboratoire CPLD
Remacle Matthieu
Schmitz Thomas
Pierlot Vincent
Section 1 - Introduction
1
ELEN0040
Introduction
1.1
Objectif et instructions
Le but de ce laboratoire est de vous familiariser avec les logiciels nécessaires pour la création de
votre projet VHDL dans le cadre du cours d’électronique numérique, ainsi que sur la création d’un schéma
de base.
Au terme de ce laboratoire, il vous sera demandé de créer un rapport écrit, au format PDF, à remettre
aux étudiants moniteurs. Ce rapport comprendra l’ensemble de vos réponses aux questions posées tout
au long de ce laboratoire, vos codes VHDL et vos schémas.
1.2
Logiciels requis
Deux logiciels sont indispensables pour le laboratoire. Ils sont installés sur les machines du R100,
mais vous devrez les installer par vous même sur vos machine pour le travail VHDL :
ModelSim, Mentor Graphics
Quartus II, Altera
Version : Web edition
Lien : https://www.altera.com/download/
software/quartus-ii-we
Version : Altera Edition
Lien : https://www.altera.com/download/
software/modelsim-starter
Il existe une version Linux, en cas de problème lors de l’installation adressez vous aux étudiants
moniteurs
1.3
Conventions
Les encadrés suivants seront utilisés au cours de ces notes :
Remarque importante
Remarque très importante, qui doit être impérativement respectée !
?
1
Question devant être résolue dans le rapport
Section 2 - Les registres
2
ELEN0040
Les registres
Cette section fait référence à une notion indispensable pour le VHDL, mais qui sera vue plus
tard en cours
Le terme Registre viendra souvent au cours de ce laboratoire. Il existe plusieurs sortes de registres,
tels que les Flip-flop, les Verrous, etc... Toutefois, pour la bonne compréhension de ce laboratoire, il suffit
de retenir qu’il s’agit d’élément de mémorisation.
Ces éléments ont pour particularité de conserver leur sortie inchangée pendant toute la durée d’une
période d’horloge, et ce quelque soit l’entrée fournie.
Ainsi, ils sont capable de regarder leur entrée sur le flanc montant de l’horloge, et de conserver cette
valeur jusqu’au flanc montant suivant, où ils regardent à nouveau l’entrée.
Le symbole communément utilisé pour un registre est le suivant :
Q
D
CLK
Figure 1 – Symbole d’un registre
2
Section 3 - Considérations théoriques
3
ELEN0040
Considérations théoriques
3.1
Conception d’un programme VHDL
La conception d’un programme VHDL peut être résumée par le diagramme de la figure 2 :
Architecture
Specification
Design
Simulation
Synthesis
Optimisation
Place & route
Optimisation
Timing
Analysis
Programming
Debug
Figure 2 – diagramme d’un développement de programme sur CPLD
Passons en revue les différentes étapes reprises dans ce diagramme :
Architecture specification : Cette première étape est la plus importante. Elle consiste à écrire les
spécifications du programme, ou en d’autres termes, écrire l’ensemble des fonctions que le programme devra être capable de réaliser. Cette spécification sera très utile pour le debug, car elle
permet au final de créer un ensemble de scénarios test que le programme devra pouvoir effectuer
sans encombre.
3
Section 3 - Considérations théoriques
ELEN0040
La création de l’architecture consiste à réfléchir à l’organisation du code, et aux ressources nécessaires. En particulier, on commence généralement par la création d’une machine d’état complète,
ainsi qu’une liste des entrées/sorties (I/O). Les différents signaux et ressources nécessaires doivent
aussi faire l’objet d’une réflexion. À la fin de cette étape, il doit être possible d’avoir une première
idée de l’ensemble des ressources nécessaires (pins (pattes) I/O, registres, etc...) à l’implémentation
du programme.
C’est grâce à cette réflexion sur l’architecture du programme qu’il sera possible de déterminer
sa faisabilité et/ou déterminer le adapté au programme. Dans le cadre de ce laboratoire, et par
extension de votre projet, le composant vous est imposée. Il est donc de votre ressort d’évaluer
correctement les ressources requises afin de savoir si votre programme est réalisable. Si ce n’est
pas le cas, il faut revoir les spécifications à la baisse.
Programme (design) : Cette étape reprend la phase de programmation à proprement parlé. Il convient
de suivre scrupuleusement l’architecture que vous avez définie dans l’étape précédente, afin de ne
pas utiliser des ressources inutiles.
Simulation : Cette étape, bien que facultative, vous permet de faire un premier debug de votre
logiciel, afin d’éliminer les erreurs de conception. A cette étape, il est déjà possible de vérifier
si le design répond aux spécifications de votre projet, via un ensemble de scénarios de test. Le
logiciel utilisé au cours de ce laboratoire pour cette étape est ModelSim.
Synthesis : Votre design créé et simulé, il vous reste à l’implémenter physiquement. La première
étape de ce processus est la synthèse, c’est à dire la traduction de votre code VHDL en équations
booléennes implémentables dans la CPLD. Grâce à Quartus II, il vous est possible de réaliser
cette étape en un clic. A l’issue du processus, un rapport vous sera présenté avec, entre autres,
les ressources nécessaires à l’implémentation du design. Si ces ressources sont trop importantes
pour votre composant, il conviendra d’optimiser votre code pour diminuer la consommation, voir
diminuer les spécifications.
Place & Route : Votre design a été traduit en équations, mais il n’est pas encore mis sous une
forme programmable dans la CPLD. Il faut en effet encore décider de l’emplacement des différents
flip-flops utilisés, des signaux de contrôle, etc... Ceci est réalisé, toujours par le logiciel Quartus
II, durant cette étape. L’analyse est généralement relativement précise et il est rare qu’un design
qui est analysable ne soit pas implémentable. Toutefois, il est possible que cela arrive. Il convient
alors de réaliser encore quelques optimisations si tel est le cas.
Timing analysis : Pour les designs dont la vitesse est un élément essentiel, il faut également analyser les timings, c’est-à-dire le temps mis par un signal pour passer de l’entrée de le composant
à sa sortie (entre autre). Cette étape ne s’appliquera toutefois pas à vos designs dans le cadre de
ce cours.
Programming & debug : Dernière étape : placer le programme sur le composant et vérifier que tout
se passe bien. Si la simulation a été bien réalisée, le programme devrait fonctionner du premier
coup...
?
Le composant utilisé pour ce laboratoire est un MaxV 5M160Z, au package QFP64. Recherchez
dans la datasheet (appellée ici Handbook ) les ressources dont vous disposez pour créer votre
design. En particulier, combien d’éléments logiques, et combien d’entrées/sorties disposez vous ?
Ces informations se trouvent toutes dans la section I, Max V Device Core
3.2
Écrire du code propre
Chaque programmeur à son propre style pour coder, mais il convient de respecter certains points
clés afin de garder un code propre. Ceci permet de diminuer les erreurs, et de faciliter la relecture. Les
commentaires sont également très importants ! Voici une liste, non exhaustive, d’éléments à respecter :
— Indentation du code,
4
Section 3 - Considérations théoriques
ELEN0040
— Choix d’une convention de nomenclature (par exemple : les types commencent par une minuscule
et les variables par une majuscule, etc...),
— Choix de noms cohérents et lisibles,
— Commentaire pour chaque élément un peu compliqué,
— etc...
Voici un exemple de code lisible. Il correspond à nos choix de nomenclature, mais rien ne vous empêche
d’utiliser les vôtres (par exemple mettre les mots clés en majuscule. Ceci étant possible puisque le VHDL
n’est pas sensible à la casse)
1
2
3
4
5
6
7
8
9
10
11
12
13
library ieee ;
use i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ;
entity cardio is
port
( −− I n p u t p o r t s
clk
: in
std_logic ;
heart
: in
std_logic ;
−− O u t p u t p o r t s
led_fast
: buffer std_logic ;
led_slow
: b u f f e r s t d _ l o g i c −− no s e m i c o l o n !
) ;
end e n t i t y c a r d i o ;
3.3
Création d’un schéma
Dans la seconde partie du laboratoire, vous devrez concevoir un schéma électrique simple. Il vous sera
aussi demandé d’en réaliser un pour votre projet. La création d’un schéma peut se faire via la succession
d’étapes suivantes :
Spécification : Tout comme dans le cas d’un programme, vous devez choisir quelles fonctions votre
design doit être capable de réaliser.
Choix des composants : Une fois vos spécifications écrites, vous devez trouver les composants nécessaires pour les réaliser : quelles résistances choisir ? Avez vous besoin d’un timer ? De boutons ?
De logique supplémentaire ?
Analyse des datasheets : Une fois vos composants choisis, il faut lire les datasheets. Pour un composant, elles permettent de déterminer la tension d’alimentation, l’emplacement de chaque entrée/sortie ou encore différentes recommandations du constructeur. Pour des composants plus simples
tels qu’une résistance, cette étape de lecture est moins cruciale, mais peut se permettre de s’assurer que la résistance puisse supporter la puissance dissipée, ou que les condensateurs supportent
la tension de service.
Cette étape est absolument primordiale ! Une mauvaise lecture peut
entraîner le non fonctionnement du système voir une destruction du
composant (choix d’une mauvaise tension d’alimentation, mauvais branchements, etc...) !
Réalisation : Maintenant que vous disposez de toutes les informations nécessaires, il ne vous reste
plus qu’à connecter les différents éléments entre eux pour réaliser ce dont vous avez besoin.
La figure 3 vous montre un exemple de schéma électrique. Il s’agit de la carte de développement
contenant la CPLD utilisée lors de ce laboratoire. Ce schéma reprend quelques principes couramment
utilisés pour réaliser des schéma lisibles :
— Séparation des différentes parties du système (alimentation, horloge, CPLD),
— Utilisation de nets ou bus (groupement de plusieurs connections) pour simplifier la lecture et
éviter de devoir mettre trop de fils (CLK0, CLK1, etc...),
5
Section 3 - Considérations théoriques
3
4
5
A
GND
COR6
R6
61
PIU1061
PIP1019
PIR604
PIR605
60
PIU1060
PIP1018
PIR603
PIR606
59
PIU1059
PIP1017
PIR602
PIR607
58
PIU1058
PIP1016
PIR601
PIR608
56
PIU1056
COR8
R8
55
PIU1055
220R
220R
PIP1015
PIR804
PIR805
PIP1014
PIR803
PIR806
PIP1013
PIR802
PIR807
PIU1053
PIP1012
PIR801
PIR808
PIU1052
PIP1011
PIP1010
220R
220R
GND
GND
COR10
R10
PIP109
PIP108
PIP107
PIP106
COR12
R12
PIP105
PIR1208
PIR1201
PIP104
PIR1207
PIR1202
PIP103
PIR1206
PIR1203
PIP102
PIR1205
PIR1204
PIP101
54
PIU1054
PIR1008
PIR1001
PIR1007
PIR1002
PIR1006
PIR1003
PIR1005
PIR1004
220R
220R
220R
220R
GND
Header 20
COR14
R14
PIR1401
PIR1408
PIR1402
PIR1407
PIR1403
PIR1406
PIR1404
PIR1405
PIDCOD2201 PID30COD31 PID40COD41 PIDCOD5501
PID20 PID302 PID402 PID502
220R
D5 220R
D4
LG R971-KN-1
LS R976-NR-1
B
D3
LY R976-PS-36
D2
53
52
51
PIU1051
50
PIU1050
49
PIU1049
48
PIU1048
47
PIU1047
46
PIU1046
45
PIU1045
44
PIU1044
43
PIU1043
42
PIU1042
40
PIU1040
38
PIU1038
37
PIU1037
36
PIU1036
35
PIU1035
34
PIU1034
5M160ZE64C4
IO, DIFFIO_L1p
IO, DIFFIO_L1n
IO
IO, DIFFIO_L2p
IO, DIFFIO_L2n
IO
IO, CLK0
IO, CLK1
IO
IO, DIFFIO_L3p
IO, DIFFIO_L3n
IO
IO, DIFFIO_B1p
IO, DIFFIO_B1n
IO, DIFFIO_B2p
IO, DIFFIO_B2n
IO, DIFFIO_B3p
IO, DIFFIO_B3n
IO
IO, DIFFIO_B4p
IO, DIFFIO_B4n
IO, DEV_OE, DIFFIO_B5p
IO, DEV_CLRn, DIFFIO_B5n
IO, DIFFIO_B6p
IO, DIFFIO_B6n
IO, DIFFIO_B7p
IO, DIFFIO_B7n
64
PIU1064
COP2
P2
1
PIU101
2
PIU102
PIR704
PIR705
PIP202
4
PIU104
PIR703
PIR706
PIP203
5
PIU105
PIR702
PIR707
PIP204
7
PIU107
PIR701
PIR708
PIP205
COR9
R9
CLK0
CLK1
9
PIU109
10
PIU1010
11
12
13
PIU1013
18
PIU1018
19
PIU1019
20
PIU1020
21
PIU1021
22
PIU1022
24
PIU1024
25
PIU1025
26
PIU1026
27
PIU1027
28
PIU1028
29
PIU1029
30
PIU1030
31
PIU1031
32
PIU1032
33
PIU1033
PIR904
PIR905
PIR903
PIR906
220R
220R
PIP206
PIP207
PIU1011
PIR902
PIR907
PIP208
PIU1012
PIR901
PIR908
PIP209
220R
220R
COR13
R13
COR15
R15
PIR1505
PIR1504
PIR1506
PIR1503
PIR1507
PIR1502
PIR1508
PIR1501
220R
220R
5M160ZE64C4
VCCIO
COR11 VCCIO
R11
PIR1304
PIR1305
PIR1303
PIR1306
PIR1302
PIR1307
PIR1301
PIR1308
PIP2012
PIR1106
PIP2013
PIR1102
PIR1107
PIP2014
PIR1101
PIR1108
PIP2015
220R
220R
PIP2016
PIP2017
PIP2018
PIP2019
220R
220R
D6
D7
D8
Header 20
B
COProg
Prog
1
3
5
7
9
PIProg05
PIProg07
VCCIO
Clock i
COC1
C1
10uF
10uF
680R
PIR101680R
LM317KTTR
PIC202
PIC201
COC2
C2
4
PIU204
10uF
10uF
RST
6
PIU206
THR
2
PIU202
TRIG
VCC
GND
COR2
R2
8
PIU208
330R
PIR201 330R
PIR301
PIC302
PIC301
COR3
R3
C
PIR302
PIProg09
PIRA101
1K
1K
GND
PIProg02
NLVCCIO
VCCIO
PIProg04
PIProg06
PIProg08
NLGND
GND
PIProg010
30310-6002HB
2112432
517-30310-6002
PIRB101
CORB1
RB1
1K
1K
CLK1
COU1C
U1C
NLTDI
TDI
NLTDO
TDO
PIRB102
PICLOK10
COU2
U2
PIR202
VCCIO
CORA1
RA1
PIRA102
2
4
6
8
10
NLTCK
TCK
NLTMS
TMS
COR1
R1
PIVR10
VCCIO
VCC
PIR102
1
PIC102
PIC101
2
4
PIVR104
PIVR102
A
D9
i Power
VIN VOUT
VOUT
GND
PIP2020
VCCIO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PIDCOD6601 PIDCOD7701 PID80COD81 PID90COD91
PID602 PID702 PID802 PID902
GND
COVR1
VR1
PIP2011
PIR1105
PIR1103
PIProg01
3
PIP2010
PIR1104
PIProg03
PIVR103
PIP201
VCCIO
COR7
R7
3
PIU103
GND
9V
8
COU1A
U1A
IO, DIFFIO_T1p
IO
IO, DIFFIO_T1n
IO, DIFFIO_T2p
IO, DIFFIO_T2n
IO, DIFFIO_T3p
IO, DIFFIO_T3n
IO, DIFFIO_T4p
IO, DIFFIO_T4n
IO, DIFFIO_T5p
IO, DIFFIO_T5n
IO
IO, DIFFIO_T6p
IO, DIFFIO_T6n
IO
IO, DIFFIO_R1p
IO, DIFFIO_R1n
IO
IO, DIFFIO_R2p
IO, DIFFIO_R2n
IO, CLK3
IO, CLK2
IO
IO, DIFFIO_R3p
IO, DIFFIO_R3n
IO, DIFFIO_R4p
IO, DIFFIO_R4n
BANK 1
PIP1020
BANK 2
62
PIU1062
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
7
LS R976-NR-1
COU1B
U1B
63
PIU1063
COP1
P1
6
LY R976-PS-36
2
LG R971-KN-1
1
ELEN0040
220R
220R
DIS
7
PIU207
OUT
3
PIU203
CVOLT
5
PIU205
PIC402
LMC555CN
PIC401
100nF
100nF
GND
COC4
C4
100nF
100nF
PIU1014
TDI
TDO
TCK
TMS
5M160ZE64C4
VCC
PICLOCK102
COC3
C3
PIU1016
COCLOCK1
CLOCK1
RK09K1130C94
PICd102
PICLOK103
1
PIU201
15
17
16
14
PIU1015
PIU1017
PICd101
COC5
C5
PIC501PIC502
PIC501
PIC502
VCC
PICd20
COCd1
Cd1
100nF
100nF
GND
COCd2
Cd2
PICd201
100nF
100nF
GND
10uF
10uF
GND
C
U1D
COU1D
9V
Astable operation: 0,7Hz - 50.25% to 48,1Hz, 66,67%
3
PIVR203
VAOL-S8SB4
PIC602
PIC601
GND
COC6
C6
10uF
10uF
VIN VOUT
VOUT
GND
2
4
PIVR204
VCCIO
PIVR202
PIVR201
PIR401
R4
COR4
LM317KTTR
PIR402220R
220R
PIC702
PIC701
65
10uF
10uF
PIU1065
PIR502
COR5
R5
330R
VCCIO
RA2
CORA2
PIRA202
1K
1K
GND
6
PIU306
2
PIU302
9V
D1
COD1
PID101
PIP301
PID102
8
PIU308
F1
COF1
PIF101
MBRS240LT3G
PIC802
PIF102
PIC801
1210L050YR
0.5A
Header 2
VCCIO1
VCCIO1
VCCIO
23
6
PIU1023
PIU106
CORB2
RB2
22K
PIRB20122K
4
PIU304
PIP302
GND
GND
PIRB202
CLK0
PICLOK01
U3
COU3
2
1
VCC
PIU108
5M160ZE64C4
PIRA201
PIR501 330R
COP3
P3
41
8
PIU1041
57
VCCIO2 PIU1057
39
VCCIO2 PIU1039
COC7
C7
VCCIO
D
VCCINT
VCCINT
COVR2
VR2
COD10
D10
1
PID10 1
PID10 2
7
RST
DIS
PIU307
THR
OUT
PIU303
TRIG
CVOLT
PIU305
VCC
GND
PIU301
3
5
PICLOK03
1
PIC902
LMC555CN
COC8
C8
PIC901
100nF
100nF
GND
i
CPLD
COCLOCK0
CLOCK0
RK09K1130C94
PICLOCK002
COC9
C9
100nF
100nF
D
C10
COC10
PIC1002PIC1001
Title
100nF
100nF
GND
Astable operation: 59Hz - 50.207% to 320Hz, 51.22%
Size
MaxV Dev Board
Number
Revision
A3
Date:
File:
1
2
3
4
5
6
27-02-14
D:\Dropbox\..\Schematics.SchDoc
7
2.0
Sheet of
Drawn By: Matthieu Remacle
8
Figure 3 – Carte de développement CPLD
— Alignement des différents composants, fils à 90 degrés,
— Informations sur le schéma (révision, auteur, etc...)
Remarquez également que pour chaque composant, il y a au moins deux informations : son nom, et
sa valeur.
D’autres informations peuvent se trouver sur le schéma, mais ne sont pas affichées pour simplifier la
lecture :
— Une référence pour commander le composant,
— Le fabricant,
— Des informations sur le composant (par exemple la tension maximale admissible aux bornes d’un
condensateur), etc...
Quand vous ferez votre liste de composants avant d’aller au magasin les acheter, vous devrez vous
poser les questions suivantes, selon le composant considéré :
Résistance : Valeur ? Puissance minimale a dissiper ? (A part pour les résistances dissipant beaucoup de puissances, une valeur commune est 500mW. Ce sera la valeur donnée par le vendeur si
vous ne lui dites rien.)
Capacité : Valeur ? Tension minimale à supporter ?
Composant : Référence exacte ?
Boutons, connecteurs, etc... Emprunte (footprint), espacement des pattes ? Dans le cadre de ce
projet, l’espacement sera de 2.54mm (espacement standard pour les cartes à trous et breadboard)
6
Section 3 - Considérations théoriques
ELEN0040
En regardant le schéma, déterminez, pour les éléments ci-dessous, les différentes informations
nécessaires avant d’acheter vos composants, sachant que VCC = 1.8V et VCCIO = 3.3V :
?
7
R1, R2, C2, RA1, RB2, C3, U2, VR1
Question bonus : une erreur s’est glissée dans le schéma du LM317KTTR. Quelle est-elle ?
(N’hésitez pas à aller voir la datasheet)
Section 4 - Conception d’un électrocardiogramme simple
4
ELEN0040
Conception d’un électrocardiogramme simple
4.1
Spécification
Imaginons qu’un circuit d’amplification analogique se connecte à des électrodes sur un patient, et
retransmet en sortie une tension variant de 0 à 3.3V donnant l’électrocardiogramme de ce patient. De
plus, les tensions de sortie sont telles que la sortie peut être considérée comme un 0 la majorité du
temps ou comme un 1 lors d’un battement de cœur.
Le but de ce projet est de concevoir un système allumant un témoin lumineux lorsque le rythme
cardiaque du patient dépasse une certaine valeur, fixée ici à 150 bpm (battement par minute) ; ou un
autre témoin lorsque ce rythme descend en dessous de 40 bpm.
?
4.2
Imaginez un scénario de test permettant de vérifier que le système, une fois construit, correspondra bien à la spécification donnée.
Architecture
Une solution possible est d’utiliser une horloge rapide (plus rapide que les battements de cœur), et
compter le nombre de coups d’horloge entre chaque battement. Plus ce nombre de coups sera faible, plus
rapide sera la vitesse des battements, et inversement. Il faudra donc un signal interne capable de retenir
le nombre de coups d’horloge entre battements.
La première difficulté ici réside à déterminer la fréquence de l’horloge. En effet, une fréquence élevée
permettra d’être plus précis dans la détection, mais d’un autre côté, le nombre de coups maximum à
compter, et donc l’utilisation en registre du signal interne, sera plus élevée.
Une fréquence de 30Hz semble être un bon compromis. En effet, à 150 bpm il faudra compter 12
coups d’horloge, tandis qu’a 40 bpm il faudra en compter 45. Ainsi, il suffit de 6 bits 1 pour retenir le
nombre de coups d’horloge.
?
Cette fréquence n’est pas compatible en tant que telle avec la carte de développement. Pourquoi ?
Quelle fréquence pourrions nous utiliser à la place ? Combien de bits sera-t-il alors nécessaire
d’utiliser ?
Astuce : Lire le schéma de la carte de développement
En plus des bits utilisés pour le comptage, il convient d’utiliser deux autres bits pour retenir les
valeurs de sortie des leds entre 2 battements de cœur.
On pourrait donc imaginer une architecture avec un seul processus simple, effectuant les actions
suivantes :
— Comptage des coups d’horloge lorsque l’entrée de l’électrocardiogramme est à 0, c’est à dire entre
deux battements de coeur,
— Calcul du nombre de sorties pendant chaque battement, donc lorsque l’entrée est à 1.
En pratique sur la carte qui vous est donnée, le signal heart (horloge CLOCK1) possède un niveau
haut pendant 50% du temps et un niveau bas le reste du temps. (Duty cycle de 50%). Il serait donc
incorrect de calculer la fréquence cardiaque uniquement sur base des niveaux bas de la clock1. Par
conséquent, nous devons mesurer la période totale du signal.
Cette architecture utiliserait à priori n + 2 bits de mémoire, où n est le nombre de bits calculés à la
question précédente.
1. 6 = dlog2 (45)e
8
Section 4 - Conception d’un électrocardiogramme simple
4.3
ELEN0040
Programme
Voici un exemple de code effectuant les opérations demandées 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
architecture cardio_arch of cardio is
signal cnt
: i n t e g e r range 0 t o 127 := 0 ;
s i g n a l h e a r t _ o l d : s t d _ l o g i c := ’ 0 ’ ;
begin
counter : process ( clk )
begin
i f ( r i s i n g _ e d g e ( c l k ) ) then
i f ( h e a r t _ o l d = ’ 1 ’ and h e a r t = ’ 0 ’ ) t h e n
i f ( c n t > 80 ) t h e n
−− t o o s l o w
l e d _ f a s t <= ’ 0 ’ ;
l e d _ s l o w <= ’ 1 ’ ;
e l s i f ( c n t < 18 ) t h e n −− t o o f a s t
l e d _ s l o w <= ’ 0 ’ ;
l e d _ f a s t <= ’ 1 ’ ;
else
−− good r a n g e
l e d _ s l o w <= ’ 0 ’ ;
l e d _ f a s t <= ’ 0 ’ ;
end i f ;
c n t <= 0 ;
−− r e s e t c o u n t e r
else
i f ( c n t /= 127 ) t h e n
c n t <= c n t + 1 ;
end i f ;
end i f ;
h e a r t _ o l d <= h e a r t ;
end i f ;
end p r o c e s s c o u n t e r ;
end a r c h i t e c t u r e c a r d i o _ a r c h ;
?
Essayez de répondre aux questions suivantes, sachant que la fonction rising_edge est vraie
lorsqu’il y a un flanc montant sur clk :
— A quoi sert le signal heart_old ?
— Que se passera-t-il en cas d’électrocardiogramme plat, au niveau du signal cnt ?
— Que se passera-t-il si un dysfonctionnement de l’électrocardiogramme génère un signal
heart d’une fréquence supérieure à celle de clk ?
— Pourquoi faut-il retenir l’état des leds ?
2. L’entité correspondante a été déclarée plus haut.
9
Section 5 - Création et simulation d’un projet
5
ELEN0040
Création et simulation d’un projet
5.1
Découverte de Quartus II
Quartus II est la suite logicielle développée par Altera. Elle vous permettra de réaliser, au sein d’une
interface unique, toutes les tâches envisageables sur CPLD/FPGA :
— Conception du programme via non seulement du VHDL ou Verilog, mais aussi via des machines
d’état, du schéma ou encore des blocs diagrammes, etc...
— Implémentation, avec la génération de nombreux rapports,
— Programmation,
— Analyses diverses et variées : consommation, temps de propagations des signaux (timing), ressources (ex : nombre d’éléments logiques utilisés), etc...
Interface
Ce logiciel fonctionne avec la notion de Projet. Un projet reprend l’ensemble des codes sources,
fichiers de programmation, fichiers de contrainte, etc, nécessaires pour la programmation d’un composant.
Vous aurez donc un seul projet pour votre laboratoire. La création d’un projet est relativement simple :
— Une fois le logiciel démarré, cliquez sur File → New Project Wizard
— Une nouvelle fenêtre s’ouvre. En cliquant sur suivant, vous pouvez configurer les différentes variables de votre projet, à commencer par l’emplacement des fichiers, et le nom (mettez ici cardio).
Ensuite, vous pouvez sauter l’étape d’ajout de fichier (nous en créerons un plus tard) pour passer
à la configuration du composant, une 5M160ZE64C5 :
— Enfin, dans la partie Simulation, choisissez ModelSim Altera :
10
Section 5 - Création et simulation d’un projet
ELEN0040
Le projet étant créé vous avez maintenant accès à la fenêtre principale de Quartus II. Cette fenêtre
reprend un certain nombre d’informations :
Navigateur de projet : Cette fenêtre reprends un résumé de la hiérarchie du projet. Dans le cadre
de ce laboratoire, la hiérarchie restera simple, puisque nous n’aurons qu’un seul fichier.
Dans cette fenêtre, il est également possible de passer en revue les différents fichiers du projet,
etc...
Tâches : Cette fenêtre fournit l’ensemble des informations concernant les tâches à effectuer pour avoir
un projet fonctionnel. Chaque tâche (par exemple : la synthèse) peut être effectuée indépendamment
en double-cliquant sur celle-ci. Si une tâche nécessite qu’une autre tâche soit effectuée, elle le
sera également.
Enfin, il est possible via cette fenêtre d’accéder aux rapports de compilation, vous indiquant ce qui
s’est produit lors de l’exécution d’une tâche. Pour ce faire, il suffit de cliquer sur la petite flèche
afin de développer la tâche, et cliquer sur un des rapports proposés.
Messages : Les messages générés (par exemple : les erreurs de compilation, etc...) seront affichés
ici
11
Section 5 - Création et simulation d’un projet
ELEN0040
Outils : Les outils importants, tels que le lancement d’une compilation, d’une analyse de timing, ou
encore le pin planner se trouvent dans cette barre.
Si une des fenêtres n’est pas disponible sur votre écran, vous pouvez la faire apparaître en
cliquant sur View → Utility Windows et en cliquant sur l’élément indisponible.
Dans la barre supérieure, d’autres outils sont disponibles sous la partie Tools :
Ainsi, c’est ici que vous trouverez, entre autre :
— Le programmeur,
— L’analyseur de timing,
— Le Plugin-in Manager,
— Les advisors,
— Le lancement d’une simulation.
Enfin, on peut aussi parler du menu Assignments, qui reprend tout ce qu’il vous faudra pour attribuer
les entrées/sorties de votre programme, ainsi que les options du projet :
Vous noterez pour finir que l’ensemble des fonctionnalités de la barre d’outils est présent dans les
menus-déroulants.
12
Section 5 - Création et simulation d’un projet
ELEN0040
Configuration de Quartus II
L’intégralité de ces étapes se passe dans le logiciel Quartus II. Toutefois, il est nécessaire de le
configurer pour lui dire d’utiliser ModelSIM pour la simulation. Ceci peut être fait en allant sur Tools →
Options. Dans la fenêtre qui s’affiche, allez sur l’onglet EDA Tool Options, et vérifier que le chemin de
ModelSim-Altera est définit. Si ce n’est pas le cas, définissez-le.
Edition du fichier VHDL
Créons maintenant notre électrocardiogramme. Pour ce faire, faites File → New et dans la fenêtre
qui s’affiche, sélectionnez VHDL file.
Un fichier vide s’ouvre dans l’espace de travail, il ne vous reste plus qu’à recopier le code d’exemple
créé un peu plus tôt. Plutôt que de bêtement copier le programme, nous allons le réécrire. Quartus II
fourni en effet une série de Templates permettant de faciliter l’écriture de code VHDL. Vous pouvez y
accéder via le bouton . Dans la nouvelle fenêtre qui s’ouvre, choisissez VHDL → Constructs → Design
Units → Entity.
Appuyez ensuite sur Insert et la construction est ajoutée à votre fichier VHDL. Il ne vous reste plus
alors qu’a remplacer les éléments entre <> à votre guise. N’oubliez pas que vous pouvez aussi utiliser
la fonction Find & Replace (via CTRL-H) de l’éditeur de texte pour aller plus vite.
13
Section 5 - Création et simulation d’un projet
ELEN0040
Sauvegardez votre projet. Une fois votre entité recopiée, vous pouvez vérifier que ce que vous avez
fait est correct, via le bouton . Si la compilation est réussie, un message s’affichera dans la fenêtre de
message et un rapport de compilation (vide) dans l’espace de travail. Finalement, recopiez l’intégralité
(entité + architecture) du code, et vérifiez que la syntaxe est correcte.
Votre fichier étant syntaxiquement correct, il est maintenant temps de lancer les étapes d’analyse et
de simulation.
5.2
Découverte de ModelSim
Interface
Afin de vérifier le fonctionnement du système, il est possible de le simuler d’abord. Pour ce faire,
appuyez sur le bouton , qui lancera le programme ModelSim avec tous les paramètres déjà chargés.
Tout comme pour Quartus, l’espace de travail est découpé en différentes zones, les plus importantes étant
celles-ci :
Bibliothèques : Toutes les libraires nécessaires sont reprises dans cette fenêtre. En particulier, votre
programme se trouve dans la librairie Work. Double-cliquez sur le nom de votre programme pour
lancer la simulation.
Objets : Tous les signaux disponibles apparaîtrons dans cette fenêtre. Vous pouvez, avec la souris,
les glisser-déposer dans la fenêtre Wave pour afficher le résultat de la simulation sur ces signaux.
Wave : Tous les résultats de simulation demandés seront accessibles dans cette fenêtre. Ici, l’objet
clk à été déplacé (Si la fenêtre n’apparait ps, faites View → Wave).
14
Section 5 - Création et simulation d’un projet
ELEN0040
Console : Il est possible de piloter le logiciel à l’aide d’une console, c’est à dire en lui entrant une
série de commandes. Les messages, du même type que ceux de quartus, sont affichés ici.
Lorsque vous avez double-cliqué sur votre programme dans la fenêtre Libraries, vous avez lancé une
simulation. En réalité, votre simulation a été initialisée, et se trouve au temps 0, mais il ne s’est encore
rien passé. En effet, il faut tout d’abord donner au logiciel des stimuli, c’est-à-dire déterminer les entrées
du système. Avec ModelSim, il y a plusieurs façon de travailler. En voici 3 :
— Lancer la simulation sans aucune information, puis lui donner les stimuli au fur et à mesure ;
— Lancer la simulation avec des stimuli généré graphiquement à l’avance ;
— Lancer la simulation avec un fichier de TestBench, qui reprend l’ensemble des stimuli.
Dans ce laboratoire, nous verrons la première et la dernière possibilité. En effet, le fichier de Testbench
est en réalité beaucoup plus court et simple à écrire que de créer des stimuli à la main. La première
possibilité peut être pratique pour déboguer une situation étrange : on pose quelques stimuli, on stoppe
la simulation, on regarde ce qu’il se passe, puis on impose d’autre stimuli, on relance la simulation, etc.
Voyons d’abord cette première façon de faire.
Lancement d’une simulation
Vous utiliserez principalement deux possibilités :
— Stimulus de type horloge,
— Stimulus de type valeur forcée.
Une fois votre simulation démarrée, commencez tout d’abord par déplacer tous les objets dans la
fenêtre Wave, ce qui va permettre la visualisation des signaux. Remarquez que les entrées, les sorties,
mais également les signaux internes sont disponibles, ce qui est très pratique pour déboguer une situation.
Ensuite, faites un clic droit sur l’élément clk, puis dans le menu qui apparaît, choisissez Clock... :
Dans le champ Period, indiquez "16ms". Répétez l’opération avec le signal heart, mais avec cette fois
ci une période de "2sec", et un duty cycle de 5, ce qui simulera un battement de cœur.
15
Section 5 - Création et simulation d’un projet
ELEN0040
Enfin, lancez la simulation pour un laps de temps de 10 sec. Vous pouvez le faire soit en saisissant
dans le champ approprié une durée puis en cliquant sur le bouton :
Soit en entrant run 10 sec dans la console. Vous pouvez zoomer sur le résultat avec O et I.
?
Grâce à ces outils, réalisez le scénario de test que vous avez conçus au début de ce laboratoire,
et analyser le afin de vérifier que le système fonctionne comme escompté. Dans votre analyse,
n’oubliez pas d’inclure :
— Une explication précise du scénario de test...
— ... à mettre en relation avec les signaux observés ;
— Une explication sur la pertinence de vos tests (couvrent-ils tous les scénarios ? Si non,
lesquels ne peuvent être simulés ?...)
Les Testbenches
Maintenant, nous allons voir la seconde possibilité de simulation : l’utilisation de fichiers de Testbench.
Il s’agit de fichiers VHDL, indiquant quelle entité est testée, et faisant tourner différents processus de
test. L’unité testée est appelée Unit Under Test (UUT), ou encore Device Under Test (DUT). Le code
suivant reprend un fichier pour tester notre entité cardio :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
library ieee ;
library std ;
use i e e e . s t d _ l o g i c _ 1 1 6 4 . a l l ;
use i e e e . s t d _ l o g i c _ t e x t i o . a l l ;
use i e e e . s t d _ l o g i c _ u n s i g n e d . a l l ;
use s t d . t e x t i o . a l l ;
entity test_cardio
end ;
is
architecture test_arch
signal heart
:
signal led_slow
:
signal led_fast
:
signal clk
:
constant clk_cycle :
constant beat_cycle
of test_cardio is
std_logic ;
std_logic ;
std_logic ;
std_logic ;
i n t e g e r := 1 0 0 0 ;
: i n t e g e r := 3 ;
−− D e s c r i p t i o n o f c a r d i o
component c a r d i o
19
20
16
Section 5 - Création et simulation d’un projet
port (
heart
led_slow
led_fast
clk
end component ;
21
22
23
24
25
26
27
28
−− B e g i n i n g o f
begin
DUT : c a r d i o
p o r t map (
heart
=>
l e d _ s l o w =>
l e d _ f a s t =>
clk
=>
29
30
31
32
33
34
35
36
37
38
39
in std_logic ;
out s t d _ l o g i c ;
out s t d _ l o g i c ;
in std_logic ) ;
t h e a r c h i t e c t u r e : p o r t map
heart ,
led_slow ,
led_fast ,
clk ) ;
−− P r o c e s s e s d e c l a r a t i o n
c l k _ s t i m u l u s : process
begin
f o r i in 1 to c l k _ c y c l e loop
c l k <= ’ 0 ’ ;
w a i t f o r 8ms ;
c l k <= ’ 1 ’ ;
w a i t f o r 8ms ;
end l o o p ;
wait ;
end p r o c e s s c l k _ s t i m u l u s ;
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
:
:
:
:
ELEN0040
heart_stimulus : process
begin
−− H e a r t s t i m u l u s h e r e
wait ;
end p r o c e s s h e a r t _ s t i m u l u s ;
end a r c h i t e c t u r e t e s t _ a r c h ;
La structure du fichier est la suivante :
—
—
—
—
Déclaration d’une entité vide pour la simulation,
Déclaration des signaux internes qui correspondent aux entrées/sorties de la DUT,
Connection de la DUT au sein de notre entité de simulation,
Déclaration de processus de tests.
Il faut donc voir le Testbench comme une boite noire, dans laquelle on ajoute une autre boite, notre DUT.
Ajoutons le fichier écrit à notre projet. Pour ce faire, créez un nouveau fichier VHDL, copiez le code
ci-dessus et enregistrez le fichier. Ensuite, dans Quartus, faites Assignements → Settings. Dans la fenêtre
qui s’ouvre, choisissez la partie Simulation sous EDA Tools Settings :
17
Section 5 - Création et simulation d’un projet
ELEN0040
Ensuite, dans la partie NativeLink settings, cochez Compile test bench, et cliquez sur le bouton Test
Benches.
Dans la fenêtre qui s’ouvre, faites New afin d’obtenir ceci :
Indiquez, en suivant l’exemple de la capture d’écran, un nom pour le Testbench. Cochez la durée de la
simulation (jusqu’à la fin, ou jusqu’à une certaine période), et enfin, grâce au bouton , allez chercher
votre fichier de test. N’oubliez pas de cliquez sur Add.
Revenez ensuite à la fenêtre principale de Quartus en sauvant bien vos données. Cliquez ensuite sur
. La simulation démarre. Après avoir ajusté le zoom dans la fenêtre Wave grâce aux touches O et I,
vous devriez obtenir ceci :
18
Section 5 - Création et simulation d’un projet
ELEN0040
Comme le montre la capture, votre simulation démarre automatiquement, avec les informations contenues dans le fichier de Testbench. Ici toutefois, le fichier fourni pour ce laboratoire ne contient aucune
information sur le signal heart. Celui-ci apparait donc en rouge.
?
Modifiez le fichier de Testbench fourni pour implémenter votre scénario de test élaboré plus tôt
dans ce laboratoire. Vérifiez que le système se comporte comme souhaité.
La réponse à cette question doit au minimum contenir le code utilisé, les waveforme obtenue, et
une petite analyse détaillant en quelques phrases ce qui se produit (à mettre en rapport avec
la question précédente)
Votre système est maintenant simulé, et fonctionne comme vous le souhaitez. Vous pouvez donc passer
à l’étape de synthèse et de programmation ! Quittez donc ModelSim.
5.3
Analyse et Place & Route du fichier
Analyse
Durant cette étape, le logiciel va analyser votre fichier VHDL et le traduire en éléments logiques.
Pour démarrer l’analyse, il suffit de cliquer sur Analysis & Synthesis dans la fenêtre de tâche. Si cette
opération est réussie, vous devriez voir un petit , comme ceci :
En outre, une fenêtre de rapport de compilation s’est ouverte dans votre espace de travail. Si tel n’est
pas le cas, vérifiez à nouveau votre fichier VHDL.
Dans la fenêtre de message, vous devriez voir un grand nombre d’informations. Cliquez sur le bouton
pour n’inclure que les warnings. Vous devriez voir ceci :
Le premier avertissement n’est pas important, elle nous indique que le programme est utilisé en mode
gratuit. En revanche, les deux autres types d’avertissements sont intéressants. Attardons nous sur l’erreur
numéro 10631. Dans le cas où la signification ne vous apparaît pas tout de suite, il convient d’aller sur
internet pour tenter de trouver une réponse. Ainsi, une aide est disponible en ligne à l’adresse suivante :
19
Section 5 - Création et simulation d’un projet
ELEN0040
http://quartushelp.altera.com/12.1/
Dans ce cas précis, l’aide nous indique qu’un latch(mémoire) a du être ajouté par le compilateur. En
fait, il s’agit des deux registres évoqués lors de l’architecture, permettant de retenir la valeur des leds
de sortie. En effet, il n’est pas écrit explicitement que l’on désire retenir la valeur car on ne met à jour
cette valeur que dans certaines parties du code. Dans ce cas le compilateur introduit des mémoires afin
de conserver leurs valeurs.
Ce comportement est souhaité, on peut donc conserver ces warnings.
?
Essayez de trouver la cause des autres warnings dans l’aide. Expliquez en quelques mots ce
qu’il se passe, pourquoi cela se passe, quelles sont les conséquences possibles, et comment les
enlever.
Une fois le fichier analysé, un grand nombre d’informations sur ce qui a été réalisé est maintenant
disponible. Vous pouvez accéder au rapport de compilation, s’il n’est pas déjà ouvert, avec un clic droit
sur Analysis & Synthesis puis View Report :
Cette fenêtre reprend deux informations capitales :
— Le nombre d’éléments utilisés par votre programme.
— Le nombre d’I/O’s de votre système.
Ces deux nombres doivent bien entendu être compatibles avec le matériel dont vous disposez ! Sinon
il faudra modifier votre code pour utiliser moins de ressources. Vous pouvez aussi, par curiosité, aller voir
les autres parties du rapport, comme le Ressource Usage Summary.
Parmi les autres informations disponibles, il est possible de voir l’implémentation physique du système.
Allez dans Tools → Netlist Viewers → RTL Viewer :
20
Section 5 - Création et simulation d’un projet
ELEN0040
Vous pouvez ici voir la traduction de votre code en terme d’utilisation de registres, multiplexeurs, etc...
Ainsi, le signal heart_old a entraîné l’ajout d’un registre.
?
Cette fonction est très puissante. Grâce aux différents outils de cette fenêtre, essayez de trouver
dans le code VHDL les lignes faisant référence (la première ligne suffit) aux différents registres.
Trouvez aussi les lignes de code faisant référence aux deux signes < (LessThan, comme celui
en rouge sur la figure).
La dernière étape consiste maintenant à assigner les différentes signaux de notre système à des
entrées/sorties du composant. Seules certaines I/O’s de la CPLD sont accessibles sur la carte de développement. Il faudra également indiquer au logiciel que faire des I/O’s non utilisées et enfin indiquer
quelle tension utiliser.
Dans ce projet, il y a deux types de signaux : les signaux classiques, et les signaux d’horloges. Un
signal est considéré comme signal d’horloge par Quartus de manière automatique lorsque vous utilisez
la fonction rising_edge(), entre autre. De plus, il est important de savoir qu’il ne peut y avoir que
deux signaux d’horloge par composant. Vous devez être capable, à partir du code que vous avez écrit,
de déterminer quel signal est un signal d’horloge. Mais vous pouvez avoir confirmation dans Quartus en
allant dans le rapport du Fitter, puis de naviguer dans Ressource Section, Control Signal :
Les différents signaux sont indiqués par une valeur Clock pour le champ Usage.
21
Section 5 - Création et simulation d’un projet
ELEN0040
Maintenant, il faut indiquer au logiciel l’emplacement de chacun de vos signaux sur le composant.
Pour ce faire, cliquez sur le bouton , ce qui ouvre la fenêtre suivante :
Il vous est possible de déplacer un signal (par exemple clk) sur une autre entrée de la CPLD.
Attention toutefois :
— Les horloges de votre système doivent être sur des entrées d’horloges de la CPLD, symbolisées
par ,
— Certaines I/O’s sont réservées (comme celles de programmation par exemple, représentées par )
ou celles d’alimentations (représentées par )
N’oubliez pas de vous référer au schéma de la carte de laboratoire pour placer vos entrées et sorties au
bon endroit.
Les deux timers 555 de la carte de laboratoire sont connectés directement sur les entrées CLK0
et CLK1 de la CPLD. Toutefois, il vous est aussi possible d’utiliser les entrées CLK2 et CLK3
Enfin, vous pouvez également décider de la tension de sortie de la pin, grâce à la colonne I/O
Standard. Vérifiez que tout est en 3.3-V LVTTL (default).
Un mauvais choix de tension sur une entrée pourrait détruire composant !
Dans ce laboratoire, ainsi que dans votre projet, seule une partie des entrées/sorties du composant
sont disponibles sur les connecteurs. Il convient donc de placer vos signaux sur des I/O’s disponibles des
connecteurs P1 et P2 de la carte.
?
22
En vous référant au schéma de la figure 3, listez toutes les pins (en indiquant leur numéro) dont
vous disposez
Section 5 - Création et simulation d’un projet
ELEN0040
La dernière chose à faire est d’indiquer au logiciel que faire avec les I/O’s non utilisées. Par
défaut, la CPLD imposera un 0. Toutefois, ceci pose problème pour les I/O’s 7 et 9 qui sont
reliées aux timers 555 : il y a un risque de conflit entre la valeur imposée par le timer 555 et
celle imposée par la CPLD.
Il convient donc de changer ce comportement par défaut et placer toutes les pins non utilisées en mode
Entrée. Pour faire cela, faites un clic droit sur le nom de la CPLD dans le Project Navigator, et cliquez
sur Device :
Dans la fenêtre qui apparaît, cliquez sur Device and Pin Options. Une nouvelle fenêtre s’affiche : allez
dans la partie Unused Pin. Enfin, dans le menu déroulant intitulé Reserve all unused pins, choisissez As
input tri-stated :
Synthèse du fichier
A ce stade, votre fichier a été codé, simulé et analysé. Il ne reste plus qu’à le synthétiser, c’est-à-dire
le mettre dans une forme compréhensible par la CPLD. Si les deux autres étapes ont été réalisées avec
succès, il y a peu de chance que votre programme ne passe pas cette étape.
Cliquez sur le bouton
pour lancer la compilation complète et enfin obtenir ceci :
A la fin de cette étape, un certain nombre de rapports sont disponibles. Ainsi, il est par exemple
possible de voir la façon dont le programme a été implémenté sur le composant. Pour ce faire, cliquez
sur (chip planer), ce qui ouvre la fenêtre suivante :
23
Section 5 - Création et simulation d’un projet
ELEN0040
Plus un bloc est bleu foncé, plus il est utilisé. Ainsi, dans le programme créé ici, seules 2 unités
logiques sont utilisées. Vous pouvez ainsi vous balader dans le programme afin de voir exactement
comment votre système a été implémenté. Vous pouvez par exemple voir les équations logiques, les
registres, etc. Double cliquer sur un bloc pour voir le détail du bloc. Par exemple :
A chaque fois, il vous est possible de voir où l’élément à été déclaré dans le code, en faisant un clic
droit, puis Locate → Locate in Design File :
24
Section 5 - Création et simulation d’un projet
ELEN0040
Dans un projet plus complexe, vous serez plus que probablement amenés à faire des analyses
de Timing, c’est à dire vérifier le temps que prends le signal pour passer de l’entrée à la sortie
de la CPLD. Ici, il n’y a pas besoin de faire cette analyse, puisque le système est utilisé à une
vitesse très lente.
5.4
Programmation
La toute dernière étape consiste à programmer le composant. Pour se faire, connectez le programmateur à votre ordinateur. Sous Windows, l’installation des pilotes n’est pas forcément automatique :
vous devrez le faire manuellement, en allant dans votre gestionnaire de périphériques, et en indiquant
l’emplacement des drivers. Ceux-ci se trouvent dans le répertoire quartus/drivers de votre installation de
Quartus II.
Ouvrez le programmateur en double-cliquant sur Program Device (Open Programmer), dans la partie
Tasks de Quartus. Une nouvelle fenêtre s’ouvre. Vous pouvez toutefois l’intégrer dans le logiciel sous la
forme d’un onglet en faisant Window → Attach Window.
Cliquez sur le bouton
pour sélectionner et configurer votre programmateur. Une nouvelle
fenêtre s’ouvre, choisissez USB-Blaster dans Currently Selected Hardware :
25
Section 5 - Création et simulation d’un projet
ELEN0040
Faites Close pour revenir à la fenêtre de programmation, cliquez tout simplement sur start pour
démarrer la programmation. Si tout s’est bien passé, votre composant est programmé !
Placez le potentiomètre CLK0 à fond à droite (lorsque vous êtes face à la carte) , et déplacez le
curseur de l’autre potentiomètre. Observez les changements.
La fréquence minimale/maximale est obtenue en plaçant le curseur à fond à droite/gauche
respectivement.
En pratique la fréquence minimale de la clock heart est de l’ordre de 1.4 Hz ce qui ne permet
pas de descendre jusque 45 bpm. Une solution consiste à diviser la fréquence du signal heart
par deux au moyen du process ci-dessous. N’oubliez pas de déclarer un nouveau signal heart2
et d’utiliser ce nouveau signal à la place de heart
1
2
3
4
5
6
heart_div2 : process ( heart )
begin
i f ( rising_edge ( heart ) ) then
h e a r t 2 <= n o t ( h e a r t 2 ) ;
end i f ;
end p r o c e s s h e a r t _ d i v 2 ;
La plage de fréquence des horloges peut varier d’une carte à l’autre, commencez par mesurer
celle-ci à l’oscilloscope a . Fixez la clock à 80 Hz. Déterminez la valeur du compteur correspondant à 150 bpm et 45 bpm. Changez les seuils obtenus dans le programme VHDL. Afin
de déterminer les valeurs seuils, il est utile d’afficher la valeur du compteur en binaire sur les
LEDs. Pour ce faire, utilisez la ligne de code : leds( 6 downto 0 ) <= std_logic_vector(
to_unsigned( cnt , 7 )
a. En pratique il est interdit de mesurer la fréquence directement sur la carte, vous devez faire sortir le signal
CLOCK0 ou CLOCK1 sur une des I/O’s du composant menant vers P1/P2
26
Section 6 - Exercice
6
ELEN0040
Exercice
Pour cet exercice, vous devrez faire une version améliorée cardiogramme. En effet, à la place d’une
LED indiquant un rythme cardiaque trop faible et une LED indiquant un rythme cardiaque trop élevé,
vous allez réaliser un système avec 8 LEDs. Le nombre de LEDs allumées doit être proportionnel au
rythme cardiaque. Les fréquences cardiaque intermédiaires sont à votre appréciation, mais l’évolution de
l’allumage des LEDs doit être proportionnel au rythme cardiaque. De plus, les deux seuils de danger
(environ 45bpm et 200bpm) doivent être présentés comme la figure 4 :
45bpm
200bpm
Figure 4 – Huits LEDs avec deux niveaux de danger
Doit se trouver dans votre rapport :
— Le code VHDL du système,
— Le code du TestBench utilisé,
— Une petite analyse des résultats de la simulation
— La réponse aux questions posées tout au long de ce labo
Veillez à utiliser un nombre minimum de ressources. Par exemple, ce système est implémentable
avec moins de 22LE. Tout design au dessus de 25LE souffrira d’un malus lors de la cotation !
27