Académique Documents
Professionnel Documents
Culture Documents
Département Electronique
Master Electronique des Systèmes Embarqués ESE
Programmation en Assembleur
pour le DSP TMS320C6713
Présenté par : K. BOUDJIT
B.P. 32 El-Alia, Bab-Ezzouar, Alger 16111 Tél : 213 (0) 21 24 79 12 Poste 805
Fax : 213 (0) 21 24 71 87http://www.usthb.dz/
I. INTRODUCTION .............................................................................................................. 1
II. APERCU DE L’ARCHITECTURE C6000........................................................................ 1
II.1. Fonctionnement de base du DSP .................................................................................... 1
II.2. Instructions ...................................................................................................................... 1
II.3. Fichiers de registre .......................................................................................................... 2
II.4. Unités fonctionnelles ...................................................................................................... 3
Exercice N°1 : ......................................................................................................................... 3
III. OPERATIONS D’ASSEMBLEUR TYPIQUES ............................................................ 3
III.1. Chargement des constantes dans les registres ............................................................... 3
Exercice N°2 : ......................................................................................................................... 3
III.2. Enregistrement des mouvements (moves), mise à zéro ................................................. 3
III.3. Chargement de la mémoire dans les registres................................................................ 4
Exercice N°3 : ......................................................................................................................... 4
III.4. Stockage des données en mémoire ................................................................................ 5
Exercice N°4 : ......................................................................................................................... 5
III.5. Créneaux de retard (Delay slots) ................................................................................... 6
Exemple 1 ............................................................................................................................... 6
III.6. Addition, soustraction et multiplication ........................................................................ 8
Exercice N°5 : ......................................................................................................................... 8
III.7. Branchements et opérations conditionnelles ................................................................. 8
Exercice N°6 : ......................................................................................................................... 9
III.8. Opérations logiques et manipulation de bits.................................................................. 9
III.9. Autres instructions de l’assembleur ............................................................................... 9
III.10. Résumé du jeu d'instructions C67x ............................................................................. 9
IV. DIRECTIVES UTILES POUR LES LANGAGES ASSEMBLEURS ......................... 11
IV.1. Affectation des unités fonctionnelles .......................................................................... 12
Exercice N°7 : ....................................................................................................................... 13
Exercice N°8 : ....................................................................................................................... 14
IV.2. Rédaction du programme interne du produit ............................................................... 14
IV.3. Pipeline, créneaux de retard (Delay slots) et instructions parallèles ........................... 15
IV.4. Instructions et contraintes parallèles ........................................................................... 16
IV.4.1. Contraintes en matière de ressources .................................................................... 16
IV.4.2. Contraintes des unités fonctionnelles ................................................................... 16
IV.4.3. Contraintes croisées .............................................................................................. 16
IV.4.4. Contraintes liées aux chargements et aux stockages ............................................ 17
IV.4.5. Contraintes sur la lecture du registre .................................................................... 17
IV.4.6. Contraintes relatives aux inscriptions au registre ................................................. 17
V. PIPELINE DE LOGICIELS AD HOC ............................................................................. 18
Programmation en Assembleur pour le DSP TMS320C6713
DSP
I. INTRODUCTION
Ce chapitre contient des détails sur la façon de programmer la famille de processeurs TI C6000
en assembleur. La famille de processeurs C6000 comporte de nombreuses variantes. Il ne serait
donc pas possible de décrire ici comment programmer tous les processeurs. Cependant,
l'architecture de base et les instructions sont similaires d'un processeur à l'autre. Elles varient
selon le nombre de registres, la taille des registres, les périphériques de l'appareil, etc. Ce
chapitre part du principe que l'appareil dispose de 32 registres 32 bits polyvalents et de huit
unités fonctionnelles, comme le processeur C6713.
𝑦= 𝑎[𝑛]𝑥[𝑛]
(Par exemple, l'algorithme du filtre FIR est exactement le même que celui de cette opération de
point produit). Lorsque a[n] et x[n] sont stockés en mémoire, à partir de n=1, nous devons
calculer a[n]x[n] et l'ajouter à y (y est initialement 0) et répéter cela jusqu'à n=40. Dans le
langage assembleur pour le C6000, cette opération MAC peut être écrite sous la forme :
MPY .M a,x,prod
ADD .L y,prod,y
Ignorez .M et .L pour l'instant. Ici, a, x, prod et y sont des nombres stockés en mémoire et
l'instruction MPY multiplie deux nombres a et x ensemble et stocke le résultat dans prod.
L'instruction ADD ajoute deux nombres y et prod ensemble et stocke le résultat dans la mémoire
de y.
II.2. Instructions
Vous trouverez ci-dessous la structure d'une ligne de code assembleur.
Tableau 1 :
Label : Parallel Bars (||) [Condition] Instruction Unit Operands ;Comments
Le [disp] spécifie le nombre d'éléments en mot, demi-mot ou octet, selon le type d'instruction
et il peut être soit une constante de 5 bits, soit un registre. L'incrémentation/décrémentation des
registres d'index se fait également en fonction du nombre d'octets dans le mot, le demi-mot ou
l'octet. Les modes d'adressage avec déplacements sont utiles lorsqu'on accède à un bloc
d'emplacements mémoire. Ceux avec incrémentation/décrémentation automatique sont utiles
lorsqu'un bloc est accédé consécutivement pour implémenter un tampon, par exemple, pour
stocker des échantillons de signaux pour implémenter un filtre numérique.
Exercice N°3 :
(Chargement de mémoire) : Supposons que les valeurs suivantes sont stockées dans des
adresses mémoire :
Loc 32-bit value
100h fe54 7834h
104h 3459 f34dh
108h 2ef5 7ee4h
Dans le mode big endian, les adresses mémoire inférieures contiennent la partie MSB des
données. Ainsi, nous avons
Tableau 4 : Mode de stockage du big endian.
0x8000 0x11
0x8001 0x22
0x8002 0x33
0x8003 0x44
III.5. Créneaux de retard (Delay slots)
Dans l'unité centrale C6x, il faut exactement un cycle d'horloge de l'unité centrale pour exécuter
chaque instruction. Cependant, les instructions telles que LDW doivent accéder à la mémoire
externe lente et les résultats du chargement ne sont pas disponibles immédiatement à la fin de
l'exécution. Ce retard des résultats de l'exécution est appelé créneau (slots) de retard.
Exemple 1
Par exemple, considérons le chargement du contenu de la mémoire à l'adresse pointée par A10
vers A1 et ensuite le déplacement des données chargées vers A2. Vous pourriez être tenté
d'écrire un simple code en assembleur de 2 lignes comme suit :
1 LDW .D1 *A10, A1
2 MV .D1 A1,A2
Qu'est-ce qui ne va pas avec le code ci-dessus ? Le résultat de l'instruction LDW n'est pas
disponible immédiatement après l'exécution de LDW. En conséquence, l'instruction MV ne
copie pas la valeur souhaitée de A1 à A2. Pour éviter cette exécution indésirable, nous devons
faire en sorte que l'unité centrale attende que le résultat de l'instruction LDW soit correctement
chargé dans A1 avant d'exécuter l'instruction MV. Pour les instructions de chargement, nous
avons besoin de 4 cycles d'horloge supplémentaires jusqu'à ce que le résultat du chargement
soit valide. Pour faire attendre l'unité centrale pendant 4 cycles d'horloge, nous devons insérer
4 instructions NOP (no operations) entre LDW et MV. Chaque instruction NOP rend l'unité
centrale inactive pendant un cycle d'horloge. Le code résultant sera comme suit :
1 LDW .D1 *A10, A1
2 NOP
3 NOP
4 NOP
5 NOP
6 MV .D1 A1,A2
6 Master Electronique des Systèmes Embarqués ESE – USTHB/FGE
Programmation en Assembleur pour le DSP TMS320C6713
DSP
ou simplement vous pouvez écrire
1 LDW .D1 *A10, A1
2 NOP 4
3 MV .D1 A1,A2
Alors, pourquoi le concepteur de l'unité centrale n'a-t-il pas fait en sorte que l'instruction LDW
prenne 5 cycles d'horloge au départ, plutôt que de laisser le programmeur insérer 4 NOP ? La
réponse est que vous pouvez insérer d'autres instructions que les NOP dans la mesure où ces
instructions n'utilisent pas le résultat de l'instruction LDW ci-dessus. De cette manière, l'unité
centrale peut exécuter des instructions supplémentaires en attendant que le résultat de
l'instruction LDW soit valide, ce qui réduit considérablement le temps d'exécution total de
l'ensemble du programme.
Tableau 5: Delay slots
Description Instructions Delay slots
Single Cycle All instructions except following 0
Multiply MPY, SMPY etc. 1
Load LDB, LDH, LDW 4
Branch B 5
La latence de l'unité fonctionnelle indique combien de cycles d'horloge chaque instruction
utilise réellement une unité fonctionnelle. Toutes les instructions C6x ont une latence d'unité
fonctionnelle, ce qui signifie que chaque unité fonctionnelle est prête à exécuter l'instruction
suivante après un cycle d'horloge, indépendamment des délais des instructions. Par conséquent,
les instructions suivantes sont valables :
1 LDW .D1 *A10, A4
2 ADD .D1 A1,A2,A3
Bien que la première instruction LDW ne charge pas correctement le registre A4 pendant
l'exécution de l'ADD, l'unité fonctionnelle D1 devient disponible dans le cycle d'horloge juste
après celui dans lequel l’instruction LDW est exécutée.
Pour clarifier l'exécution des instructions avec créneaux de retard, pensons à l'exemple suivant
de l'instruction LDW. Supposons que A10 = 0x0100 et A2=1, et que votre intention est de
charger A9 avec le mot de 32 bits à l'adresse 0x0104. Les instructions 3 MV ne sont pas liées à
l'instruction LDW. Elles font autre chose.
1 LDW .D1 *A10++[A2], A9
2 MV .L1 A10, A8
3 MV .L1 A1, A10
4 MV .L1 A1, A2
5 ...
Nous pouvons poser plusieurs questions intéressantes à ce stade :
Tableau 7 .L Unit
Instruction Description
ABS valeur absolue entière avec saturation
ADD(U) addition d'entiers signés ou non signés sans saturation
AND bitwise AND
CMPEQ comparaison d'entiers pour l'égalité
CMPGT(U) comparaison d'entiers signés ou non signés pour plus de
CMPLT(U) comparaison d'entiers signés ou non signés pour moins de
LMBD détection du bit le plus à gauche
MV passer de registre en registre
NEG négation (pseudo-opération)
NORM normaliser un entier
NOT bitwise NOT
+OR bitwise OR
SADD addition d'entiers avec saturation à la taille du résultat
SAT saturer un nombre entier de 40 bits en un nombre entier de 32 bits
SSUB soustraction d'entiers avec saturation à la taille du résultat
SUBC soustraction et décalage d'un nombre entier conditionnel - utilisé pour la
division
XOR exclusive OR
ZERO zéro un registre (pseudo-opération)
Tableau 8 .D Unit
Instruction Description
ADD(U) addition d'entiers signés ou non signés sans saturation
ADDAB (B/H/W) addition d'entiers en utilisant le mode d'adressage
LDB (B/H/W) charge de la mémoire avec un décalage constant de 15 bits
MV passer de registre en registre
STB (B/H/W) stocker en mémoire avec un décalage de registre ou un décalage
constant non signé de 5 bits
𝑦= 𝑎 ∗ 𝑥
Exercice N°9 :
(Produit intérieur) : Écrivez le programme complet en assembleur du produit intérieur à calculer
𝑦= 𝑎 ∗ 𝑥