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