Вы находитесь на странице: 1из 59

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

Вам также может понравиться