Chapitre III : Jeu d'instructions du DSP TMS320C54x 16 bits à Virgule Fixe
1. Modes d’adressages : sept (07) modes d'adressage :
Mode Description Exemple
d‘adressage
Immédiat Employé pour traiter des constantes, on utilise # pour LD #0080H, A
spécifier cet adressage. Charger la valeur 0080H dans l’accumulateur A
Absolu Employé pour traiter les données qui se trouvent en
mémoire. 03 types d'adressage absolu :
Le contenu de l'adresse 1000H est stocké à l'adresse indiquée par AR5 (accès mémoire
données)
Le contenu de l'adresse 1000H est stocké à l'adresse indiquée par AR5 (accès mémoire
programme)
Le contenu de l'adresse 1000H est stocké à l'adresse indiquée par AR5 (accès mémoire
des interfaces d’E / S)
Direct Accéder à des opérandes en spécifiant l’offset à partir de LD #0, DP
l'adresse de base qui est définie dans un registre Charger la page 0 pour accéder au bloc mémoire de 128 mots
d’adressage. Deux registres peuvent être utilisés : DP et SP.
Indirect Le plus utilisé, il introduit les registres auxiliaires qui
servent à contenir les adresses d’accès en mémoire.
Les modifications allouées en utilisant ces registres sont les
suivantes :
1
Accumulateur Accumulateur A contient l’adresse de l’opérande plutôt que
A le registre auxiliaire. Ce mode est utilisé uniquement par
l’instruction READA qui manipule les données dans
l’espace RAM_Program.
Registres de En utilisant l’instruction LDM (LoaD Mapped register) qui
mappage de permet d’accéder aux différents registres mappés.
mémoire
Pile Les instructions employées sont : PSHD 0200H
- PSHD (Push Data : sauvegarder le contenu d’une Transférer le contenu de la case mémoire adressée par 0200H dans RAM-data vers la pile
case mémoire dans RAM Data vers la pile) et
PSHM (Push Mapped register ARx : sauvegarder le PSHM AR4
contenu d’un registre auxiliaire dans la pile) Sauvegarder le contenu du registre AR4 dans la pile
- POPD (Pop Data : extraire un mot de la pile et
sauvegarder le dans une case mémoire dans RAM- POPD 1000H
data) et POPM (Pop Mapped register ARx : Extraire un mot de la pile et sauvegarder le dans la case mémoire adressée par 1000H
extraire un mot de la pile et sauvegarder le dans
POPM AR0
un registre auxiliaire)
Extraire un mot de la pile et sauvegarder le dans le registre AR0
2
2. Instructions de transfert de données :
2.1 Chargement des accumulateurs :
Si on veut réinitialiser un accumulateur, on doit tout simplement charger la valeur nulle dans l’accumulateur en question :
On peut charger les 32 bits d’un accumulateur à la fois comme suit : on veut charger la valeur hexadécimale 6789ABCD dans l’accumulateur A :
LD #0ABCDH, A ; charger l’accumulateur A avec la valeur immédiate ABCDh dans la partie low (basse), l’accumulateur A
contient : 6789ABCDh
Les instructions équivalentes sont les suivantes :
LD #6789h, AH
LD #0ABCDh, AL
2.2 Chargement des registres auxiliaires : STM (STore Mapped register)
3
2.3 Chargement du contenu des registres auxiliaires dans un accumulateur (LDM LoaD Mapped register ARx)
LDM AR7, 16, B ; charger la partie haute (high) de l’accumulateur B (donc dans BH) avec le contenu du registre auxiliaire AR7.
3. Instructions réalisant des opérations logiques :
3.1 Opérateur logique AND : utilisé uniquement avec les accumulateurs A ou B.
Si on désire utiliser le contenu d’une case mémoire, on doit le copier dans un accumulateur :
L’instruction suivante est fausse : AND @71h, A
On peut utiliser l’instruction ANDM (ANDMemory) :
4
L’opérateur AND peut être utilisé avec les registres auxiliaires ARx comme suit :
3.2 Opérateur logique OR : utilisé uniquement avec les accumulateurs A ou B.
Si on désire utiliser le contenu d’une case mémoire, on doit le copier dans un accumulateur :
5
On peut utiliser l’instruction ORM (OR Memory) :
On peut utiliser l’opérateur OR avec les registres auxiliaires ARx comme suit :
3.3 Opérateur logique XOR : utilisé uniquement avec les accumulateurs A ou B.
Si le XOR est utilisé pour deux valeurs identiques le résultat obtenu est nul :
Si on veut l’utiliser avec le contenu d’une case mémoire, on doit copier ce contenu dans un accumulateur :
6
On peut utiliser l’instruction XORM (XOR Memory) :
3.4 Le complément à 1 :
4. Instructions réalisant des opérations arithmétiques :
4.1 Instruction ADD :
7
Nous pouvons réaliser l’addition en utilisant l’@age indirect à travers les registres auxiliaires ARx :
4.2 Instruction SUB :
La soustraction peut se faire en utilisant l’@age indirect à travers les registres auxiliaires ARx :
8
4.3 Instruction d’addition en mémoire ADDM (ADD to Memory) : utilisée si on souhaite réaliser une addition des contenus en mémoire :
Autrement dit, cette dernière instruction d’addition peut se faire en se servant des registres auxiliaires ARx :
STM #22 , AR1
ADDM #0FFh, *AR1
Remarque : Le TMS320c54x ne fournit pas une instruction permettant de réaliser la soustraction des contenus en mémoire (telle que ADDM).
Ceci peut se faire en utilisant toujours l’instruction ADDM comme dans les exemples suivants :
ADDM # - 1 , 4h ; soustraire la valeur 1 de la valeur en case mémoire adressée par 4h
Ou :
STM # 4h, AR2
ADDM # -1 , *AR2
4.4 Incrémentation / Décrémentation des registres auxiliaires ARx : MAR (Modify Auxiliary Register) :
Remarque : le symbole * devant le registre auxiliaire ne se rapporte pas à l'adressage indirect, il signifie tout simplement qu'une opération est
effectuée sur ce registre auxiliaire.
4.5 Modification des registres auxiliaires ARx : l'instruction MAR qui ajoute la valeur dans AR0 à un autre registre auxiliaire :
9
L'instruction MAR *AR4+0 modifie le registre auxiliaire AR4 en ajoutant le contenu de AR0 au contenu de AR4 et puis en mettant la somme
dans AR4.
De même, nous pouvons soustraire une valeur à partir d'un registre auxiliaire :
5. Instructions de Branchements et de Tests : conditionnel et inconditionnel.
5.1. Instructions de Branchement inconditionnel : B ( Branch ). Se fait sans qu'il y ait une condition à vérifier
B $ brancher à la même @ (à l'instruction elle même)
Ou :
label: B label brancher à la même @ (à l'instruction elle même)
Ce branchement génère une boucle infinie, il est utilisé généralement dans la gestion des erreurs de programmation afin de les bloquer.
10
5.2. Instructions de Branchement conditionnel : BC ( Branch Conditionally ). Se fait en présence d'une condition à vérifier.
* Test d'égalité : AEQ (Acc. A EQual) ou BEQ (Acc. B EQual).
Exp :
Nous commençons par allouer un emplacement mémoire afin de stocker la valeur de x (dans la case mémoire adressée par 30H dans la page 2 =
@0130H).
11
* Test d'inégalité : ANEQ (Acc. A Not EQual) ou BNEQ (Acc. B Not EQual)
Une autre manière de le faire en utilisant l'opérateur logique XOR comme suit :
Remarque : le XOR permet de vérifier les tests d’égalité et d’inégalité : si le XOR renvoie une valeur nulle cela veut dire que la condition
12
d’égalité est vérifiée ; sinon, si le XOR renvoie une valeur non nulle cela veut dire que la condition d’inégalité est vérifiée.
* Test Strictement Supérieur : AGT (Acc. A Greater Than) ou BGT (Acc. B Greater Than).
Exp :
Nous commençons par allouer un emplacement mémoire afin de stocker la valeur de input (dans la case mémoire adressée par 10H dans la page
6 = @310H).
Le test opposé de Strictement Supérieur (qui est Inférieur ou égal) se réalise en utilisant l'instruction ALEQ (Acc. A Less or EQual) ou BLEQ
(Acc. B Less or EQual). Considérons toujours l'exemple précédent, le code assembleur associé serait le suivant :
13
Exp : soit un système de chauffage d'eau, s’il trouve que la température de l'eau est < = 5°, le système de contrôle doit augmenter
automatiquement la température à 100%.
Le programme correspondant en assembleur est le suivant : nous avons deux variables Temperature et Heater stockée dans les emplacements
mémoire 44H et 45H respectivement dans la page 2
14
* Test Strictement Inférieur : ALT (Acc. A Less Than) ou BLT (Acc. B Less Than).
Exp :
Nous commençons par allouer un emplacement mémoire afin de stocker la valeur de input1 (dans la case mémoire adressée par 1H dans la page
3 = @181H).
15
Le test opposé de Strictement Inférieur (qui est Supérieur ou égal) se réalise en utilisant l'instruction AGEQ (Acc. A Greater or EQual) ou
BGEQ (Acc. B Greater or EQual). Considérons toujours l'exemple précédent, le code assembleur associé serait le suivant :
16
Exp : nous avons un système de chauffage d'eau dont si la température de l'eau est > = 95°, le système de contrôle doit diminuer
automatiquement la température à 50%.
Nous avons deux variables Temperature et Heater stockée dans les emplacements mémoire 44H et 45H respectivement dans la page 2
* Implémentation des boucles FOR et WHILE avec l'instruction BC : Une méthode typique pour implémenter des boucles FOR et WHILE
est en utilisant un Compteur contenant le nombre d'itérations de la boucle.
17
Exp:
On utilise l'acc. A pour la variable i , et la case mémoire @ 70H dans la page 0 pour la variable j
Le programme assembleur précédent pour être implémenté comme suit, en utilisant l'instruction BANZ (Branch on Auxiliary register Non-Zero).
Le nombre d'itérations sera initialisé dans un registre auxiliaire.
18
Remarque : dans l'instruction BANZ le symbole * devant le registre auxiliaire AR3 ne désigne pas l'adresse d'une location mémoire, il signifie
tout simplement qu'une modification doit être apporter sur le registre AR3 (dans l’exemple précédent AR3 = AR3 – 1).
6. Instructions de Multiplications :
Le DSP donne plus d'avantages et plus d'intérêt à la multiplication que les microprocesseurs ou même les microcontrôleurs. L’opération de
multiplication dans un DSP nécessite 1 seul cycle d'horloge pour qu'elle soit exécutée grâce à l'unité MAC tandis que dans les microprocesseurs
et les microcontrôleurs il lui faut jusqu'à 10 cycles d'horloge.
La multiplication nécessite aussi l'utilisation d'un registre temporaire T, il est considéré comme un registre mappé (tels que les registres
auxiliaires).
19
6.1. Multiplication simple : MPY qui réalise la multiplication entre une constante et le contenu du registre temporaire T
Elle peut se faire aussi entre une case mémoire et le contenu du registre T.
20
Autrement :
6.2. Multiplication en utilisant Accumulateur : MPYA qui réalise la multiplication entre uniquement le contenu de la partie haute de
l'accumulateur A et le contenu du registre T, le résultat de la multiplication est rangé dans l'accumulateur B
Remarque : la multiplication suivante génère un résultat nul car MPYA réalise la multiplication entre le contenu de AH ( de l'accumulateur A )
et le contenu du registre T
21
6.3. Multiplication MAC (Multiply with Accumulate): _ MAC peut contenir jusqu'à trois opérandes, la multiplication nécessite deux
opérandes et que le premier soit un contenu du registre T , puis une accumulation doit être faite , le résultat final est rangé dans un accumulateur à
savoir A ou B.
Exemple 1:
En utilisant MPY :
En utilisant MAC :
22
Exemple 2:
En utilisant MPY :
En utilisant MAC :
23