TP ELECTRONIQUE NUMERIQUE
Cycle ingnieur 2me anne
Chapitre I.
Programmation CPLD (ALTERA)
Chapitre II.
DSP C6713 (TEXAS INSTRUMENT)
Chapitre III.
Microcontrleur 68HC11 (MOTOROLA)
La dure des sances est de 4 heures
ALTERA Programmation CPLD
Chapitre I : PROGRAMMATION CPLD
(ALTERA)
ALTERA Programmation CPLD
PROGRAMMATION CPLD sous QUARTUS II
Introduction
But : Comprendre et mettre en oeuvre la programmation de FPGA basse densit.
Dans ce TP vous allez :
Utiliser une saisie schmatique pour programmer un composant programmable basse
densit.
Intgrer des blocs dcrits en VHDL
Programmer des modifications en VHDL.
Effectuer des simulations
Charger et tester un design sur un circuit.
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
Double-cliquer sur licne QUARTUS II 6.0 :
disponible sur le bureau.
Ou
Cliquer sur Dmarrer ProgrammesAlteraQuartus II 6.0
ALTERA Programmation CPLD
Cration de votre projet
Sous QUARTUS, slectionner : FileNew Project Wizard
Cliquer sur Next
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
Cliquer directement sur Next
ALTERA Programmation CPLD
Slectionner La famille MAX3000A, puis le composant EPM3128TC100-10
(Vrifier que les options Any sont actives pour les options Package-Pin count et
Speed grade ).
Ce composant correspond celui de la carte que vous allez utiliser.
La technologie du max3000 est de lEEPROM. La configuration est garde lors des coupures
dalimentation.
Il faut galement configurer les broches en entres par dfaut.
Pour cela :
AssignementdeviceDevice and pin options
Puis activer As Inputs, tri-stated sous longlet Unused Pins.
ALTERA Programmation CPLD
Cration dun schma
Ouvrir alors un fichier schmatique :
FilenewBloc Diagram/Schematic File
En se plaant dans la fentre ddition schmatique qui vient de souvrir :
Cliquer avec le BOUTON DROIT de la souris
Puis InsertSymbol
Dans la bibliothque altra, slectionner une broche de type INPUT.
(Librairiesc:/altera/quartus60/librairies/primitivespininput)
Cliquer sur OK
ALTERA Programmation CPLD
En utilisant la mme procdure que prcdement, entrer les composants :
Output (Librairiesc:/altera/quartus42/librairies/primitivespinoutput
And2 ((Librairiesc:/altera/quartus42/librairies/primitiveslogicand2)
Pour avoir la liste des composants, il est possible dutiliser licne Symbol Tool :
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.
ALTERA Programmation CPLD
il faut maintenant affecter un nom logique aux broches dE/S en double cliquant sur chaque
symbole INPUT et OUTPUT :
et entrer les noms : E1 E2 SOUT et VSEG.
Maintenant il faut compiler le schma et vrifier quil ny a pas derreur.
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.
ALTERA Programmation CPLD
ASSIGNEMENT DES ENTREES/SORTIES
On va utiliser les boutons poussoirs disponibles sur la maquette pour connecter les entres E1
et E2, et le segment suprieur dun des afficheurs pour la sortie SOUT.
Connexion des E/S
Boutons poussoirs :
Les boutons poussoirs sont connects aux broches du CPLD comme suit :
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 :
Lactivation dun afficheur seffectue en plaant un 0 sur sa broche Digit_n (signal
VSEG de votre schma).
Le Schma de la carte montre que cest un niveau logique 0 qui allume un segment.
ALTERA Programmation CPLD
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
ALTERA Programmation CPLD
ASSIGNEMENT DES NUMEROS DE BROCHES
Pour ce premier exemple, on va utiliser les boutons sw1 et sw2, et le segment a de
lafficheur 1. Il faut maintenant affecter les numros de broches correspondants :
Ouvrir la fentre dassignement avec le menu AssignementsPins
ou le bouton
On obtient la fentre :
Double cliquer dans la colonne location
Et slectionner le numro de broche pour le signal de cette ligne (ici E1).
Procder de la mme manire pour :
E1
: broche 24
E2
: broche 25
SOUT : broche 70
VSEG : broche 97
11
ALTERA Programmation CPLD
Recompiler le programme (voir le paragraphe COMPILATION plus haut) et vrifier quil ny
a pas derreurs.
En fermant la fentre de compte-rendu de compilation, vous devez avoir des tiquettes sur les
broches de cette faon :
Si on ne voit pas les numros de broches faire le menu :
ViewShow Location assignments
12
ALTERA Programmation CPLD
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
Dans la colonne Name, cliquer avec le bouton DROIT
Puis, cliquer sur Insert Node or Bus
Cliquer alors sur Node finder.
13
ALTERA Programmation CPLD
Cliquer ensuite sur List.
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
ALTERA Programmation CPLD
Sauvegarder le fichier en cliquant sur
et en acceptant le nom propos. Ce fichier
max3k.vwf est le fichier des vecteurs de simulation. Pour le moment ce nest pas la
simulation.
Mise en uvre du simulateur :
Pour lancer le simulateur cliquer sur :
Aprs le temps dexcution, on doit avoir :
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
ALTERA Programmation CPLD
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
Vrifier que la carte est connecte au PC et quelle est alimente.
Vrifier que le programmateur est configur en mode BYTEBLASTER_II:
Si ce nest pas le cas, excuter le setup avec ce bouton.
slectionner le programmateur BYTEBLASTER_II et fermer la fentre.
Enfin, pour programmer le composant, slectionner loption Program/Configure et cliquer
sur Start :
Aprs le chargement, vrifier le bon fonctionnement sur la maquette.
En appuyant sur les boutons sw1 et sw2, on vrifiera que le segment a du premier afficheur
sallume ou steint suivant la table de vrit de la porte AND dcrite dans le schma initial.
16
ALTERA Programmation CPLD
DESIGN II : VHDL - MACRO - BUS
Pour commencer il faut changer de schma en gardant le mme projet.
- Fermer le fichier schmatique max3k.bdf
- Crer un nouveau fichier (voir le paragraphe cration dun schma au dbut du TP)
- Insrer une broche dentre (voir le paragraphe InsertSymbol puis PinInput au dbut du
TP
- Sauvegarder le fichier en lui donnant le nom max3V.bdf
- Dans le menu <Projet>, cliquer sur <Set as Top Level Entity>
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.
En suivant les boites de dialogue, dfinissez un compteur 28 bits simple.
Instancier ce compteur dans votre schma en utilisant le menu <InsertSymbol> puis
slectionner le composant dans le dossier <Project>.
17
ALTERA Programmation CPLD
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.
Dfinition dun composant en VHDL
Faire :
FileNewVHDL File
Puis entrer le texte suivant :
Library IEEE ;
Use
ieee.std_logic_1164.all ;
Use
ieee.std_logic_arith.all;
entity dec7seg is port (
entree : in
std_logic_vector(3 downto 0);
seg
: out std_logic_vector (6 downto 0) );
end dec7seg;
architecture arch_decod
begin
seg <=
"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
ALTERA Programmation CPLD
"???????" 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
Sauvegarder le fichier sus le nom de lentity : dec7seg
Crer le symbole en utilisant le menu:
FileCreate/updateCreate Symbol Files for current File
Si la cration se passe bien (pas derreurs), il faut instancier le dcodeur en insrant le
symbole dans le schma.
19
ALTERA Programmation CPLD
Raliser alors les connexions suivantes :
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
ALTERA Programmation CPLD
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,
Enfin, il faut ajouter les broches de validation des 4 afficheurs 7 segments.
Relier alors les validations des afficheurs de faon ce que :
1 afficheur soit valid en permanence.
1 afficheur ne soit jamais valid
1 afficheur soit valid lors de la pression sur le bouton 1
1 afficheur soit valid lors de la pression sur le bouton 2
Utiliser les numros de broches du tableau dassignation des broches donnes prcdemment.
COMPILER ET TESTER SUR LA MAQUETTE.
Valider votre codage des tats des 7 segments.
21
ALTERA Programmation CPLD
DESIGN III : MULTIPLEXAGE
Gestion de lafficheur multiplex / gnration de nombres pseudo alatoires / comptage.
Avec le design II on a vu quil ny a que 8 signaux du CPLD pour visualiser sur les 4
afficheurs 7 segments. Si on active les 4 afficheurs en mme temps, ils afficheront la mme
valeur. Pour pouvoir afficher des valeurs diffrentes, mais simultanment, sur les 4
afficheurs, il faut faire du multiplexage. On allumera les afficheurs tour de rle, mais de
manire ce quon ai limpression quils tous allums en mme temps.
Comme au dbut de <DESIGN II>, on va commencer par changer de <Top_level>.
- Enregistrer (menu <File / enregistrer sous >) le fichier schmatique max3V.bdf sous le
nom max3M.bdf.
- Dans le menu <Projet>, cliquer sur <Set as Top Level Entity>.
- Dans la fentre <Project Navigator>, cliquer (bouton droit) sur le fichier max3V.bdf puis
sur <Remouve File From Project>.
On veut avoir le design suivant :
Le module Multiplex (dcodeur multiplex) remplace le module Dec7Seg. Le module
Deci_Compt cr un compteur sur 4 chiffres (chaque chiffre de 0 F en binaire pur ou de 0
9 en dcimal). On utilisera un bouton SWn pour valider lentre Enb_Cnt des compteurs. Le
diviseur dhorloge Lpm_Counter0 va fournir lhorloge du multiplexeur et l(horloge des
compteurs.
22
ALTERA Programmation CPLD
Ecriture du dcodeur multiplex
Crer un nouveau fichier VHDL ( menu FileNewVHDL File) quon sauvegardera sous le
nom Multiplex.vhd.
Le fichier a la structure suivante :
Library IEEE ;
Use
ieee.std_logic_1164.all ;
Use
ieee.std_logic_arith.all;
use
ieee.std_logic_unsigned.all;
entity Multiplex is port (
clk : in std_logic;
ent1 : in std_logic_vector(3
ent2 : in std_logic_vector(3
ent3 : in std_logic_vector(3
ent4 : in std_logic_vector(3
seg : out std_logic_vector(6
naff : out std_logic_vector(3
end Multiplex;
downto
downto
downto
downto
downto
downto
0);
0);
0);
0);
0);
0) );
architecture display of Multiplex is
signal code : std_logic_vector(3 downto 0);
signal num : std_logic_vector(1 DOWNTO 0);
begin
Aff_Num : process (clk)
begin
if (clk = '1' and (clk'event))then
num <= num+1;
end if;
end process;
Mux_Aff : process(num) begin
case num is
when "00" => naff <= "1110";
when "01" => naff <= "1101";
when "10" => naff <= "1011";
when "11" => naff <= "0111";
end case;
end process ;
23
code
code
code
code
<=
<=
<=
<=
ent0;
ent1;
ent2;
ent3;
ALTERA Programmation CPLD
decod : process (code) begin
case code is
--- assigner le signal seg en function des valeurs du signal code.
--- la structure est : when ???? => seg <= ????????;
.
.
end case;
end process ;
end display;
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
ALTERA Programmation CPLD
Un compteur binaire sur 4 bits scrit comme suit :
signal count1: std_logic_vector(3 DOWNTO 0);
process (clk)
begin
if (clk'event and clk = '1')then
count1 <= count1 + 1;
end if;
end process;
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;
Ecrire le fichier Vhdl <Deci_Compt.vhd>, crer le symbole, insrer-le dans le schma la
place de Deci_Compt; tester sur la carte.
FIN de la manipulation
25
Interruption
Chapitre II : DSP C6713
(TEXAS INSTRUMENT)
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 :
Supprimer la configuration existante.
Slectionner le simulateur C6713 device Cycle Accurate Simulator Little
Sauver et quitter en lanant code composer studio.
Vrifier que la carte est bien alimente.
Crer un nouveau projet dans le votre rpertoire.
Le menu < Project / new >
Vrifier que vous tes bien dans votre rpertoire ; sinon utiliser le browser pour slectionner
le vtre.
Vrifier que la cible
est TMS320c67xx
27
Interruption
Vous pouvez tendre le projet afin de vrifier la cration.
Crer un fichier de configuration CDB (Configuration Data Base).
File :new :DSP/BIOS configuration
Slectionner le fichier c6713.cdb
Sauvegarder votre fichier cdb dans votre rpertoire
File->save
En mettant le nom adquat.
28
Interruption
Avec le menu <Projet / Add files to project>,
ajouter dans votre projet les fichiers
votre_nom.cdb
votre_nomcfg.cmd
o < votre_nom > est le nom utilis prcdemment pour sauvegarder le fichier <.cdb>.
Dans le menu <Option / customize> cocher la case Load Program After Built.
Taper le programme suivant :
#include <stdio.h>
#define TAILLE_MAX
short
a[TAILLE_MAX],
volatile int y = 0;
int
256
x[TAILLE_MAX];
dotp(short *m, short *n,
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)
for (i = 0; i < count; i++)
sum = sum + m[i] * n[i];
return sum;
}
Sauvegarder le fichier dans votre rpertoire sous le nom tp1.c.
Ajouter le fichier au projet
Votre projet doit alors ressembler celui ci : (fichier .c .cmd et .cdb)
30
Interruption
Slectionner le mode Debug :
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:
Gardez la fentre de dsassemblage en arrire plan.
Excuter le programme en pas pas :
Debug :Go Main
Utiliser la fentre Watch pour regarder les variables :
Slectionner la variable y dans votre fichier source (tp1.c) puis clic droit et faites :
Add To Watch Window
31
Interruption
Avancer en mode pas pas en entrant dans la fonction dotest en utilisant loutil :
Constater que la fentre dobservation des variables locales est actualise :
La commande :
vous permet dexcuter le programme en entier.
La barre de status indique ltat du processeur :
CPU RUNNING
ou
CPU Halted
Vous pouvez arrter le CPU en utilisant la commande :
Dans la fenetre Watch vous avez le rsultat du calcul :
y = 2796160
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
Cliquer sur lhorloge pour valider le profiling :
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 :
Excuter le programme (la touche fonction F5 est un raccourci).
Examinez alors les rsultats du profile :
Vous constatez que la fonction dotp un temps dexcution max et min de 16112 et 7992
cycles.
Q1) Comment expliquez vous cette diffrence de temps dexcution ?
Q2) Dautre part, la fonction dotp effectue une boucle de calcul lmentaire 256 fois.
Comment expliquez-vous que mme au minimum, ce nombre de cycle est trs important ?
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>
Appelez votre nouvelle configuration : Optimize :
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 :
Il est encore possible damliorer la vitesse de ce code en alignant les donnes.
Pour cela, il faut ajouter dans le code au dbut du fichier :
#pragma
#pragma
DATA_ALIGN(a,8) ;
DATA_ALIGN(x,8) ;
Mesurer alors les nouveaux temps dexcution en version optimise.
Max :
Min :
Q7) Conclure en expliquant leffet de DATA_ALIGN.
Q8 (subsidiaire) Quel est leffet du mot cl : volatile.
36
Interruption
2] Programme en langage C / Interface CCS
Fermez le projet en cours.
Puis sous explorateur, copiez le rpertoire
votre rpertoire (D:\TP_A2\votre_nom\).
<C:\A2TP_MANIP_DSPC67\volume1> dans
Ouvrez alors le projet <volume.pjt> de votre rpertoire(D:\TP_A2\votre_nom\volume1\).
Project
open
Le logiciel vous demande lemplacement du fichier RTS6700.lib :
Le bouton browse vous permet daccder lemplacement
C:\Ccstudio_v31\c6000\cgtools\lib\
Slectionner le fichier et valider (bouton Ouvrir).
Vous devez avoir un projet de la forme :
Volume.c contient le code source du programme.
Volume.h contient la dfinition de diverses constantes et structures
Load.asm contient une routine appele en C
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)
Cliquez sur (Toggle Probe Point). La ligne sillumine en bleu.
FileFile IO. Vous pouvez alors slectionner un fichier dentre ou de sortie.
Dans le champ File Input cliquez sur Add File
Choisissez le fichier sine.dat. Les valeurs contenues dans ce fichier sont en
hexadcimal.
i) Cliquez sur open pour ajouter le fichier dans la liste des fichiers dentre/sortie.
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)
Cliquez sur ADD Probepoint
Dans la liste Probe point la ligne 61 du fichier volume.c est illumine.
Connectez le fichier sine.dat
Cliquez sur REPLACE.
Vous pouvez sortir des botes de dialogue, le fichier sine.dat est dfini comme fichier
dentre.
Vous pouvez alors visualisez les donnes dentre :
View
Graph
Time/Frequency
Dans les proprits du graphique, vous pouvez changer le titre, etc
32 bits signed integer
Cliquez sur OK, le graphique des donnes saffiche.
Cliquez avec le bouton droit sur la fentre du buffer dentre, et choisissez Clear Display
dans le menu pop up.
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
(Toggle Breakpoint) ou pressez F9.
La cible sera arrte sur cette ligne chaque fois que les buffers seront mis jour.
c) Cliquez sur
(Animate) ou F12 pour faire excuter le programme.
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
b) Avec le click droit, vous pouvez insrer une nouvelle expression
c) Insrez la variable gain
d) Redmarrez le programme et faites varier la valeur de gain . Lamplitude du fichier
de sortie est modifie en consquence.
Enfin il est possible dassocier un programme extrieur rgissant le comportement de la
variable.
a) File Load GEL
Slectionnez volume.gel
b) GELApplication ControlGain
c)
(Animate)
d) Modifiez le gain avec le curseur.
e) Pour comprendre le fonctionnement du GEL, arrtez le programme, puis cliquez sur
volume.gel.
41
Interruption
3] Manipulation de signaux rels.
Fermer le logiciel CCStudio.
Lancer le logiciel de SetUp :
Supprimer la configuration actuelle (C6713 device Cycle Accurate Simulator Little) et
slectionner la configuration < C6713 DSK USB>, cliquer sur bouton <add> puis sur le
bouton <Save & Quit>
Crer un nouveau projet :
1) La cible doit tre TMS320C67XX
2) Slectionner votre rpertoire (D:\TP_A2\<votre_nom>\)
3) Entrer le nom du projet (par exemple filtre_Fir)
42
Interruption
Copier les fichiers du rpertoire : <C:\A2TP_MANIP_DSPC67\\Filtre_fir > dans le rpertoire
de votre nouveau projet (D:\TP_A2\<votre_nom>\Filtre_FIR\).
Ajouter les fichiers suivants ce projet (menu <ProjectAdd file to project>).
STN1_6713.cdb , STN1GLib.c , Dspc67x.lib , my_main.c
Connecter un GBF lentre audio de la carte (entre ligne), et un oscilloscope la sortie
ligne de la carte.
Rgler lamplitude du signal dentre environ 0,75v crte crte.
Excuter le programme (compilation puis chargement puis excution). Il effectue une recopie
de lentre sur la sortie. Vrifier le bon fonctionnement.
Regarder maintenant le fichier my_main.c
Q1) Quelle est la frquence dchantillonnage du signal ?
Le programme est configur pour appeler priodiquement la fonction user_process tous
les N chantillons.
Q2) La fonction user_process est appele tous les N chantillons. Que vaut N ?
Q3) Quelle est alors la latence entre lentre et la sortie ? Exprimer cette latence en
nombre dchantillon puis en temps (en tenant compte de la frquence
dchantillonnage).
Pour rpondre cette question, vous devez imaginer le voyage dun chantillon du signal
entre le moment ou il est numris par le convertisseur dentre, et le moment ou il ressort sur
le convertisseur de sortie.
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 crire un filtre FIR en utilisant le tableau de coefficient
<Tab_Coef_1R> qui est le fichier. Ce tableau contient 17 valeurs (cette valeur est dfinie par
le symbole FIR_TAPS_1).
Vous allez utiliser la fonction de filtrage crite par TEXAS INSTRUMENT fournie dans la
bibliothque dspc67x.lib que vous avez intgre votre projet.
Lappel de la fonction suit le format suivant :
DSPF_sp_fir_gen(Bufferin_temp, Tab_Coef_1R, Buff_out, FIR_TAPS, SIZE_FIFO);
Q7) Tester le filtre obtenu.
Q8) Quel est le type de filtre ?
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.
}
}
// Pour tous les elements du buffer
// Pour tous les tages du filtre
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 ?
Il faut maintenant convertir les coefficients du premier filtre en entiers cods en
Q15. Pour cela calculer le tableau de coefficients entier en Q15 en multipliant
chaque chiffre par 32768.
0.0135 * 32768 = 442
46
Interruption
Et ainsi de suite de faon crire le tableau de la faon suivante :
int Tab_Coef_int[] = {442, ..} ;
vous allez alors crire la fonction de filtrage en virgule fixe en tenant compte de
la renormalisation des chiffres lors des multiplication :
a * b devient : ((a * b) << 15)
Utiliser le prototype suivant :
my_int_fir(int *in, int *coef, intt *out, int nb_tap,
int size_buf)
Q13) Programmer et tester votre filtre en virgule fixe.
Q14) utilisez les outils de profiling pour mesurer le temps de calcul
En flottant
En virgule fixe.
47
Interruption
Chapitre III: MICROCONTROLEUR 68HC11
(MOTOROLA)
48
Interruption
LES MICROCONTROLEURS
Les micro-contrleurs sont des circuits intgrants un microprocesseur, de la RAM, de la
ROM et des priphriques.
Ces circuits sont trs rpandus dans les applications de contrle de processus. On les
utilise dsormais dans les applications de contrle o ils supportent tout le traitement
logique. Les cartes de commande comprenant alors plutt llectronique dinterfaage.
Ces composants permettent de raliser des cartes conomiques, ce qui permet de
multiplier les traitements.
La programmation des microcontrleurs peut se faire en langage volu (C en gnral),
mais le plus souvent, et pour les petites applications, elle seffectue en assembleur.
Le langage est alors prvu pour tre rapidement assimilable et comporte des instructions
de manipulation de bit permettant de traiter les entres sorties.
Lobjet de cette manipulation est de programmer une application partir dun micro
contrleur. Pour cela, on dispose dune carte de dveloppement. Cette carte permet
lexcution de programme pas pas, la visualisation des registres Dans un deuxime
temps, le programme tant mis au point, on programme un composant afin de faire une
maquette complte et indpendante.
Consulter la documentation annexe sur le langage dassemblage de ce microcontrleur.
Le 68HC11 est un circuit 8 bits de MOTOROLA. Il sagit du circuit le plus complet en
gamme 8 bits. Il est particulirement adapt au contrle de petits automates. On le
trouve galement beaucoup en lectronique automobile.
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
Lancez le programme : OP711_BC
Ce programme permet dditer des fichiers sources assembleur pour le micro 68HC11,
de les diter, de les assembler et den lancer lexcution sur la carte MC711_B.
49
Interruption
En cliquant sur nouveau vous pouvez crire votre programme :
org
$2000
mem equ
$40
debut lda
tab
addb
ldx
stx
bcl
dex
bne
nop
bra
#12
#2
#$1234
mem
bcl
debut
Sauvegarder ce programme (menu FichiersEnregistrer Sous ) dans votre
rpertoire (D:\TP_A2\<votre_nom>\Mc_Hc11\), sous un nom qui vous convient, mais
avec imprativement lextension .A11 (par exemple : ex1.a11).
50
Interruption
Lancer le dbugger en cliquant sur
(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).
Refermer le dbugger de faon revenir sous diteur.
51
Interruption
Sous diteur, licne
opration.
qui permet dobtenir une explication sur les codes
Q1) Expliquer les instructions du programme :
LDA
TAB
ADDB
STX
LDX
DEX
BNE
NOP
Relancer le dbuggeur et faites apparatre les cases mmoires autours de $40 en utilisant
licne :
Excuter le programme en pas pas. En cliquant sur licne :
52
Interruption
Q2) Pourquoi le registre B prend la valeur $0E aprs lexcution de laddition ?
Q3) Que se passe til lors de lexcution de linstruction stx mem ?
Lors de lexcution de la boucle, modifier la valeur du registre X en lui imposant la
valeur 0001 (souris).
Relier maintenant 4 LEDs aux bits 0 3 du port B du microcontroleur. Il faut galement
alimenter linterface :
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.
On souhaite maintenant programmer la fonction suivante :
Multiplication des chiffres issues de 2 roues codeuses (carte interface), et affichage du
rsultat en dcimal.
Pour cela vous allez cbler la carte interface de la faon suivante :
Relier le port C 2 roues codeuses
Relier le port B 2 afficheurs 7 segments.
54
Interruption
Composer le programme suivant :
PORTC
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.
Q7) Ecrire un programme permettant de lire les roues codeuses, et dobtenir le
chiffre de la premire roue codeuse dans le registre A et le chiffre de la deuxime
roue codeuse dans le registre B.
On souhaite maintenant crire un programme permettant de multiplier les chiffres
slectionns par les roues codeuses et afficher le rsultat de cette opration sur les
afficheurs en base 10.
Linstruction MUL permet deffectuer la multiplication.
Pour traduire le rsultat en base 10, vous allez diviser le rsultat par 10.
Regarder le fonctionnement de linstruction IDIV grce laide en ligne.
Q8) Programmer une modification permettant davoir le chiffre des units dans D
et le chiffre des dizaines dans X.
Le registre D est : le registre A concatn avec le registre B :
B
D
55
Interruption
Vous allez alors ajouter le code suivant :
stx
lda
mem
mem+1
Q9) Constater leffet de ce code, et expliquer le fonctionnement. Pour comprendre,
utiliser la fentre de visualisation de la mmoire ladresse $40.
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).
Q10) Terminer alors le programme par un bouclage de faon ce quil sexcute
en continu en mode RUN.
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;
}
}
Sauvegarder ce programme avec lextension .c ( votre_nom.c )
Dautre part, crer un nouveau fichier et crire :
votre_nom.obj
Sauvegarder ce fichier sous le nom votre_nom.prb
Ce fichier rfrence les diffrents fichiers de votre projet.
Compiler ce programme en utilisant licne :
Vrifier quil ny ait pas derreurs.
Vous pouvez alors lancer le link :
57
Interruption
Vous pouvez alors lancer le dbugger et excuter le programme.
Q11) Que fait ce programme ? Expliquer le fonctionnement.
Q12) Ecrire en langage c un programme permettant de raliser la multiplication
des deux nombres issus des roues codeuses.
III MISE EN UVRE DU MICROCONTROLEUR
Il sagit maintenant dadapter votre programme afin de le faire excuter sur une carte
autonome ne comportant que le microcontroleur et quelques composants : circuit de
RESET, interface de communication avec le PC.
Programmation :
Pour linstant votre programme fonctionnait en mmoire vive externe ladresse $2000.
a) Sur la carte autonome, le programme doit tre plac dans la mmoire
morte.
b) Si votre programme utilise une ou plusieurs cases mmoire RAM, il faut
que ladresse de ces cases corresponde une ressource RAM du
composant.
c) Lors du dmarrage, il faut que le pointeur programme soit initialis sur le
dbut de votre programme.
d) Les adresses des ports sont diffrentes
e) La version microcontrleur ne permet pas de programmer le sens des
changes du port B (les broches sont en sortie uniquement).
Zone de mmoire morte sur le 68HC11E2 :
Adresse de la mmoire RAM disponible :
Adresse du vecteur de RESET :
PORTB
DDRC
PORTC
$F800 - $FFFF
$040 - $7F
$FFFE
EQU $1004
EQU $1007
EQU $1003
Exemple :
Case_ram equ
$40
Le symbole Case_ram pointe sur une case mmoire
ORG
$F800
Le code sera implant en $F800
Le symbole Deb_Prog vaut $F800 et rfrence le
dbut de programme
LDA
LDA
...
#3
Case_ram
ORG
FDB
$FFFE
Deb_prog
Deb_prog
*
Origine du vecteur de reset
Pointe sur le dbut de programme
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.
Ecrivez alors en C une fonction portb(n)
n tant un caractre permettant de sortir le
caractre n sur le port B, testez votre fonction.
59