Syst' Emes Num Eriques V4
Syst' Emes Num Eriques V4
Syst' Emes Num Eriques V4
04-02-2013
1
Lobjectif de cet enseignement pratique est une initation aux systemes numeriques, mettant
en uvre les concepts de developpement sur circuits programmables de type FPGA.
Lapplication retenue est la commande dun robot, fabrique a partir dune base Rogue Blue
ERS de chez ROGUE ROBOTICS.
La documentation complete de la carte et des logiciels Quartus, NIOS IDE ainsi que des com-
posants utilises peuvent etre telecharges sue le site du fabriquant http ://www.altera.com/
Ce document comporte un tutorial qui permettra une prise en main rapide dune part de
lenvironnement de developpement materiel Quartus II et dautre part de lenvironnement de
developpement logiciel NIOS IDE.
Ensuite seront developpes dans une serie de manipulations, les points suivants :
Etude et definition de larchitecture du systeme robot
Implantation dun processeur generique
Implantation de circuits dentee-sortie
Implantation dun logiciel de commande de lapplication en langage C
2
1 Decouverte de lenvironnement
1.1 Presentation de la carte de developpement Stratix
3
2 Tutorial pour limplantation du processeur NIOS II
standard
Ce tutorial permet de creer un systeme bati autour dun cur de la famille des processeurs
embarques NIOS II avec de la memoire vive, un port de mise au point JTAG et dun coupleur
parallele (PIO) permettant de piloter des LEDs. Ce premier systeme sera implante et teste sur la
carte developpement Stratix.
4
Il apparat alors (voir figure ci-dessous), un schema (Block Diagram File) avec :
dans la zone Target HDL choisir loption VHDL et cliquer sur OK.
(creation dans le repertoire de travail des fichiers first nios2 system.ptf et de first nios2 system.vhd
Linterface SOPC Builder apparat alors, avec a gauche longlet System Content. Il ne
contient pour le moment aucun element constituant le systeme, il faut tout specifier.
5
4. Specifier dans Target Board Nios Development Board, Stratix (EP1S10)
et verifier que dans Clock(MHz) il y a bien 50.0 qui est la valeur par defaut pour la carte
de developpement Stratix.
5. Nous allons maintenant ajouter le coeur du systeme :
Dans longlet System Content, selectionner NIOS II Processor Altera Corporation,
et cliquer sur Add...
Il apparait alors une fenetre qui permet de choisir le type de processeur NIOS II que lon
souhaite implanter, on choisira ici le modele Standard
Dans la liste des composants disponibles (onglet de gauche : System Content), cliquer sur
Memory et selectionner On-Chip Memory (RAM or ROM) et cliquer sur Add...
6
Il faut maintenant preciser les parametres de la memoire a savoir
ici, une RAM de 32 bits, de taille totale 20 koctets
Il est a noter que le SOPC Builder cree automatiquement les connexions entre le processeur
et la memoire !
8. Ajout du port JTAG :
7
Dans la liste des composants disponibles :
10. Ajout et specification du numero de peripherique (ID Peripheral) Dans la liste des com-
posants disponibles, selectionner dans la categorie Other System ID Peripheral et
cliquer sur Add...
Il ny a pas ici, de parametre a configurer.
11. Ajout et specification des parametres du PIO
A ce stade, tous les composants necessaires ont ete selectionnes et parametres. Cependant,
avant de generer le systeme ainsi defini, il faut encore assigner a chaque peripherique, une
adresse de base et definir les niveaux dinterrruption.
Le systeme est maintenant entierement configure, il ne reste plus qua le generer et le charger
dans le FPGA
13. Pour generer le systeme complet :
Cliquer sur longlet System Generation
Ne pas cocher la case Simulation
8
Cliquer sur Generate pour lancer la compilation.
La compilation dure environ 1 minute et elle nest pas terminee tant que le message
suivant nest pas affiche :
# 2005.12.27 11 :46 :35 (*) SUCCESS : SYSTEM GENERATION COMPLETED.
Press Exit to exit.
14. Cliquer alors sur Exit pour retourner dans lenvironnement de developpement Quartus II
9
4 Integration du systeme dans le projet
Selectionner le composant
first nios2 system et cliquer sur OK
On retourne alors sur le schema, une empreinte du composant etant attachee au pointeur de
la souris. Il suffit de cliquer pour placer le composant. Il ne reste plus alors qua connecter les 3
signaux au composant. Sauvegarder le schema ! ! !
On prendra soin a ce niveau de verifier que le systeme realise est bien associe a la carte de
developpement Stratix. Pour cela dans le menu Assignments, selectionner Device et verifier
dans la fenetre qui souvre que le circuit EP1S10F780C6 est bien selectionne.
10
Dautre part, toujours dans le menu Assignments selectionner Pins et cliquer sur la case To
afin de trier les broches par leur nom.
Pour cela, dans la fenetre Compilation Report, ouvrir Timing Analyzer et cliquer sur
Summary
Remarque : pour faire apparatre (ou supprimer) les noms des broches, aller dans le menu
View et selectionner Show Pins and Location Assignments
11
5.2 Developpement dun programme
Il existe un environnement independant qui permet decrire et de mettre au point les logiciels
a implanter sur la carte de developpement, cest le NIOS II IDE (Integrated Development
Environment)
1. Lancer lapplication NIOS II IDE
2. Avant de creer un nouveau projet, il faut tout dabord vous placer dans votre repertoire
de travail. Pour cela, dans le menu File Switch workspace Browse selectionner
votre repertoire de tracail C :\altera\qdesign51 ...
3. Dans le menu File New Project... choisir dans la fenetre qui apparat C/C++
Application et cliquer sur Next
12
4. Dans la fenetre qui souvre, choisir un projet type dans Select Project Template. Par
exemple Hello World
5. Il faut selectionner la cible sur laquelle vous voulez faire executer ce programme. Pour cela,
dans Select Target Hardware Browse... aller dans votre repertoire de travail et
selectionner le systeme qui vient detre defini et charge dans le FPGA (fichier avec lextension
.ptf)
6. Cliquer sur Finish. Une fenetre hello world.c souvrira alors. Elle contient un fonction main
7. Avant de lancer la compilation, avec le bouton droite de la souris, cliquer sur le nom du
projet dans la fenetre C/C++ Project et selectionner : System Library Properties.
8. Decocher la case Clean Exit et cocher Small C Library . Cliquer sur OK pour fermer la
fenetre.
9. Avant de faire la moindre modification a ce code source, avec le bouton droite, cliquer sur le
nom du projet et lancer Build Projet. Cela permet au compilateur de generer les fichiers
system.h ... de facon a les inclure ensuite dans le code source.
10. Pour lexecuter cliquer sur Run As Nios II Hardware.
11. Dans la fenetre nommee Console, doit safficher Hello from Nios II !
Completer le programme ci-dessus, afin de faire afficher sur les 8 LEDs LEDG[7]..LEDG[0], la
valeur dune variable cmpt qui sera incrementee toute les demi-secondes. La fonction qui permet
de creer une temporisation sappelle usleep(valeur du retard). Determiner experimentalement en
quelle unite sexprime ce retard.
Pour ecrire une valeur dans le registre de donnees du PIO, on utilisera la fonction definie par
Altera : IOWR ALTERA AVALON PIO DATA( ). Son prototype se trouve dans le fichier altera
avalon pio regs.h
Remarque : les types suivant ont ete definis pour utiliser les fonctions developpees par Altera
alt 8 signed char
alt u8 unsigned char
alt 16 signed short
alt u16 unsigned short
alt 32 signed long
alt u32 unsigned long
Ecrire une fonction main() qui contient la declaration locale dun tableau de 5 entiers.
1. Faire une boucle qui permet dafficher les elements du tableau a laide dun pointeur, en
utilisant une syntaxe de la forme : p++. On affichera les elements et leurs adresses.
2. De meme, faire une boucle qui permet dafficher les elements du tableau, en utilisant une
syntaxe de la forme : p+i ou i est lindice de boucle. Interpretation !
3. Ecrire une fonction qui permet dafficher la valeur des elements du tableau, ladresse du
tableau sera passee en parametre.
4. Reprendre les points ci dessus avec un tableau de char
13
6 Gestion des interruptions
Lobjectif ici, est de generer entierement un nouveau systeme qui permettra de lire letat
des 4 interrupteurs SW3..SW0. Le fonctionnement sera prevu dans un premier temps sans inter-
ruptions, afin daborder le fonctionnement du registre de capture de front. Dans un deuxieme
temps, la mise en place et la gestion des interruptions seront abordees.
Avant de recompiler le projet, il faut rajouter sur le schema quatre entrees correspondant aux
interrupteurs SW0..SW3. On verifiera la syntaxe precise du noms de ces entrees dans le menu
Assignement, Pins...
Pour tester la nouvelle fonctionnalite implantee, ecrire un programme en langage C qui permet
dafficher en permanence les valeurs contenues dans les registres EDGE CAPTURE et DATA du
PIO. Dans ce premier programme, les interruptions ne sont pas autorisees.
Pour le tester : appuyer sur linterrupteur SW0 par exemple, observer la valeur affichee. Ap-
puyer ensuite sur SW1, observer la valeur affichee. Interpreter.
Remarque : pour arreter lexcution dun programme : dans la fenetre Console, cliquer sur licone
Terminate.
14
Mise en place des interruptions
La procedure suivante doit etre suivie :
tout dabord, effectuer une remise a zero du registre EDGE CAPTURE pour eviter toute
interruption parasite
Mise en place du sous programme de traitement dinterruption (voir ci-apres)
Autorisation des interruptions par la mise en place du masque dinterruption.
Il existe une fonction dans la bibliotheque HAL (Hardware Abstraction Layer) fournie par Altera,
qui permet de mettre en place un vecteur dinterruption correspondant a un niveau dinterruption
spcecifique : alt irq register().
int alt irq register ( alt u32 id, void* context, void (*isr)(void*, alt u32) )
void nom de votre fonction de traitement des IT(void* context, alt u32 id)
Modifier le programme precedent de facon a prendre en compte une interruption lors dun
appui sur SW1 (et uniquement sur SW1), par exemple.
Remarques :
le fabriquant preconise decrire des fonctions dinterruption comportant peu dinstructions
il est interdit dutiliser des fonctions dentree-sortie standart du langage C, telles que printf(),
dans les fonctions dinterruption (cf page 6.14)
Exercies sur la gestion des interruptions :
1. Lors de lappui sur un interrupteur, incrementation dune variable et affichage sur les LEDs
2. En reprenant le programme precedent, rajouter la decrementation de la variable lors de
lappui sur un autre interrupteur
3. Soit 2 variables v1 et v2, locales a la fonction main(), on souhaite obtenir le fonction-
nement suivant :
v1 v2
Appui sur SW0 1 0
Appui sur SW1 0 1
Appui sur SW2 0 0
4. En reprenant le premier exercice du tutorial : a partir de la valeur 0, incrementation automa-
tique dune variable toutes les 0.5s, on doit maintenant lors dun appui sur un interrupteur
avoir une temporisation de 0,25s (ralentissement). Lors dun second appui sur le meme in-
terrupteur, la temporisation doit revenir a sa valeur initiale de 0,5s (acceleration).
15
7 Generation du signal de commande des LEDs emettrices IR
Au systeme precedemment defini, on souhaite rajouter un circuit temporisateur qui permettra
de generer le signal de commande des LEDs emettrices infra-rouges.
1. Rajouter au systeme un Timer que lon nommera Timer LED IR possedant une sortie
Timeout Pulse qui generera une impulsion a une frequence de 38kHz.
Pour observer ce signal, on le connectera a une broche du port dextension J15 , par exemple
la broche LED IR. La syntaxe precise du nom de la broche sera trouvee dans le menu
Assignments Pins ... cf Tutorial page 11.
2. Ecrire un programme de test qui permet de lire et dafficher les registres de ce circuit tem-
porisateur et du Sys clk timer. Interpreter les resultats.
Masse
+5V
Commande
Le signal de commande est code en PWM, la periode de repetition des impulsions doit etre
denviron 20ms. Selon lallure de ce signal de commande, le fonctionnement suivant peut etre
obtenu :
+5V
lorsque :
t To ' 1,5 ms le moteur est a larret
To To ' 1,0 ms le moteur tourne dans un sens
T # 20ms To ' 2,0 ms le moteur tourne dans le sens oppose
16
8.1 Generation dun signal de commande
Le signal de commande du moteur doit etre du type PWM (Pulse Width Modulation). Il faut
donc rajouter au systeme un composant capable de generer un signal PWM. Altera fournit ce
type de composant sur son site, il nest pas integre par defaut dans la version de base du SOPC
Builder. Nous allons lintegrer en nous aidant de la documentation fournie par Altera.
REMARQUE IMPORTANTE : les fichiers fournis par le constructeur sont ecrits en Verilog.
On ne peut compiler ensemble que des fichiers du meme type. Cela impose donc lors de la definition
dun nouveau systeme devant comporter un module PWM, que celui-ci soit definit en Verilog ( cf
Tutorial page 5, choisir loption Verilog).
1. En suivant les instructions fournies dans le fichier qts qii54007.pdf, inclure dans le SOPC
Builder le composant PWM Avalon Interface.
2. Realiser un programme de test et visualiser le signal
3. Le systeme doit posseder un PIO capable de gerer les boutons poussoirs SW0, SW1 et le
signal de commande dun servomoteur. Le fonctionnement doit etre le suivant :
en absence daction sur SW0 et SW1, le moteur doit etre a larret
une action sur SW0 doit faire tourner le moteur dans un sens
une action sur SW1 doit faire tourner le moteur dans le sens oppose
Pour realiser le test lorsque les moteurs seront connectes, on veillera a ce que les
valeurs extremes de la duree To ne depassent pas 10% de la valeur de reference
1.5 ms ! ! !
17
9 Detection dobstacles & Pilotage
9.1 Detection
La detection dobstacle sera realisee a laide dun detecteur infrarouge TSOP2236 dont la
documentation constructeur est fournie en annexe.
Timer 36kHz
Vcc
470
1
LED IR
TSOP2236
vers IR_PIO
2
9.2 Commande
On souhaite maintenant realiser un systeme qui permette au robot de se deplacer en ligne
droite et de sarreter lorsquun obstacle est detecte. Ce systeme devra en outre comporter un
interrupteur qui permettra darreter le robot a nimporte quel moment (Arret durgence).
18
10 Annexes
Brochages :
LEDG[0]
..
.
LEDG[7]
1 GND 2 +5V
3 DQ(DS1620) 4 CLK(DS1620)
5 RST(DS1620) 6 -
7 - 8 -
9 - 10 -
11 Moteur1 12 Moteur2
13 LED IR 14 DETECT IR
(TSOP2236)
19