Академический Документы
Профессиональный Документы
Культура Документы
Chapitre I.
Chapitre II.
Chapitre III.
DESIGN 1
UTILISATION DE QUARTUS II
Dfinition de votre rpertoire de travail
Crez un rpertoire votre nom dans D:\TP_A2\
Dans le nom nutilisez que les caractres alphanumriques et le soulign.
Exemple : D:\TP_A2\Dupont_et_Durand
Dmarrage de QUARTUS II
Renseigner le nom de votre rpertoire (pour viter les erreurs de frappe, utiliser le browser
en cliquant sur le bouton situ droite de la fentre), et indiquer le nom du projet que vous
souhaitez crer : par exemple : max3k.
Cliquer sur Next
Puis InsertSymbol
Draws orthogonal
bus lines
Symbol Tool
Crer le schma suivant en utilisant licne Draws Orthogonal bus lines pour tracer les
interconnexions entre les composants.
Sauvegarder le fichier. Le logiciel va vous proposer le nom du projet < max3k> que vous
avez rentr la cration du projet. Garder ce nom.
il faut maintenant affecter un nom logique aux broches dE/S en double cliquant sur chaque
symbole INPUT et OUTPUT :
COMPILATION
Utiliser le menu Processing Start compilation
Ou cliquer sur le bouton dans la barre des icnes
On obtient lcran :
Sil y a des erreurs (une autre valeur que 0 errors), alors il faut regarder les messages
derreur et vrifier votre schma.
Une pression amne un niveau logique 0 sur lentre logique du CPLD pour les boutons sw1
et sw2, et un niveau logique 1 sur lentre logique du CPLD pour les boutons sw3 et sw4.
Afficheurs :
Circuit :
Les tableaux ci-joint permettent de faire correspondre les E/S aux numros de broche du
composant sur la carte MAX3000 utilise pour les tests..
Dsignation
Bouton sw1
bouton sw2
bouton sw3
bouton sw4
Clock 32.768 MHz
Digit Affich 1
Digit Affich 2
Digit Affich 3
Digit Affich 4
Numro de
broche
24
25
27
28
87
97
98
99
100
Dsignation
Segment_a
Segment_b
Segment_c
Segment_d
Segment_e
Segment_f
Segment_g
Segment_h
10
Numro de
broche
70
71
72
75
76
77
80
79
On obtient la fentre :
11
12
SIMULATION
Avant de vrifier le fonctionnement du schma sur la carte, on va le faire par simulation.
Faire le menu :
Filenewsother files
Puis Vector Waveform
13
Slectionner les signaux E1, E2, SOUT et VSEG (maintenir le bouton <Ctrl> appuy)et
valider la slection avec le bouton indiqu ici.
Remarque : le bouton avec la double flche fait passer tous les signaux dune fentre vers
lautre.
Cliquer sur les boutons Ok jusqu revenir la fentre de dbut
Cliquer sur le bouton <Zoom>, puis dans la fentre centrale, cliquer avec le bouton gauche
(zoom +) ou le bouton droit (zoom -) pour avoir au moins 200 ns de visualisation.
En maintenant le bouton gauche appuy et en glissant la souris, slectionner un rectangle et
appuyer sur <0> ou <1> pour changer le niveau logique assigner lentre E1 ou E2. On
doit configurer E1 et E2 de faon avoir toutes les combinaisons pour vrifier la table de
vrit dune porte logique 2 entres.
Remarque : les entres doivent rester stables 0 ou 1, au mois 30 ns pour chaque
combinaison simuler.
14
Vrifier les rsultats de simulation. On remarquera que le fichier du rsultat de simulation est
diffrent du fichier des vecteurs saisi auparavent.
QUEL EST LE TEMPS DE PROPAGATION DE LA PORTE AND ?
15
TEST REEL
Aprs la simulation, il faut tester en rel sur la carte. Pour cela il faut tlcharger le fichier de
configuration dans le CPLD.
Faire le menu <Tools / Programmer> ou cliquer sur le bouton
16
En cliquant sur ce bouton, on constate quon a les 2 fichiers schmatiques dans le projet.
Donc il faut enlever lancien.
Avec le bouton droit de la souris, cliquer sur le fichier max3k.bdf puis cliquer sur <Remouve
File From Project>.
Gnrateur de MACRO
Pour gnrer une macro il faut faire, dans le fichier de schma, un clic droit puis :
InsertSymbolc:/altera/quartus/librairies/megafunctionarithmeticlpm_counter.
17
Connecter la broche <input> sur lentre CLK du compteur. Cette entre sera affecte la
broche 87 du CPLD. Cette broche 87 est relie sur la carte un oscillateur de 32,768 MHz.
"1000000"
"1111001"
"0100100"
"0110000"
"0011001"
"0010010"
"0000010"
"1111000"
"0000000"
of
dec7seg is
WHEN
WHEN
WHEN
WHEN
WHEN
WHEN
WHEN
WHEN
WHEN
entree = "0000"
entree = x"1"
entree = x"2"
entree = x"3"
entree = x"4"
entree = x"5"
entree = x"6"
entree = x"7"
entree = x"8"
18
ELSE
ELSE
ELSE
ELSE
ELSE
ELSE
else
ELSE
ELSE
"???????" when
"???????" when
"???????" WHEN
"???????" WHEN
"???????" WHEN
"???????" WHEN
"???????" WHEN
"0000000";
end arch_decod;
entree = x"9"
entree = x"a"
entree = x"b"
entree = x"c"
entree = x"d"
entree = x"e"
entree = x"f"
ELSE
ELSE
ELSE
else
ELSE
ELSE
ELSE
En remplaant les ? par des digits 0 ou 1; la figurer ci aprs permet de coder les bonnes
valeurs.
b0
b5
b4
b6
b3
b1
b2
B6 B5 B4 B3 B2 B1 B0 Val
0
0
1
0
0
0
0
9
A
b
C
d
E
F
19
Remarque :
Pour relier deux signaux simples on utilise le trait fin (orthogonal
node tool). Pour relier deux bus (vecteur de plusieurs signaux) on
utilise le trait gras (orthogonal bus tool).
Quand on relie deux bus de taille diffrente il faut donner des noms aux bus donner les
numros utiliss dans le vecteur.
La sortie du compteur est un bus de 28 fils, donc il aura un nom xxx[27..0] ; et lentre du
dcodeur est un bus de 4 fils, donc il aura le mme nom xxx mais avec une dimension [m..n]
avec m > n, m-n+1 = 4 et m et n tant entre 0 et 27. Ici on choisira les 4 bits de poids fort.
20
Dautre part la sortie du dcodeur est un bus de 7 fils qui est reli 7 broches de sortie
individuels. Donc il faut donner un nom au bus de sortie (yyy[6..0]) et donner un nom
chaque fil qui va du bus vers une broche de sortie ; soit le mme nom (yyy) et le numro du fil
(entre 0 et 6). Soit yyy6, yyy5,
21
22
downto
downto
downto
downto
downto
downto
0);
0);
0);
0);
0);
0) );
23
code
code
code
code
<=
<=
<=
<=
ent0;
ent1;
ent2;
ent3;
Les entres ent1 ent4 sont les valeurs visualiser sur les afficheurs 1 4 respectivement. La
sortie seg est la valeur slectionne un instant parmi les 4 entres ent1 ent4. La sortie
naff slectionne lafficheur activer. Le signal clk dfinit la frquence de multiplexage de
laffichage.
Le process Aff_Num slectionne le numro de lafficheur activer. Le process Mux_Aff
slectionne, suivant lafficheur choisi, la valeur afficher (code) et la valeur (naff) pour
activer ce seul afficheur. On remarquera que dans naff, il ny a quun seul bit 0.
Taper le fichier et cre le symbole. Sil ny a pas derreur, instancier le symbole dans le
schma.
Ecriture du Compteur
Il y a 2 possibilit de raliser le module Deci_Compt:
Implanter un compteur binaire classique.
Dans ce cas, les chiffres varieront de 0 F sur les 4 afficheurs. Pour pouvez gnrer ce
compteur avec les MACRO (type lpm_counter).
Crer le symbole, insrer-le dans le schma la place de Deci_Compt; tester sur la carte.
Raliser un compteur dcimal.
On ralisera en vhdl un compteur dcimal sur 4 chiffres. Lentit est :
entity Deci_Compt is port (
clk
: in std_logic;
enb_cnt : in std_logic;
compt
: out std_logic_vector(15 downto 0) );
end Deci_Compt;
24
Pour le transformer en un compteur dcimal il faut tester Count1 pour le remettre 0 quand il
dpasse 10. Ce sera le compteur du chiffre des units.
Faire faire le compteur 4 chiffres (16 bits), il faut ajouter un compteur pour le chiffre des
dizaines qui sincrmente seulement quand le chiffre des units passe de 9 0 ; un compteur
pour le chiffre des centaines qui sincrmente seulement quand le chiffre des dizaines passe
de 9 0 et un compteur pour le chiffre des milles qui sincrmente seulement quand le chiffre
des centaines passe de 9 0.
On concatene les 4 compteurs pour faire le bus de sortie :
Compt <= count4 & count3 & count2 & count1;
25
Interruption
26
Interruption
Dans cette manipulation, vous allez estimer les performances du DSP c67 de Texas
instrument, vous allez utiliser les capacits de lenvironnement de dveloppement CCS
(Code Composer Studio), manipuler et afficher des donnes.
Vous allez galement tester un traitement lmentaire.
1] TIME PROFILING
Cration dun rpertoire :
Crez un rpertoire votre nom dans D:\TP_A2\
Dans le nom nutilisez que les caractres alphanumriques et le soulign.
Exemple : D:\TP_A2\Dupont_et_Durand
Lancer le setup de code composer studio :
27
Interruption
28
Interruption
Dans le menu <Option / customize> cocher la case Load Program After Built.
#include <stdio.h>
#define TAILLE_MAX
short
a[TAILLE_MAX],
volatile int y = 0;
int
256
x[TAILLE_MAX];
int count) ;
29
Interruption
main()
{
int i;
for (i = 0; i < TAILLE_MAX; i++) {
a[i] = i;
x[i] = TAILLE_MAX - i;
}
y = dotp (a, x, TAILLE_MAX) ;
y = dotp (a, x, TAILLE_MAX) ;
printf("y = %d\n", y);
}
int
dotp(short *m, short *n,
{
int i, sum = 0;
int count)
30
Interruption
Compilez votre programme de faon crer le fichier excutable (un .out). Par dfaut, le
fichier gnr sappellera Le_nom_de_votre_projet.out .
Compiler et linker le programme en cliquant sur le bouton:
31
Interruption
Avancer en mode pas pas en entrant dans la fonction dotest en utilisant loutil :
La commande :
ou
CPU Halted
32
Interruption
Vous allez maintenant mesurer les temps dexcution en utilisant les outils de profiling :
Ouvrir une session de profiling :
Profilesetup
en cliquant sur :
collect application..
et
Profile all functions
Puis :
Profile viewer
Pour faire apparaitre la fenetre de visualisation.
33
Interruption
On ne sintresse quaux fonctions <dotp> et <main>, vous pouvez donc supprimer les
autres fonctions en les slectionnant puis avec SUPR.
Faites apparatre les mesures <Incl min> , <Incl max> , <Incl average>
en utilisant longlet :
Colomns and rows setting
Avant dexcuter le code, placer un point darrt dans le code sur laccolade fermante en
double cliquant :
34
Interruption
Optimisation :
Project : Configuration..
Slectionner le mode Release et cliquer sur le bouton <Set Active>
Recompiler et recharger le programme.
Lancer lexcution (touche F5).
Dans ce mode, on ne peut plus observer les temps dexcution. Il faut donc crer un mode
intermdiaire :
Le menu <ProjectconfigurationAdd>
Et rendez la active.
35
Interruption
Recompiler le programme.
Fermer le profile courant et ouvrir une nouvelle session de profile.
Excuter le programme.
Q3) Quels sont maintenant les nouveaux temps dexcution du programme.
Max :
Min :
Q4) Vous remarquerez que le temps minimum est infrieur 256. Comment expliquez-vous
ce phnomne ?
Q5) Regarder le code assembleur gnr pour la fonction dotp. Les units de calculs de
chaque opration sont rfrences. Essayer de comprendre la fonction de ces oprations en
consultant la documentation en ligne.
Vous allez maintenant modifier le code pour mesurer les performances en flottant.
Pour cela, changer le type de retour et des paramtres de la fonction dotp par float.
Reconstruire alors le code et refaites les mesures :
Q6) Quelles sont les temps dexcution pour la fonction dotp en mode DEBUG :
Max :
Min :
Max :
Min :
DATA_ALIGN(a,8) ;
DATA_ALIGN(x,8) ;
Min :
36
Interruption
<C:\A2TP_MANIP_DSPC67\volume1> dans
Project
open
Le logiciel vous demande lemplacement du fichier RTS6700.lib :
37
Interruption
Vectors .asm dfini le point dentre. Dans ce cas, il sagit de ltiquette _c_int_00. Ce point
dentre est dfini dans la bibliothque rts.lib. Les programmes qui se trouvent l initialisent
la pile, le tas (pour les allocations dynamiques), et font appel la fonction main. Aprs son
excution (fin de main), on trouve un code darrt (boucle infinie).
Volume.cmd : fichier de commande du linker
Rts700.lib : Run Time support pour la cible DSP.
Double cliquez sur le fichier volume.c dans la vue projet, de faon voir le code source.
Analysez le code source afin de comprendre la fonction de ce programme.
Vous allez maintenant ajouter une sonde permettant de lire les donnes dentre partir dun
fichier sur le PC.
Cette fonctionnalit fonctionne dans les 2 sens, et permet de mettre au point des algorithmes
en lisant ou en gnrant des donnes de fichiers.
a) Projectrebuild
b) FileLoad Program Slectionnez le programme que vous venez de construire
(volume.out).
c) Double cliquez sur le fichier volume.c dans la vue Projet
d) Placez le curseur sur la ligne de la fonction main :
DataIO(),
Puis click droit et Toggle Probe point.
e)
f)
g)
h)
Cette fentre vous permettra par la suite de manipuler les donnes de ce fichier (rewind, stop,
forward, start).
38
Interruption
j) Dans la boite de dialogue FILE IO, changez ladresse inp_buffer, et placez la taille 100.
j)
k)
l)
m)
n)
39
Interruption
Choisissez View
Graph
Time/Frequency nouveau
Modifiez le titre en output buffer et connectez le (start Address) sur out_buffer.
Validez.
Utilisation et test :
a) Dans le fichier volume.c, placez le curseur sur la ligne qui appelle la fonction dataIO.
b) Cliquez sur
La cible sera arrte sur cette ligne chaque fois que les buffers seront mis jour.
c) Cliquez sur
A chaque fois que le point darrt est atteint, CCS rcupre 100 valeurs du fichier, et les crit
ladresse inp_buffer.
Ajustement du gain
Le gain de la boucle est dfini dans le programme par la ligne :
*output ++ = *input++ * gain;
Le gain est plac au dpart la valeur MINGAIN dfinie dans volume.h.
a) ViewWatch Window.
40
Interruption
c)
(Animate)
41
Interruption
42
Interruption
43
Interruption
En plaant un point darrt dans le programme de recopie, vous pouvez examinez les chiffres
dans le buffer dentre.
Q4) Quelle est la plage de variation des chiffres flottants qui reprsentent le signal
dentre ?
Vous allez maintenant crire un filtre passe bas moyenneur dordre 2 : y = x(t)/2 + x(t-1)/2
Pour cela, vous pouvez dfinir une variable qui contiendra x(t-1).
Pour crer cette fonction, utiliser le prototype suivant :
my_fir_2(float *in, float *coef, float *out, int nb_tap, int size_buf)
Dans votre code, vous utiliserez uniquement les paramtres <in> et <out> qui sont les
tableaux qui contiennent le signal dentre, et le signal que vous allez calculer, et <size_buf>
qui renseigne sur le nombre dchantillons traiter.
Dans la fonction user_process, placer lappel de la fonction de recopie entre commentaires, et
appelez votre nouvelle fonction.
Q5) Ecrire et tester le filtre moyenneur dordre 2.
my_fir_2(float *in, float *coef, float *out,int nb_tap,int size_buf)
{
int i, j;
float val;
static float temp;
for (j = 0 ; j < size_buf ; j++) {
// Pour tous les lments du buffer
out[j] = in[j] / 2 + temp / 2 ;
temp = in[j];
// temp mmorise x[y-1];
}
}
Q6) Pour cette fonction, combien dchantillons gnrez vous ? Combien dchantillons
du signal dentre utilisez-vous ?
Observer maintenant la fonction main situe dans ce fichier, et identifier les lignes qui
permettent le vieillissement des chantillons.
44
Interruption
Vous allez maintenant programmer vous-mme la fonction de filtrage en vous inspirant des
indications ci dessous :
my_float_fir(float *in, float *coef, float *out, int nb_tap, int size_buf)
{
int i, j;
float val;
for (j = 0 ; j < size_buf ; j++) {
val = 0;
for (i = 0 ; i < nb_tap ; i++)
val = val + in[i+j] * coef[i];
out[j] = val.
}
}
Dans un premier temps, pour mettre au point votre fonction, appelez l avec la variable
nb_tap = 2. Dans ce cas, le signal de sortie sera damplitude 10 fois plus faible.
Une fois que vous obtenez un signal (damplitude faible) en sortie, placer la variable nb_tap
sa valeur normale (SIZE_TEMP).
Votre filtre ne marche pas.
Compiler maintenant votre programme en mode RELEASE. Et le filtre marche maintenant.
Q9) Expliquer :
Pourquoi votre filtre ne marchait pas au dpart ?
Pourquoi marche t-il en mode RELEASE ?
Pourquoi la fonction bibliothque marchait ?
45
Interruption
Q10) Faites fonctionner maintenant le filtre dont les coefficients sont dclars dans le
tableau Tab_Coef_3B en dbut de programme :
Q11) Quel est le type de filtre ? Ce filtre marche t-il en mode release / debug
Le processeur que vous utilisez est un processeur flottant. Mais pour la suite
nous allons considrer que les oprations flottantes sont pnalisantes.
Pour passer en mode entier vous allez modifier le paramtre dinitialisation
dans la fonction main :
FRM_FLOATFRM_FIX
STN1_InitAll(SEL_ADDA1,
FRM_FIX);
FREQ_ECH,
SIZE_FIFO,
CFG_IRQ,
Les valeurs lues sur le convertisseur dentre sont alors des entiers qui voluent
entre -2048 et +2047.
Q12) Quelle est la rsolution du convertisseur dentre ?
Interruption
int size_buf)
47
Interruption
48
Interruption
LES MICROCONTROLEURS
I MISE EN ROUTE
Crez un rpertoire votre nom dans D:\TP_A2\
Dans le nom nutilisez que les caractres alphanumriques et le soulign.
Exemple : D:\TP_A2\Dupont_et_Durand
Crer un sous rpertoire \Mc_Hc11
49
Interruption
org
$2000
mem equ
$40
debut lda
tab
addb
ldx
stx
bcl
dex
bne
nop
bra
#12
#2
#$1234
mem
bcl
debut
50
Interruption
(Db).
Registres
Les registres A et B sont les registres de donnes. Ils contiennent les donnes sur
lesquelles on peut effectuer les oprations arithmtiques et logiques.
Les registres X et Y contiennent en gnral des pointeurs sur lespace mmoire.
SP est le pointeur de pile.
PC est le pointeur programme (ladresse de linstruction suivante).
CCR est le registre code condition. (Qui contient entre autre les bits N Z V et C de
lunit arithmtique).
51
Interruption
52
Interruption
Leds
Port B
Ecrire et excuter le programme suivant :
PORTB equ
PORTC equ
$1004
$1003
org
$2000
lda
sta
bsr
lda
sta
bsr
lda
sta
bsr
lda
#1
PORTB
tempo
#2
PORTB
tempo
#4
PORTB
tempo
#8
debut
sta
bsr
bra
PORTB
tempo
dbut
ldx
dex
bne
rts
#0
tempo
bbb
bbb
la suite
Excuter ce programme avec la commande RUN du dbugger.
Constater que ce programme excute un chenillard sur les 4 leds.
Q4) Expliquer le fonctionnement de la routine tempo . (En excutant en pas
pas au besoin).
53
Interruption
On souhaite modifier ce programme pour raliser un chenillard sur les 8 leds, mais sans
utiliser la structure de code prcdente.
Vous allez utiliser linstruction :
ROLA
Cette instruction naccepte pas de paramtres.
Q5) Quel est le fonctionnement de cette instruction ?
(Une table des diffrentes instructions du processeur est galement disponible la fin de
ce texte).
Q6) Programmer et faites constater le fonctionnement du chenillard sur 8 leds.
54
Interruption
equ
org
$1003
$2000
BCL
lda
bra
PORTC
BCL
Sur la carte interface placer les roues codeuses sur les positions : 3 et 4.
Excuter linstruction en pas pas. Le registre A doit contenir le chiffre $34 ou $43.
Regarder le fonctionnement de linstruction MUL grce laide en ligne.
Pour obtenir un chiffre dans le registre A et lautre dans le registre B, vous allez utiliser
les instructions de dcalage :
lsla par exemple
Et le ET logique :
anda
#valeur.
B
D
55
Interruption
mem
mem+1
Il vous faut maintenant dcaler le chiffre des dizaines sur le poids et additionner les
deux registres pour former le rsultat.
Trouver les instructions de dcalage adquates en consultant la table dinstruction en fin
de texte.
Trouver linstruction qui additionne A + B et place le rsultat dans A (cf table de
rfrence des instructions).
56
Interruption
III LANGAGE C
Il est possible dcrire des programmes en langage C en utilisant le cross-compilateur.
Dans la mesure o on sintresse la programmation dapplications sur des cartes cibles
diffrentes, il ny a pas de bibliothque dentres/sortie. (Pas de fonction printf,
scanf).
Garder le cblage existant.
Ecrire le programme suivant :
#define
#define
BYTE
PORTB
unsigned char
*portB;
unsigned char
0x1004
void Tempo()
{
int
count;
count = 0x3FFF;
while (count != 0)
count--;
return;
}
void main()
{
BYTE val, *portB;
portB = (BYTE*)PORTB;
val = 1;
while (1) {
*portB = val;
Tempo();
val = val << 1;
if (val == 0)
val = 1;
}
}
57
Interruption
$F800 - $FFFF
$040 - $7F
$FFFE
EQU $1004
EQU $1007
EQU $1003
Exemple :
Case_ram equ
$40
ORG
$F800
LDA
LDA
...
#3
Case_ram
ORG
FDB
$FFFE
Deb_prog
Deb_prog
*
58
Interruption
Programmation du microcontrleur :
Une fois que votre programme est modifi et assembl sans erreur, il faut connecter la
carte microcontrleur au port srie du PC.
Vous allez alors dans le menu PROGRAMMATION et choissiez le HC11E2
Vous placer le switch de la carte sur la position PRG
Vous suivez les indications sur lcran (reset de la carte, puis programmation)
Aprs la programmation, si aucune erreur nest signale :
Vous placez linterrupteur sur la position MAN
Vous pressez le bouton RESET
Votre programme est alors actif
Compilez ce programme.
59