Académique Documents
Professionnel Documents
Culture Documents
Sommaire :
I. Introduction…………………………………………………......................... 2
1. Le processeur Nios II :……………………………………………………. 2
2. Le but du TP………………………………………................................... 2
II. Manipulation………………………………………………………………….3
1. Utilisation de ports d’entrée/sortie……………………………….. 3
2. Calcul de la tension maximale à la sortie du filtre………………... 4
3. Calcul de la tension par programmation………………………….. 4
a. Pour une seule valeur de fréquence……………………………4
b. Pour 50 valeurs de fréquence…………………………………. 6
4. La fonction de transfert du filtre…………………………………... 7
III. Conclusion…………………………………………………………………….9
IV. Liste des figures……………………………………………………………... 10
V. Liste des programmes……………………………………………………... 10
VI. Annexe……………………………………………………………………….. 10
VII. Références………………………………………………………………….. 10
1
Mise en œuvre d'un processeur embarqué processeur NIOSII de Altera
I. Introduction :
1. Le processeur Nios II :
Nios II est un processeur 32-bit embarqué conçu spécialement pour la famille des FPGA
Altera. Nios II incorpore de nombreuses améliorations sur l'architecture d'origine Nios, le
rendant plus adapté pour une large gamme d'applications d'électronique embarqué et systèmes
de contrôle.
L'architecture Nios II est une architecture RISC soft-core qui est mis en œuvre
entièrement dans une FPGA. La nature embarquée de ce type de processeur permet au
concepteur de spécifier et générer un processeur sur mesure pour des besoins d'applications
spécifiques. Les concepteurs peuvent étendre les fonctionnalités de base en y ajoutant une
unité de gestion de mémoire prédéfini, définir des instructions personnalisées ou des
périphériques personnalisés [1] :
2
Mise en œuvre d'un processeur embarqué processeur NIOSII de Altera
Altera propose un logiciel appelé "Embedded Development Suite" (EDS) qui contient un
environnement de développement intégré complet pour gérer le matériel et le programme en
deux étapes distinctes:
2. Le but du TP:
Notons que le programme C complet écrit pendant ce TP est donné sur l’ANNEXE.
II. Manipulation :
L’architecture complète du processeur est donnée par la figure II-1. Dans les paragraphes à
suivre on va la décrire partie par partie selon l’application demandée.
3
Mise en œuvre d'un processeur embarqué processeur NIOSII de Altera
Pour une première analyse de l’architecture, notons que l’entrée clk du processeur est
reliée à la patte CLOCK_50, ce qui garantie que la fréquence du système est bien de 50 MHz.
4
Mise en œuvre d'un processeur embarqué processeur NIOSII de Altera
Ainsi que le reset du processeur est relié à la patte KEY[0] ce qui signifie que l’initialisation
du système est faite par le bouton poussoir le plus faible de la carte DE2 d’Altera.
L’objectif de cette partie est d’afficher par le processeur les valeurs des 8 interrupteurs
SW[7..0] sur les leds vertes LEDG[7..0].Pour cela il faudra prévoir au niveau du processeur,
en plus des éléments décrits précédemment, deux ports d’entrées/sorties (PIO), un configuré
en entrée, l’autre en sortie. Figure II.2 :
Plus la configuration matérielle sur le SOPC Builder il faut aussi générer le programme
C/C++ sous l’environnement "Embedded Development Suite (EDS)" qui va permettre de
contrôler les leds à l’aide des interrupteurs.
#include <stdio.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"
int var;
int main(){
while(1){
var = IORD_ALTERA_AVALON_PIO_DATA(INTERUPT_BASE);
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,var);
5
Mise en œuvre d'un processeur embarqué processeur NIOSII de Altera
à-dire la led destination, et var qui représente la valeur de l’interrupteur (0 ou 1). Cette
fonction permet de contrôler la led selon l’état de l’interrupteur.
Le but de cette partie est de créer une procédure de temporisation logicielle pour faire
clignoter une led. Le teste est fait sur la led LEDG8.
Pour cela il faut prévoir une autre sortie au système. Figure II.3 :
Le sous programme qui assure cette application est donné par Programme 2 :
void Clignoter_Led(){
int i,permut;
if (i>=100000){
i=0;
if (permut){
permut = 0;
}
else {
permut = 1;
}
IOWR_ALTERA_AVALON_PIO_DATA(LEDG8_BASE, permut);
}
else{
i++;
}
}
Ce programme est donné par un compteur qui contrôle la fréquence de clignotement, il permet
de varier la valeur du variable permut de 0 à 1 (ou inversement) si la condition
(i>=100000) est vérifiée. La fonction IOWR_ALTERA_AVALON_PIO_DATA() permet
d’allumer ou éteindre la led LEDG8 selon la valeur de permut ( 0 ou 1).
Dans cette partie on va afficher des nombres sur les afficheurs 7 segments (HEX 7 à HEX 0),
lus en binaire à partir des interrupteurs de la carte.
Pour cela il faut rajouter une entrée sur 15bits qui représente les 15 interrupteurs, et 8 sorties
sur 7 bits chacune pour commander les 8 afficheurs.
Le schéma qui permet de faire cette application est donné par la figure II.4 :
6
Mise en œuvre d'un processeur embarqué processeur NIOSII de Altera
Pour faire la conversion BCD (4bits)/7 segment il faut décrire en VHDL le bloc de
conversion. Le code VHDL est donné par le programme 3.
Entity 7_segment is
port(
E:in bit_vector (3 downto 0);
S:out bit_vector (6 downto 0)
);
end 7_segment;
Maintenant il ne reste qu’à écrire le programme C, à implémenter sur le processeur, pour faire
le traitement.
Le code est donné par le programme 4 :
7
Mise en œuvre d'un processeur embarqué processeur NIOSII de Altera
int main(){
int modulo[8],i;
int val;//nombre décimale de 8 chiffres maximal.
while(1){
val = IORD_ALTERA_AVALON_PIO_DATA(INTERUPT_BASE);
for(i=0;i<=7;i++){
modulo[i]= val%10;//calcul du modulo
val=val/10;
}
/****chaque afficheur reçoit un chiffre ****/
IOWR_ALTERA_AVALON_PIO_DATA(BCD0_BASE,modulo[0]);
IOWR_ALTERA_AVALON_PIO_DATA(BCD1_BASE,modulo[1]);
IOWR_ALTERA_AVALON_PIO_DATA(BCD2_BASE,modulo[2]);
IOWR_ALTERA_AVALON_PIO_DATA(BCD3_BASE,modulo[3]);
IOWR_ALTERA_AVALON_PIO_DATA(BCD4_BASE,modulo[4]);
IOWR_ALTERA_AVALON_PIO_DATA(BCD5_BASE,modulo[5]);
IOWR_ALTERA_AVALON_PIO_DATA(BCD6_BASE,modulo[6]);
IOWR_ALTERA_AVALON_PIO_DATA(BCD7_BASE,modulo[7]);
}
}
Le programme est donné par une boucle while pour qu’il s’exécute d’une manière
continue.
La variable val reçoit la valeur décimale représentée par les interrupteurs, en utilisant la
fonction IORD_ALTERA_AVALON_PIO_DATA().
La boucle for de 8 itérations, permet pour une première itération de calculer le modulo de
(val/10) puis pour chaque itération on divise le résulta sur 10 et on calcule à nouveau le
modulo, les résulta sont stockées sur le tableau modulo[].
Pour envoyer la valeur donnés par les interrupteurs aux afficheurs, on utilise la fonction
IOWR_ALTERA_AVALON_PIO_DATA(),qui se compose de deux arguments : l’adresse de
base de l’afficheur BCDi_BASE, et la valeur à afficher donner par les valeurs modulo[i]
avec i varie de 0 à 7.
L’objectif de cette partie, est d’utiliser le timer pour calculer les temps d’exécution des
programmes afin d’évaluer les performances des 3 versions des processeurs disponibles.
Figure II.5
8
Mise en œuvre d'un processeur embarqué processeur NIOSII de Altera
A la fin de ce paragraphe on a mis un tableau qui résume les temps d’exécution des
différents programmes selon le processeur utilisé.
9
Mise en œuvre d'un processeur embarqué processeur NIOSII de Altera
int permut,var,Max2,time2,i;
permut = 1;
while (permut == 1) {
permut = 0;
var = tab[i];
tab[i] = tab[i+1];
Programme 6 : tableau trié (valeur max et temps d’execution).
int i,j,N=16;
int x;
for(i=0;i<n;i++){
x=tab[i];
z=0;
v= 1 << 30;
for(j=N-1;j>=0;j--){
Programme 7 : calcul de la racine carré.
10
Mise en œuvre d'un processeur embarqué processeur NIOSII de Altera
III. conclusion :
Le but de ce TP était d’évaluer la qualité du bus GPIB à contrôler les différents
instruments connectés au bus, en étudiant bien sur la caractéristique d’un filtre passe bande.
11
Mise en œuvre d'un processeur embarqué processeur NIOSII de Altera
On a trouvé ce TP très intéressant, car il nous à permis d’une part de mettre en œuvre ce
qu’on a étudié durant les séances de cours, et d’autre par de se familiariser avec la
programmation et le contrôle des différents instruments connecté au bus GPIB, en utilisant un
langage de haut niveau.
12
Mise en œuvre d'un processeur embarqué processeur NIOSII de Altera
V. Annexe:
Cette annexe présent une description des différentes instructions de langage C utiliser
dans ce TP.
1. La fonction ibwrt:
Après l’exécution du programme nous avons constaté que le bus ne donne pas la main à
l’utilisateur de changer les valeurs de l’instrument.
Syntaxe :
Exemples:
a- ibwrt(gene,"*cls",4);
b- ibwrt(gene,"freq 18 KHZ",11);
c- ibwrt(gene,"volt 4V",7);
Cette instruction permet de fixer la tension du générateur à 4V, la commande est sur 7 octets.
d- ibwrt(gene,buff2,11);
Dans le paragraphe III-2.3.b, on a utilisé une boucle For pour varier la fréquence du
générateur de 0 à 50. Dans chaque itération la valeur de la fréquence est stockée dans un
deuxième buffer en utilisant l’instruction :
sprintf(buff2,"freq %d KHZ",i);
13
Mise en œuvre d'un processeur embarqué processeur NIOSII de Altera
Par la suite la fonction «ibwrt » envoi au générateur la valeur stockée dans buff2.
e- ibwrt(multi,"R0V1",4);
Cette instruction envoie au multimètre la commande R0V1, cette commande est sur 4 octets et
elle permet d’une part de faire un réglage automatique de gamme du multimètre (le message
R0), et d’autre part d’activer un cycle de mesure rapide (le message V1).
f- ibwrt(multi,"X1",2);
La fonction «ibwrt» envoie au multimètre la commande X1, qui est sur 2 octets, pour qu’il
face une seule mesure de tension.
g- ibwrt(multi,"?",1);
h- ibwrt(multi,"R0S1T1F2",8);
2. La fonction ibrd:
La fonction «ibrd » permet de lire les données en provenance de l’instrument et les stocker
dans un buffer.
Syntaxe :
14
Mise en œuvre d'un processeur embarqué processeur NIOSII de Altera
Exemples:
ibrd(multi,buff,18);
Rappelons que l’objectif de ce TP est de calculer la tension en sortie du filtre afin de tracer ca
fonction de transfert, cette tension est donnée par le multimètre.
Donc dans cet exemple, la fonction « ibrd » permet de stocker la valeur calculée par le
multimètre, dans un buffer de 18 octets.
printf("results: %s \n",buff);
15