Td corrigé TP DSP TMS320C50 - Creatis pdf

TP DSP TMS320C50 - Creatis

4.3.4 Conception et implantation d'un filtre IIR. 5 Bibliographie. 6 ANNEXES. 6.1 Instruction MAC. 6.2 Fichier pass.asm. 6.3 Fichier mult.asm. 6.4 Fichier rif.asm.




part of the document



7
2.4.2 Adressage indirect (Cf. [1, p. 5-4])  RENVOIPAGE _Toc513532233 \h 8
2.4.3 Adressage circulaire (Cf. [1, p. 5-21])  RENVOIPAGE _Toc513532234 \h 8
3 Prise en main du starter kit  RENVOIPAGE _Toc513532235 \h 9
3.1 Les outils du starter kit  RENVOIPAGE _Toc513532236 \h 9
3.2 Initialisation de la carte DSK TMS320C5x  RENVOIPAGE _Toc513532237 \h 9
3.2.1 Initialisation du timer (Cf. [Réf. 1, p. 9-9])  RENVOIPAGE _Toc513532238 \h 9
3.2.2 Initialisation du port série (Cf. [1, p. 9-24])  RENVOIPAGE _Toc513532239 \h 10
3.2.3 Initialisation du Circuit Analogique d'Interface (AIC) TLC32040  RENVOIPAGE _Toc513532240 \h 11
4 Manipulations  RENVOIPAGE _Toc513532241 \h 13
4.1 Réglage de l'AIC, Echantillonnage et repliement de spectre  RENVOIPAGE _Toc513532242 \h 13
4.2 Le MAC et les modes d'adressage  RENVOIPAGE _Toc513532243 \h 13
4.2.1 Multiplication en adressage direct et indirect  RENVOIPAGE _Toc513532244 \h 14
4.2.2 Multiplication de deux vecteurs  RENVOIPAGE _Toc513532245 \h 14
4.2.3 Génération d'un signal en dent de scie par adressage circulaire  RENVOIPAGE _Toc513532246 \h 14
4.3 Convolution & filtrage  RENVOIPAGE _Toc513532247 \h 14
4.3.1 Filtre moyenneur  RENVOIPAGE _Toc513532248 \h 15
4.3.2 Gestion de la mise à l'échelle du résultat  RENVOIPAGE _Toc513532249 \h 15
4.3.3 Conception et implantation d'un filtre FIR  RENVOIPAGE _Toc513532250 \h 15
4.3.4 Conception et implantation d'un filtre IIR  RENVOIPAGE _Toc513532251 \h 15
5 Bibliographie  RENVOIPAGE _Toc513532252 \h 16
6 ANNEXES  RENVOIPAGE _Toc513532253 \h 17
6.1 Instruction MAC  RENVOIPAGE _Toc513532254 \h 17
6.2 Fichier pass.asm  RENVOIPAGE _Toc513532255 \h 19
6.3 Fichier mult.asm  RENVOIPAGE _Toc513532256 \h 20
6.4 Fichier rif.asm  RENVOIPAGE _Toc513532257 \h 21
6.5 Fichier rii.asm  RENVOIPAGE _Toc513532258 \h 23
6.6 Jeu d'instructions du TMS320C50  RENVOIPAGE _Toc513532259 \h 26
6.7 Signal rectangle et Fourier  RENVOIPAGE _Toc513532260 \h 27



INTRODUCTION
Parmi la famille des processeurs spécialisés une nouvelle branche est apparue vers 1982 avec pour principale fonction de traiter numériquement et rapidement les signaux issus de la parole. Le premier processeur ou calculateur spécialisé en traitement du signal (TS ou SP pour Signal Processing), le "DSP" (Digital Signal Processor), était né et depuis, cette famille n'a cessé de s'agrandir. Les processeurs DSP diffèrent des microprocesseurs ordinaires par le fait qu'ils ont été conçus spécialement pour effectuer de manière très rapide, car câblée, les opérations de somme et de produit qui sont présents dans tout algorithme de traitement du signal. Sur un DSP on peut en un cycle effectuer une multiplication et une accumulation. Si au début ils effectuaient 5 millions d'instructions par seconde (MIPS) sur des entiers de 16 bits pour un prix de 600$, ils peuvent aujourd'hui, en version standard, effectuer 50 MFLOPS sur des entiers ou des flottants (MFLOP: millon Floating Operation per Second) pour un prix inférieur à 40$. Des DSP de nouvelle génération, tournés vers des applications vidéos, effectuent 2000 MIPS.

La famille de processeurs la plus répandue actuellement est sans conteste celle des DSP de Texas Instruments qui détient environ 70 % du marché, les 30 % restant étant partagés entre Motorola, Analog Devices, Lucent Technologies, Nec et Oki.
L'avantage des DSP tient :
CARSPECIAUX 183 \f "Symbol" \s 10 \h à leur faible prix par rapport aux circuits analogiques réalisant la même fonction.
CARSPECIAUX 183 \f "Symbol" \s 10 \h leur facilité d'intégration sur des cartes numériques
CARSPECIAUX 183 \f "Symbol" \s 10 \h leur possibilité de résoudre par la programmation, dont la complexité n'est pas limitée, toutes sortes de problèmes linéaires ou non linéaires
CARSPECIAUX 183 \f "Symbol" \s 10 \h leur robustesse car ils sont insensibles aux variations de température, aux dérives et au vieillissement
CARSPECIAUX 183 \f "Symbol" \s 10 \h leur flexibilité et leur souplesse de modification, car il suffit de changer le programme sans modifications matérielles.

Les principales applications se trouvent dans :
CARSPECIAUX 183 \f "Symbol" \s 10 \h les télécommunications : téléphone filaire et cellulaire, modem, fax, transcodeurs, interpolateurs, répondeurs, routeurs, codec …
CARSPECIAUX 183 \f "Symbol" \s 10 \h le traitement de la parole: reconnaissance, compression, synthèse.
CARSPECIAUX 183 \f "Symbol" \s 10 \h la commande de procédés : asservissement, contrôle flou, diagnostique automatique, automobile (ABS) …
CARSPECIAUX 183 \f "Symbol" \s 10 \h l' instrumentation : analyse spectrale, oscilloscope, générateur de signaux, …
CARSPECIAUX 183 \f "Symbol" \s 10 \h le traitement d'image : Image par Résonance Magnétique, image ultrasonore, reconnaissance, compression, transmission, animation ...

Les difficultés qui attendent les utilisateurs de ces processeurs sont au nombre de trois :
·ð la première est liée à l'architecture du DSP, qui tout en étant proche de celle du microprocesseur, est fortement spécialisée pour les algorithmes du traitement du signal,
·ð la deuxième difficulté, et ce n'est pas la moindre, concerne la technique du traitement numérique du signal laquelle nécessite la maîtrise d'outils mathématiques adaptés,
·ð enfin, la dernière difficulté se rapporte à l'implantation de l'algorithme ou la manière de programmer le DSP de façon à utiliser au mieux les ressources de son architecture. On parle d'ailleurs de plus en plus souvent d'adéquation algorithme-architecture qui suppose une relation très étroite dans le développement du logiciel et du matériel.
Ces processeurs sont programmés principalement en langage C (via un compilateur croisé) avec une phase d'optimisation si nécessaire en assembleur.

Parallèlement aux DSP à usage général ou à spectre large, les constructeurs commercialisent aussi des DSP réservés à des secteurs d'activités ciblés. Ainsi, ces DSP sont optimisés pour un type d'application de par leur parfaite adéquation entre leur architecture et l'algorithme utilisé. Par exemple, les séries DSP568xxx de Motorola et TMS320C54x de Texas Instruments ont été développées spécialement pour l'exécution rapide des algorithmes exploités dans les téléphones sans fil. C'est le cas également pour la famille de processeur TMS320F/C240 de Texas Instruments qui est spécialisée dans le domaine de la commande industrielle, en particulier pour le contrôle de la conversion d'énergie et la commande de moteur électrique (commande vectorielle).

Le processeur que nous allons utilisé est le TMS320C50 qui est un DSP 16 bits à virgule fixe principalement dédié à la téléphonie mobile. Il est de la cinquième génération construit par Texas Instrument avec une technologie CMOS, d'où son nom C5x. Il a un temps de cycle de 50ns. A titre d'exemple on donne la cadence maximale pour quelques applications classiques :
- filtre numérique FIR sur 64 coefficients (3,55 µs)
- filtre numérique IIR ordre 4 (2,15 µs)
- FFT mémoire à mémoire sur 1024points (2,89 ms).
Ici, le DSP est monté sur une carte Starter Kit de Texas Instrument permettant de le mettre en œuvre facilement sur un signal analogique. Il est associé à un Analog Interface Circuit (AIC) réalisant les conversions A/D et D/A à une fréquence réglable par programme.
Architecture générale du starter kit TMS320C50
Schéma de la carte
La carte starter kit TMS320C50 que vous avez à disposition contient (Cf. Figure 1) :
- Un DSP TMS320C50 (16 bits, virgule fixe, cycle 50ns)
- Une mémoire PROM de 32 ko
- Un circuit analogique d'interface (AIC) TLC32040
- Des connecteurs RCA entrée/sortie audio
- Un circuit d'horloge
- Un port-série qui permet le chargement de codes via un PC


Figure 1 : Schéma général de la carte starter kit TMS320C5x
Organisation de la mémoire
La carte starter kit TMS320C50 comprend une mémoire PROM-8bits de 32 K réservée pour le noyau (kernel) qui est parcourue au démarrage du DSP et une mémoire RAM de 10 K pour les programmes application.
Au niveau CPU (Voir Figure 3) du TMS320C50, on trouve une Single-Access RAM (SARAM) et trois (B0,B1,B2) Dual-Access RAM (DARAM). La DARAM B2 est une mémoire tampon des registres de status.
La plan général d'adressage mémoire de la carte TMS320C50 est donnée Figure 2.


Figure 2 : Plan d'adressage mémoire de la carte starter kit TMS320C5x
Dans le fichier pass.asm (Cf. Annexe 6.2), on peut relever les instructions .ds 0F00h, .ps 080Ah et .ps 0A00h qui permettent d'implanter à différentes adresses mémoire les mots de données, les routines d'interruption et le code d'initialisation.
Schéma fonctionnel de l'unité centrale de calcul (CPU)
Le schéma fonctionnel du CPU du TMS320C50 est donné Figure 2. Vous en trouverez une description complète p. 3-4 de la référence [1].
On peut noter sur ce schéma :
- la présence de deux bus (data, Program),
- le type d'opérande du multiplieur et leur taille,
- le nombre et la position des 'scaler',
- la taille de l'accumulateur.

Figure 3 : Schéma fonctionnel du CPU du TMS320C50
Les modes d'adressage du TMS320C50
L'architecture mémoire du TMS320C50 est de type Harward modifiée : il y a donc une mémoire donnée (notée dma)et une mémoire programme (notée pma), cette dernière pouvant contenir des données.
Le TMS320C50 possèdent plusieurs modes d'adressage détaillés au chapitre 5 de [1]. Nous rappelons ici brièvement les modes adressages direct, indirect et circulaire.
Adressage direct (Cf. [1, p. 5-2])
La mémoire est découpée en 512 pages de données. Chaque page contient 128 mots de 16 bits. Pour accéder à une case mémoire, il faut préciser le numéro de page (sur 9 bits) et le numéro du mot (sur 7 bits) à l'intérieur de la page choisie. Pour accéder à plusieurs cases situées sur la même page, le choix de la page n'est fait qu'une seule fois.

Exemple
LDP #11 ( On choisit la page 11MPY 5( On multiplie le contenu du registre TREG0 avec le mot N° 5 de la page 11, c'est-à-dire avec le contenu de l'adresse (11x128)+5=1413=0585h Adressage indirect (Cf. [1, p. 5-4])
Ce mode d'adressage est basé sur l'utilisation des registres auxiliaires notés (ARn) au nombre de 8 (AR0 : AR7) (Cf. Figure 3). Ces registres contiennent une adresse mémoire codée sur 16 bits. Le contenu de ces registres (c'est-à-dire une adresse mémoire) peut être automatiquement in(dé)crémenté au cours d'une instruction comme le MAC (Cf. Annexe 6.1)

Le choix du registre auxiliaire courant se fait par l'intermédiaire de l'instruction MAR et est mémorisé dans le registre ARP codé sur 3bits :
MAR *,AR3 ( Définit AR3 comme registre auxiliaire courant.

Les incréments possibles du registre auxiliaire courant sont les suivants :
* ( pas d'incrément
*+ ( +1
*- ( -1
*0+ ( +INDX, INDX étant un registre initialisé par SPLK #valeur,INDX
*0- ( - INDX
Adressage circulaire (Cf. [1, p. 5-21])
Dans ce mode d'adressage, une zone mémoire (tampon) est délimitée par deux registres, le Circular Buffer Start Register (CBSR) et le Circular Buffer End Register (CBER). Un registre auxiliaire est associé à ce tampon par l'intermédiaire du registre Circular Buffer Control Register (CBCR). La conséquence est qu'une incrémentation du registre auxiliaire qui le ferait pointer en dehors du tampon entraîne la mise de l'adresse de début du tampon dans le registre auxiliaire (et inversement pour une décrémentation). Ce type d'adressage est notamment utilisé pour la génération de signaux périodiques et pour la mise en œuvre de la convolution.
Le TMS320C50 permet l'utilisation de deux tampons circulaires.

Exemple
SPLK #200h,CBSR1 ( Début du tampon à l'adresse 200hSPLK #210h,CBER1( Fin du tampon à l'adresse 210h SPLK #0Eh,CBCR( Activation du tampon circulaire N°1 avec le registre AR6 (Cf. [1, p.4-7])SPLK #200h,AR6( AR6 contient l'adresse de début du tampon circulaire

Prise en main du starter kit
Les outils du starter kit
La programmation du TMS320c50 est réalisée ici en assembleur. Avec la carte, trois executables DOS sont fournis :
1 assembleur dsk5a.exe
1 programme de chargement dsk5l.exe
1 débogueur dsk5d.exe

 INCORPORER Word.Picture.8 
Figure 4 : De l'assembleur au starter kit
Les programmes sont écrits dans un fichier texte fichier.asm qui est ensuite assemblé (dsk5a fichier.asm) en un fichier.dsk. L'assemblage peut être lancé avec l'option -l ce qui génère un fichier.lst lisible avec toutes les adresses et les codes des instructions.
Le fichier.dsk est chargé du PC sur le Starter Kit (dsk5l fichier.dsk) par l'intermédiaire de la liaison série et automatiquement éxécuté.
Le fichier.dsk peut être également chargé et lancé par l'intermédiaire du débogueur. Ce dernier est lancé par dsk5d.
Initialisation de la carte DSK TMS320C5x
Elle s'effectue en 3 étapes : l'initialisation du timer, celle du port-série et celle du circuit analogique d'interface (AIC).
Initialisation du timer (Cf. [Réf. 1, p. 9-9])
Le timer fonctionne de manière synchrone au processeur. Il utilise (Cf. Figure 5-6) les registres TIM (Timer), PRD (Period), TCR (Timer Control Register) positionnés en mémoire données.

Figure 5 : Schéma du timer


Figure 6 : Registre de contrôle du timer : TCR
Le timer permet de générer le signal d'horloge TOUT qui servira de base au circuit d'interface analogique en fonction de CLKOUT1 (signal correspondant à la demi-fréquence du quartz à 40 MHz), du champ TDDR du registre TCR et de la période PRD.
INCORPORER Equation.3


SPLK #01h, PRD ; PRD à 1 re-initialise le registre
SPLK #20h, TCR ; recharge et démarre le timer avec TDDR=0.

Après l'exécution de la 2ème ligne, la sortie du timer (TOUT) délivre un signal carré de fréquence 10 MHz.

Initialisation du port série (Cf. [1, p. 9-24])
La transmission et la réception des bits sur le port série se fait à l'aide d'une double bufferisation, aussi bien en émission qu'en réception (Cf. Figure 7).

En émission, l'utilisateur charge la donnée à transmettre dans un premier registre DXR. Ce registre est ensuite transféré en parallèle dans le registre à décalage XSR à partie duquel les bits sont transmis en série sur la broche DX.

En réception, les bits reçus en série sur la broche DR chargent en série le registre à décalage RSR. Lorsque ce registre est plein, il est automatiquement chargé en parallèle dans le registre DRR accessible à l'utilisateur.

Figure 7 : Schéma de l'interface avec le port-série

Le contrôle du port série s'effectue par l'intermédiaire du registre SPC (Serial Port Control) (Cf. Figure 8).

FSM=1 : il faut une impulsion de synchronisation trames pour l'émission ou la réception de chaque mot de 8 bits (FO=1) ou 16 bits (FO=0).
INCORPORER Equation.3 =0 réinitialise la transmission
=1 active la transmission
INCORPORER Equation.3 =0 réinitialise la réception
=1 active la réception

SPLK #08h, SPC ; XRST et RRST=00, FSM=1.
SPLK #0C8h, SPC ; XRST et RRST=11, FSM=1.


Figure 8 : Registre de contrôle du port série : SPC

Initialisation du Circuit Analogique d'Interface (AIC) TLC32040
a) Introduction
Le Circuit intégré TLC32040 est chargé de réaliser les conversions analogique-digitale en entrée et digitale-analogique en sortie. Il rassemble (Cf. Figure 9) :
- un filtre anti-repliement à capacités commutées
- un convertisseur analogique-digital (DAC) sur 14 bits
- des ports séries pour communiquer avec le TMS320C50
- un filtre passe-bas de reconstruction à capacités commutées


Figure 9 : Schéma fonctionnel de l'AIC
L'initialisation de ce circuit repose sur le registre de contrôle de l'AIC (gain, synchro, …), sur les deux registres RA (codé sur 5 bits) et RB (codé sur 6 bits) pour la partie A/D (filtre anti-repliement, fréquence d'échantillonnage) et sur les deux registres TA (codé sur 5 bits) et TB (sur 6 bits) pour la partie D/A (filtre de reconstruction +- re-échantillonnage).
b) Réglage du filtre anti-repliement (Cf. Figure 10)
Le filtre anti-repliement est un filtre passe-bande dont la réponse en fréquence est donnée ci-dessous. Il est constitué par la mise en cascade d'un filtre passe bas du 7ème ordre de type Chebyshev avec une fréquence coupure notée fc et d'un filtre passe-haut du 4ième ordre de type Chebyshev avec une fréquence de coupure notée fcHP.
Les fréquences de coupure et d'échantillonnage vont dépendre des valeurs des registres RA et RB ainsi que de la fréquence principale fournie par le timer du DSP (notée fMCLK ou tout)
INCORPORER Equation.3 INCORPORER Equation.3

Avec, RA est un entier compris entre 4 et 31.

INCORPORER CDraw4
Figure 10 : Réponse en fréquence du filtre anti-repliement

Le filtre anti-repliement peut être désactivé par l'intermédiaire du registre de contrôle de l'AIC.

c) Réglage de la fréquence d'échantillonnage
La fréquence d'échantillonnage fs doit être supérieure à deux fois fc afin de respecter Shannon et elle est déterminée ainsi : INCORPORER Equation.3 , avec RB un entier compris entre 2 et 63.
d) Réglage du filtre de reconstruction
Le filtre de reconstruction est un filtre passe-bas du 7ième ordre de type Chebyshev dont la fréquence de coupure fcDA est donnée par : INCORPORER Equation.3
Ce filtre est suivi d'un filtre analogique pour lisser les artefacts introduits par la commutation des capacités.

Remarque : ce circuit analogique d'interface peut fonctionner en mode asynchrone. Dans ce cas le signal est re-échantillonné avant l'interpolation à la fréquence fsDA telle que :INCORPORER Equation.3.
Lorsque les deux convertisseurs (AD et DA) sont synchrones, seuls les valeurs de TA et TB sont prises en compte pour calculer la fréquence d'échantillonnage et les fréquences de coupure.
e) Registre de contrôle de l'AIC
Le registre de contrôle de l'AIC est un mot de de 8 bits [3, p. 12] dont les rôles sont les suivants :

d9d8d7d6D5d4d3d2LPxxG1G0SYAXLBBP
LPInterpolateur numérique en sinx/x [3, p.16]Xxreste à zéroG0-G1Contrôle du gain de l'AIC [3, p. 16]SYMode synchrone (1), asynchrone (0)AXEntrée auxiliaire active (1), inactive (0)LBFonction loopback active (1), inactive (0) [3, p. 8]BPFiltre anti-repliement actif (1), inactif (0)
Manipulations
Les 4 premières heures de TP doivent vous conduire à la fin du §4.2 (Modes d’adressage). Lors de la deuxième séance, vous poursuivrez le TP là où vous vous serez arrêtés. Un compte-rendu global est à rendre à la fin des deux séances.

Pour toutes les manipulations, vous aurez besoin de deux fenêtres DOS (l'une pour assembler, l'autre pour déboguer) et d'une fenêtre notepad pour éditer les fichiers .asm

Votre répertoire de travail est C:\TPC50
Le répertoire qui contient les fichiers originaux est C:\ TPC50-Init

Au préalable, effacer le contenu de C:\TPC50 puis recopiez l'ensemble de C:\TPC50-Init dans C:\TPC50

Réglage de l'AIC, Echantillonnage et repliement de spectre
Nous allons étudier le programme pass.asm (listing en annexe 6.2) qui permet de restituer sur la sortie analogique le signal reçu sur l'entrée. Il va nous permettre d'observer les phénomènes induits par l'AIC et d'analyser le code correspondant à l'initialisation de la carte.

( Calculez la fréquence d'échantillonnage minimale et maximale (pour une fréquence d'horloge de 10 Mhz) à laquelle l'AIC peut fonctionner.
( Compilez le programme pass.asm sous DOS en tapant la ligne de commande dsk5a pass.asm.
( Chargez et exécutez le programme pass.dsk sous DOS en tapant la ligne de commande dsk5l pass.dsk et appliquez en entrée de la carte une sinusoïde de 1kHz et de 1V d'amplitude.
( Observez sur l'oscilloscope le signal d'entrée et le signal de sortie. Observez le retard introduit par le passage par la carte, et mesurez le gain en sortie.
( En éditant pass.asm, donnez les différents paramètres d'initialisation (timer, fréquences de coupure, d'échantillonnage) de la carte et de l'AIC.
( Assurez vous que le filtre anti-repliement est actif ; Faites varier la fréquence de la sinusoïde en entrée, vérifiez expérimentalement les fréquences de coupure à -3dB du filtre anti-repliement.

( Toujours avec le filtre anti-repliement actif, appliquez en entrée un signal carré, faites en varier la fréquence et expliquez les phénomènes observés en s'appuyant sur la transformée de Fourier d'un signal rectangle périodique (voir §6.7).

( Modifiez pass.asm pour supprimer le filtre anti-repliement. Compilez pass.asm et appliquez ce programme sur un signal sinusoïdal dont on fera varier la fréquence de 1kHz à 20 kHz. Commentez et expliquez le phénomène observé.

Le MAC et les modes d'adressage
L'objectif des manipulations qui suivent est de comprendre et d'utiliser les différents modes d'adressages offerts par le TMS320C50. On insistera en particulier sur l'adressage direct, indirect et circulaire. Ce dernier étant largement utilisé pour l'implantation de filtres numériques ou la génération de fonction.
On étudiera également l'instruction MAC (Multiply and Accumulate) qui permet en un seul cycle d'horloge de réaliser une addition suivie d'une multiplication. Cette instruction (ou ses variantes MACD, MADD, MADS) est appelée dans la plupart des opérations de traitement du signal.
Pour cela nous travaillerons principalement avec le débogueur (dsk5d) ce qui permettra d'exécuter les programmes en pas à pas tout en observant le contenu des registres et de la mémoire.
Multiplication en adressage direct et indirect
L'objectif est de réaliser la multiplication de 2 entiers et de sauvegarder le résultat en mémoire en utilisant l'instruction MAC et deux types d'adressage.
Le fichier C:\ TPC50-Init\mult.asm contient l'initialisation de la carte avec la mise en mémoire de plusieurs valeurs. Copier ce fichier dans votre répertoire TPC50.
On cherche à multiplier le contenu de b0 avec a0 et à sauver le résultat en c0. Pour cela les instructions suivantes pourront être utiles : APAC, LDP, MAC, MAR, PAC, SACL.
( Insérez le code nécessaire pour réaliser cette opération utilisant uniquement l'adressage direct.
( Lancez le débogueur (dsk5d), charger votre program (Load/Dsk), et insérez un point d'arrêt bien placé (Break/Add …). Faites tourner le programme en mode pas à pas (eXecute/Step by Step/Space) en observant les registres et les zones mémoire concernées (Display/Data).
( Insérez à la suite la même chose mais en utilisant uniquement l'adressage indirect. Observez en mode pas à pas.
Multiplication de deux vecteurs
L'objectif est de réaliser la multiplication d'un vecteur ligne par un vecteur colonne et de sauvegarder le résultat en mémoire. On utilisera l'instruction MAC et un adressage approprié.
Le fichier DSP\C50\pvect.asm contient l'initialisation de la carte avec la mise en mémoire de plusieurs valeurs. Copier ce fichier dans votre répertoire TPC50.
On cherche à multiplier le vecteur b avec a et à sauver le résultat en c0. L'instruction RPT sera à utiliser en plus des instructions déjà vues.
( Insérez le code nécessaire pour réaliser cette opération.
( Faites tourner le programme en mode pas à pas en observant les registres et les zones mémoire concernées.
Génération d'un signal en dent de scie par adressage circulaire
L'objectif est de générer un signal en dent de scie qui sera envoyé sur la sortie analogique de la carte et donc observable à l'oscilloscope. Pour cela on utilisera un tampon circulaire sur une zone mémoire où sont stockées des valeurs linéairement croissantes. Les instructions suivantes pourront être utiles : LACL, LAR, MAR, SAMM, SPLK.

Le fichier DSP\C50\scie.asm contient l'initialisation de la carte avec la mise en mémoire de plusieurs valeurs. Copier ce fichier dans votre répertoire TPC50.
( Insérez le code nécessaire pour générer un signal en dent de scie.
( Faites tourner le programme en insérant des points d'arrêt et/ou en mode pas à pas en observant les registres et les zones mémoire concernées. Visualisez la sortie audio de la carte à l'oscilloscope et commentez.
( Modifiez le programme précédent pour rendre dissymétrique les dents de scie.
( Comment modifiez la fréquence de la dent de scie ?

Convolution & filtrage
L'objectif est la mise en œuvre de filtres à réponse impulsionnelle finie (FIR) et infinie (IIR). On illustrera également les limites de précision des DSP à virgule fixe.
Filtre moyenneur
L'objectif est de réaliser la convolution du signal d'entrée avec un filtre moyenneur (de longueur L) et de renvoyer le résultat sur la sortie.
Pour cela on utilisera l'adressage indirect et les instructions MACD et RPT.
( Que permet de faire l'instruction MACD ?
Copiez le fichier C:\DSP\C50\rif.asm dans votre répertoire de travail C:\TPC50. Ce fichier contient déjà les coefficients d'un filtre de longueur 6 et les problèmes de mise à l'échelle (liée au calcul en virgule fixe) sont gérés.
( Insérez le code nécessaire pour réaliser la convolution dans la routine d'interruption de réception..
( Appliquez une sinusoïde d'amplitude 1V cac. Faites varier la fréquence de la sinusoïde de 50 Hz à 5kHz. Expliquez les phénomènes observés. Relevez les fréquences caractéristiques.
( Doublez la longueur du filtre et observez les effets sur le signal de sortie. Comparez les fréquences caractéristiques.
Gestion de la mise à l'échelle du résultat
Les manipulations sont à réaliser avec le filtre moyenneur de longueur 6 dont les coefficients sont à mettre à 100 000.
( Pour une sinusoïde de 1kHz, 0.5V cac, augmentez progressivement l'amplitude et observez le signal de sortie. Commentez.
( Proposez deux solutions distinctes, (l'une avant le calcul, l'autre après) pour repoussez les limites du phénomènes de saturation, c'est-à-dire traiter des signaux d'amplitude plus importante.
Conception et implantation d'un filtre FIR
L'objectif est d'implanter un filtre FIR passe-bande conçu avec Matlab sur le DSP. Pour cela, on utilisera toujours le fichier rif.asm en mettant à jour les coefficients.
( Conception du filtre sous Matlab : On utilise la méthode des fenêtres pour concevoir un filtre de longueur 17. Sous Matlab, on calcule le filtre et on observe sa réponse impulsionnelle et sa réponse en fréquence.
TA=31;TB=16;fe=1e7/(2*TA*TB)
B=fir2(16,2*[0 1/12 3/12 1/2],[0 1 1 0]);
b=round(B*10000)'
stem(b);
[H,F]=freqz(b,1,256,fe);
plot(F,20*log10(abs(H))),grid

( Insérez les coefficients du filtre dans rif.asm en actualisant le nombre de ligne à retard et L-1.
( Assemblez votre programme, testez le et vérifiez que les fréquences de coupure sont en accord avec le gabarit théorique.

Conception et implantation d'un filtre IIR
L'objectif est d'implanter sur le DSP un filtre à réponse impulsionnelle infinie (IIR) passe-bas conçu avec Matlab. Nous avons choisi d'implanter un filtre elliptique d'ordre 4 avec une fréquence de coupure à 1 kHz.
On rappelle que la fonction de transfert d'un filtre IIR peut s'écrire sous la forme suivante :
INCORPORER Equation.3
CARSPECIAUX 159 \f "Wingdings" \s 12Ÿ Conception du filtre sous Matlab : On utilise la fonction ellip qui réalise la transformation bilinéaire d'un filtre analogique elliptique. Sous Matlab, on calcule le filtre, et on vérifie sa stabilité.

ta=20;tb=31;fe=1e7/(2*ta*tb);
[b,a]=ellip(4,3,40,1000/(fe/2));
[h,f]=freqz(b,a,256,fe);
plot(f,20*log10(abs(f)));
zplane(b,a)

CARSPECIAUX 159 \f "Wingdings" \s 12Ÿ Tracez et observez la réponse en fréquence du numérateur (partie MA) et celle du dénominateur (partie AR)

CARSPECIAUX 159 \f "Wingdings" \s 12Ÿ Les coefficients sont normalisés en les multipliant par 213 (format Q13) et à intégrer au fichier rii.asm. Comparez la réponse en fréquence du filtre aux coefficients normalisés avec celle du filtre initial.

B=round(b*2^13)
A=round(a*2^13)
[H,f]=freqz(B,A,256,fe);
plot(f,20*log10(abs(H)),'r',f,20*log10(abs(h)),'b');
zplane(B,A)

CARSPECIAUX 159 \f "Wingdings" \s 12Ÿ On se propose d'implanter ce filtre IIR sur le DSP en trois étapes (en utilisant les instructions MACD et RPT) en testant à chaque étape les fréquences de coupure.
- Implantation de la partie MA et test (identique à un filtre FIR)
- Implantation de la partie AR et test
- Association des parties MA et AR et test

CARSPECIAUX 159 \f "Wingdings" \s 12Ÿ Proposez une implantation du filtre IIR plus efficace en terme de ressources hardware.


Bibliographie
Site Texas Instrument : http://www.ti.com
[1] TMS320C5x User's Guide SPRU056D.PDF
[2] TMS320C5x DSP Starter Kit User's Guide SPRU101A.PDF
[3] TLC32040C Documentation technique SL1S0114E
[4] G. Baudoin, "DSP, Les processeurs de traitement du signal, Famille 320C5x", Ed : Dunod, 1996, 271 p.

ANNEXES
Instruction MAC







Fichier pass.asm
;==========================================================================;
;=INFORMATION PROGRAM ; pass through =;
;============= FILE NAME ; pass.asm =;
;= INCLUDE FILES ; no include files =;
;= PROCESSOR ; TMS320C5x =;
;= AUTHOR ; Matt Byatt - Texas Instruments =;
;= DATE/VERSION ; July 1996 / Ver 1.00 =;
;==========================================================================;
;=DESCRIPTION =;
;============= =;
;= =;
;= Pass: A program that initialises the TMS320C50 DSK processor =;
;= and AIC codec. At a sampling rate of 8kHz, the board's =;
;= serial input port is read to the accumulator. =;
;= Within the same ISR, the contents of the accumulator are =;
;= written to the serial output port without modification. =;
;= The constant read and writing continually passes the =;
;= input signal to the output. =;
;= =;
;= =;
;==========================================================================;
;=SPECIFICATION FREQUENCY ; 8kHz =;
;= MISC TLC320C40 initialised =;
;==========================================================================;
.mmregs
;==========================================================================;
;=SETTINGS =;
;==========================================================================;
.ds 0f00h ; Assemble to data memory
TA .word 17 ; TA AIC value - Fcut = 4 KHz
RA .word 17 ; RA AIC value - Fcut = 4 KHz
TB .word 37 ; TB AIC value - Fs = 2*Fcut
RB .word 37 ; RB AIC value - Fs = 2*Fcut
AIC_CTR .word 29h ; |LP xx G1 G0 | SY AX LB BP|
; +---------------+------------------+
;==========================================================================;
;=INTERRUPT SETTINGS =;
;==========================================================================;
.ps 080ah ; Assemble to program memory
RINT b RX ; Branch to RX on receive interrupt
XINT b TX ; Branch to TX on transmit interrupt
;==========================================================================;
;=PROCESSOR INITIALISATION =;
;==========================================================================;
.ps 0a00h ; Assemble to program memory
.entry ; Mark program entry point
.text ; Text
START setc INTM ; Disable interrupts
ldp #0 ; Set data page pointer to page zero
splk #0834h,PMST ; Write 16 bit pattern to PMST register
lacc #0 ; Load accumulator with number zero
;-----------------------;
samm CWSR ; Set software wait state to zero
samm PDWSR ; Set software wait state to zero
splk #022h,IMR ; Using XINT syn TX & RX
call AIC ; Initialize AIC and enable interrupts
;-----------------------;
clrc OVM ; Overflow mode is set to zero
spm 0 ; Product shift mode is set to zero
splk #012h,IMR ; Mask interrupts
clrc INTM ; Enable interrupts
;==========================================================================;
;=MAIN PROGRAM =;
;==========================================================================;
WAIT idle ; Idle until interrupt
nop ; No operation
nop ; No operation
b WAIT ; Branch to WAIT
;---- end of main program ------ ; Comment line
;==========================================================================;
;= RECEIVE INTERRUPT SERVICE ROUTINE =;
;==========================================================================;
RX ldp #0 ; Set data page pointer to zero
lamm DRR ; Read data from serial input register
and #0FFFCh ; Clear lower two (status) bit from acc
samm DXR ; Write lower acc to DXR
rete ; Return to main program
;==========================================================================;
;=TRANSMIT INTERRUPT SERVICE ROUTINE =;
;==========================================================================;
TX rete ; Return to main program
;==========================================================================;
;=BOARD INITIALISATION =;
;==========================================================================;
AIC splk #20h,TCR ; To generate 10 MHz from Tout
splk #01h,PRD ; Load period counter with 1
mar *,AR0 ; Modify AR pointer (used with GREG)
lacc #0008h ; Load acc with 08h
sacl SPC ; Store acc in SPC
lacc #00C8h ; Load acc with 0C8h
sacl SPC ; Set and reset SPC register
;-----------------------;
lacc #080h ; Initialise 8000h to FFFFh as global memory
sach DXR ; Store high acc to DXR
sacl GREG ; Store to global memory register
lar AR0,#0FFFFh ; Set AR0 register
rpt #10000 ; Set repeat counter
lacc *,0,AR0 ; Access global memory
sach GREG ; Disable global memory
;-----------------------;
ldp #TA ; Load data page TA
setc SXM ; Set SXM for sign extension mode
lacc TA,9 ; Load accumulator with TA data
add RA,2 ; Load accumulator with RB data
call AIC2ND ; Call function AIC2ND
;-----------------------;
ldp #TB ; Load data page TB
lacc TB,9 ; Load accumulator with TB data
add RB,2 ; Load accumulator with RB data
add #02h ; Add 10b to set status bits
call AIC2ND ; Call function AIC2ND
;-----------------------;
ldp #AIC_CTR ; Load data page AIC_CTR
lacc AIC_CTR,2 ; Initialized control register
add #03h ; Add 11b to set status bits
call AIC2ND ; Call function AIC2ND
ret ; Return from call
;-------------------------------;
AIC2ND ldp #0 ; Load data page zero
sach DXR ; Store upper acc to DXR
clrc INTM ; Enable interrupts
idle ; Idle until interrupt - TINT
add #6h,15 ; Set 2 LSBs of upper acc high
sach DXR ; Store upper acc to DXR
idle ; Idle until interrupt - TINT
sacl DXR ; Store lower acc to DXR
idle ; Idle until interrupt - TINT
lacl #0 ; Store lower acc to DXR - flushing
sacl DXR ; make sure the word got sent
idle ; Idle until interrupt - TINT
setc INTM ; Disable interrupts
ret ; Return from call
;-------------------------------;
.end ; End of program

Fichier mult.asm
;==========================================================================;
;=DESCRIPTION
;=============
;=
;= Mult: Programme de test de multiplication
;= Pas d'IT, Pas d'AIC, Pas d'IO
;==========================================================================;
.mmregs

.ds 0f00h ; Assemble to data memory (Page 30)
b0 .word 1
b1 .word 2
b2 .word 3
b3 .word 4

.ds 0f10h
c0 .word 0
c1 .word 0
c2 .word 0
c3 .word 0

.ps 0980h ; Assemble en memoire programme
a0 .word 5
a1 .word 6
a2 .word 7
a3 .word 8
;==========================================================================;
;=PROCESSOR INITIALISATION =;
;==========================================================================;
.ps 0a00h ; Assemble to program memory
.entry ; Mark program entry point
.text ; Text
START setc INTM ; Disable interrupts
ldp #0 ; Set data page pointer to page zero
splk #0834h,PMST ; Write 16 bit pattern to PMST register
lacc #0 ; Load accumulator with number zero
;-----------------------;
samm CWSR ; Set software wait state to zero
samm PDWSR ; Set software wait state to zero
;-----------------------;
clrc OVM ; Overflow mode is set to zero
spm 0 ; Product shift mode is set to zero
;==========================================================================;
;=MAIN PROGRAM
; Multiplication de 2 entiers
;==========================================================================;
WAIT SPLK a0,AR1 ; AR1 pointe sur a0 (Program memory)
SPLK b0,AR2 ; AR2 pointe sur b0 (Data memory)
SPLK c0,AR3 ; AR3 pointe sur c0 (Data memory)

; Initialisation a 0 de PREG et ACC
MPY #0 ; TREG0* 0 -> PREG
PAC ; PREG -> ACC

; Adressage direct

; Initialisation a 0 de PREG et ACC
MPY #0 ; TREG0* 0 -> PREG
PAC ; PREG -> ACC

; Adressage indirect

HALT:
idle
nop
nop
b HALT

;---- end of main program ------; Comment line
.end ; End of program
Fichier rif.asm
;==========================================================================;
; Filtre a moyenne glissante
;
; Mise en oeuvre de la convolution
; Illustration des problemes de calcul en virgule fixe
;
; -> AIC
; AIC set-up parameters. For DSK running at 40 mhz, the sampling
; frequency is 10,000,000/2/TA/TB for transmit and is
; 10,000,000/2/RA/RB for receive. The max value for TA,TB.RA,RB is 63
; since the registers are 6 bits.
; ------------------------------------------------------------------------

.MMREGS
L-1 .set 5
.ds 0f00h
TA .word 16 ;
RA .word 16 ; This set up of AIC registers give
; a sampling freq of 10,081 Hz
;
TB .word 31 ;
RB .word 31 ;
AIC_CTR .word 08h
OUTPUT .word 0


;Filter Coefficient Generator
h0 .word 10000
h1 .word 10000
h2 .word 10000
h3 .word 10000
h4 .word 10000
h5 .word 10000

XN .word 0,0,0,0,0 ; Ligne de retard des echantillons d'entree
XNLAST .word 0;

.ps 0080ah
rint: B RECEIVE
xint: B TRANSMIT

.ps 0a00h
.entry ;
;--------------------------------------------------------------

SETC INTM
LDP #0
OPL #0834h,PMST
LACC #0
SAMM CWSR
SAMM PDWSR
SETC SXM ; Mise a un du bit de signe, ACCh a FFFF sur 32 bits
SPLK #012h,IMR ; This turns on receive interrupt only

CALL AICINIT ;
SPLK #12h,IMR
SETC OVM ;
SPM 0 ;
CLRC INTM ;

WAIT: ; a main program would go here
nop
nop
B WAIT ;

RECEIVE:
LDP #XN
LAMM DRR ; load accumulator with word received from AIC
SACL XN ; store the value of received word to a variable

LAR AR0,#XNLAST ; load AR0 with address of last delay element
ZAP ; ZERO ACC AND PRODUCT REGISTERS
MAR *,AR0 ; AR0 is the current AR register.

;.............. Votre code

;..............

SACH OUTPUT,1 ; Recuperation des bits significatifs de l'Accu
LACC OUTPUT
SFL
AND #0fffch ; Two LSB's must be zero for AIC
SAMM DXR ; write output word to transmit register
RETE ;


TRANSMIT:
RETE


******************************************************************
; DESCRIPTION: This routine initializes the 'C50 serial port *
; and the TLC320C40's (AIC) TA,RA,TB,RB and *
; control registers *
;*****************************************************************
;
AICINIT: SPLK #20h,TCR ; To generate 10 MHz from Tout
SPLK #01h,PRD ; for AIC master clock
MAR *,AR0
LACC #0008h ; Non continuous mode
SACL SPC ; FSX as input
LACC #00c8h ; 16 bit words
SACL SPC
LACC #080h ; Pulse AIC reset by setting it low
SACH DXR
SACL GREG
LAR AR0,#0FFFFh
RPT #10000 ; and taking it high after 10000 cycles
LACC *,0,AR0 ; (.5ms at 50ns)
SACH GREG
;------------------------
LDP #TA ;
SETC SXM ;
LACC TA,9 ; Initialize TA and RA register
ADD RA,2 ;
CALL AIC_2ND ;
;------------------------
LDP #TB
LACC TB,9 ; Initialize TB and RB register
ADD RB,2 ;
ADD #02h ;
CALL AIC_2ND ;
;------------------------
LDP #AIC_CTR
LACC AIC_CTR,2 ; Initialize control register
ADD #03h ;
CALL AIC_2ND ;
RET ;

AIC_2ND:
LDP #0 ; Data page point is 0 (MM regs)
SACH DXR ; send ACChi 00
CLRC INTM ; enable interrupts
IDLE ; wait for interrupt
ADD #6h,15 ; 0000 0000 0000 0011 XXXX XXXX XXXX XXXX b
SACH DXR ; send ACChi to initiate secondary protocol
IDLE ; wait for interrupt
SACL DXR ; send the T register data
IDLE ; wait for interrupt
LACL #0 ; clear ACClo
SACL DXR ; send another to make sure 1st word got sent
IDLE ; wait for interrupt
SETC INTM
RET ;
.END

Fichier rii.asm
; ------------------------------------------------------------------------
; Filtre IIR
;
; Implantation d'un filtre IIR elliptique d'orde 4
;
; ------------------------------------------------------------------------
.mmregs
N .set 4
N-1 .set 3
.ds 0f00h
TA .word 20 ;
RA .word 20 ; This set up of AIC registers give
; a sampling freq of 8 kHz
;
TB .word 31 ;
RB .word 31 ;
AIC_CTR .word 09h ; Filtre anti-repliement actif

YN .word 0
YN-1 .word 0,0,0
YNLAST .word 0
POUBY .word 0 ; Case prevue pour eviter l'ecrasement
; d'une valeur lors du MACD

MA .word 0
XN .word 0,0,0,0
XNLAST .word 0
POUBX .word 0 ; Meme fonction que POUBY

OUTPUT .word 0;

; Coefficient du filtre calcules sous Matlab, format Q13
; pour remplir au mieux les 15 bits + signe
; a(0,4) = (1*2^13) -24108 30929 -19621 5249
; b(0,4) = 186 -107 296 -107 186

.ps 0980h
COEFFA .word -5249,19621,-30929,24108 ; en Q13
COEFFB .word 186,-107,296,-107,186 ; en Q13

;COEFFA .word 0,0,0,0 ; pour test partie MA
;COEFFB .word 1,0,0,0,0 ; pour test partie AR

.ps 0080ah
rint: B RECEIVE
xint: B TRANSMIT

.ps 0a00h
.entry ;
;--------------------------------------------------------------
SETC INTM
LDP #0
OPL #0834h,PMST
LACC #0
SAMM CWSR
SAMM PDWSR
SETC SXM ; Mise a un du bit de signe, ACCh a FFFF sur 32 bits
SPLK #012h,IMR ; This turns on receive interrupt only

CALL AICINIT ;
SPLK #12h,IMR
SETC OVM ;
SPM 0 ;
CLRC INTM ;
;-----------------------------a main program would go here
WAIT:
nop
nop
B WAIT ;
;-------------------------------------------------------------------------------
; Routine pour implanter un IIR d'ordre N
; Implantation sous forme directe de type 1
; yn = b0.xn + b1.xn-1 + b2.xn-2 + b3.xn-3 + b4.xn-4; Partie MA
; -a1.yn-1 - a2.yn-2 - a3.yn-3 - a4.yn-4; Partie AR
;
; AR0 -> xn
; AR1 -> xn-4
; AR4 -> yn-4
; COEFFA -> -a4
; COEFFB -> b4
;--------------------------------------------------------------------------------
RECEIVE:
;------- Initialisation des registres auxiliaires
ZAP

;------- Lecture de xn

;------- Calcul de la partie MA

;------- Calcul de la partie AR

;------- Sortie de yn

;---------------------------------------------------------------------------------

TRANSMIT:
RETE


******************************************************************
; DESCRIPTION: This routine initializes the 'C50 serial port *
; and the TLC320C40's (AIC) TA,RA,TB,RB and *
; control registers *
;*****************************************************************
;
AICINIT: SPLK #20h,TCR ; To generate 10 MHz from Tout
SPLK #01h,PRD ; for AIC master clock
MAR *,AR0
LACC #0008h ; Non continuous mode
SACL SPC ; FSX as input
LACC #00c8h ; 16 bit words
SACL SPC
LACC #080h ; Pulse AIC reset by setting it low
SACH DXR
SACL GREG
LAR AR0,#0FFFFh
RPT #10000 ; and taking it high after 10000 cycles
LACC *,0,AR0 ; (.5ms at 50ns)
SACH GREG
;------------------------
LDP #TA ;
SETC SXM ;
LACC TA,9 ; Initialize TA and RA register
ADD RA,2 ;
CALL AIC_2ND ;
;------------------------
LDP #TB
LACC TB,9 ; Initialize TB and RB register
ADD RB,2 ;
ADD #02h ;
CALL AIC_2ND ;
;------------------------
LDP #AIC_CTR
LACC AIC_CTR,2 ; Initialize control register
ADD #03h ;
CALL AIC_2ND ;
RET ;

AIC_2ND:
LDP #0 ; Data page point is 0 (MM regs)
SACH DXR ; send ACChi 00
CLRC INTM ; enable interrupts
IDLE ; wait for interrupt
ADD #6h,15 ; 0000 0000 0000 0011 XXXX XXXX XXXX XXXX b
SACH DXR ; send ACChi to initiate secondary protocol
IDLE ; wait for interrupt
SACL DXR ; send the T register data
IDLE ; wait for interrupt
LACL #0 ; clear ACClo
SACL DXR ; send another to make sure 1st word got sent
IDLE ; wait for interrupt
SETC INTM
RET ;
.END

Jeu d'instructions du TMS320C50





Signal rectangle et Fourier








PAGE 


PAGE 3