Université Joseph Fourier Année 2014/2015 Master 1 Informatique Option Introduction à la modélisation et à la vérification des systèmes numériques Planche de TP n 4 Synthèse FPGA avec Quartus (http://www.altera.com/) Nous allons finir la conception du système de contrôle pour un four à micro-ondes par sa synthèse FPGA sur carte Altera Cyclone II DE1. Vous vous placerez dans le répertoire projet_fpga et exécuterez (source) au préalable le fichier.bashrc_quartus11_1. 1. Avant de pouvoir procéder à cette synthèse sur FPGA, il faut adapter votre description VHDL en conséquence. Nous allons utiliser divers dispositifs d'entrées/sorties (voir dessin ci-dessous) : - les entrées primaires Half_power, Full_power, Start, s30, s60, s120, Time_set, Door_open seront activées par les switches (on allumera également la led rouge associée) - l'état de la FSM sera affiché sur l'afficheur 7 segments de droite (hex0) - on allumera des leds vertes (à droite) pour faire apparaître les passages à '1' des sorties Full, Half, In_light, Finished. - les binômes qui ont réalisé le compteur pourront le synthétiser aussi, et afficher sa valeur sur les afficheurs 7 segments de gauche (hex3 à hex1). Les autres binômes devront ajouter l'entrée Timeout comme une entrée primaire.
L'entité du système devra être modifiée comme suit pour prévoir les interactions avec les dispositifs d'entrées/sorties : entity Oven is port(reset, clk, Half_power, Full_power, Start, s30, s60, s120, Time_set, Door_open: in std_logic; Full, Half, In_light, Finished: out std_logic; LEDR : out std_logic_vector(7 downto 0); -- pour leds rouges LEDG : out std_logic_vector(3 downto 0); -- pour leds vertes seg_val_hex0: out INTEGER range 0 to 127; -- pour affichage etat seg_val_hex1: out INTEGER range 0 to 127; -- pour affichage cpt seg_val_hex2: out INTEGER range 0 to 127; -- pour affichage cpt ); end Oven; seg_val_hex3: out INTEGER range 0 to 127 -- pour affichage cpt Afin de fournir les informations nécessaires sur le brochage de la carte, l'architecture de l'entité ci-dessus devra contenir des déclarations telles que ci-dessous (à compléter, voir les explications concernant l'attribut chip_pin à http://quartushelp.altera.com/13.0/mergedprojects/ hdl/vhdl/vhdl_file_dir_chip.htm et les informations fournies plus bas et en annexe) : attribute chip_pin : string; attribute chip_pin of reset : signal is "R22"; -- bouton poussoir de droite attribute chip_pin of clk : signal is "L1"; -- 50 MHz internal quartz -- attribution des entrées aux switches (par ex ici de gauche à droite) : attribute chip_pin of Half_power: signal is "M2"; -- SW 7 attribute chip_pin of Full_power : signal is "U11"; -- SW 6 attribute chip_pin of Start : signal is "U12"; -- SW 5 -- et ainsi de suite... (à compléter) -- descriptif des afficheurs 7 segments : attribute chip_pin of seg_val_hex0 : signal is "J2,J1,H2,H1,F2,F1,E2"; -- idem pour seg_val_hex1 et seg_val_hex3, à compléter (voir ci-dessous) -- attribution des sorties LEDR et LEDG aux leds (par ex ici de gauche à -- droite) : attribute chip_pin of LEDR : signal is "U18,Y18,V19,T18,Y19,U19,R19,R20"; -- idem pour LEDG (à compléter) Noter que, sur cette carte, les pins des afficheurs 7 segments sont définis comme suit :
L'entité et l'architecture vont devoir être modifiées afin d'afficher l'état symbolique sur les afficheurs 7 segments, et éclairer les leds. Dans l'état symbolique auquel on choisira d'attribuer la valeur 0, la sortie seq_val_hex0 sera affectée comme suit : seg_val_hex0 <= 2#0000001#; -- 0 et on fera de même les affectations suivantes dans les états auxquels on attribuera 1, 2, etc seg_val_hex0 <= 2#1001111#; -- 1 seg_val_hex0 <= 2#0010010#; -- 2 seg_val_hex0 <= 2#0000110#; -- 3 seg_val_hex0 <= 2#1001100#; -- 4 seg_val_hex0 <= 2#0100100#; -- 5 seg_val_hex0 <= 2#0100000#; -- 6 seg_val_hex0 <= 2#0001111#; -- 7 seg_val_hex0 <= 2#0000000#; -- 8 seg_val_hex0 <= 2#0000100#; -- 9 Pour l'allumage des leds rouges selon les valeurs des entrées, on pourra faire : LEDR(7) <= Half_power; LEDR(6) <= Full_power; -- et ainsi de suite (bien noter l'ordre choisi). On pensera également à l'allumage des leds vertes en fonction des valeurs des sorties. Attention à maintenir à '0' toutes les leds inutilisées. Enfin, il faudra modifier la description utilisée jusqu'ici afin d'avoir des resets actifs bas, et d'utiliser une horloge ralentie en divisant l'horloge de synchronisation (quartz à 50 MHz) en utilisant le process diviseur suivant : -- Diviseur Quartz 50Mhz PROCESS (clk) VARIABLE cnt : INTEGER RANGE 0 TO 67108863; CONSTANT verrou_t : INTEGER := 50000000; BEGIN IF (clk'event AND clk = '1') THEN IF (reset = '0') OR (cnt = verrou_t ) THEN cnt := 0; ELSE cnt := cnt + 1; END IF; END IF; IF (cnt = verrou_t ) THEN ck_1hz <= '1'; -- ck_1hz signal local ELSE ck_1hz <= '0'; END IF; END PROCESS; 2. On pourra alors procéder à la synthèse et aux tests. Lancer l'outil de synthèse par la commande quartus. Lors de sa première exécution, il est conseillé de faire Tools options, et de décocher "show welcome screen" et cocher "re-open current project at startup". Pour créer un nouveau projet, faire File New project wizard, puis bouton Next; choisir un répertoire et un nom de projet (et bouton Next); choisir les fichiers à inclure dans le projet (et bouton Next); choisir Family et Device comme indiqué sur la copie d'écran ci-dessous (et bouton
Next); sur l'écran suivant faire Next; et enfin finir par Finish. Il faut alors cliquer sur le nom du projet, faire File Open et ouvrir le fichier contenant la top cell, et faire Project Set as top-level entity (attention : le nom de l'entity doit être identique au préfixe du nom du fichier qui la contient). Puis faire Assignments Device, cliquer sur le bouton Device and Pin Options, puis choisir l'onglet Unused pins, et dans le menu déroulant sélectionner "As input tri-stated". On peut alors lancer la compilation par Processing Start compilation. Il faudra s'assurer que la compilation n'a pas échoué, et noter alors le nombre de CLB et de flipflops occupés (voir ex. ci-dessous).
A noter que le menu Tools Netlist_Viewers RTL Viewer vous permet aussi de visualiser le système synthétisé (double-cliquer sur un composant vous permet d'en voir le contenu). Il est alors possible de programmer la FPGA (via la connexion USB) et de procéder aux tests. Utiliser le menu Tools Programmer, cliquer sur le bouton Hardware Setup et sélectionner USB_Blaster, puis cliquer sur le bouton Start (attention, la case à cocher Program/Configure doit être cochée). Une fois la carte configurée, vous pouvez procéder aux manipulations (les entrées seront modifiées grâce aux switches, vous pourrez recommencer les manipulations à tout moment après avoir fait un reset). A rendre : - à la fin du TP : votre description VHDL modifiée pour la synthèse sur FPGA (commenter clairement les modifications) + une indication sur les résultats de synthèse (nombre de blocs logiques, registres) et sur l'exécution sur FPGA : qu'avez-vous pu tester, et avec quelles manipulations? Est-ce cohérent par rapport au comportement attendu? - avant le 30 Avril soir (par mail à Laurence Pierre) : le rapport sur toute la conception de cet exemple, depuis la spécification jusqu'à la synthèse (aux différentes synthèses plus exactement, avec analyse de leurs résultats), en passant par la vérification d'assertions. Ce rapport devra faire le point sur tout ce processus, et relater clairement toute votre démarche. En particulier, un aspect important est lié à la validation durant tout le processus de conception : avez-vous détecté et corrigé des erreurs durant la simulation initiale, grâce aux assertions, après visualisation des résultats de synthèse, et si oui de quels types et grâce à quelles observations? Les sections recommandées pour ce rapport sont : 1) Introduction : contexte et objectifs de ce projet, quelles méthodes d'eda doit-il illustrer? comment?, etc Caractéristiques de l'étude de cas traitée dans ce projet, que permet-elle d'illustrer sur la modélisation des systèmes matériels?, etc... 2) Modélisation et simulation de l'étude de cas : présentation de l'étude de cas, explication de la modélisation VHDL, validation : choix des scénarios de test utilisés et résultats de couverture associés, et résultats de simulation (chronogrammes lisibles) commentés 3) Synthèse ASIC : résultats de synthèse comparatifs commentés (codage utilisé par l'outil, nombre de flips-flops et pourquoi, surface du circuit, fréquence d'horloge, ) avec conclusions, et résultats comparatifs de simulation commentés (reconnaît-on la concordance des états et sorties?). 4) Validation avec assertions PSL : propriétés PSL avant et après synthèse commentées avec soin, résultats de simulation avec ces propriétés (copies commentées des chronogrammes) : qu'avez-vous observé? Est-ce cohérent par rapport à votre design? A-t-il été corrigé à cette étape et comment? Vos scénarios ont-ils dû être revus pour permettre toutes les vérifications de façon pertinente?... 5) Synthèse FPGA : modifications des descriptions VHDL pour cette synthèse sur FPGA et pourquoi, résultats de synthèse (nombre de blocs logiques, registres), scénarios exécutés sur FPGA et conclusions de ces observations, comparaison par rapport à la synthèse ASIC, avez-vous encore corrigé des erreurs à cette étape?, 6) Conclusions sur la démarche de conception et les outils utilisés dans ce projet, que permettent-ils de faire, que ne permettent-ils pas, comment se présenterait un processus plus complet?... NB. Ne mettre en annexe que les compléments d'information (sources VHDL commentés des testbenches, rapports produits par Leonardo Spectrum, ), pas les informations essentielles à la compréhension du sujet et du travail réalisé, ni les résultats de simulation et synthèse et leur analyse!
Annexe.