e2i3 Tp1 Cod Sopc Builder 2012

27
TP1 de Codesign: Conception avec Nios II et SOPC Builder

Transcript of e2i3 Tp1 Cod Sopc Builder 2012

Page 1: e2i3 Tp1 Cod Sopc Builder 2012

TP1 de Codesign: Conception avec Nios II et

SOPC Builder

Page 2: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

2

Objectifs:

- Familiarisation avec l’outil SOPC Builder.

- Création d’un système complet à base du NIOS II.

- Compiler et exécuter du code sur le Nios II. Dans la première partie de ce TP, vous allez apprendre à utiliser les outils (Quartus II et SOPC Builder) qui vont vous permettre de créer votre plate-forme hardware en implémentant le processeur Nios II et un ensemble de périphériques de base. Dans une deuxième partie, vous allez utiliser l’outil NiosII Embedded Design Suite (basé sur Eclipse) qui permet d’écrire et compiler des programmes en C (software) qui vont être exécutés sur cette plate-forme.

Pour tous les TPs, vous allez utiliser la carte d’expérimentation DE2 qui comprend un FPGA

Cyclone 2 de chez Altera et plusieurs composants externes listés ci-dessous : I/O Devices

• Built-in USB-BlasterTM cable for FPGA configuration • 10/100 Ethernet • RS232 • Video Out (VGA 10-bit DAC) • Video In (NTSC/PAL/Multi-format) • USB 2.0 (type A and type B) • PS/2 mouse or keyboard port • Line In/Out, Microphone In (24-bit Audio CODEC) • Expansion headers (76 signal pins) • Infrared port

Memory • 8-MBytes SDRAM, 512K SRAM, 4-MBytes Flash • SD memory card slot

Displays • 16 x 2 LCD display • Eight 7-segment displays

Switches and LEDs • 18 toggle switches • 18 red LEDs • 9 green LEDs • Four debounced pushbutton switches

Clocks • 50 MHz crystal for FPGA clock input • 27 MHz crystal for video applications • External SMA clock input

Page 3: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

3

Partie 1 : Hardware (45 minutes)

Le processeur Nios II est un soft processeur, définit avec un langage de description matérielle, qui peut être implémenté sur les FPGA Altera en utilisant la suite logicielle Quartus II. Pour implémenter un système complet, il est nécessaire d’ajouter d’autres éléments au processeur, tel que des mémoires, des interfaces d’entrées/sorties, des temporisateurs (timers) et des interfaces de communications.

Un système complet à base de Nios II peut être implémenté sur la carte DE2 comme le montre la figure ci-dessous.

Pour ce premier TP, vous allez uniquement implémenter les périphériques de base qui permettent de réaliser des applications simples telles que :

- allumer des LEDs séquentiellement, - lire les valeurs des interrupteurs et des boutons poussoirs. - afficher des valeurs sur les afficheurs 7 segments - communiquer avec le PC via une liaison série de type RS232

Cyclone II FPGA Chip

Host Computer

USB-Blaster Interface

JTAG UART Interface

JTAG Debug Module

NIOS II Processor

Avalon Switch Fabric

On-Chip Memory

SRAM Interface

SDRAM Interface

Flash Interface

Parallel I/O Interface

Serial I/O Interface

SRAM Chip

SDRAM Chip

Flash Chip

Parallel I/O port lines

Serial I/O port lines

Timer

Page 4: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

4

Au niveau hardware, pour réaliser ces applications, vous avez besoin d’implémenter les périphériques suivants (comme le montre la figure ci-dessous) :

- Un µP et une mémoire pour exécuter le programme. - Des entrées/sorties d’usages général (GPIO) pour les LEDs, les interrupteurs, les boutons poussoirs et

les afficheurs 7 segments. - D’un temporisateur pour l’affichage séquentiel sur les LEDs - D’un UART pour les transmissions séries.

Cyclone II FPGA Chip

…………

[LEDR17…LEDR0] [LEDG7…LEDG0]

Host Computer

USB-Blaster Interface

JTAG UART Interface

JTAG Debug Module

NIOS II Processor

Avalon Switch Fabric

SRAM Interface

SRAM Chip

Timer

Switches and Key parallel input

interface

………..

[SW17..SW0] [KEY3..KEY0]

Red and Green LEDs parallel

output interface

7 segments parallel output interface

…………..... HEX7 HEX0

Page 5: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

5

Vous allez découvrir à travers cet exercice la suite logicielle d’Altera qui permet de faire du Codesign Hard/Soft. Le sujet de cet exercice contient des instructions très précises qu’il faut suivre rigoureusement pour construire votre système.

1. Aller sur le lien suivant : https://www.polytech.upmc.fr/~douze/E2i3/CoD/TP/TP1_SOPC_Builder/ et copier le

fichier E2i3_TP1_SOPCBuilder.zip sur votre ordinateur. Dézipper ce fichier dans un répertoire CoD que vous aurez créer au préalable sur votre disque réseau (H:\CoD\).

2. Lancer QuartusII : Demarrer ���� Programmes ����Programmation ���� ALTERA ���� Quartus II 10.1 ���� Quartus II 10.1 (32 bit). Sur la page d’accueil, Cliquez sur « Create a New Project » afin de créer un nouveau projet. Dans cette première page, cliquez sur Next, sur la seconde page, vous devez choisir le nom de votre projet et son répertoire de travail. A la première ligne, sélectionnez le répertoire précédemment copié sur le disque H (H:\CoD\E2i3_TP1_CoD_SOPCBuilder). Pour le nom, choisissez TP1.

3. Cliquez sur Next, dans cette page vous pouvez ajouter des fichiers (vhdl ou verilog) à votre projet. Dans cet

exercice, vous allez partir de zéro (from scratch) pour construire votre système donc vous n’avez aucun fichier à rajouter.

4. Cliquez sur Next, sur cette page, vous devez choisir le composant programmable (FPGA, CPLD) sur lequel

vous allez implémenter votre circuit numérique. La carte DE2 est munie d’un FPGA Cyclone II EP2C35F672C6, choisissez ce composant dans la liste des composants proposés comme le montre la figure ci-dessous. Ce numéro est toujours écrit sur la partie visible des composants programmable.

Page 6: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

6

5. Cliquez sur Next, dans cette page vous avez la possibilité de spécifier l’utilisation d’autres outils logiciels (que

ceux d’Altera) pour réaliser la simulation ou la synthèse. Il est par exemple possible d’utiliser Modelsim (Mentor Graphics) pour faire les simulations à la place de l’outil de simulation proposé par Altera. Pour cet exercice, laissez la page tel quel et cliquez sur Next.

6. Dans la dernière page, vous avez une synthèse des choix que vous avez faits dans les pages précédentes,

vérifiez que vous vous n’êtes pas trompé et cliquez sur Finish.

7. La synthèse des circuits numériques demande beaucoup de calculs et de ressources processeur et peuvent prendre beaucoup de temps. Pour diminuer au maximum les temps de synthèse, allé dans le menu Assignements ���� Settings, sélectionnez la section Compilation Process Settings dans la fenêtre Category, ensuite vérifier que la case Use Smart Compilation est cochée. Validé et terminé en cliquant sur OK .

Page 7: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

7

8. Une fois que ceci est bien vérifié, vous allez commencer à construire votre système. Démarrer SOPC

Builder en allant sur Tools ���� SOPC Builder… ou en cliquant sur l’icône suivante : La fenêtre Create New System s’ouvre, remplissez le champ System Name avec le nom de votre système (utilisez impérativement le nom niosII ). Vous pouvez aussi choisir le langage HDL de votre choix, VHDL dans votre cas. Valider en cliquant sur OK. Renommez l’horloge clk en clk_in et fixer la valeur à 50 MHz.

9. Vous allez commencer par ajouter le

processeur Nios II à votre système.

Dans la fenêtre de gauche, sélectionnez le Processors � Nios II processor et cliquez sur le bouton Add… Vous avez la possibilité de sélectionnez la version du cœur : économique (Nios II/e), standard (Nios II/s) ou rapide (Nios II/f, f comme fast). En fonction de ce choix, vous avez un processeur plus ou moins puissant mais qui prend aussi plus ou moins de place sur le FPGA.

Sélectionnez la version fast du cœur : Nios II/f (f comme Fast)

Page 8: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

8

Dans l’onglet JTAG Debug Module, vous avez la possibilité de choisir les capacités de débogage du processeur à travers la liaison JTAG. Sélectionnez l’option Level 1. Comme indiqué, le Level 1 vous permet de vous connecter avec la cible à travers la liaison JTAG (JTAG Target Connection) de télécharger le code sur la cible (Download Software), d’avoir des points d’arrêts software (Software Breakpoints). Comme pour le choix de la version du processeur, plus vous choisissez de capacité de mise au point (débogage), plus cela prendra beaucoup de place sur la matrice FPGA. Cliquez sur le bouton Finish et renommez le périphérique en cpu (bouton droit sur le nom du périphérique et choisir Rename).

10. Ensuite vous allez rajouter l’interface pour la mémoire SRAM à votre système. Ce périphérique a été réalisé sur mesure pour la carte DE2, on parle alors de Custom peripheral. Cette mémoire externe permet de stocker le code et les données pour le processeur. Dans la catégorie University_Program����Memory sélectionnez l’élément SRAM/SSRAM Controller et cliquez sur le bouton Add… Cliquez sur Finish et renommez le périphérique en ext_SRAM.

11. Ensuite, vous allez rajouter l’interface série qui permet de télécharger et débugger le code sur la cible, cette

interface permet également de communiquer avec le PC. Dans la catégorie Interface Protocol et ensuite Serial, sélectionnez l’élément JTAG UART et cliquez sur le bouton Add… Cliquez sur Finish et renommez le périphérique en jtag_uart.

Page 9: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

9

12. Ensuite vous allez rajouter l’interface pour les afficheurs 7 segments. Ce périphérique est également un

Custom Peripheral. Dans la catégorie Project, sélectionnez l’élément Display ����DE2 Seven Segs Driver et cliquez sur Add… Cliquez sur Finish et renommez le périphérique en seven_seg.

13. Ensuite, vous allez rajouter l’interface pour les LEDs. Dans la catégorie Peripherals et ensuite

Microcontroller Peripherals , sélectionnez l’élément PIO (Parallel I/O) et cliquez sur le bouton Add… Choisissez une taille de 18 bit avec le mode Output . Cliquez sur Finish et renommez le périphérique en LEDR. Refaites la même opération pour les LEDs Vertes. En choisissant 8 bit au lieu de 18 bit et en le renommant LEDG .

14. Ensuite, vous allez rajouter les interfaces pour les boutons poussoirs (KEY) et pour les interrupteurs (Switch). Dans la même catégorie Peripherals et ensuite Microcontroller Peripherals , sélectionnez encore l’élément PIO (Parallel I/O) et cliquez sur le bouton Add… Choisissez une taille de 3 bit avec le mode Input . Cliquez sur Finish et renommez le périphérique KEY.

15. Refaites la même opération pour les interrupteurs (Switch). En choisissant 18 bit au lieu de 3 bit et en le

renommant Switch. 16. Ensuite, vous allez rajoutez les temporisateurs qui vont vous permettre de faire des opérations séquentielles

sur les LEDs. Dans la catégorie Peripherals et ensuite Microcontroller Peripherals , sélectionnez l’élément Interval Timer et cliquez sur le bouton Add… Laissez les paramètres par défaut et cliquez sur Finish. Renommez le périphérique en sys_clk_timer. Refaites la même opération pour un deuxième timer de plus grande précision. Modifiez l’unité de la période en µsec et cliquez sur Finish. Renommez le périphérique en high_res_timer (il sera utilisé dans les prochains exercices pour mesurer le temps d’exécution de certaines fonctions).

17. Ensuite, vous allez rajoutez l’interface série (UART) qui va vous permettre de communiquer avec un

PC ou une autre cible. Dans la catégorie Interface Protocols et ensuite Serial, sélectionnez l’élément UART et cliquez sur le bouton Add… Laissez les paramètres par défaut et cliquez sur Finish. Renommez le périphérique en uart.

18. Pour s’assurer que toutes les adresses de base sont valides et bien aligné, allez dans le menu System et

cliquez sur Auto-Assign Base Addresses. 19. Pour s’assurer que les IRQ (interruptions) ne sont pas en conflit, allez dans le menu System et cliquez

sur Auto-Assign IRQs. 20. Dans la colonne Module Name Double cliquez sur le cpu (Nios II) déjà rajouté à votre système. En bas

de cette page, vous allez sélectionner les adresses de reset et d’exception. Sélectionnez ext_SRAM pour Reset Vector et ext_SRAM pour Exception Vector. Ensuite cliquez sur le bouton Finish.

Page 10: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

10

Après toutes ces opérations, votre système devrait ressembler à ceci :

21. Vous pouvez maintenant cliquez sur le bouton Generate. SOPC Builder va vous demander si vous

voulez sauvegarder le système. Ensuite le logiciel va générer votre système Nios II fait sur mesure. Cette opération consiste a généré tout le code HDL des IP que vous avez instancié dans SOPC Builder. Cette opération prend un certain temps, pour éviter de perdre du temps, passé à la suite avant d’attendre la fin de la génération.

22. Retournez dans Quartus II. Dans la suite, vous allez instancier le composant créé avec SOPC Builder avec les entrées/sorties du FPGA. Pour cela, vous allez utiliser l’outil graphique de Quartus II. Créez un nouveau fichier graphique en allant sur File ���� New, choisissez Design Files � Block DIagram/SChematic File comme type de fichier. Enregistrez le sous le nom TP1.bdf dans le même répertoire que le projet.

23. Quand SOPC Builder aura terminé, vous allez instanciez le système dans le fichier TP1.bdf. Dans ce schéma, double cliquez n’importe où. Ceci ouvre la fenêtre de Symbol. Développer le répertoire Project et sélectionner le symbole niosII.

Page 11: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

11

24. Cliquez sur le bouton OK et placez le symbole dans le schéma comme indiqué ci-dessous.

25. Maintenant il faut connecter les entrées/sorties du composant niosII avec les entrées/sorties du FPGA.

Pour cela, vous allez utiliser les noms attribués dans le fichier d’assignement. Double cliquez n’importe où. Ceci ouvre la fenêtre de Symbol. Développer le répertoire c:/altera/10.1/quartus/libraries ensuite primitives et puis pin, sélectionnez input .

Page 12: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

12

26. Cliquez sur OK et placez ce port d’entrée à gauche du composant niosII , en face de la clk_in. Double cliquez sur le port et renommer le CLOCK_50 (nom utilisé pour l’entrée de l’horloge de 50 MHz dans le DE2_pin_assignement.csv).

27. Ensuite il faut faire la connexion en cliquant sur l’icône et relier le port d’entrée CLOCK_50 avec l’entrée clk_in du niosII.

28. Pour les ports de plusieurs bits, il faut faire différemment. Par exemple pour l’entrée Switch qui est sur 18 bits. Il faut faire la même manipulation que les étapes 28 et 29 mais pour la nomination du port, il faut écrire SW[17..0] pour préciser qu’il s’agit d’un vecteur de 18 bits. Pour la connexion il faut choisir

l’icône suivante : .

29. Il faut connecter l’entrée reset_n avec un des boutons poussoir de la carte. On doit relié KEY[0..0] avec

reset_n et KEY[3..1] avec l’entrée KEY du composant niosII . Comme le montre l’image ci-dessous.

30. Pour l’entrée de l’UART , il faut choisir le nom UART_RXD .

31. Pour les sorties, choisir output au lieu de input. Il y a un seul port bidirectionnel qui est le bus de données de la mémoire SRAM (sram_dq). Pour celle-ci il faut choisir un port de type bidir . Pour toutes les autres sorties, voir ci-dessous les noms qu’il faut choisir en conformité avec l’assignement des pins. Pour les afficheurs 7 segments, il faut intercaler un inverseur logique. Pour cela, cliquez sur l’icône

et allez dans primitives ���� logic ���� not.

Page 13: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

13

32. Une fois que vous avez connecté toutes les entrées/sorties de votre FPGA dans le composant

schématique TP1.bdf, il faut ajouter ce composant à votre projet et le choisir comme top-level de votre design. Pour cela, allez dans l’onglet Files du Project Navigator. Click droit sur le répertoire Files et sélectionnez Add/Remove Files in your project…, ajoutez le TP1.bdf et cliquez sur Add puis OK . Ensuite click droit sur le TP1.bdf et choisir Set as top-level entity.

33. Maintenant il va falloir connecter les entrées/sorties du composant créée avec SOPC Builder avec les entrées/sorties du FPGA. Pour faciliter cette tache, nous vous fournissons un fichier de configuration (DE2_pin_assignements.csv) qui attribut un nom explicite à chaque numéro de pin du FPGA conformément à l’implémentation du FPGA sur la carte DE2. Pour importer cette configuration dans votre projet, allez sur Assignements ���� Import Assignements et choisissez le fichier DE2_pin_assignements.csv. Pour vérifier que l’importation a bien été effectuée, allez dans Assignements ���� Pin Planner.

34. Maintenant, vous pouvez faire la synthèse de votre design. Depuis le menu Processing, sélectionnez

Start Compilation ou alors, cliquez directement sur l’icône . Après quelques minutes, la fenêtre Compilation Report - Flow summary apparait et vous donne les résultats de la synthèse et du placement routage. Cette page vous renseigne sur la place occupée par votre design dans le FPGA :

• Le nombre d’éléments logiques utilisés (Total Logic element) • Le nombre de registres (Total Registers) • Le nombre de pins (Total Pins) • L’espace mémoire utilisés (Total Memory bits) • Le nombre de multiplieur utilisés (Embedded multiplier 9-bit) • Le nombre de PLL

Page 14: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

14

35. Assurez-vous que la carte est alimentée. Connectez la carte à votre PC avec le câble USB (connecteur

BLASTER de la carte DE2 et pas DEVICE). Lancez le programmateur depuis le menu Tools ����

Programmer ou l’icône . Une fenêtre apparait, cliquez sur OK. Le nom du type de câble (USB-Blaster) doit apparaitre à cotés de Hardware Setup… Ci ce n’est pas le cas, cliquez sur le bouton Hardware Setup. Ensuite sélectionnez votre type de câble dans le menu Currently selected hardware. Une fois que votre câble est sélectionné, fermer la fenêtre en cliquant sur Close.

36. Le fichier TP1.sof devrait déjà être sélectionné dans la fenêtre de programmation. Ci ce n’est pas le cas, cliquez sur le bouton Add File… afin de le sélectionner. Cochez la case Program/configure qui correspond à votre fichier .sof et ensuite cliquez sur le bouton Start afin de programmer le FPGA.

37. Si tout va bien, le FPGA est maintenant configuré. Si vous avez une version limité de la licence une fenêtre OpenCore Plus Status doit apparaitre, surtout ne pas appuyer sur Cancel.

38. Vous avez maintenant terminé la partie Hardware et vous allez passer à la partie Software avec l’outil Nios II Software Buil Tool for Eclipse qui est un environnement de développement basé sur Eclipse.

Page 15: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

15

Partie 2 : Software (30 minutes)

1. Dans les étapes suivantes, vous allez compiler un programme pour votre système SOPC, le télécharger dans la carte et l’exécuter. Pour cela, retournez dans SOPC Builder, ouvrir l’outil NiosII SBT à partir du menu Nios II ���� Nios II Software Build Tool. Au démarrage on vous demande de sélectionner le répertoire de travail. Choisissez le répertoire /E2i3_TP1_CoD_SOPC_Builder/software.

2. Créer un nouveau projet en sélectionnant File � New ���� Nios II Application and BSP from

Template dans la barre des menus. Dans la partie Target Hardware Information , vous devez spécifiez par un fichier .sopcinfo qu’elle est la cible sur laquelle vous allez développer. Il s’agit de la cible que nous venons de créer avec SOPC Builder précédemment. Naviguez vers le chemin de votre projet afin de sélectionner le fichier niosII.sopcinfo. Ensuite choisissez le nom de votre projet (niosII_training_project par exemple). Dans la partie Select Project Template, choisissez Blank Project. Cliquez sur Finish.

Page 16: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

16

3. Vous avez maintenant créez deux nouveaux répertoires, un projet C/C++

(nios_training_project) et un projet qui contient les librairies pour votre système (niosII_training_project_bsp). Cependant, le projet C/C++ est vide et nous devons y ajouter des codes sources. Pour ajouter le fichier simple.c à votre projet, d’abord développer le répertoire niosII_training_project . Ensuite naviguer sur votre disque réseau H: et trouver le fichier simple.c (voir dans le répertoire software). « drag and drop » le fichier simple.c dans le répertoire niosII_training_project dans l’IDE Nios II comme le montre la figure ci-dessous.

Page 17: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

17

4. Maintenant, sélectionnez le répertoire niosII_training_project_bsp, faites un click droit et choisissez NiosII ����BSP Editor. Dans cette page, vous pouvez choisir toutes les propriétés de votre système. Assurez-vous que stdout, stderr et stdin soit configuré sur jtag_uart . Ce choix de configuration signifie que le JTAG est la sortie standard de votre système. Dans ce cas, les fonctions printf() ou scanf() permettent d’écrire ou de lire des données sur le bus série du JTAG. Vérifiez que sys_clk-timer soit configuré avec sys_clk_timer et que Timestamp_timer soit configuré avec high_res_timer. Cliquez sur Generate et ensuite Exit.

Page 18: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

18

5. Maintenant vous allez compiler le code, pour cela, sélectionnez le répertoire niosII_training_project, ensuite avec le clic droit sélectionnez Build Project ou alors cliquez

sur l’icône suivante : Note : Vous pouvez faire en sorte que la compilation soit faite en arrière plan (background), ou alors laisser l’exécution de cette tache en premier plan (forground). Lorsque la compilation s’exécute en arrière plan, vous avez la possibilité d’utiliser l’outil pour faire d’autres opérations.

6. Après que la compilation soit terminée, il faut télécharger le programme sur la cible. Pour cela sélectionner le répertoire niosII_training_project, avec le clic droit sélectionnez Run As ���� Nios II Hardware. Note 1 : Si une fenêtre s’ouvre, allez dans l’onglet Target Connection et cliquez sur Refresh Connections et dans System ID Check cochez les deux cases Ignore Mismatched System ID et Ignore Mismatched System TimeStamp et enfin cliquez sur Run

Cette commande va télécharger le programme vers la cible et l’exécuter. Vous devriez observer sur la console le message Hello World ! Vous devriez également voir les LEDs vertes clignoter. Maintenant modifiez la valeur sur les interrupteurs et vérifiez que le résultat est recopié sur les LEDs rouges. Dans le programme simple.c, vous avez des fonctions qui permettent de lire ou d’écrire sur les interfaces d’entrées sorties. Pour la lecture des switch: sw=IORD_ALTERA_AVALON_PIO_DATA(SWITCH_BASE); Pour l’écriture sur les LEDR : IOWR_ALTERA_AVALON_PIO_DATA (LEDR_BASE,sw); Dans les 2 cas le paramètre NOM_DU_PERIPHERIQUE_BASE correspond à l’adresse du périphérique dans l’espace adressable du Nios II. Vous pouvez retrouver la valeur de cette adresse dans le fichier system.h. Ce fichier renseigne sur les paramètres de votre système. Pour l’ouvrir, allez sur le répertoire NiosII_training_project_bsp ���� System.h Par exemple, relevez l’adresse de SWITCH_BASE et vérifiez que c’est bien la même que celle spécifié dans SOPC Builder. Le périphérique SEVEN_SEG est composé de plusieurs registres d’écriture pour cette raison il faut rajouter un offset dans l’adresse pour écrire sur les différents registres du périphérique. Pour avoir plus de détail sur ce périphérique, vous pouvez examiner le code VHDL de ce

Page 19: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

19

périphérique (voir le fichier de2_sevensegs.vhd dans le répertoire de2sevensegs). En effet, ce périphérique n’est pas fourni par Altera, il a été fait sur mesure pour la carte DE2.

7. Maintenant, vous allez tester le debugger. Lancer le debugger en sélectionnant le répertoire niosII_training_project . Ensuite avec le clic droit sélectionnez Debug As ���� Nios II Hardware. Le debugger va se lancer, se connecter et télécharger le code sur la cible. (Choisir Yes lorsqu’on va vous demander de changer de perspective pour le debug).

8. Activer l’affichage des numéros de ligne. Pour cela, allez sur Window dans le menu et ensuite

Préférences. Ouvrir le répertoire General et ensuite sélectionnez Editors ���� Text Editors. Activer le carré Show line numbers et puis appuyer sur OK .

9. Positionnez des points d’arrêts sur les lignes 27 e 31. Pour positionner un point d’arrêt, il suffit de placer le curseur dans la partie grise à gauche des numéros de ligne et faire un double click. Un petit rond bleu doit normalement apparaitre à cotés du numéro de ligne indiquant qu’un

point d’arrêt a été positionné. Cliquez sur le bouton resume . Le programme s’arrête sur le premier point d’arrêt à la ligne 27.

10. Maintenant, sélectionnez la fenêtre Variables et visualiser la valeur de la variable sw. Pour afficher la valeur en hexadécimal, sélectionnez la variable sw, avec un clic droit choisissez

Page 20: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

20

Format et ensuite Hexadécimal. Vérifiez que la valeur de sw correspond à la position des interrupteurs sur la carte DE2. Afficher également la valeur de GreenLed en hexadécimal.

11. Vous pouvez également faire du pas à pas avec le debugger. Pour cela appuyer sur l’icône

suivante :

12. En faisant du pas à pas, vous devriez voir la valeur de GreenLed être inversé et les LEDs vertes s’éteindre sur la carte.

13. Changez la position des interrupteurs et en cliquant sur l’icône , vérifiez que la valeur de sw change en conséquence.

14. Pour arrêter le debugger. Allez dans le sous-menu Debug, ensuite faire un clic droit sur le

nom du projet logiciel qui est en train d’être debugger et sélectionnez Terminate and Remove.

15. Pour revenir à la fenêtre de l’IDE, cliquez sur la double flèche en haut à droite de l’écran

et sélectionnez Nios II

Page 21: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

21

Partie 3 : Exercices (45 minutes) Après avoir testé le programme donné en exemple simple.c qui envoie un message sur la liaison série, qui recopie les valeurs des interrupteurs sur les LEDs rouges, qui fait clignoter les LEDs vertes et qui affiche des valeurs quelconques sur les afficheurs 7 segments, modifier ce code pour répondre aux questions suivantes :

1. Envoyez de manière continu la valeur des interrupteurs (sw) sur la console (avec la fonction printf()) et générez un chenillard sur les LEDs vertes.

2. Ecrire un programme qui permet de commander la valeur des LEDs vertes, des LEDs rouges et les valeurs à afficher sur les afficheurs 7 segments à partir de la console de l’IDE. Pour cela il faut utiliser la fonction scanf(). Pour que les commandes soient décodées correctement par la cible, il faut inventer un codage explicite. Par exemple :

• pour afficher la valeur 100 sur les LEDs vertes, envoyer la commande g 100 (g comme green) • pour afficher la valeur 100 sur les LEDs rouges, envoyer la commande r 100 (r comme red) • pour afficher la valeur 3 sur l’afficheur HEX0, envoyer la commande h0 3. • pour afficher la valeur 9 sur l’afficheur HEX5, envoyer la commande h5 9. • Etc…

3. Faire un chenillard sur les LEDs vertes commandé en vitesse par les boutons poussoirs (KEY). Par exemple,

le défilement du chenillard s’accélère si vous appuyez sur le bouton poussoir KEY [3], et le défilement ralentit si vous appuyez sur le bouton poussoir KEY [2]. Attention ! les boutons poussoir sont à l’état haut au repos et KEY [0] est utilisé comme reset du système.

Page 22: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

22

Custom Peripherals Cette partie consiste à reprendre l’architecture matérielle créée pendant la première partie et y

rajouter un périphérique personnalisé (Custom Peripheral) qui va permettre de commander les LEDs vertes en intensité.

Pour apprendre à créer un périphérique personnalisé avec la suite logicielle d’Altera, vous allez fabriquer un périphérique PWM qui va permettre de commander les LEDs vertes en intensité. Au lieu de les commander en tout ou rien, vous allez pouvoir commander l’intensité lumineuse des LEDG en modifiant le rapport cyclique du périphérique PWM.

Pour réaliser ce périphérique, on vous fournit le code VHDL du composant. Avant de commencer,

examiner le code VHDL de ce périphérique (avalon_pwm.vhd) afin de comprendre comment il fonctionne.

Dans les étapes suivantes, vous apprendrez comment insérer ce périphérique dans SOPC Builder, comment l’ajouter à votre système et comment doit être écrit le code C qui permet d’utiliser ce périphérique.

Dans une deuxième partie vous allez écrire un programme qui permet de générer un battement de cœur (HeartBeat) sur les LEDs vertes.

Page 23: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

23

Partie 4 : Création d’un périphérique personnalisé : Custom Peripheral (30 minutes)

1. Dans SOPC Builder sur la colonne Use de la liste des périphériques de votre système. Désélectionnez la

case correspondant aux LEDs vertes (LEDG). Nous désélectionnons ce périphériques car nous allons maintenant piloter les LEDs à partir du périphérique PWM que vous allez créer dans cette partie.

2. Vous allez maintenant créez un composant pour SOPC Builder à partir du code VHDL. Dans le menu File,

sélectionnez New Component et allez vers l’onglet HDL Files.

3. Cliquez sur Add et naviguer vers le fichier “avalon_pwm.vhd”. Cliquez sur Open.

4. SOPC Builder exécute l’analyseur de Quartus II pour vérifier qu’il n’y a pas d’erreur de syntaxe dans le code. Cliquez sur Close.

5. Assurez-vous que le Top Level Module pointe bien sur avalon_pwm.

Page 24: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

24

6. Allez sur l’onglet Interfaces, dans la section Avalon Slave Settings, positionnez les valeurs de Read Wait et Write Wait à 0.

7. Allez sur l’onglet Signals, pour le signal nommé out_port de la colonne Name, dans la colonne Interface, en face de out_port, sélectionnez new Conduit…

8. Positionnez la colonne Interface et la colonne Signal Types comme dans la figure ci-dessous :

L’onglet Interface permet de définir les interfaces de votre composant, dans votre cas, vous avez 2 interfaces : - Une interface “export_0”(Conduit Output) qui correspond à la sortie de votre module PWM et qui

sera connecté avec les LEDs - Une interface “avalon_slave_0”(Avalon Slave) qui correspond à l’interface connecté avec le bus

avalon. Le paramètre slave est mentionné car votre périphérique ce comporte en temps qu’esclave de votre système. Il ne fait qu’exécuter des ordres, il n’en donne pas.

L’onglet Signals permet de définir les connexions entre les ports d’entrées/sorties de l’entité de votre composant avalon_pwm et les signaux du bus avalon.

Page 25: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

25

9. Allez sur l’onglet Library Info , et observez les paramètres par défauts. Positionnez le champ Group sur Peripherals/Microcontroller Peripherals. Ce paramètre représente la catégorie dans laquelle sera rangé votre composant dans SOPC Builder. Ce sera l’endroit ou vous devrez aller chercher votre composant pour l’incorporer à votre système. Dans cet onglet vous pouvez également rajouter des renseignements sur ce périphérique, comme l’auteur ou une url vers la documentation technique, etc… Cliquez sur Finish et ensuite sur Yes, Save

10. Maintenant, dans SOPC Builder allez dans le menu File et sélectionnez Refresh Component List.

11. Localisez le composant avalon_pwm que vous venez de créer et ajoutez le à votre système (Si vous avez bien suivit les instructions, il devrait être dans la catégorie Peripherals ����Microcontroller Peripherals) . Renommer le en avalon_pwm_inst.

12. Avant de générer le système, il est préférable de réaligner les adresses. Pour cela, allez dans System ����

Auto Assign Base Adress.

13. Cliquez sur le bouton Generate pour régénérer votre système.

14. Une fois que le système a été régénéré, allez sur l’éditeur schématique de Quartus II. Sélectionnez le composant niosII et avec le clic droit sélectionnez Update Symbol or Block. Vous devriez observer que les ports sur le symbole ont changé en relation avec les changements que vous avez faits dans SOPC Builder. Il est possible que certaine connexion soient incorrectes après la mise à jour du symbole, modifier le schéma afin de rétablir ces connexions.

15. Sauvegardé le schéma mis à jour (File � Save), et faites la synthèse du nouveau design en cliquant sur . Cliquez sur Ok quand la synthèse est terminé avec succès.

16. Ouvrez le programmateur en cliquant sur . Cochez la case Program/Configure, et cliquez sur le bouton Start pour implémenter le circuit dans le FPGA.

17. Dans SOPC Builder, ouvrez Nios II SBT (Nios II ���� Nios II Software Build Tool), créer un nouveau

projet en allant dans le menu File et sélectionnez New ����NiosII Application and BSP Template.

18. Sélectionnez le bon fichier niosII.sopcinfo. Choisissez niosII_pwm_project comme nom pour votre projet. Dans la partie Select Project Template, sélectionnez Blank Project et cliquez sur Finish.

Pour la suite, on vous a fournit les programmes qui permettent d’utiliser votre nouveau périphérique avalon_pwm. Ouvrez et examinez le fichier pwm.c et le fichier altera_avalon_pwm_regs.h qui se trouve dans le répertoire source_pwm. Vous remarquerez que l’on vous a fournit un fichier .h qui définit quatre fonctions qui permettent de venir lire ou écrire dans les registres duty et divider. Ces fonctions permettent de venir modifier les paramètres de votre périphérique. En l’occurrence, ici cela permet de venir modifier la période et le rapport cyclique de votre signal PWM de sortie.

19. Utilisez l’explorateur Windows et naviguer vers le répertoire source_pwm. Glisser et déposer le fichier

pwm.c et le header qui l’accompagne altera_avalon_pwm_regs.h vers le répertoire niosII_pwm_project dans l’EDS Nios II.

20. Avant de compiler il faut régénérer le BSP qui a été légèrement modifié par l’ajout du Custom Peripheral. Pour cela, clic droit sur le dossier du BSP et sélectionnez NiosII ���� Generate BSP

Page 26: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

26

21. Sélectionnez le répertoire niosII_pwm_project et avec le clic droit sélectionnez Build Project et ensuite

cliquez sur Run in Background.

22. Après que la compilation soit terminée, sélectionnez Run As ���� Nios II Hardware.

23. Le message “Application - PWM ” devrait apparaitre dans la console de l’IDE. Suivit par la question “Please enter an LED intensity between 1 to 4 (0 to exit)”.

24. Cliquez avec la souris sous le texte afin d’y placer le curseur. Ajuster l’intensité des LEDs en tapant 1, 2, 3

ou 4 suivit par la touche Entrée. 25. Si vous tapez 0 sur votre clavier, cela terminera le programme.

Partie 5 : Battement de cœur : HeartBeat (30 minute s) Dans cette cinquième partie, le but est d'afficher sur les vertes LEDs de la carte DE2 un « coeur qui bat» (HeartBeat en anglais). Pour cela, il faut moduler l'intensité perçue par les diodes luminescente par une fonction triangulaire comme ci-contre. Il n'est pas demandé une période très précise, mais une variation « autour » de 1 hertz (entre 0.5 et 2 Hz par exemple).

Remarque : dans la pratique, l'intensité lumineuse perçue n'est pas une fonction linéaire, mais nous négligerons ceci pour cette application simple. Pour que l’œil ne voit pas les allumages et extinctions de la LED, il faut que la période Ton+Toff soit suffisamment faible. Une fréquence d'au moins 50 Hz (Ton+Toff < 20 ms) suffit. D'un autre côté, on évitera également les périodes trop courtes peu compatibles avec les temps de commutation de l'électronique de commande, et génératrices d'interférences. Un bon choix se situe entre 60 Hz (16.7 ms) et 400 Hz (2.5 ms). Pour générer des tempos, il est conseillé d’utiliser la fonction usleep() que vous avez déjà utilisé dans le TP1. Si vous utilisez usleep(), ne pas oublier de rajouter la librairie unistd.h (#include ″unistd.h″). Ecrivez le programme HeartBeat.c qui permet de répondre à ce cahier des charges.

Partie 6 : Périphérique personnalisé et paramétrabl e (30 minutes)

Dans cette partie du TP, on désire rendre le périphérique avalon_pwm paramétrable afin de pouvoir choisir le nombre de bits de sortie lors de l’instanciation du périphérique dans SOPC_Builder.

1. Pour cela, il faut modifiez le code VHDL du composant avalon_pwm afin de le rendre générique. Dans un premier temps, faites une copie du fichier avalon_pwm.vhd et renommer le en avalon_pwm_generic.vhd (renommer également l’entité du composant en avalon_pwm_generic). Ensuite modifier le code de ce composant en rendant la taille du vecteur de sortie out_port modifiable grâce à un paramètre générique N.

~ 1 second

Inte

nsity

0%10

0%

Ton

Toff

Page 27: e2i3 Tp1 Cod Sopc Builder 2012

Polytech’Paris UPMC TP1 : Conception avec Nios II & SOPC Builder

E2i3 : UE Codesign Y. DOUZE

27

2. Créez un nouveau composant dans SOPC Builder en suivant les mêmes étapes que dans la partie 4 du

TP. Vous devriez remarquer que dans ce nouveau composant il est possible de paramétrer la taille du vecteur de sortie.

3. Dans SOPC Builder, sélectionnez Files ���� Refresh Component List

4. Ensuite, remplacez le périphérique LEDR par votre nouveau composant avalon_pwm_generic et choisissez 18 pour la taille du vecteur de sortie (N).

5. Générer votre système dans SOPC Builder, mettez à jour le composant niosII dans le schéma de Quartus II et réparer les connexions qui ont été cassé, faites la synthèse dans Quartus II et chargez le circuit sur le FPGA.

6. Dans l’IDE Nios II, modifiez le code C afin de générer un cœur qui bat sur les LEDs rouges.

7. Compilez et testez votre code sur la cible.

Partie 7 : Configuration individuelle de chaque sor tie PWM (30 minutes) Dans cette partie, on désire créer un composant sur lequel il y a plusieurs sorties PWM (8 par exemples)

mais sur lequel on puisse configurer chaque canal individuellement. Au lieu que toutes les sorties PWM aient le même rapport cyclique, on désire pouvoir configuré le rapport cyclique de chaque sortie individuellement.

1. Pour cela, il faut modifiez le code VHDL du composant avalon_pwm. Dans un premier temps, faites

une copie du fichier avalon_pwm.vhd et renommer le en avalon_pwm_8_channels.vhd. Ensuite il faut modifier le code de ce composant afin de pouvoir configurer la période et le rapport cyclique de chaque sortie individuellement. Pour cela, il faut changer la taille du bus d’adresse car les deux registres DIV et DUTY ne suffisent plus pour configurer individuellement chaque sortie PWM. Pour configurer individuellement chaque sortie PWM il faut autant de registre DIV et DUTY que de sorties PWM. Si on choisit 8 sorties PWM, il faut alors 16 registres internes. Ensuite, il faut choisir une adresse pour chaque registre. On choisit par exemple que les 8 adresses basses (0 à 7) soient réservé pour les registres DIV et les 8 adresses hautes (8 à 15) pour les registres DUTY.

2. Créez un nouveau composant dans SOPC Builder en suivant les mêmes étapes que dans la partie 1 du TP.

3. Ensuite, remplacez le périphérique LEDG par votre nouveau composant avalon_pwm_8_channels.

4. Générer votre système dans SOPC Builder, mettez à jour le composant niosII dans le schéma de Quartus II et réparer les connexions qui ont été cassé, faites la synthèse dans Quartus II et chargez le circuit sur le FPGA.

5. Dans l’IDE Nios II, modifiez le code C afin de générer un cœur qui bat sur les LEDs vertes.

6. Compilez et testez votre code sur la cible.