Vous êtes sur la page 1sur 31

Cours/TP DSP, Benot Decoux, 2005-2006

Traitement du Signal sur DSP 56303


- Rsum Dernire mise jour : 1/09/2005

Sommaire
Introduction
I) Implmentation dun filtre IIR sur DSP
I.1) Forme directe
I.2) Forme canonique
I.3) Filtres en cascade
II) Implmentation de la TFR (Transforme de Fourier Rapide) sur DSP
Annexe 1 : Programme de TFR sur DSP56303
Annexe 2 : Arithmtique des DSP
Annexe 3 : Utilisation du DSP56303

1
1
1
5
6
7
9
12
19

Introduction
Un DSP traite le signal chantillon par chantillon, et non pas par blocs comme dans la plupart
des programmes tournant sur PC. Ceci est permis par le fait que le processeur est ddi la tche de
traitement du signal.
Le DSP utilis ici est le 56303 de Motorola. Le signal est chantillonn et mmoris sur 24 bits,
et le mode de codage est la virgule fixe. Ce mode permet de coder des valeurs dcimales entre 1 et
+0,99999. Il ncessite donc de grer les dpassements de capacit rsultant des oprations de
calcul, avant mmorisation ou envoi en sortie (au convertisseur numrique-analogique). Des notions
darithmtique susceptibles daider la comprhension du fonctionnement du DSP sont donns en
annexe ("Arithmtique des DSP"), ainsi que des informations spcifiques au DSP utilis
("Utilisation des DSP").
Ce document aborde limplantation des algorithmes de filtrage numrique dans ce DSP, ainsi
que limplantation de la Transforme de Fourier Rapide (TFR).

I) Implmentation dun filtre IIR sur DSP


I.1) Forme directe
Dans la forme directe, on mmorise des valeurs passes des chantillons dentre et de sortie.
La mmoire ncessaire pour cette implmentation est :
- 5 mots pour les coefficients ai et bj (i=0, 1, 2 ; j=1, 2)
- 2 mots pour les chantillons dentre
- 2 mots pour les chantillons de sortie

Cours/TP DSP, Benot Decoux, 2005-2006

Une des conditions de stabilit dun filtre du 2nd ordre tant b1max=2 (voir paragraphe sur la
modlisation de filtres analogiques), on est confront un problme dans le cas dun codage en
virgule fixe (qui ne permet de coder que des valeurs comprises entre 1 et +1).
Une mthode consiste diviser tous les coefficients par 2 avant codage. On retrouve le vrai
rsultat de traitement en multipliant lchantillon de sortie par 2 la fin (ce qui sera ralis
facilement, par un dcalage logique dun bit vers la gauche de la donne). En effet, la relation
entre/sortie temporelle peut scrire :
S(n)=2[a0/2e(n)+ a1/2e(n-1)+]
Un exemple dorganisation de la mmoire, pour les coefficients et les chantillons mmoriser,
pourrait tre :
coefficients dans mmoire X, pointe par pointeur dadresse R0 (associ M0 et N0) ;
chantillons dans mmoire Y, pointeurs dadresse R1 pour les entres et R2 pour les sorties.

Algorithme
Lalgorithme implmenter est le suivant :
Rpter indfiniment
Attente dun nouvel chantillon e(n) dans le CAN
Traitement : calcul du nouvel chantillon de sortie s(n)
Mise jour des pointeurs circulaires (remplacer s(n-2) par s(n), et remplacer e(n-2) par e(n))
Envoyer s(n) en sortie du CNA

On peut partir du programme de gestion des entres/sorties analogiques "pass.asm", et y


intgrer un saut la routine de traitement. Celle-ci peut se trouver dans un autre fichier, dont le
nom doit alors tre inclus dans le programme "pass.asm" modifi ( laide de la directive
dassemblage "include" : voir programme de filtrage disponible sur site web).
Pour rduire le temps dexcution de la routine, on a tout intrt utiliser les capacits de
traitement parallle du DSP (voir le tutoriel sur le DSP disponible sur le site). Il permet par exemple
deffectuer en parallle les oprations suivantes :
mac

X0,Y0,A

A=A+X0Y0 ;

X:(R0)+,X0

Y:(R1)+,Y0

=move X:(R0)+,X0
X0=X pointe par R0 ;
R0=R0+1 ;

=move Y:(R1+),Y0
Y0=Y pointe par R1
R1=R1+1

Pour les coefficients et les chantillons mmoriser, on peut organiser la mmoire de la


manire suivante :

coefficients dans mmoire X, pointe par le registre dadresse R0 (associ M0 et N0) ;

chantillons dans mmoire Y, registres dadresse R1 pour les entres et R2 pour les
sorties.

Diffrentes tapes du programme


Les diffrentes tapes du programme crire sont les suivantes :
Etape 1 : donner des noms aux coefficients (symboles) ; quivalent dclarer des constantes
a0
a1

equ
equ

0.0001/2
0.0002/2

; remarquer la division par 2 , possible ici

Cours/TP DSP, Benot Decoux, 2005-2006


a2
b1
b2

equ
equ
equ

..
..
..

Etape 2 : rserver des emplacements en mmoire pour les coefficients et les chantillons
coef

org
dsm

X:$0
5

en
sn

org
dsm
dsm

Y:$0
2
2

; $0=adresse de la 1 re case mmoire de X


; 5 cases mmoire

Etape 3 : copier les valeurs des coefficients en mmoire


org
dc

X :coef
a0,a1,a2,b1,b2

; coef quivalent $0
; 5 cases mmoire

Etape 4 : Initialisations utiles au programme


Pointeurs dadressage : R0, M0, R1, M1, R2, M2 :
move
move
move
move
move
move

#coef,R0
#4,M0
#en,R1
#1,M1
#sn,R2
#1,M2

; R0 pointe sur la zone mmoire coef


; zone de mmoire coef modulo 5
; R1 pointe sur la zone mmoire en
; zone de mmoire en modulo 2
; idem pour sn avec R2 et M2
;

Mise 0 des zones de mmoire "en" et "sn" :


clr
do
move
move

A
#2,fin_raz
A,Y :(R1)+
A,Y :(R2)+

; A=0
; rpter 2 fois jusqu fin_raz
; en=0
; sn=0

fin_raz

Etape 5 : Routine de filtrage : entre = 1 chantillon ; sortie = 1 chantillon


Cette routine utilise les transferts parallles du DSP (voir tutoriel sur ce DSP56303)
Initialisation pralable :
move

X:(R0)+,X0

; X0=a0

1re solution pour la routine


filtrage
move
mpy
move
move
mac
move
move
mac
move
move
mac
move
move
macr

A,Y1
X0,Y1,A
X:(R0)+,X0
Y:(R1)+,Y0
X0,Y0,A ;
X:(R0)+,X0
Y:(R1),Y0
X0,Y0,A
X:(R0)+,X0
Y:(R2)+,Y0
-X0,Y0,A
X:(R0)+,X0
Y:(R2),Y0
-X0,Y0,A

; Y(1)=e(n)
; A=a_0.e(n)
; X0=a_1
; Y0=e(n-1)
; A=A+a_1.e(n-1)
; X0=a_2
; Y0=e(n-2)
; A=A+a_2.e(n-2)
; X0=b_1
; Y0=s(n-1)
; A=A-b_1.s(n-1)
; X0=b_2
; Y0=s(n-2)
; A=A-b_2.s(n-2)=s(n)/2

Cours/TP DSP, Benot Decoux, 2005-2006


move
asl
move
move

Y1,Y:(R1)
A
X:(R0)+,X0
A,Y:(R2)

; e(n) dans e(n-2)


; A=2.A=s(n)
; X0=a_0
; s(n) dans s(n-2)

rts

2e solution, utilisant ladressage parallle du DSP (donc plus rapide)


Pour rduire le temps dexcution de la routine, on a tout intrt exploiter les possibilits de
traitement parallle du DSP (voir le tutoriel sur le DSP disponible sur le site web).
Pour cela on doit remplacer par exemple R1 par R4 et R2 par R5, car les registres dadresse
sont rpartis en 2 groupes : R0-R3 et R4-R5, et on ne peut pas utiliser 2 registres du mme groupe
en parallle.
On peut ainsi par exemple effectuer en parallle les oprations suivantes :
mac

X0,Y0,A

A=A+X0Y0 ;

X:(R0)+,X0

Y:(R4)+,Y0

=move X:(R0)+,X0
X0=X pointe par R0 ;
R0=R0+1 ;

=move Y:(R4+),Y0
Y0=Y pointe par R4
R4=R4+1

La routine de filtrage devient alors :


filtrage
move
mpy
mac
mac
mac
macr
asl
move

A,Y1
X0,Y1,A
X0,Y0,A
X0,Y0,A
-X0,Y0,A
-X0,Y0,A
A
A,Y:(R5)

X:(R0)+,X0
X:(R0)+,X0
X:(R0)+,X0
X:(R0)+,X0
Y1,Y:(R4)
X:(R0)+,X0

Y:(R4)+,Y0
Y:(R4),Y0
Y:(R5)+,Y0
Y:(R5),Y0

;Y(1)=e(n)
;A=a_0.e(n) ; X0=a_1 ; Y0=e(n-1)
;A=A+a_1.e(n-1) ; X0=a_2 ; Y0=e(n-2)
;A=A+a_2.e(n-2) ; X0=b_1 ; Y0=s(n-1)
;A=A-b_1.s(n-1) ; X0=b_2 ; Y0=s(n-2)
;A=A-b_2.s(n-2)=s(n)/2 ; e(n) dans e(n-2)
;A=2.A=s(n) ; X0=a_0
;s(n) dans s(n-2)

rts

Calcul des temps dexcution


Il faut se rfrer au document de Motorola "DSP56300 Family Manual", Appendice A :
Instructions timing and restrictions, et Appendice B : Benchmark programs.
Soit T la dure dun cycle dhorloge (=priode dhorloge) du DSP,
move

X:(R0)+,X0

move
mpy
mac
mac
mac
macr
asl
move

A,Y1
X0,Y1,A
X0,Y0,A
X0,Y0,A
-X0,Y0,A
-X0,Y0,A
A
A,Y:(R2)

; 1T

filtrage
X:(R0)+,X0
X:(R0)+,X0
X:(R0)+,X0
X:(R0)+,X0
Y1,Y:(R1)
X:(R0)+,X0

Y:(R1)+,Y0
Y:(R1),Y0
Y:(R2)+,Y0
Y:(R2),Y0

; 1T
; 1T
; 1T
; 1T
; 1T
; 1T
; 1T
; 1T

rts

Total : 16 cycles dhorloge, un peu moins de 200ns 80Mhz (priode de 12,5ns). Cette dure
est comparer avec la condition de temps rel : le traitement doit seffectuer dans une dure
infrieure la priode dchantillonnage, soit par exemple environ 21 s 48kHz. Le rapport entre
ces 2 dures est denviron 170.

Cours/TP DSP, Benot Decoux, 2005-2006

I.2) Forme canonique


Principe
Pour rappel, les relations entres/sorties implmenter (voir rsum de cours pour plus de
dtails et un exemple dimplmentation en C) sont :
s( n ) = a 0 w( n ) + a 1w( n 1) + a 2 w( n 2)
w( n ) = e( n ) b 1w( n 1) b 2 w (n 2)
Les avantages de la forme canonique sont :
- on na plus que 2 chantillons passs mmoriser, au lieu de 4 pour la forme directe (+ 5
coefficients) ;
- le nombre de traitements est rduit par rapport la forme directe ; on na que 5 cyclesmachine (ce qui reprsente par exemple 500 ns pour une horloge 20MHz) ;
- on peut augmenter les coefficients les plus faibles, en gnral les ai : on peut normaliser les
ai et les bi indpendamment ; ils seront donc moins sensibles aux erreurs darrondi.
On peut partir du programme "filtre.asm", modifier lordre de mmorisation des coefficients du
filtre, la fonction dinitialisation, ainsi que celle de calcul de lchantillon filtr.
Il ne faut pas oublier de grer la division par 2 des coefficients (ncessaire pour le codage en
virgule fixe).
s ( n) a 0
a
a
w (n ) e( n ) b1
b
= w ( n) + 1 w (n 1) + 2 w ( n 2) et
=
w ( n 1) 2 w ( n 2)
2
2
2
2
2
2
2
2
Il faut donc dabord diviser e(n) par 2, puis multiplier le membre de droite de la 2e quation par
2 pour obtenir w(n). Enfin, il faut multiplier le rsultat final par 2 pour obtenir s(n).
Voici une premire version du programme non-optimis du point de vue du temps de traitement
car nutilisant que quelques traitements parallles, qui auraient pu tre plus nombreux :
org
dc

X:coef
b_1,b_2,a_0,a_1,a_2

;copie des valeurs des coefficients dans ces mmes emplacements


;coefficients diviss par 2

move
move
move
move

#wn,R0
#1,M0
#coef,R4
#4,M4

;R0 pointe sur la zone memoire "wn"


;zone de memoire "wn" modulo 2
;R4 pointe sur la zone memoire "coef"
;zone de memoire "coef" modulo 5

clr
do
move

A
#2,fin_raz
A,Y:(R0)+

;A=0
;mise a zero de la zone "wn"
;A=0 dans "wn"

.
init_filtre

fin_raz
rts
.
filtrage
asr
move
mac
move
mac
asl
move
move
mpy
move
mac
move
mac
move
asl
rts

A
X:(R0)+,X0
-X0,Y0,A
X:(R0)+,X0
-X0,Y0,A
A
A,X1
Y:(R4)+,Y0
X1,Y0,A
X:(R0)+,X0
X0,Y0,A
X:(R0),X0
X0,Y0,A
X1,X:(R0)
A

Y:(R4)+,Y0
Y:(R4)+,Y0

Y:(R4)+,Y0
Y:(R4)+,Y0

;il faut A=e(n) ici


;e(n)=e(n)/2
;X0=w(n-1), Y0=b1
;A=A-b1*w(n-1)
;X0=w(n-2), Y0=b2
;A=A-b2*w(n-2)=w(n)
;w(n)=w(n)*2
;X1=w(n) (sauvegarde temporaire pour memorisation)
;Y0=a0
;A=a0*w(n)
;X0=w(n-1), Y0=a1
;A=A+a1*w(n-1)
;X0=w(n-2), Y0=a2
;A=A+a2*w(n-2)
;w(n)->w(n-2)
;A=2.A=s(n) (car les coefficients ont ete divises par 2)

Voici maintenant une 2e version utilisant ladressage parallle :


5

Cours/TP DSP, Benot Decoux, 2005-2006

coef

org
dsm

Y:$0
2

org
dc
..
move
move
move
move
move
clr
rep
move
move
move

Y:coeff
a0, b1, b2, a1, a2

mpy
mac
mac
mac
macr

X0,Y1,A
-X0,Y0,A
-X1,Y0,A
X0,Y0,A
X1,Y0,A

#coef,R5
#4,M5
#wn,R1
#2,N1
#1,M1
A
#2
A,X :(R1)+
Y:(R5)+,X0
A,Y1

; R5 pointe sur la zone mmoire coef


; en mode dadressage modulo 5
; R1 pointe sur la zone de mmoire wn
; pour les incrmentations sup. 1
; en mode dadressage modulo 2
; rpter 2 fois la ligne suivante
; A=0 dans les w(i)
; X0=a0
; Y1=e(n)

filtrage
X:(R1)+,X0
X:(R1),X1
X0,X:(R1)A,X:(R1)+

Y:(R5)+,Y0
Y:(R5)+,Y0
Y:(R5)+,Y0
Y:(R5)+,Y0
Y:(R5)+,X0

; A=a0.e(n)
; A=A-b1.w(n-1)
; A=A-b2.w(n-2)
; A=A+a1.w(n-1)
; A=A+a2.w(n-2)

;X0=w(n-1)
;X1=w(n-2)
;w(n-1)->w(n-2)
;w(n)->w(n-1)

;Y0=b1
;Y0=b2
;Y0=a1
;Y0=a2
;X0=a0

rts

I.3) Filtres en cascade


Comme dans le cas de la programmation en langage volu, il est ncessaire dutiliser des
tampons mmoire pour les coefficients ai et bi des diffrents filtres, ainsi que pour les valeurs
passes des chantillons dentre et de sortie.
Considrons le cas le plus simple de la mise en cascade de plusieurs fois le mme filtre du 2nd
ordre : les coefficients ai et bi sont les mmes pour tous les filtres.
Les tapes 1 et 3 ne changent pas.
Etape 2 : rservation de plus demplacements en mmoire pour les chantillons.
en
sn

org
dsm
dsm

Y:$0
4
4

Etape 4 : Initialisation des pointeurs dadresse : en consquence de laugmentation de la taille des


tampons dchantillons, il faut augmenter dautant la taille des modulo.
Pointeurs dadressage : R0, M0, R4, M4, R5, M5 :
move
move
move
move

#en,R4
#3,M4
#sn,R5
#3,M5

; R4 pointe sur la zone mmoire en


; zone de mmoire en modulo 4
; idem pour sn avec R5 et M5
;

De plus il faut se dplacer diffremment dans ces tampons. Il faut donc utiliser les registres
dincrmentation Ni associs aux registres pointeurs Ri. Par consquent on ajoute au programme du
filtre unique les lignes suivantes :
move
move

#2,N4
#2,N5

; pour le passage dun filtre lautre : tampon chantillons dentre


; idem pour chantillons de sortie

Etape 5 : Routine de filtrage : les parties ajoutes ou modifies sont mises en gras.
filtrage
do #2,fin_fltr
move A,Y1
mpy X0,Y1,A
mac X0,Y0,A

X:(R0)+,X0
X:(R0)+,X0

; Y1=e(n) la 1re itr., s(n) du filtre prcdent aux autres


; A=a_0.e(n) ; X0=a_1 ; Y0=e(n-1)
; A=A+a_1.e(n-1) ; X0=a_2 ; Y0=e(n-2)

Y:(R4)+,Y0
Y:(R4),Y0

Cours/TP DSP, Benot Decoux, 2005-2006


mac X0,Y0,A
mac -X0,Y0,A
macr-X0,Y0,A

X:(R0)+,X0
X:(R0)+,X0
Y1,Y:(R4)+N4

asl A
move A,Y:(R5)+N5
fin_fltr
rts

Y:(R5)+,Y0
Y:(R5),Y0

; A=A+a_2.e(n-2) ; X0=b_1 ; Y0=s(n-1)


; A=A-b_1.s(n-1) ; X0=b_2 ; Y0=s(n-2)
; A=A-b_2.s(n-2)=s(n)/2 ; e(n) dans e(n-2)
; incrm. pour la proch. itr.
; A=2.A=s(n) ; X0=a_0
; s(n) dans s(n-2) ; incrm. pour la proch. itr.

X:(R0)+,X0

II) Implmentation de la TFR (Transforme de Fourier Rapide) sur le DSP


Il sagit de limplmentation du programme "fft.asm" (disponible sur le site www-dsp.efrei.fr).
Dans ce programme, la TFR est dclare comme macro-instruction. Elle possde 3 paramtres :
"points" (nombre de points N), "data" (adresse des chantillons du signal) et "coef" (adresse des
facteurs de phase).
Cette macro-instruction peut tre appele dans un programme principal en lui passant ses 3
paramtres de la faon suivante :
fft

points, data, coef

Soient A et B les 2 entres complexes dun papillon :


A=Re(A)+Im(A)
B=Re(B)+Im(B)
Le facteur de phase WNk est dfini par :
2k
k
WN = exp j
= exp(-j) = cos j sin
N

2k
Re (WNk ) = cos ; Im (WNk ) = sin ; =
N

Les sorties du papillon A et B sont dfinies par :


A=A+B. WNk
B=A-B. WNk
Le dveloppement donne :
A=Re(A)+jIm(A)+(Re(B)+jIm(B))(cos-jsin)
soit :
Re(A)=Re(A)+Re(B).cos+Im(B).sin
Im(A)=Im(A)+Im(B).cos-Re(B).sin

(1)
(2)

Re(B)=Re(A)-Re(B).cos-Im(B).sin
Im(B)=Im(A)-Im(B).cos+Re(B).sin

(3)
(4)

B peut tre calcul partir de A, ce qui rduit le nombre doprations :


(1)+(2) Re(B)=2.Re(A)-Re(A)
(3)+(4) Im(B)=2.Im(A)-Im(A)
Les facteurs de phase WNk sont stocks ladresse coef
- Valeurs de cosinus en mmoire X
7

Cours/TP DSP, Benot Decoux, 2005-2006

Valeurs de sinus en mmoire Y

Seules N/2 valeurs sont stockes : de 0 - avec =2/N.


Le cur du programme est le calcul dun papillon, cest dire le calcul des 2 nombres
complexes de sortie partir des 2 nombres complexes dentre.
Calculs intermdiaires :
b=Im(A)-Re(B).sin
Im(A)=b+Im(B).cos
Im(B)=2.Im(A)-Im(A)

(MAC)
(MACR)
(SUBL)

b=Re(A)-Re(B).cos
Re(A)=b+Im(B).sin
Re(B)=2.Re(A)-Re(A)

(MAC)
(MACR)
(SUBL)

Les transferts parallles du DSP sont utiliss.

Test de lalgorithme
On met quelques priodes de sinus en mmoire. Le rsultat de la TFR doit tre 0 partout sauf
pour la composante correspondant la frquence du signal. Le module de cette composante est
alors gal lamplitude du signal.
Les chantillons dentre sont stocks ladresse data :
- Partie relle en mmoire X
- Partie imaginaire en mmoire Y
-

ladressage en mode bits inverss est lun des 3 modes dadressage du DSP
ce mode se programme de la manire suivante :
- registre Mi charg avec 0
- registre Ni charg avec le nombre de bits inverser

Un exemple de programme : copie dune zone de mmoire dans une autre avec adressage en
bits inverss pourrait tre (voir galement programme bit_rev.asm) :

fin1

move
move
move
move
do
move
move
nop

#data, R3
; R3 pointe sur une zone data pralablement initialise
#data2, R4
#0, M3
; programmation du mode bit reverse
#nb_pts, N3
; renversement binaire sur nb_pts adresses
#nb_pts, fin1
x :(R3)+N3,x0
x0,x :(R4)+

Cours/TP DSP, Benot Decoux, 2005-2006

Annexe 1 : Programme de TFR sur DSP56303


;*****************************************************************************************************
; fft.asm
;
Algorithme de calcul de la transformee de Fourier rapide TFR
;
- sur place (les sorties de la FFT crasent les chantillons du signal)
;
- dcimation temporelle
;
;
Benoit Decoux, TP DSP, EFREI 2002-2003
;
( partir du programme fftc563.asm de Motorola et du travail de projet de
;
fin d'tudes de MM. Barbiero et Valette, promotion 2002).
;*****************************************************************************************************
fft macro points,data,coef ; macro fft
;initialisation des registres de dcalage (papillons, groupes et coefficients W(n,k)
move #points/2,n0
; n0 = nombre de papillons par groupe (valeur initiale : 'points'/2)
move #1,n2
; n2 = nombre de groupes dans la passe (valeur initiale : 1)
move #points/4,n6
; n6 pour acceder aux valeurs sinus et cosinus des W(n,k)
; (la moiti de la taille du tableau)
;mode d'adressage
move #-1,m0
move m0,m1
move m0,m4
move m0,m5
move #0,m6
do

; m0 = $FFFF, adressage lineaire


; idem pour m1
; idem pour m4
; idem pour m5
; adressage en binaire inverse pour r6 (acces aux W(n,k))

#@cvi(@log(points)/@log(2)+0.5),_fin_pass

; boucles sur les passes (N=2^P itrations)

;initialisation des ptr de calcul et enreg


move #data,r0
move r0,r4
move #coef,r6
lua
(r0)+n0,r1

; r0 contient l'adresse de base des chantillons "data"


; idem pour r4
; r6 pointe sur l'adresse de base de "coef"
; r1 contient l'adresse du N/2e chantillon

;initialisation des registres de dcalage


move n0,n1
move n0,n4
move n0,n5
nop
lua
(r1)-,r5

; registre de decalage n1 <- nb papillon par groupe


; idem n4
; idem n5

do

n2,_fin_grpe

; boucle sur les groupes (n2 iterations)

;init des calculs intermdiaires


move x:(r1),x1 y:(r6),y0
move x:(r5),a
y:(r0),b
move x:(r6)+n6,x0
do
mac

n0,_fin_papi
-x1,y0,b
y:(r1)+,y1

macr

x0,y1,b

subl

b,a

mac

x1,x0,b

x:(r1),x1

macr

y1,y0,b

x:(r0)+,a

subl

b,a

a,x:(r5)+
x:(r0),b

b,x:(r4)+

; x1 <- Re[B], y0 <- sinus (car r6=coef)


; A <- Re[B], B <- Im[A]
; x0 <- cosinus (n6=points/4) et r6 remis a jour pour prochaine iteration

y:(r0),a
b,y:(r4)

a,y:(r5)
y:(r0),b

_fin_papi
;mises jour pour papillons
move x:(r0)+n0,x1 y:(r4)+n4,y1
move
_fin_grpe
move
lsr b
move
lsl a
move
move
_fin_pass
endm

a,x:(r5)+n5 y:(r1)+n1,y1
n0,b1
n2,a1
b1,n0
a1,n2

; r5=r1-1 (adresse du N/2-1e chantillon)

; boucle sur les papillons (n0 iterations)


; B <- (B=Im[A])-Re[B]*sinus (calcul intermdiaire)
; y1 <- Im[B] et r1++
; B <- (B=Im[A]-Re[B]*sinus)+Im[B]*cosinus=Im[A']
; X <- (A=Re[B]) et r5++ (sauvegarde en mmoire X)
; A <- Im[A]
; A <- (Im[B']=2*Im[A]-Im[A'])
; B <- Re[A]
; Y <- Im[A'] (sauvegarde en mmoire Y)
; B <- (B=Re[A])+Re[B]*cosinus (calcul intermdiare)
; x1 <- Re[B]
; B <- Re[A']=(B=Re[A]+Re[B]*cosinus)+Im[B]*sinus)
; A <- Im[A] et r0++
; Y <- Im[B'] (sauvegarde en mmoire Y)
; A <- (2*Re[A]-Re[A']=Re[B'])
; X <- Re[A'] et r4++ (sauvegarde en mmoire X)
; B <- Im[A]
; x1 <- Re[B] et r0=r0+n0
; r4=r4+n4
; X <- (A=Re[B']) et r5=r5+n5
; y1 <- Im[B] et r1=r1+n1
; b1 <- nombre de papillons par groupe
; division du nombre de papillons/groupes par 2
; a1 <- nombre de groupes par passe
; multiplication du nombre de goupes/passe par 2
; mise jour de n0 avec son nouveau contenu
; idem pour n2
; fin macro

Cours/TP DSP, Benot Decoux, 2005-2006


;************************************************************************
; Transformee de Fourier rapide (FFT)
;
Benoit Decoux, cours-TP DSP 2002-2003, EFREI
;************************************************************************
include 'fft.asm'
; macroinstruction du calcul de la TFR
; DEFINITION des adresses des registres utiliss
;*************************************************************************
M_PCTL
equ x:$FFFFFD
; registre de commande de la PLL
M_BCR
equ x:$FFFFFB
; registre de commande des BUS
; DEFINITION des constantes
;*************************************************************************
points
equ 64
; nombre de points de la TFR
pi
equ 3.141592654
; no comment
freq
equ 2.0*pi/@cvf(points)
; 1 priode de sinus sur 'point' pour les facteurs de phase W(n,k)
np
equ 8
freq2
equ 2.0*pi/@cvf(points/np)
; "frquence" du signal de test cosinus : 'np' priodes dans le tableau de 'points'
valeurs
data
equ $100
; adresse mmoire de la zone de donnes traiter
coef
equ data+points
; adresse mmoire de la zone de mmorisation des facteurs de phase
affi
equ $160
; adresse mmoire de la zone de mmorisation des rsultats de la FFT
; allocations en memoire X
;*************************************************************************
org
x:data
ds
points
; pour les donnes traiter
org
x:coef
; ligne facultative puisque l'adresse 'coef' est la suite de 'data'
ds
points/2
; pour les cos & sin utiliss par la FFT
org
x:affi
ds
points
; pour les rsultats du traitement
; allocations en memoire Y
;*************************************************************************
org
y:data
ds
points
; idem pour parties imaginaires
org
y:coef
ds
points/2
;***************table generation macro***********************************
; Sine-Cosine Table Generator
;
sincosr - macro to generate sine and cosine coefficient
;
lookup tables for Decimation in Time FFT
;
twiddle factors. Only points/2 coefficients
;
are generated.
;
points number of points (2 - 32768, power of 2)
;
coef base address of sine/cosine table
;
negative cosine value in X memory
;
negative sine value in Y memory
;**************************************************************************
sincosr macro points,coef
sincosr ident 1,1
org
x:coef
count set
0
dup
points/2
dc
@cos(@cvf(count)*freq)
count set
count+1
endm
org
y:coef
count set
0
dup
points/2
dc
@sin(@cvf(count)*freq)
count set
count+1
endm
endm
; fin macro sincos
; macro de gnration de signal de test (cosinus)
;***********************************************
sigtst macro
points,coef
org
x:data
count set
0
; generate a cosine input
dup
points
dc
@cos(@cvf(count)*freq2)/256
count set
count+1
endm
; fin de la boucle dup
org
y:data
count set
0
; 0 fill the corresponding imaginary input
dup
points
dc
0
count set
count+1
endm
; fin de la boucle dup
endm
; fin de la macro
sincosr
sigtst

points,coef
points,coef

; Programme principal
;**********************************
org
p:$100
START
main movep #$040003,x:M_PCTL
movep #$012421,x:M_BCR
ori
#3,mr
movec #0,sp
move #0,omr
fft
points,data,coef

; macro lancer avant le programme :


; elle contiennent des directives d'assemblage

; set PLL for MPY of 4X


; set up one ext. wait state for all AAR areas
; mask interrupts
; clear hardware stack pointer
; operating mode 0

10

Cours/TP DSP, Benot Decoux, 2005-2006


;

jsr
jmp
end

module
*

; appel la routine pour ne garder que le module


; tourne en rond

11

Cours/TP DSP, Benot Decoux, 2005-2006


;****************************************************************************************
;
testflt1.asm
;
Test des fonctions de filtrage de filtre.asm
;
TP/projets DSP EFREI 2002-2003, Benot Decoux
;****************************************************************************************
nolist
include 'ioequ.asm'
include 'intequ.asm'
include 'ada_equ.asm'
include 'vectors.asm'
list
;******************************************************************************
;---Buffer for talking to the CS4215
org x:0
RX_BUFF_BASE
RX_data_1_2
RX_data_3_4
RX_data_5_6
RX_data_7_8
TX_BUFF_BASE
TX_data_1_2
TX_data_3_4
TX_data_5_6
TX_data_7_8
RX_PTR
TX_PTR

ds
ds

equ
ds
ds
ds
ds
equ
ds
ds
ds
ds

*
1
1
1
1
*
1
1
1
1

1
1

;data time slot 1/2 for RX ISR


;data time slot 3/4 for RX ISR
;data time slot 5/6 for RX ISR
;data time slot 7/8 for RX ISR
;data time slot 1/2 for TX ISR
;data time slot 3/4 for TX ISR
;data time slot 5/6 for TX ISR
;data time slot 7/8 for TX ISR
; Pointer for rx buffer
; Pointer for tx buffer

TONE_OUTPUT EQU HEADPHONE_EN+LINEOUT_EN+(4*LEFT_ATTN)+(4*RIGHT_ATTN)


TONE_INPUT
EQU MIC_IN_SELECT+(15*MONITOR_ATTN)
CTRL_WD_12
equ
NO_PREAMP+HI_PASS_FILT+SAMP_RATE_48+STEREO+DATA_16 ;CLB=0
CTRL_WD_34
equ
IMMED_3STATE+XTAL1_SELECT+BITS_64+CODEC_MASTER
CTRL_WD_56
equ
$000000
CTRL_WD_78
equ
$000000
org
START
main
movep
movep
ori
movec
move
move
move
jsr
jsr

p:$100
#$040003,X:M_PCTL
#$012421,X:M_BCR
#3,mr
#0,sp
#0,omr
#$40,r6
#-1,m6
ada_init
init_filtre

; set PLL for MPY of 4X


; set up one ext. wait state for all AAR areas
; mask interrupts
; clear hardware stack pointer
; operating mode 0
; initialise stack pointer
; linear addressing
; initialize codec
; initialisation des paramtres du filtre

#2,X:M_SSISR0,*
#2,X:M_SSISR0,*

; wait for frame sync to pass


; wait for frame sync

move
move

X:RX_BUFF_BASE,B
X:RX_BUFF_BASE+1,A

; receive left
; receive right

jsr

process_stereo

move
move

A,X:TX_BUFF_BASE
A,X:TX_BUFF_BASE+1

; transmit left
; transmit right

move
move
move
move

#TONE_OUTPUT,y0
Y0,X:TX_BUFF_BASE+2
#TONE_INPUT,y0
Y0,X:TX_BUFF_BASE+3

;set up control words

jmp

loop_1

include
include

'ada_init.asm'
'../prog/filtre_4.asm'

;INCLUDE YOUR OWN .ASM HERE

filtrage

;JUMP TO YOUR PROCESSING SUBROUTINE HERE

loop_1
jset
jclr

echo
process_stereo
jsr
rts
end

12

Cours/TP DSP, Benot Decoux, 2005-2006


;-------------------------------------------------------------------------------------------------------;
filtre.asm
;
Implmentation d'un filtre passe-bas du 2e ordre sur DSP 56303
;
Forme directe
;
;
TP/projets DSP EFREI 2002-2003, Benot Decoux
;-------------------------------------------------------------------------------------------------------a_0
a_1
a_2
b_1
b_2
coef

en
sn

equ
equ
equ
equ
equ

0.00379/2
0.00758/2
0.00379/2
-1.81845/2
0.83362/2

org
dsm

X:$10
5

;rservation de 5 emplacements mmoire


; pour les coefficients du filtre

org
dc

X:coef
a_0,a_1,a_2,b_1,b_2

;copie des valeurs des coefficients dans ces mmes emplacements

org
dsm
dsm

Y:0
2
2

org p:
init_filtre
move
move
move
move
move
move
clr
do
move
move
fin_raz
move
rts

#coef,R0
#4,M0
#en,R4
#1,M4
#sn,R5
#1,M5
A
#2,fin_raz
A,Y:(R4)+
A,Y:(R5)+

;R0 pointe sur la zone mmoire "coef"


;zone de mmoire "coef" modulo 5
;R4 pointe sur la zone mmoire "en"
;zone de mmoire "en" modulo 2
;R5 pointe sur la zone mmoire "sn"
;zone de mmoire "sn" modulo 2
;A=0
;mise zro des zones "en" et "sn"
;A=0 dans "en"
;X0=a_0

X:(R0)+,X0

filtrage
move
mpy
mac
mac
mac
macr
asl
move

A,Y1
X0,Y1,A
X0,Y0,A
X0,Y0,A
-X0,Y0,A
-X0,Y0,A
A
A,Y:(R5)

;Y(1)=e(n)
;A=a_0.e(n),
X0=a_1, Y0=e(n-1)
;A=A+a_1.e(n-1), X0=a_2, Y0=e(n-2)
;A=A+a_2.e(n-2), X0=b_1, Y0=s(n-1)
;A=A-b_1.s(n-1), X0=b_2, Y0=s(n-2)
;A=A-b_2.s(n-2)=s(n)/2, e(n)->e(n-2)
;A=2.A=s(n),
X0=a_0
;s(n) dans s(n-2)

X:(R0)+,X0
X:(R0)+,X0
X:(R0)+,X0
X:(R0)+,X0

Y:(R4)+,Y0
Y:(R4),Y0
Y:(R5)+,Y0
Y:(R5),Y0
Y1,Y:(R4)
X:(R0)+,X0

rts

13

Cours/TP DSP, Benot Decoux, 2005-2006

Annexe 2 : Arithmtique des DSP

Sommaire
1) Reprsentations des nombres
2) Codage binaire
3) Nombres signs
Signe-grandeur
Code complment 1
Code complment 2
4) Nombres rels
Virgule fixe
Format mixte
Virgule flottante
5) Conversions de formats
Dcimal vers binaire
Binaire vers dcimal
Fractionnaire vers binaire
Conversion hexa dcimal vers dcimal
Conversion dcimal vers hexadcimal
6) Rduction du nombre de bits du codage
Troncature
Arrondi

1
1
2
2
2
3
3
3
4
5
6
6
6
6
6
7
7
7
7

1) Reprsentations des nombres


Les nombres sont reprsents par une succession de chiffres, eux-mmes exprims dans une
base donne. Les reprsentations les plus utilises sont :
- Binaire : 1 chiffre possde 2 valeurs possibles : base 2
- Dcimale : 1 chiffre possde 10 valeurs possibles : base 10
- Hexadcimale : 1 chiffre possde 16 valeurs possibles : base 16
Ces reprsentations courantes sont des cas particuliers du cas gnral dune base n.
Dans les systmes numriques, les donnes sont reprsentes par groupes de 4 bits, chaque
groupe pouvant coder 16 valeurs, de 0 15. Les reprsentations utilises sont donc le binaire et
lhexadcimal, qui permet une criture condense, au moyen de chiffres et de lettres : de 1 9 puis
de A F.

2) Codage binaire
Sur n bits, on peut coder 2n combinaisons possibles : de 0 2n -1.
Exemples :
- 1 bit : 21 =2 combinaisons de 0 21 -1=1
- 8 bits : 28 =256 combinaisons de 0 28 -1=255
- 16 bits : 216 =65536 combinaisons de 0 216 -1=65535
- etc

14

Cours/TP DSP, Benot Decoux, 2005-2006

3) Nombres signs
A rsolution constante, des nombres peuvent tre reprsents par des valeurs positives
uniquement (nombre non signs) ou par des valeurs positives et ngatives (nombres signs).
Par exemple sur 8 bits, en reprsentation signe, un nombre peut varier de 128 +127 (en
complment 2, voir ci-dessous) ; en reprsentation non-signe, il peut varier de 0 255.
Il existe plusieurs reprsentations des nombres signs :
- signe-grandeur ;
- complment 1 ;
- complment 2.
Le plus souvent, le code utilis pour les nombres signs est le complment 2. On obtient le
complment 2 dun nombre en lui appliquant dabord le complment 1, puis en ajoutant 1.
Loppos dun nombre sobtient donc en calculant son complment 2.
Lintrt du code complment 2 est sa facilit de calcul, et le fait que la valeur 0 ne soit code
quune seule fois (ce qui nest pas le cas du complment 1). Toutes les oprations ncessaires pour
lobtenir (addition, soustraction, multiplication, division) peuvent tre ralises partir de
laddition, ralise par des additionneurs binaires.
Ce code est utilis dans les ordinateurs et la plupart des microcontrleurs, dont le DSP56303.

Signe-grandeur
Dans cette reprsentation, le bit de gauche est un bit de signe et les autres reprsentent la
grandeur.
Bit de signe : 0 nombre positif ; 1 -> nombre ngatif
Exemple :
5=1101
(pour la conversion de la reprsentation dcimale la reprsentation binaire, voir plus bas).

Code complment 1
Dans ce mode de reprsentation, les poids des bits vont sont 2n-1 , 2n-2 , 2n-3 , 20 , o n est le
nombre de bits.
Pour obtenir le complment 1 dun nombre, on inverse tous les bits de son code binaire et on
ajoute 1.
Exemple :
5=0101 ; complment 1 : 1010+1=5
La conversion binaire-vers-dcimal sobtient en ajoutant les poids des bits 1 (voir paragraphe
sur les conversions de formats, plus bas).
Exemple :
binaire=1010 dcimal= 23 +21 +1= 8+2+1= 5

Code complment 2
Les poids de bits sont les mmes quen complment 1.
On obtient le complment 2 en appliquant le complment 1 et en ajoutant 1.
15

Cours/TP DSP, Benot Decoux, 2005-2006

Exemple :
Conversion inverse :

5=0101 5=1011
binaire=1011 dcimal= 23 +21 +20 =5

Autre exemple :
72=01001000
inversion : 10110111
+1 : 10111000
= 72
Les valeurs sont comprises entre (2n-1 ) et 2n-1 1.
Exemple : n=8 : valeurs comprises entre 27 = 128 et 27 1=127.

4) Nombres rels
Les nombres rels sont encore appels nombres fractionnaires. Ils possdent des chiffres
droite la virgule.

Virgule fixe
Dans ce mode de reprsentation, on a 1 bit de signe (bit de gauche) et les autres qui concernent
la partie fractionnaire. La virgule se situe donc droite de ce bit.
Comme dans le cas des nombres entiers, la signification du bit de signe est :
0 : le nombre est positif,
1 : le nombre est ngatif.
Dans ce mode on peut reprsenter des nombres compris entre 1 et +1, plus exactement 1 et
0,999999 , le nombre de 9 dpendant du nombre de bits.
Nombre de valeurs possibles sur n bits :
2n
Prcision :
2-(n-1)
Valeurs min et max :
min=-1,0 ; max=1-2-(n-1)
Poids des bits :
-20 , 2-1 , 2-2 , , 2-(n-1)
Exemple :
N=3
Nombre de valeurs possibles :
23 =8
Prcision :
2-(n-1)=1/2 n-1 =1/4=0,25
Valeurs min et max :
-1,0 et 1-2-(3-1)= 1-2-2 =1-1/22 =1-1/4=0,75
Les 8 valeurs sont :
-1,0 ; -0,75 ; -0,5 ; -0,25 ; 0 ; 0,25 ; 0,5 ; 0,75

16

Cours/TP DSP, Benot Decoux, 2005-2006

Reprsentation sur un cercle : lintervalle [-1,0 ; 0,999] est dcompos en 2n valeurs, et le


cercle en 2n parties.
Pour passer du binaire au dcimal, on ajoute les poids des bits 1, comme dans le cas des
entiers (voir paragraphe sur les conversions de format, plus bas) :
D=-20 bn-1 +2-1 bn-2 ++2-(n-2)b1 +2-(n-1)b0
Exemples
n=3 ; binaire=010

D=-20 0+2-1 1+2-2 0=1/2

n=3 ; binaire=111
D=-20 1+2-1 1+2-2 =-1+1/2+1/4=-1/4
n=16 ; binaire=0011 0011 0011 0011
D=2-2 +2-3 +2-6 +2-7 +2-10 +2-11 +2-14 +2-15
=0,25+0,125+0,01562+0,0078+
=0,3999.
Sur 24 bits (cas de la mmoire du DSP56303) :
Prcision :
2-23
Valeur min : tous les bits sont 0 sauf le bit de signe
-1=$800000
Valeur max : tous les bits sont 1 sauf le bit de signe
1-2-23 =$7FFFFF=0,99999988
Exemple : quel nombre reprsente $FFFFFF ?
Rponse : -20 +0,9999998=-1+0,9999998=-0,00000012 ; il sagit de la valeur ngative la plus
petite, qui est gale en valeur absolue la prcision.
Ce format est parfois not [I-Q] ; I dsigne la partie gauche de la virgule ; Q la partie droite.
Ici, le format est not [1-23] ou Q23.

Format mixte
Ce codage est virgule fixe, mais avec une partie entire qui peut tre suprieure 1.
Lintrt de ce format est de permettre de sortir de la plage [-1 ; +1], ce qui facilite les calculs.
Soit I le nombre de bits de la partie entire et Q le nombre de bits de la partie fractionnaire. La
correspondance entre le nombre dcimal et le nombre binaire est :
D=-2I-1 bI-1 +2I-2 bI-2 ++20 b0 +2-1 b-1 +2-2 b-2 +...+2-Qb-Q
Il est not [I, Q] ;
Dans le cas du DSP56303, les accumulateurs A et B comportent 56 bits. Le format est [9, 47] :
la partie entire comporte 9 bits et la partie fractionnaire 47 bits.
Ces accumulateurs sont constitus par la concatnation dun registre de 8 bits et 2 registres de
24 bits :
A=A2:A1:A0 et B=B2:B1:B0
Le bit le plus gauche est le bit de signe. Les poids des 8 bits de poids fort vont de 28 21 , et
non 27 20 comme dans la reprsentation habituelle 8 bits.
A2 : 28 21 ; A1 : 20 2-23 ; A0 : 2-24 2-47
17

Cours/TP DSP, Benot Decoux, 2005-2006

La virgule se situe entre le bit de poids 20 et le bit de poids 21 . Cela permet de nutiliser que
lun des registres de 24 bits.
Exercice 1 : Dans le format mixte [9, 47], quel nombre reprsente $01FFFFFFFFFFFF ?
Rponse : 20 +2-1 +2-2 +...+2-46 =1+0,5+0,25+...=1,999999.....
Exercice 2 : Dans le format mixte [9, 47], comment coder 1 ?
Rponse : $FF800000000000
8
7
6
car -1=-2 +2 +2 +25 +...+21 +20 =-256+128+64+32+16+8+4+2+1

Virgule flottante
Lavantage de ce codage est de permettre de coder la fois des nombres sur de trs grandes
plages de valeurs sil sagit dentiers, et avec une grande prcision (beaucoup de chiffres aprs la
virgule) sil sagit de rels.
La position de la virgule est gre par lUAL. Il nest donc pas ncessaire de grer le
dpassement de capacit.
Le codage peut tre ralis sur 32 ou 64 bits. On parle respectivement de simple ou de double
prcision.
En simple prcision, ltendue des valeurs pouvant tre codes est :
1,2.10-38 3,4.1038
et en double prcision :
2,2.10-308 1,8.10308
Ces formats suivent la norme rfrence IEEE-754-1985.
La correspondance entre le nombre dcimal et le nombre binaire sobtient par la formule :
(-1)S(1+F)(2E-127 )
o S est le bit de signe, F la partie fractionnaire et E la partie entire.
Le principe du codage est le suivant :

1 bit de signe,

plusieurs bits dexposant,

plusieurs bits pour la mantisse


La virgule se trouve entre lexposant et la mantisse.
Simple prcision (32 bits)

1 bit de signe

8 bits dexposant

23 bits de mantisse
Lexposant est biais : la valeur 127 est ajoute aux 8 bits pour quil soit toujours positif.
Double prcision (64 bits)

1 bit de signe

11 bits dexposant

52 bits de mantisse
Il existe galement la prcision tendue sur 80 bits, mais les modes les plus rpandus sont la
simple et la double prcision. En programmation C, ils correspondent aux types float et double
(respectivement).
18

Cours/TP DSP, Benot Decoux, 2005-2006

5) Conversions de formats
Conversion dcimal vers binaire
La mthode est la suivante :
- on divise par 2 jusqu ce quon tombe sur un rsultat nul
- le reste vaut 0 ou 1 ; ce reste constitue ltat des bits successifs du poids faible vers le poids
fort
exemple : 14
14/2=7 (r=0) ; 7/2=3 (r=1) ; 3/2=1 (r=1) ; 1/2=0 (r=1)
rsultat : 1110
Conversion binaire vers dcimal
Si lon veut raliser la conversion inverse, on applique les poids au nombre et on ajoute 1. Ce
qui revient ajouter simplement les poids des bits 1.
exemple : 101=122 +021 +120 =5
Conversion fractionnaire vers binaire
Mthode :
- on multiplie la partie fractionnaire du nombre par 2 jusqu ce que le nombre de dcimales
soit atteint ou que la partie fractionnaire soit nulle
- la partie entire vaut 0 ou 1
- elle constitue successivement les bits du nombre binaire correspondant, du MSB au LSB
Exemple : 5,3 : 0,32=0,6 0 ; 0,62=1,2 1 ; 0,22=0,4 0 ; 0,42=0,8 0 ; etc
Rsultat : 101,0100
Conversion hexadcimal vers dcimal
2 mthodes :
1) on peut faire dabord la conversion hexadcimal vers binaire puis binaire vers dcimal
2) chaque valeur dcimale des chiffres hexa est multiplie par leur poids (1, 16, 256, 4096,)
Exemple : $7A=716+101=112+10=122
Conversion dcimal vers hexadcimal
On effectue des divisions successives par 16, et on multiplie la partie fractionnaire par 16. On
obtient ainsi des chiffres hexadcimaux des poids faibles aux poids forts.
Exemple : 250
250/16=15,625 0,62516=10 soitA
15/16=0,9375 0, 937516=15 soit F
rsultat : FA

19

Cours/TP DSP, Benot Decoux, 2005-2006

6) Rduction du nombre de bits de codage


Dans un programme il arrive frquemment quon ait besoin de transfrer la valeur dun registre
vers la mmoire, ou vers un autre registre plus court. Dans ces deux cas, le nombre de bits du
codage se trouve rduit, et il y a une perte dinformation. Il sagit de minimiser cette perte. Il existe
deux mthodes de rduction : la troncature et larrondi.

Troncature
Cest la solution la plus simple. Elle consiste enlever les bits les moins significatifs.

Arrondi
Cette solution est meilleure dans la mesure o elle consiste arrondir la valeur la plus proche
de la valeur tronque, Elle consiste additionner 1 si la partie enleve est suprieure la moiti du
bit de poids le plus faible de la partie garde, 0 sinon. Cela revient regarder la valeur du bit de
poids le plus fort de la partie enleve. Sil est gal 1, on ajoute 1 la partie garde ; sil est gale
0, on ne rajoute rien. Il suffit donc dajouter le bit de poids le plus fort de la partie enleve au mot
gard. Cet arrondi est appel arrondi au plus prs.
Le cas o, dans la partie enleve, seul le bit de poids le plus fort est 1 et tous les autres 0, est
un cas particulier. Il est quivalent 0,5 par exemple : faut-il larrondir 0 ou 1 ? On peut dcider
arbitrairement dune des 2 possibilits. Dans les DSP56xxx, dans ce cas on ajoute un 1 si le bit de
poids le plus faible de la partie garde est 1 (ce qui revient arrondir la valeur suprieure), sil
est 0 on ne fait rien (arrondi la valeur infrieure).

20

Cours/TP DSP, Benot Decoux, 2005-2006

Annexe 3 : DSP 56303 et carte dvaluation DSP56303EVM

Sommaire
I) Carte dvaluation DSP56303EVM
I.1) Description succinte
I.2) Utilisation

1
1
1

II) DSP56303
II.1) Principales caractristiques
II.2) Architecture
II.3) Formats utiliss pour le codage des donnes
II.4) Modes dadressage
II.5) Programmation
II.5.1) Instructions
II.5.2) Caractres et directives dassemblage

2
2
3
4
4
7
7
10

I) Carte dvaluation DSP56303EVM


I.1) Description succinte

Cette carte a t dvelopp par Motorola. Elle comporte un Codec (codeur-dcodeur) audio 16
bits de Crystal Semiconductor (Cirrus) de rfrence Crystal CS4215. Il sagit dun composant qui
intgre un CAN et un CNA. Ses principales caractristiques sont :

Frquence dchantillonnage de 4kHz 50kHz


Codage 8 ou 16 bits, linaire, -law et A-law
Gain programmable pour les entres analogiques
Attnuation programmable pour les sorties analogiques
Oscillateur intgr
Entres analogiques : microphone et ligne (niveau normalis)
Sorties casque, haut-parleurs et ligne
Filtres anti-aliasing et de lissage intgrs
Interface numrique srie

I.2) Utilisation
Avant toutes choses il faut alimenter le kit dvaluation, en utilisant un bloc dalimentation
rgl sur 9V. Bien vrifier ce rglage ainsi que la polarit correcte avant tout branchement.
Ensuite connecter le kit un port srie COM du PC par lintermdiaire dun cble 9 broches
(DB9-DB9).
Voici les diffrentes tapes pour gnrer un fichier binaire, le transfrer dans le DSP et
lexcuter :
Assemblage, tlchargement et excution
-

Copier le programme debugger "evm30xw" et le programme .asm (par exemple le programme


de test du CODEC "pass.asm"), dans un rpertoire local temporaire (il faut prendre le rflexe de
21

Cours/TP DSP, Benot Decoux, 2005-2006

renommer les programmes que lon est amen modifier, pour tre sr de conserver toujours la
version initiale).
Assembler le programme .asm laide de la commande :
asm56300 a b g l pass.asm

On peut galement crer un fichier batch (par exemple "asm.bat") laide dun diteur de texte,
comportant la ligne de commandes :
asm56300 a b g l %1

et lancer lassemblage par


asm pass.asm

Lancer le debugger. Si un message derreur apparat, vrifier lalimentation correcte du kit, et la


connexion srie au port COM1 du PC.
Si le bouton comportant la flche verte est enfonc, appuyer sur le bouton "stop".
Charger le fichier .cld ; il est directement tlcharg dans le DSP du kit.
Excuter ce programme en appuyant sur "bouton flche verte".
ATTENTION
- prcautions dutilisation Un des boutons-poussoirs situs sur la carte sert tester les sorties audio, en gnrant un son
damplitude maximale. Evitez de porter un casque pendant que vous faites ce test, et en rgle
gnrale avant dtre sr que le programme ne gnre pas un son trop fort.

II) DSP56303
II.1) Principales caractristiques

Technologie CMOS faible consommation


Architecture parallle permettant lexcution dune instruction en parallle avec des accs
en mmoire
Mmoire interne : 4096 mots (de 24 bits) de RAM programme (en 2 zones distinctes X et Y)
et 4096 mots de RAM donnes
Port dextension mmoire externe
Interface srie synchrone SSI
Interface srie asynchrone SCI
Interface hte/DMA (parallle)
Triple temporisateur (timer) de 24 bits
Emulateur intgr
Gnrateur dhorloge programmable PLL
Multiplieur-accumulateur parallle de 24*24 bits fonctionnant en 1 cycle machine

Interprtation : le processeur est spcialis dans lopration MAC et les transferts parallles,
contrairement certains autres architecture CISC.

Rappel : PLL=Phase-Locked Loop=boucle verrouillage de phase, permet de programmer une HF


en fonction dune frquence + basse de rfrence.

22

Cours/TP DSP, Benot Decoux, 2005-2006

II.2) Architecture
Accumulateurs A et B
Ils comportent 56 bits, et sont constitus par la concatnation de 3 registres : un de 8 bits (
gauche) et 2 de 24 bits. Notation : A=A2:A1:A0 ; B=B2:B1:B0
Le bit le plus gauche est le bit de signe. Les poids des 8 bits de poids fort vont de 28 21 , et
non 27 20 comme dans la reprsentation habituelle 8 bits.
A2 : 28 21 ; A1 : 20 2-23 ; A0 : 2-24 2-47
La virgule se situe entre le bit de poids 20 et le bit de poids 21 . Cela permet de nutiliser que
lun des registres de 24 bits.
Exemple
00000000 0,01100110011001100110011 001100110011001100110011
$ 00 333333 333333 = 0,399999999999999

Lavantage de ce format est dtre mixte : virgule fixe mais permettant de coder des valeurs
suprieures 1, ce qui permet de grer les dpassements de capacit pouvant se produire dans le cas
du format virgule fixe. La gamme des valeurs est [-256, +256-2-47 ].
Les registres 24 bits sont usage gnral : ils peuvent tre utiliss pour les transferts avec la
mmoire et avec dautres registres. Par contre, les rsultats des multiplications et des oprations
arithmtiques et logiques ne peuvent tre quun registre 56 bits (A ou B).

Registres X et Y
Comme A et B il sagit de registres usage gnral, mais utiliss comme oprandes des
multiplications et oprations arithmtiques et logiques, pas pour les rsultats. Ils comportent 48 bits
et sont constitus par la concatnation de 2 registres de 24 bits.
X=X1:X0 ; Y=Y1:Y0

Mmoire : zones X et Y
La mmoire utilise des mots de 24 bits. Elle est au format virgule fixe [1, 23].
Les accumulateurs A et B possdant 56 bits, il y a une perte dinformation lors du transfert en
mmoire des valeurs rsultant dun calcul et prsentes dans ces accumulateurs. Cette perte peut tre
minimise en utilisant un transfert avec arrondi.

Registres dlaboration des adresses mmoire


Les 3 types de registres dcrits ci-dessous sont des registres 16 bits.
8 registres dadresses (pointeurs) Rn, n=0 7
Utiliss pour pointer vers la mmoire en adressage indirect.
8 registres de mode Mn
Ils permettent de programmer le mode dadressage, selon la valeur copie lintrieur :
-1 : adressage linaire
x : adressage modulo x+1
23

Cours/TP DSP, Benot Decoux, 2005-2006

0 : adressage en bits inverss (utilis pour la FFT)


registres de dcalage Nn
Ils permettent deffectuer
suprieures 1.

des

incrmentations/dcrmentations

des

registres

dadresses,

Quelques registres systme


Registre de mode de fonctionnement : OMR
Permet :
- La slection du champ mmoire
- La programmation des interruptions
- La programmation de la frquence dhorloge
- etc
Registre de commande du circuit PLL : PCTL
Exemple
movep

#$260004, X :PCTL

; positionne la frquence dhorloge du DSP 20 MHz

II.3) Formats utiliss pour le codage des donnes


Dans les DSP56xxx, les formats utiliss sont [1-23], [1-47] et [9-47].
Le 1er est le format de base compatible avec la mmoire, le 2e est utilis pour la multiplication,
et le 3e (format mixte) permet de grer les cas de dpassement de la capacit du format [1-47] (dans
lequel les nombres doivent tre compris entre 1 et +1).

Transferts entre formats


Le passage du format [1-23] au format [1-47] se fait en plaant les 24 bits du mot de dpart
dans les 24 bits de poids fort du mot darrive, et en mettant les 24 autres 0 (dans lautre sens il y
a troncature ou arrondi, voir paragraphe sur ce transfert plus loin).
Le passage des formats [1-23] et [1-47] au format [9-47] se fait avec extension du bit de signe,
cest dire que le bit le plus gauche du mot dorigine est recopi dans les 8 bits de poids fort du
mot darrive.
Exemple :
[1-23]
[9-47]
-1=$800000
?
$FF8000000000000=-1

II.4) Modes dadressage


Il existe 3 grandes faons daccder la mmoire : les adressages
linaire : classique
modulo : permet de grer des buffers circulaires, utiles dans le cas du filtrage par exemple
en bits inverss : utilis pour la FFT

24

Cours/TP DSP, Benot Decoux, 2005-2006

Adressage immdiat
La valeur charger dans un registre est donne directement en argument. On utilise le symbole
#. Cette opration prend 2 cycles machine.
Il nest pas possible de raliser un adressage immdiat avec la mmoire, ce qui signifie quon
ne peut pas copier une valeur directement en mmoire. On doit obligatoirement passer par un
registre.
Dans les oprations avec certains registres, ce sont les poids faible qui sont concerns, pour
dautres ce sont les poids forts :

A0, A1, A2, B0, B1, B2, Ni, Mi, Ri (i[0 ; 7])
A, B, Y0, Y1, X0, X1, X, Y

: poids faibles
: poids forts

Adressage immdiat long : donnes transfrer de 16 56 bits


Exemples

sur 24 bits :
move

#$ABC,A0

move

#$ABC,X0

ou

sur 56 bits
move

#$ABCDEF, A ; dans A1 et A0, A2 mis $FF car nombre ngatif

Adressage immdiat court : donnes transfrer sur 8 ou 12 bits.


Exemples

sur 24 bits
move

#$FF, A1

; $FF dans les poids faibles de A1, 0 dans le reste

move

#$FF, Y1

; $FF dans les poids forts de Y1, 0 dans le reste

#$FF, A

; $FF dans les poids forts de A1, 0 dans le reste sauf A2=$FF

sur 56 bits
move

Adressage indirect
Utilis pour les changes entre registres et mmoire.
Lcriture ou la lecture dune valeur en mmoire ncessite 2 instructions.
Exemples
move

A1,X:(R0)

; transfert du contenu de A1 dans la case mmoire


; pointe par R0 dans la mmoire X

move

A1,X:(R0)+

; mme chose avec post-incrmentation de 1 du pointeur R0


25

Cours/TP DSP, Benot Decoux, 2005-2006


; (dcrmentation : idem mais avec signe -)
move

A1,X:(R0)+N0

; mme chose avec post-incrmentation de la valeur


; contenue dans N0

move

A1,X: -(R0)

; mme chose mais pr-dcrmentation de 1 de R0

Adressage absolu
Pour les changes entre la mmoire et les registres. Ladresse de la case mmoire concerne est
donne directement en argument.
Exemple
move

X:$3393,B0

; transfert du contenu de la case mmoire dadresse $3393 dans B0

Traitements parallles
Lorganisation matrielle des DSP de la famille 56300, avec des communications par bus, leur
permet deffectuer plusieurs oprations en parallle, en une seule instruction :
1 multiplication 24 bits 24 bits
1 addition 56 bits
2 dplacements de donnes
2 mises jours de pointeurs
Exemple
mac

X0,Y0,A

A=A+X0Y0 ;

X:(R0)+,X0

Y:(R1)+,Y0

=move X:(R0)+,X0
X0=X pointe par R0 ;
R0=R0+1 ;

=move Y:(R1+),Y0
Y0=Y pointe par R1
R1=R1+1

Mode scaling
Les donnes sont multiplies par 2 lors de leur transfert en mmoire. Ceci permet dviter de
perdre des donnes quand le contenu est suprieur 1.
Programmation : on positionne 1 le 4e bit partir de la droite du registre MR :
ori

#8, MR

II.5) Programmation
Quelques instructions et directives dassemblage couramment utilises sont donnes ci-dessous.
Les instructions sont traites par le DSP, les directives dassemblage le sont par lassembleur : elles
correspondent des oprations effectues avant lancement du programme.
Cette liste est non exhaustive. Pour la syntaxe exacte et les restrictions dutilisation, voir la
documentation constructeur.

II.5.1) Instructions

26

Cours/TP DSP, Benot Decoux, 2005-2006

Oprations arithmtiques
Multiplication et accumulation

mac

Idem mpy mais additionne ou soustrait le rsultat au contenu actuel de laccumulateur donn en
3e argument.
Exemple
mac X0,X0,A
mac -X0,X0,A

macr

; A=A+X0*X0
; A=A-X0*X0

Multiplication et accumulation, avec arrondi.

: Multiplication

mpy

Les transferts parallles sont possibles. Multiplication du 1er argument avec le 2e, rsultat dans
le 3e. 1er et 2e arguments : 24 bits ; 3e : 56 bits.
Exemples
mpy X0,X0,A
mpy X0,X0,A

X:(R0)+,X0

; A=X0*X0
; A=X0*X0, X0=X+R0, Y0=Y+R1

Y:(R1)+,Y0

X:(R0)+,X0 est quivalent move X:(R0)+,X0

mpyr

Multiplication avec arrondi

rnd

Opration darrondi

sub

Substract

Exemple
sub A,B

subl

; B=B-A

Shift left and substract

Exemple
subl B,A

; A=A*2-B

Oprations logiques
ori

OU logique avec des registres systme

Syntaxe
ORI #xx, D

; D registre systme

27

Cours/TP DSP, Benot Decoux, 2005-2006

Exemple
ORI #$8, MR

not

Complmentation logique

Syntaxe
NOT D

or

; D accumulateur 24 bits

OU logique

Syntaxe
OR S,D

; S et D registres 24 bits (masque dans S, rsultat dans D)

Transferts de donnes
move

Copie dun registre vers un autre, ou transfert entre registre et mmoire. Les transferts entre
la mmoire et les registres utilisent les registres dadresse.

Exemples
move
move
move
move
move
move
move
move

movep

X0, A1
#10,A1
#$10,A1
#$10,OMR
X:(R0),X0
X:(R0)+,X0
X0,X:(R0)+
A,Y1

; copie du contenu de X0 dans A1


; copie de la valeur dcimale 10 dans A1
; copie de la valeur hexadcimale $10 (16 en dcimal) dans A1
; idem dans registre OMR
; copie du contenu de la mmoire X pointe par R0, dans X0
; idem avec post-incrmentation du registre dadresse R0
; opration inverse
; transfert de A1 (mot de 24 bits de poids forts de A) dans Y1

Transfert vers la zone des priphriques

Exemple
movep #$260004, X:PCTL

lua

; copie du contenu de la valeur $260004 dans


; le registre PCTL
; auparavant il faut avoir fait : PCTL equ X:$FFFD
; (programmation de la frquence du DSP 20 MHz)

Load updated adress

Exemple
lua (R0)+1,R1

; R1 pointe sur ladresse mmoire pointe par (R0)+1

Boucles
do

rpte les lignes dinstructions suivantes, jusquau label indiqu en 2e argument, un nombre de
fois gal la valeur donne en 1er argument

Exemple
do
boucle1

#10, boucle1

28

Cours/TP DSP, Benot Decoux, 2005-2006

idem do mais avec pour seul argument le nombre de rptitions ; la rptition ne concerne que
la ligne suivante.

rep

Saut
"jump to subroutine" : saut (inconditionnel) la routine dfinie par la label donn en argument.

jsr

Exemple
jsr

filtrage

rts
jmp

filtrage

saut inconditionnel une routine ou une adresse

Exemple
jmp

(R1+N1)

; saut ladresse P:(R1+N1)

Fonctions mathmatiques
cvi

Convert FLOAT to INT

log

log naturel (base 10)

cos

cosinus
sinus

sin

II.5.2) Caractres et directives dassemblage


Un programme assembleur comporte des instructions du DSP et des directives dassemblage.
Ces dernires correspondent des actions effectues par lassembleur et non pas le programme.
Elles ne sont pas toujours traduites en langage machine.
Quelques caractres et directives dassemblage couramment utilises sont donnes ci-dessous.
Caractres
;

dlimiteur de commentaires

@
#

dlimiteur de fonction
oprateur dadressage immdiat

Exemple
move

#12,X0

; valeur dcimale 12 dans X0


29

Cours/TP DSP, Benot Decoux, 2005-2006


move

#$12,X0

; valeur hexadcimale 12 dans X0

Directives
org

initialise lespace mmoire et les compteurs de position


Utilis pour dfinir ladresse lorigine dune zone mmoire pour les donnes
fin du programme source

end
rts

fin de routine
Le dbut de la routine est indiqu par un label.
dfinition dun symbole (=une constante)

equ

Exemple
a0
PCTL
dc

equ
equ

0.00379/2
X:$FFFD

; coefficient dun filtre


; symbole pour le registre de commande de la PLL intgre

define constant
Pour copier des constantes en mmoire

Exemple
org
dc

ds

Y:$0
a0, b1, b2, a1, a2

; pointage sur ladresse 0 en mmoire Y


; copie cette adresse des valeurs des symboles
; pralablement dfinies par des equ

define storage
Rserve des emplacements en mmoire

Exemple
org
coef

Y:$0
dsm

; on pointe sur ladresse 0 en mmoire Y


; allocation de 5 emplacements (cases) mmoire,
; sur laquelle on pourra pointer avec le symbole coef

duplicate sequence of source lines

dup

Permet de faire une boucle au niveau de lassembleur, jusqu la directive endm.


macro

Dfinition dune macro


endm

Fin de macro
set

Set symbol to value

Exemple
compt

set

compt+1

; incrmentation dun compteur


30

Cours/TP DSP, Benot Decoux, 2005-2006


include

Indique lassembleur dinsrer le texte du fichier donne en argument cet endroit.


Exemple
include mon_prog.asm

o "mon_prog.asm" contient le code assembleur insrer cet endroit.

31