0% ont trouvé ce document utile (0 vote)
67 vues4 pages

Solution EMD Module DSP 2022 1

Le document présente un code C pour un filtre IIR simple. Il demande de faire le code en assembleur pour la boucle, d'allouer les registres, et de calculer le nombre de cycles. Il demande également de faire le graphe de dépendances et la table d'ordonnancement.

Transféré par

Zola Lz
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
67 vues4 pages

Solution EMD Module DSP 2022 1

Le document présente un code C pour un filtre IIR simple. Il demande de faire le code en assembleur pour la boucle, d'allouer les registres, et de calculer le nombre de cycles. Il demande également de faire le graphe de dépendances et la table d'ordonnancement.

Transféré par

Zola Lz
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 4

Nom : Prénom : Matricule :

EMD 2021 / 2022 : Module DSP


Le code C ci-dessous présente un filtre IIR simple. Dans cet exemple, y[i] est une entrée pour
le calcul de y[i+1]. Avant que y[i] puisse être lu pour l'itération suivante, y[i+1] doit être
calculé à partir de l'itération précédente.

void iir(short x[],short y[],short c1, short c2, short c3)


{
int i;

for (i=0; i<100; i++) {


y[i+1] = (c1*x[i] + c2*x[i+1] + c3*y[i]) >> 15;
}
}

1) Faire le code en assembleur linéaire pour la boucle complète sans allouer les
registres.

.global _iir
_iir: .cproc x, y, c1, c2, c3
.reg xi, xi1, yi1
.reg p0, p1, p2, s0, s1, cntr

MVK 100,cntr ; cntr = 100

LDH .D2 *y++,yi1 ; yi+1

LOOP: .trip 100

LDH *x++,xi ; xi

MPY c1,xi,p0 ; c1 * xi

LDH *x,xi1 ; xi+1

MPY c2,xi1,p1 ; c2 * xi+1

ADD p0,p1,s0 ; c1 * xi + c2 * xi+1

MPY c3,yi1,p2 ; c3 * yi

ADD s0,p2,s1 ; c1 * xi + c2 * xi+1 + c3 * yi

SHR s1,15,yi1 ; yi+1

STH yi1,*y++ ; store yi+1

[cntr] SUB cntr,1,cntr ; decrement loop counter

[cntr] B LOOP ; branch to loop

.endproc
2) Après avoir alloué les registres faire le code réel en assembleur et compter le
nombre de cycles écoulé pour l’exécution du programme.
Allocation des registres :

Content of Register File A Reg. A Reg. B Content of Register File B

A0 B0
cntr A1 B1
xi A2 B2 yi1
xi1 A3 B3 p2
x A4 B4
p0 A5 B5 s1
c1 A6 B6 c2
p1 A7 B7
c3 A8 B8
s0 A9 B9

2-1. Le code réel en assembleur pour la boucle interne


LOOP : LDH .D1 *A4++,A2 ; xi

NOP 4

MPY .M1 A6,A2,A5 ; c1 * xi

NOP 1

LDH .D1 *A4,A3 ; xi+1

NOP 4

MPY .M1X B6,A3,A7 ; c2 * xi+1

NOP 1

ADD .L1 A5,A7,A9 ; c1 * xi + c2 * xi+1

MPY .M2X A8,B2,B3 ; c3 * yi

NOP 1

ADD .L2X B3,A9,B5 ; c1 * xi + c2 * xi+1 + c3 * yi

SHR .S2 B5,15,B2 ; yi+1

STH .D2 B2,*B4++ ; store yi+1

[A1] SUB .L1 A1,1,A1 ; decrement loop counter

[A1] B .S1 LOOP ; branch to loop

NOP 5

2-2. Nombre de cycles : (27 * 100) = 270 cycles


3) Faire le graphe de dépendances (DEPENDENCY GRAPH).

4) Faire la table d’ordonnancement des instructions (SCHEDULING TABLE)

Cycle .D1 .D2 .M1 .M2 .L1 .L2 .S1 .S2


1 LDH LDH
2
3 SUB
4 B
5
6 MPY MPY
7 ADD ADD
8 MPY
9 SHR
10 STH

Vous aimerez peut-être aussi