Vous êtes sur la page 1sur 66

DSP et temps réel

_________ DSP ORIENTÉS APPLICATIONS INDUSTRIELLES


Chapitre 2
Description du cœur ADSP2171

CD\DSP\Cours\Chap2 M. Correvon
T A B L E D E S M A T I E R E S
PAGE

2. DESCRIPTION CŒUR DE L’ADMC401 ..................................................................................................................1


2.1 INTRODUCTION ...........................................................................................................................................................1
2.2 COMPORTEMENT FONDAMENTAL DU DSP................................................................................................................4
2.2.1 Horloge de base du DSP........................................................................................................................ 4
2.2.2 RESET et Circuit d’enclenchement ...................................................................................................... 5
2.2.3 Mise en veille ........................................................................................................................................ 7
2.3 L’UNITÉ ARITHMÉTIQUE ET LOGIQUE (ARITHMETIC/LOGIC UNIT)..........................................................................10
2.3.1 Structure .............................................................................................................................................. 10
2.3.2 Fonctions standards............................................................................................................................. 11
2.3.3 Registres d’entrées et de sortie de l’ALU............................................................................................ 12
2.3.4 Calculs simple précision...................................................................................................................... 12
2.3.5 Calculs multiprécision......................................................................................................................... 12
2.3.6 Mode saturation ou limitation de l’ALU ............................................................................................. 12
2.3.7 Mémorisation d’un dépassement de capacité dans l’ALU .................................................................. 13
2.3.8 Division............................................................................................................................................... 13
2.3.9 Bits d’état de l’ALU............................................................................................................................ 15
2.4 LE MULTIPLIEUR ET ACCUMULATEUR (MULTIPLIER/ACCUMULATOR) ...................................................................15
2.4.1 Structure .............................................................................................................................................. 15
2.4.2 Fonctions standards............................................................................................................................. 17
2.4.3 Format d’entrée des opérandes............................................................................................................ 18
2.4.4 Registres d’entrées et de sortie du MAC............................................................................................. 19
2.4.5 Opérations sur les registres résultats MR ............................................................................................ 20
2.4.6 Mode saturation ou limitation du MAC .............................................................................................. 20
2.5 LE DÉCALEUR À BARILLET (BARREL SHIFTER) ........................................................................................................20
2.5.1 Description générale............................................................................................................................ 20
2.5.2 Registres d’entrées et de sortie du décaleur à barillet.......................................................................... 25
2.5.3 Opération de décalage. ........................................................................................................................ 25
2.5.4 Ajustement de l’exposant EXPADJ .................................................................................................... 25
2.5.5 Décalage immédiat.............................................................................................................................. 25
2.5.6 Dénormalisation .................................................................................................................................. 26
2.5.7 Normalisation...................................................................................................................................... 27
2.6 CONTRÔLE DE PROGRAMME DE LA FAMILLE ADSP2100.......................................................................................28
2.6.1 Le séquenceur de programme.............................................................................................................. 28
2.6.2 Instruction de contrôle de séquence de programme ............................................................................ 32
2.6.3 Les interruptions.................................................................................................................................. 34
2.6.4 Les registres d’état et de contrôle........................................................................................................ 37
2.7 TRANSFERT DE DONNÉES .........................................................................................................................................42
2.7.1 Les générateurs d’adresses (Data Address Generators) ..................................................................... 42
2.7.2 Variables et matrices ........................................................................................................................... 46
2.7.3 Buffers circulaires ............................................................................................................................... 47
2.7.4 Transfert entre bus de données programme (PMD) et bus de données (DMD) .................................. 47
2.8 CONFIGURATION DE LA MÉMOIRE ...........................................................................................................................48
2.8.1 Configuration de la mémoire interne................................................................................................... 49
2.8.2 Configuration de la mémoire externe .................................................................................................. 50
2.8.3 Allocation des zones mémoires........................................................................................................... 51
2.8.4 Adaptation des temps d’accès mémoire .............................................................................................. 53
2.9 CHARGEMENT ET DÉMARRAGE D’UNE APPLICATION (BOOT LOADING)..................................................................54
2.9.1 Chargement de l’application ............................................................................................................... 54
2.9.2 Définition de la table des vecteurs d’interruption ............................................................................... 56
2.9.3 Ecriture dans la table d’interruption.................................................................................................... 58
2.10 TIMER ...................................................................................................................................................................58
2.11 SYNTHÈSE DES REGISTRES D’ÉTAT, DE CONTRÔLE ET DE DONNÉES DU CŒUR DU DSP.....................................60
Bibliographie
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 1

2. DESCRIPTION CŒUR DE L’ADMC401

2.1 INTRODUCTION
Le noyau de l’ADMC401 est compatible à celui de l’ADSP2171 de la famille ADSP21xx
d’Analog Devices. Il s'agit d’un DSP à virgule fixe, dont les données sont sur 16 bits. Les
nombres sont soit entiers positifs (sans signe), soit en format 1.15. Pour ce format, le bit de
poids fort représente le signe et les 15 bits restants correspondent à un nombre décimal de
module inférieur ou égal à l’unité. Si ce nombre est négatif il sera en complément à 2.
L’architecture de base est représentée à la Figure 2-1.
Le bus de données de la mémoire programme (PMD bus) est sur 24 bits, le bus de données de
la mémoire de données (DMD) a une largeur de 16 bits, alors que les bus d'adresses de la
mémoire de données (DMA) ou de la mémoire de programme (PMA) sont sur 14 bits.
La famille ADSP21xx comporte un noyau DSP composé:
− d'une unité arithmétique et logique (ALU) pouvant être chargée par deux sous-registres,
de 16 bits : AX0 ou AXI, pour l'entrée X, et AY0 ou AYI pour l'entrée Y Les sous-
registres jouent des rôles équivalents vis-à-vis de l’ALU. Le résultat des opérations de
l'ALU va dans le registre AR, relié au bus résultat R-bus, et au bus de données DMD de
16 bits. Les résultats ainsi obtenus vont pouvoir être accessibles par d'autres unités de
calcul en utilisant ces bus. Cette unité de calcul est également prévue pour effectuer des
divisions numériques ;
− d’une unité de multiplication et d’accumulation (MAC) pouvant être chargée par deux
sous-registres de 16 bits: MX0 ou MX1, pour X, et MY0 ou MY1 pour Y. Comme
précédemment, les sous-registres jouent des rôles équivalents vis-à-vis du MAC. Le
résultat des opérations de multiplication et d'accumulation vont dans le registre MR relié
au bus résultat R-bus, composé de trois sous-registres, deux de 16 bits MR1 pour les
poids forts et MR0 pour les poids faibles (en double précision), et un de 8 bits MR2 pour
l'expression du signe étendu qui permet de gérer les dépassements et les signes du
résultat. Par multiplexage, le registre MR a accès au bus de données DMD de 16 bits et
au bus résultat R-bus. Comme pour l'ALU, il peut communiquer avec les autres unités de
calcul de deux manières : le R-bus et le bus DMD ;
− d’une unité de décalage à barillet ou décaleur (Barrel Shifter). Cette unité est chargée
soit par le bus résultat R-bus, soit par un registre (noté SI par le constructeur) de 16 bits.
Les opérations consistent à décaler à droite ou à gauche pour diviser ou multiplier par
deux les données, en effectuant éventuellement un « ou logique » avec la donnée avant
décalage. En utilisant le « ou exclusif » de l'ALU, il permet de générer des séquences
pseudo-aléatoires, très pratiques en traitement ou transmission du signal. D'autre part le
détecteur d'exposant utilise le registre (noté SE par le constructeur) comme
enregistrement de la puissance de 2, correspondant à un décalage. C'est l'opération de
normalisation. Les données passent par le bus DMD de 16 bits ;
− de deux générateurs d’adresses (DAG : Data Address Generator) comportant chacun
12 registres indépendants sur 14 bits, dont quatre pour les pointeurs (I), I0 à I3 pour
DAG1 et I4 à 17 pour DAG2, et d'autre part 4 registres (M pour chaque générateur pour
modifier les pointeurs et 4 autres registres (L) pour définir les buffers circulaires bit-
reverse. Le générateur DAG1 adresse seulement la mémoire de données et peut
fonctionner en bit-reverse pour les calculs en FFT. Le générateur DAG2 adresse les deux
types de mémoire, et peut fonctionner en branchements indirects (Jump et Call). Par
exemple AX0 = DM(I0,M0) est une lecture indirecte chargée dans AX0 d'une donnée

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 2

située en mémoire de données, dont l'adresse est pointée par I0. La valeur suivante
(pointée par I0), sera I0 (précédent) + M0. Par contre, Jump (I4) est un saut indirect ;
− d'un séquenceur de programme contrôlant les sous-programmes, les boucles et les
interruptions. Quatre niveaux de boucle sont possibles. Les boucles sont contrôlées par le
registre CNTR. Le nombre placé dans ce registre indique le nombre de boucles prévues.
À chaque Reset, les interruptions sont automatiquement validées, il est donc important
de bien configurer le registre IMASK dans le programme. Les registres de statut
SSTAT, ASTAT et MSTAT sont accessibles par les instructions assembleur ENA ou
DIS.

INSTRUCTION PROGRAM ROM


REGISTER 2k x 24
DATA BOOT POWER DOWN 2 bits
PROGRAM RAM SRAM
DATA DATA ADDRESS CONTROL
2k x 24 1k x 16
ADDRESS ADDRESS GNERATOR LOGIC
PROGRAM
GENERATOR GENERATOR SEQUENCER
1 2

14 bits

PMA BUS 14 bits

MUX
14 bits

DMA BUS

PMD BUS 24 bits

24 bits

MUX
BUS
EXCHANGE
DMD BUS 16 bits

INPUT REGISTER INPUT REGISTER INPUT REGISTER CONTROL TIMER


LOGIC
ALU MAC SHIFTER
TRANMIT REG. TRANMIT REG.
OUTPUT REGISTER OUTPUT REGISTER OUTPUT REGISTER
RECEIVE REG. RECEIVE REG.

SERIAL SERIAL
16 bits R BUS PORT 0 PORT 1

5 bits 5 bits

Figure 2-1 : Schéma bloc fonctionnel (partie DSP)

− des registres d'entrée et de sortie des unités de calcul (ALU, MAC, ou décaleur) sont
dédoublés, ce qui permet une utilisation plus souple du processeur en cas d'exécution
d'un sous-programme. Chaque ensemble dédoublé de ces registres est déterminé par un
bit d'état dans le registre MSTAT. On utilise soit l'ensemble primaire (par défaut, bit
d'état = 0), soit le secondaire (bit d'état = 1). Un seul fonctionne à la fois ;
− des registres de transfert de données. Le registre PX reçoit ou fournit les 8 bits de poids
faible lors du transfert de données entre le bus DMD (16 bits) et le bus PMD (24 bits).
Les autres registres utilisables pour transférer les données sont les registres AY0 ou AY1
de AY, ou bien MY0 ou MY1 de MY, qui permettent le passage des 16 bits de poids fort
du bus de données PMD de la mémoire de programme vers le bus de données DMD de
la mémoire de données.
− un timer qui peut être considéré comme un périphérique car il n’est pas indispensable
au fonctionnement du DSP. Son rôle est de provoquer des interruptions dans le
programme selon une période Tint qui est toujours un multiple de la période interne du
processeur. Ce facteur de multiplication dépend des registres de contrôle du Timer ;
− un générateur d’adresse de démarrage (Boot Address Generator) permettant grâce
aux pins d’entrées complémentaires MMAP et BMODE ainsi qu’au registre de

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 3

contrôle MEMWAIT(15 : ROM ENABLE) le démarrage direct d’un programme


d’application en EEPROM externe ou le moniteur en ROM interne.
− un contrôleur d’état de consommation (Power Down Control Logic) permettant de
mettre le DSP en veille, c’est-à-dire dans un état de très base consommation. Le
contrôle de l’état de consommation peut se faire par hardware (entrée : PWD, sortie :
PWDACK) ou par software (registre ; SPORT1(15,14,13,12)).
− Deux ports sériels synchrones (Serial Ports 0 et 1) permettant la transmission sérielle
d’information.
Le moniteur résident en ROM interne au DSP utilise les ports sériels durant la phase
d’enclenchement (Power Up)
Le port SPORT1 est utilisé pour le chargement d’un programme d’application par
l’intermédiaire du debugger (via un PC).
Le port SPORT0 est utilisé pour le chargement d’un programme d’application résident
dans une EPROM série
Ces deux ports peuvent être reconfiguré par l’utilisateur moyennant un certain nombre
de précautions.

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 4

2.2 COMPORTEMENT FONDAMENTAL DU DSP


Pour qu’un circuit numérique tel qu’un DSP ait un comportement conforme aux
caractéristiques techniques, il ne faut pas négliger les points suivants :
− mise sous tension (enclenchement des alimentations) ;
− comportement du reset ;
− fréquence de l’horloge de base (composants externes) ;
− mise en veille basse consommation.
Un mauvais fonctionnement de l’un de ces points peut avoir un effet catastrophique sur le
comportement du système quel que soit le type de circuit (FPGA, microcontrôleur DSP, …).

2.2.1 Horloge de base du DSP


L’horloge de base du DSP est choisie en fonction de plusieurs critères. La vitesse d’exécution
(MIPS) est directement proportionnelle à la fréquence de l’horloge. Les temps d’accès des
composants externes comme les mémoires, et les périphériques peuvent également limiter la
fréquence de l’horloge. Une autre contrainte importante est imposée par les UARTs utilisés
pour la transmission sérielle. En effet pour avoir des vitesses (bauds rate) de transmission
standard (1200Bd/s, 2400Bd/s, …9600Bd/s, …115200Bd/s), la fréquence de l’horloge est
divisée par des grandeurs entières.
CLK
Baud _ rate= 2.1
SCLKDIV +1
Avec CLK, fréquence de l’horloge de base et SCLKDIV valeur de division (grandeur
entière). Si CLK=12MHz, le nombre de Baud rate correspondant à un multiple de 1200,
jusqu’à 115200Bd/s est de 16. Pour CLK=12.96MHz, ce nombre passe à 28.
Selon la valeur de cette fréquence, certaines vitesses de transmission ne sont plus assurées
avec une fiabilité suffisante.

2.2.1.1 Hardware disponible et composants externes


L’ADMC401 possède son propre oscillateur interne, il est donc possible de placer un cristal
entre les pins CLKIN et XTAL. L’oscillateur travaille sur la fréquence parallèle du cristal
(zone inductive), il est donc nécessaire d’ajouter deux condensateurs entre les deux
extrémités du cristal et la masse électronique. Le temps de cycle pour les instructions est
dérivé d’une fréquence (signal CLKOUT) correspondant au double de la fréquence de
l’oscillateur. L’utilisation d’un oscillateur externe est toujours possible. Dans ce cas, la sortie
de cet oscillateur est connectée à la broche CLKIN, XTAL étant laissé non connecté.
La fréquence du signal apparaissant sur CLKIN doit être maintenue dans les limites imposées
par le constructeur. Pour des raisons de stabilités du multiplicateur de fréquence interne, il
n’est pas acceptable de varier la fréquence de CLKIN durant le fonctionnement du DSP.

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 5

20pF 13MHz 20pF

CLKIN XTAL CLKOUT

ADSP21xx

Figure 2-2 : Oscillateur et cristal

Une PLL (multiplicateur de fréquence) génère une horloge interne de fréquence huit fois
supérieure à celle du signal CLKIN. Cette horloge interne définit les états internes du DSP.
Cette PLL génère également le signal CLKOUT, synchronisé sur les cycles d’instruction du
DSP. La Figure 2-3 illustre les relations existant entre ces signaux.
CLKIN

t
ETAT INTERNE
DU DSP 4 1 2 3 4 1 2 3 4

Cycle d'instruction Cycle d'instruction


CLKOUT

t
Figure 2-3 : Horloges externe et interne

Sur chaque DSP, il existe un certain nombre d’entrées digitales asynchrones. L’apparition des
transitions de ces signaux a une phase arbitraire par rapport à l’horloge de base du DSP. Le
délai entre la transition du signal et sa synchronisation est appelé délai de synchronisation
(synchronization delay).
Les interruptions agissant sur transition (flanc descendant) doivent donc avoir une largeur
d’impulsion suffisante pour être synchronisée et donc reconnue. Pour être sûr que ces
impulsions soient prises en compte, il est impératif de fixer leur largeur à un cycle entier de
l’horloge de base (CLKOUT) auquel il faut ajouter les setup time et hold time donnés dans
les caractéristiques.

2.2.2 RESET et Circuit d’enclenchement


L’entrée RESET , lorsqu’elle est active (« 0 ») provoque une initialisation hardware
complète de l’ADSP21xx. Durant la phase de mise sous tension, (power up), l’entrée
RESET doit impérativement être maintenue à « 0 » pour assurer une initialisation correcte.
L’ADMC401 possède un circuit de surveillance de tension (power supply monitoring) qui

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 6

répond aux exigences imposées au signal RESET . Ce circuit à une sortie nommée POR
(Power On Reset) qui peut être, selon les applications, directement connectée à l’entrée
RESET . Il est également possible d’utiliser un circuit externe. L’entrée RESET possède une
hysthérèse, mais il est vivement conseillé d’ajouter, au circuit externe, un trigger de schmitt.
A l’enclenchement, le temps pendant lequel le signal RESET doit être actif correspond au
temps de verrouillage du circuit PLL interne. Un minimum de
1
TRESET =2000tCKI avec tCKI = 2.2
FCLKIN

assure un verrouillage du circuit PLL, le démarrage de l’oscillateur n’étant pas inclus.


La Figure 2-4 illustre la relation existant entre le signal POR et le niveau de la tension
d’alimentation (partie digitale).

V CC

+5V
V RST

V HYST

t
POR

t
tRST tRST

Figure 2-4 : Comportement du signal Power On Reset

Le seuil de validité de la tension d’alimentation est nommé VRST. Ce seuil est compris entre
3.25V et 4V. Lorsque la tension descend au-dessous de VRST-VHYST, le signal POR est
activé. Lorsque la tension d’alimentation atteint VRST et que POR est actif, un compteur
d’une capacité de 17 bits est enclenché. L’horloge de ce compteur est CLKOUT. Tant que le
compteur n’a pas atteint sa valeur maximale POR est actif. Le temps de maintien de POR
est donné par la relation
1 2
tRST =217tCKI =216tCK0 avec tCKI = = =2t 2.3
FCLKIN FCLKOUT CK0

La connexion de la sortie POR à l’entrée RESET permet donc de garantir une initialisation
correcte de l’ADMC401.
Un reset complet du DSP permet de réaliser les tâches suivantes :
− masquage des interruptions ;
− pointeurs de toutes les piles (stack) initialisés ;

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 7

− pointeur de programme (PC) en position initiale (valeur dépendant de MMAP et


BMAP) ;
− initialisation de tous les périphériques.
Lorsque la tension d’alimentation est valide, il n’est plus nécessaire d’attendre la stabilisation
du circuit PLL lors d’un reset. Dans ce cas la largeur minimum de l’impulsion du signal
RESET est limitée à

tRESET = 5tCK0 2.4

Indépendamment du reset hardware, il est possible d’activer un reset software des


périphériques, excepté pour le Watchdog.
Pour réaliser ce reset, il faut exécuter la routine suivante :
PRESET : SET FL2 ; {mise a « 1 » du Flag 2}
TOGGLE FL2 ; {transition d’état du Flag 2}
TOGGLE FL2 ; {transition d’état du Flag 2}
RTS {sortie de la routine}

Une activation du Watchdog provoque une initialisation complète du DSP, excepté le


Watchdog lui-même.

2.2.3 Mise en veille


La mise en veille du DSP (Power-Down Mode) permet de diminuer la consommation de ce
dernier. La commande de mise en veille peut être software ou hardware. Dans ce mode le
comportement du DSP est le suivant :
− horloges internes désactivées (entre autre arrêt de CLKOUT) ;
− maintien du contenu des registres internes ;
− retour en mode opératoire en 100tCKI ;
− activation d’une interruption permettant le sauvetage de l’état du DSP (housekeeping)
avant l’entrée en veille et sa la restitution lors du retour en mode opératoire ;

2.2.3.1 Entrée dans le mode de mise en veille


La séquence de mise en veille débute lors de l’apparition d’une transition négative sur
l’entrée PWD ou par la mise à « 1 » du bit PDFORCE (SPORT1_AUTOBUF_CRTL[13]).
Une interruption est activée à l’adresse 0x002C. Des précautions doivent être prises pour
éviter des interruptions multiples de mise en veille afin d’éviter un dépassement de capacité
des piles. Cette interruption, non masquable peut être utilisée pour exécuter un certain
nombre d’opérations de mémorisation de l’état actuel du système comme par exemple une
désactivation des périphériques, suppression des interruptions en attente, etc …Une fois ces
opérations effectuées, c’est grâce à l’instruction IDLE que le mode de veille est activé. La
mise en veille ne nécessite que un ou deux cycles d’horloge. Comme déjà mentionné, les
contenus des registres et les mémoire sont maintenus. Les sorties actives sont également
maintenues. Si l’instruction RTI apparaît avant l’instruction IDLE, le mode de veille est
désactivé.

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 8

Interruption hardware Programme principal


ou routine d'interruption
PDW

PC
Vecteur d'interruption 0x002C PC
t
Interruption software
PC JUMP INT_POWERDOWN

1 PDFORCE

INT_POWERDOWN : DM(Save_AX0) = AX0;


.....
.....
IDLE ;

Mise en veille

Figure 2-5 : Mise en veille

2.2.3.2 Sortie du mode de mise en veille


Le mode de veille peut être quitté lorsque l’entrée PWD est le siège d’une transition positive
ou par activation du RESET . Le temps de recouvrement (delay startup from power down
recovery) pour sortir du mode de veille peut être contrôlé par le bit XTALDELAY
(SPRTO1_AUTOBUF_CRTL[14]).
− XTALDELAY est à « 0 » : le temps de recouvrement est de 100tCKI.
− XTALDELAY est à « 1 » : le temps de recouvrement est de 4096tCKI.
Cette caractéristique permet de stabiliser des éventuelles horloges externes avant de
commencer l’exécution du programme.

ROUTINE DE PWD
.....
.....
IDLE ;

Commande hardware
Mise en veille
PDW
PCUR= "0" PCUR= "1" PC = "0"

t
PC AX0 = DM(Save_AX0)
.....
.....
RTI ;

PC Programme principal
ou routine d'interruption

Figure 2-6 : Sortie de la mise en veille

Une fois le temps de recouvrement écoulé, l’exécution de l’instruction suivant IDLE dépend
de l’état du bit PCUR (SPORT1_AUTOBUF_CRTL[12]).

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 9

− Si PUCR est à « 0 » le DSP exécute les instructions que suivent IDLE, permettant par
exemple de retrouver l’état du système avant la mise en veille. Lors de l’apparition de
l’instruction RTI, le programme retourne dans la routine interrompue par la demande
de mis en veille. Les interruptions ayant été mémorisées, durant l’état de veille peuvent
alors être exécutées.
− Si PUCR est à « 1 » le compteur de programme PC, les registres d’état, et de boucle
CNTR et IMASK sont mis à « 0 ». SSTAT est initialisé à 0x55. L’instruction exécutée
se trouve à l’adresse 0x0000.
Si un RESET est activé durant l’état de veille, une séquence complète initialisation est
exécutée selon les états de MMAP et BMODE.

2.2.3.3 Reconnaissance du mode de veille


Une sortie PWDACK (power down acknowledge) est mise à « 1 » lorsque le DSP se trouve
en mode basse consommation. Ce signal indique que la sortie d’horloge CLKOUT est valide,
mais dans certain cas ceci ne veut pas dire que l’exécution des instructions a commencé (par
exemple après un RESET ou lorsque XTALDELAY est actif)

2.2.3.4 Utilisation de PWD comme interruption non-masquable


L’entrée PWD peut être utilisée comme interruption non-masquable sans rapport avec le
mode de veille. En effet l’activation du mode de veille n’intervient que si l’instruction IDLE
est présente.

Programme principal
ou routine d'interruption
Interruption hardware
PDW PC
Vecteur d'interruption 0x002C PC

t
PC JUMP INT_NON_MASQ

INT_NON_MASQ : DM(Save_AX0) = AX0;


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

.....;
.....;
RTI

PCUR="0"

PC AY=DM(I4,M3);
.....;
.....;

Figure 2-7 : Interruption non masquable

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 10

2.3 L’UNITÉ ARITHMÉTIQUE ET LOGIQUE (ARITHMETIC/LOGIC UNIT)


L’ALU fournit un ensemble standard de fonctions arithmétiques et logiques.

2.3.1 Structure
L’ALU est constitué de deux ports d’entrées X et Y de 16 bits de largeur. Le port de sortie R
de 16 bits également correspond au résultat. Pour les calculs en multiprécision, l’ALU
accepte une entrée supplémentaire de retenue nommée CI (Carry Input). Cette entrée est
issue du registre d’état arithmétique (voir §2.6.4.1) ASTAT. L’ALU génère six signaux
d’état définis au §2.3.9.
− Le port d’entrée X de l’ALU accepte des données (16 bits) de deux sources, soit du
double registre AX (AX0 ou AX1) ou des registres liées au bus résultat R-Bus (voir
§2.3.3). Ces registres peuvent être utilisés directement comme opérandes. Les deux
registres contenus dans AX peuvent être lus ou écrits depuis le bus DMD. L’ensemble
des instructions disponible permet également la lecture de ces registres par le bus
PMD, mais il n’y a pas de connexion directe. Ces opérations utilisent l’unité de
transfert de données entre le bus DMD (16 bits) et le bus PMD (24 bits). La sortie du
registre AX, grâce à un double port, peut être simultanément lue par le port d’entrée X
et disponible sur le bus DMD.
− Le port d’entrée Y de l’ALU accepte également des données (16 bits) de deux sources,
soit du double registre AY (AY0 et AY1) ou du registre de « feedback » AF (voir
§2.3.3). Les deux registres contenus dans AY peuvent être lus ou écrits depuis le bus
DMD ou écrits directement depuis le bus PMD. L’ensemble des instructions
disponibles permet également la lecture de ces registres par le bus PMD mais dans ce
cas c’est l’unité de transfert de données entre le bus DMD (16 bits) et le bus PMD (24
bits) qui est utilisée. La sortie registre AY, grâce à un double port, peut être
simultanément lu par le port d’entrée Y et disponible sur le bus DMD.
− Le port de sortie R de l’ALU est connectée au registre de « feedback » AF et au
registre de résultat AR. La sortie registre AR, grâce à un double port, peut
simultanément être envoyée au bus résultat R-Bus et au bus DMD. L’ensemble des
instructions disponible permet également la lecture du registre AR par le bus PMD,
mais il n’y a pas de connexion directe. Cette opération utilise l’unité de transfert de
données entre le bus DMD (16 bits) et le bus PMD (24 bits).
N’importe quel registre associé à L’ALU peut être lu et écrit dans un même cycle d’horloge.
Les registres sont lus au début du cycle et écrits à la fin du même cycle. Dans un cycle donné,
la valeur contenue dans un registre quelconque a été chargée à la fin du cycle précédent. Par
conséquent, une nouvelle valeur écrite dans un registre ne peut pas être lue avant le début du
cycle suivant. Cette caractéristique permet à un registre de fournir un opérande sur une entrée
de l’ALU au début d’un cycle et être rafraîchit par un nouvel opérande issu de la mémoire à
la fin du cycle. Ceci permet aussi de stocker en mémoire le contenu d’un registre résultat et
de rafraîchir ce dernier par un nouveau résultat issu de l’ALU dans le même cycle.
Les registres de l’ALU sont doubles (2 banks). Seul un bank est accessible à la fois. Le
second bank peut être activé, par exemple dans un sous-programme ou une routine
d’interruption, ce qui évite le stockage des données contenues dans les registres. La sélection
du bank primaire ou secondaire est commandée par le bit MSTAT[0] (voir §2.6.4.3)

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 11

24 bits PMD BUS

DMD BUS

16 bits 16 bits
16 bits 16 bits
16 bits
MUX
16 bits
Bank 2 Bank 2
Bank 1 Bank 1
AX REGISTERS AY REGISTERS
16 bits
2 x 16 2 x 16

MUX MUX

16 bits 16 bits
Bank 2
Bank 1
AF REGISTER
1 x 16
AZ
X Y
AN
AC
AV ALU CI
AS 16 bits
AQ
R

16 bits
MUX

Bank 2
Bank 1
AR REGISTER
1 x 16
16 bits

R BUS

Figure 2-8 : Unité Arithmétique et logique

2.3.2 Fonctions standards


Les fonctions standards de l’ALU sont les suivantes (R=AR ou AF) :
R = X+Y : Addition simple
R = X+Y+CI : Addition avec retenue sur 1 bits
R = X-Y : Soustraction simple
R = X-Y+CI-1 : Soustraction avec retenue et décalage de 1 bit
R = Y-X : Soustraction simple
R = Y-X+CI-1 : Soustraction avec retenue et décalage de 1 bit
R = -X : Changement de signe de X (complément à deux)
R = -Y : Changement de signe de Y (complément à deux)
R = Y+1 : Incrémentation de Y par 1
R = Y-1 : Décrémentation de Y par 1
R = PASS X : Passe X dans R avec modification des flags AZ et AN

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 12

R = PASS Y : Passe Y dans R avec modification des flags AZ et AN


R = 0 (PASS 0) : Mise à zéro de R
R = ABS X : Valeur absolue de X avec modification du flag AS
R = X AND Y : ET logique bit à bit entre X et Y
R = X OR Y : OU logique bit à bit entre X et Y
R = X XOR Y : OU exclusif logique bit à bit entre X et Y
R = NOT X : NON logique bit à bit de X (complément à 1)
R = NOT Y : NON logique bit à bit de Y (complément à 1)

2.3.3 Registres d’entrées et de sortie de l’ALU.


Les registres connectés aux ports de l’ALU sont les suivants
Source Source Destination
Registres connectés au port X Registres connectés au port Y Registre connectés au port R
ALU AX0 (Bus DMD) AY0 (Bus DMD - PMD) AR (Bus R)
AX1 (Bus DMD) AY1 (Bus DMD - PMD) AF (ALU : R)
AR (Bus R) AF (ALU : R)
MAC MR0 (Bus R)
MR1 (Bus R)
MR2 (Bus R)
BR SR0 (Bus R)
SR1 (Bus R)

2.3.4 Calculs simple précision


Lors d’une addition simple précision, on peut avoir les quatre cas suivant :
AC AV AN
X Y R
(Carry) (Overflow) (Negativ)
x>0 y>0 0<x+y<7FFF 0 0 0
x>0 y<0
0<x+y<7FFF 1 0 0
x<0 y>0
x>0 y<0
8000<x+y<0 0 0 1
x<0 y>0
x<0 y<0 8000<x+y<0 1 0 1

x<0 y<0 8000>x+y 1 1 0


x>0 y>0 x+y>7FFF 0 1 1
La soustraction peut être déduite de l’addition.

2.3.5 Calculs multiprécision


L’ALU supporte les opérations en multiprécision grâce à l’entrée de retenue CI (Carry In) et
au bit AC (ASTAT[3]) du registre d’état arithmétique ASTAT. L’état logique de CI est
identique à la valeur du bit AC généré lors de l’opération précédente dans l’ALU.

2.3.6 Mode saturation ou limitation de l’ALU


Le fonctionnement de l’ALU suppose l’absence de saturation ce qui correspond à des
données ne pouvant varier (en format 1.15) que de 1000 0000 0000 0000 (valeur la plus

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 13

négative), pour laquelle AV=AC=1, à la valeur 0111 1111 1111 1111 (valeur la plus
positive), pour laquelle AV=1 et AC=0.
Dépassement de capacité (AV) Retenue (AC)
Registre AR
(Overflow) (Carry)
0 0 R (sortie de l’ALU) Résultat du calcul
0 1 R (sortie de l’ALU) Résultat du calcul
1 0 01111111111111111 Pleine échelle positive
1 1 10000000000000000 Pleine échelle négative

En mode normal, l’ALU ne tient pas compte de la saturation. Pour activer ce mode, il faut
modifier le bit MSTAT[3] (AR Saturation Mode Enable). Le mode de saturation reste actif
pour toutes les opérations futures de l’ALU. Attention, il faut garder à l’esprit que seul le
registre AR doit être utilisé pour ce mode.

2.3.7 Mémorisation d’un dépassement de capacité dans l’ALU


L’activation du bit MSTAT[2] (ALU Overflow Latch Mode Enable) du registre d’état des
modes de fonctionnement permet de maintenir l’état du bit AV (ASTAT[2]) du registre
d’état arithmétique après la détection d’un dépassement de capacité. Dans ce mode AV ne
peut être remis à « 0 » que par écriture, via le bus DMD.

2.3.8 Division
L’ALU supporte la division entre deux nombres pouvant être signés ou non. Une première
restriction impose que les deux nombres doivent être du même type, c’est-à-dire soit les deux
signés, soit le deux non-signés. En simple précision, le dividende à une capacité de 32 bits
tandis que le diviseur est un mot de 16 bits. Le temps d’exécution de la division prend dans
ce cas 16 cycles d’horloge.
− Pour une division signée :
‰ Les 16 bits de poids forts du dividende doivent être dans AY1 ou AF (registres
connectés à l’entrée Y de l’ALU.
‰ Les 16 bits de poids faible du dividende doivent être dans AY0.
‰ Le diviseur doit se trouver dans un des registres AX0, AX1, ou un registre de
résultat R (registres connectés sur l’entrée X de l’ALU).
‰ Le résultat d’une capacité de 16 bits se trouve dans le AY0

− Pour une division non-signée :


‰ Les 16 bits de poids forts du dividende doivent être dans AF (registre connecté
à l’entrée Y de l’ALU.
‰ Les 16 bits de poids faible du dividende doivent être dans AY0.
‰ Le diviseur doit se trouver dans un des registres AX0, AX1, ou un des registres
de résultat R (registres connectés sur l’entrée X de l’ALU).
‰ Le résultat d’une capacité de 16 bits se trouve dans le AY0

Lorsque le dividende et le diviseur sont signés, la primitive DIVS (divide-sign) est exécutée
en premier. Cette primitive définit le signe du quotient par une fonction OU-exclusif entre les
bits de signes (MSB) du dividende et du diviseur. Le contenu du registre AY0 est décalé de 1
bit vers la gauche, le LSB étant remplacé par le bit de signe du quotient.

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 14

Le signe du quotient est également mémorisé dans le bit ASTAT[6] (AQ) du registre d’état
arithmétique.
Le bit de poids fort des 16 bits de poids faibles du dividende AY0[15] est mémorisé dans
AF[0] alors que les 15 bits de poids faibles de la sortie de l’ALU R[15…0] sont chargés dans
AF[15…1].

15 bits 1 bits
LEFT SHIFT

AX0[15...0] AX1[15...0] AX1[15...0] AF[15...1] AF[0] AY0[15...0]


16 bits 16 bits 16 bits LOWER DIVIDEND
16 bits

16 bits MUX PARTIAL


MUX REMAINDER
UPPER DIVIDEND 1 bits
16 bits
1 bits
DIVISOR MSB
1 bits
16 bits MSB

16 bits 16 bits
R - BUS

X Y
ALU
R=PASS Y
Z AQ
ASTAT[6]
15 bits
LSB

Figure 2-9 : Bloc spécifique à la division DIVS

Lors d’une division de deux nombres non-signés, la primitive DIVS n’est pas utilisée. Dans
ce cas le bit ASTAT[6] (AQ) doit être initialisé à « 0 » Le bit AQ indique dans ce cas que le
quotient doit être considéré comme positif.
La seconde primitive DIVQ (divide quotient) permet de générer un bit du quotient à la fois.
Cette primitive doit donc être exécutée autant de fois qu’il reste de bit à définir pour le
quotient. Pour les divisions non-signées, la primitive DIVQ doit être exécutée 16 fois alors
que pour des divisions signées on utilise une fois la primitive DIVS et 15 fois la primitive
DIVQ.
L’instruction DIVQ décale le contenu du registre AY0 de 1 bit vers la gauche, le bit AY0[15]
étant mémorisé dans AF[0]. Les 15 bits de poids forts du résultat de l’addition si AQ= « 1 »
ou de la soustraction si AQ= « 0 » sont chargés dans AF[15…1].
La valeur du bit AQ est définie comme le résultat le l’opération logique OU-exclusif entre le
MSB du diviseur et le MSB du résultat fourni par l’ALU.
L’opération de division est très complexe. Le choix d’un format du dividende et du diviseur
peut conduire à un résultat erroné. On s’occupera ici que d’un cas, utilise pour l’interpolation
des codeurs optiques incrémentaux sin – cos. Dans ce cas particulier, une division doit être
effectuée entre des nombres signés de format 1.31 pour le dividende et 1.15 pour le diviseur.
Le résultat, c’est à dire le quotient aura le format 1.15. La seule condition à respecter est que
le dividende doit être plus grand que le diviseur.
Pour plus d’information, voir ADSP2100 Family, User’s Manual, Chap. 2, § 2.2.7.4.
Appendix B, Division Exceptions.

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 15

15 bits 1 bits
LEFT SHIFT

AX0[15...0] AX1[15...0] AF[15...1] AF[0] AY0[15...0]


16 bits 16 bits LOWER DIVIDEND
PARTIAL
REMAINDER
16 bits MUX 16 bits
1 bits
DIVISOR 1 bits
16 bits MSB

R - BUS X Y
ALU
R=Y+X IF AQ=1
R=Y-X IF AQ=0

Z AQ
ASTAT[6]
1 bits
15 bits MSB
LSB

Figure 2-10 : Bloc spécifique à la division DIVQ

2.3.9 Bits d’état de l’ALU


Les bits d’état définis dans le registre d’état arithmétique ASTAT (voir §2.6.4.1) sont les
suivants :
Flag Nom Définition
AZ Zero NOR logique de tous les bits du port R de l’ALU
Vrai (1) si tous les bits sont à 0
Bit de signe du port R de l’ALU
AN Negative
Vrai (1) si la valeur est négative
AV Overflow OU exclusif des deux retenues (Carry) des deux derniers étages (MSB)
de l’additionneur
Vrai (1) s’il y a dépassement de capacité
AC Carry Retenue (Carry) du dernier étage de l’additionneur
AS Sign Bits de signe du port X de l’ALU.
Affecté uniquement pat l’instruction ABS (valeur absolue)
AQ Quotient Bit de quotient affecté uniquement par les instructions DIVS et DIVQ

2.4 LE MULTIPLIEUR ET ACCUMULATEUR (MULTIPLIER/ACCUMULATOR)


Le multiplicateur / accumulateur (MAC) permet la réalisation de multiplication rapide (1
cycle d’horloge) avec addition ou soustraction cumulée. Des fonctions complémentaires
telles que saturation / limitation et mise à zéro sont également implantées. Un registre
de »feedback » permet également la réutilisation d’un résultat dès le cycle d’horloge suivant.

2.4.1 Structure
Le multiplicateur est constitué de deux ports d’entrée X et Y de 16 bits de largeur. Le port de
sortie P de 32 bits correspond au résultat. Ce résultat passe ensuite au travers d’un
additionneur / soustracteur de 40 bits, lequel peut ou non ajouter ou soustraire au résultat le
contenu du registre MR. Le résultat global est ensuite chargé dans le registre MR par une

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 16

remise à jour. Le registre MR de sortie est constitué de trois registres, deux de 16 bits MR0 et
MR1 et un de 8 bits, MR2.
La capacité de l’additionneur / soustracteur est supérieure à 32 bits afin de permettre un
dépassement de capacité lors de calculs intermédiaires faisant intervenir une suite de
multiplications et additions / soustractions. Le bit ASTAT[6] permet de signaler un
dépassement de capacité sur les 32 bits de MR0 et MR1.
Le multiplicateur à deux entrées X et Y de 16 bits et une sortie résultat P de 32 bits.
− Le port d’entrée X du MAC accepte des données (16 bits) de deux sources, soit du
double registre MX (MX0 ou MX1) ou des registres liées au bus résultat R-Bus (voir
§2.4.4). Ces registres peuvent être utilisés directement comme opérandes. Les deux
registres contenus dans MX peuvent être lus ou écrits depuis le bus DMD. La sortie
registre MX, grâce à un double port, peut être simultanément lu par le port d’entrée X
et disponible sur le bus DMD.
− Le port d’entrée Y du MAC accepte également des données (16 bits) de deux sources,
soit du double registre MY (MY0 et MY1) ou du registre de « feedback » MF (voir
§2.4.4). Les deux registres contenus dans MY peuvent être lus ou écrits depuis le bus
DMD, ou écrits directement depuis le bus PMD. L’ensemble des instructions
disponibles permet également la lecture de ces registres par le bus PMD mais dans ce
cas c’est l’unité de transfert de données entre le bus DMD (16 bits) et le bus PMD (24
bits) qui est utilisée. La sortie registre MY, grâce à un double port, peut être
simultanément lu par le port d’entrée Y et disponible sur le bus DMD.
− Le port de sortie P du MAC (32 bits) est connecté au 32 bits de poids faibles de
l’additionneur / soustracteur de 40 bits, la seconde entrée n’est rien d’autre que les
registres MR2, MR1, MR0.
L’additionneur / soustracteur a deux entrées, l’une de 32 bits directement connectée à la
sortie du multiplicateur, l’autre de 40 bits permet la lecture du registre MR.
Les sorties de l’additionneur / soustracteur vont soit au registre de résultat MR soit au
registre de « feedback » MF. Le registre MF permet aux bits 16 à 31 du résultat d’être
directement utilisés par l’entrée Y du multiplicateur lors du prochain cycle de l’horloge. Le
registre de résultat est constitué de trois registres, deux de 16 bits (MR0 et MR1) et un de 8
bits (MR2). Ces registres peuvent être chargés directement par le bus DMD. Leurs sorties
sont directement connectées (driver tri-state) au bus DMD ou au bus résultat R.
N’importe quel registre associé au MAC peut être lu et écrit dans un même cycle d’horloge.
Les registres sont lus au début du cycle et écrits à la fin du même cycle. Dans un cycle donné,
la valeur contenue dans un registre quelconque a été chargée à la fin du cycle précédent. Par
conséquent, une nouvelle valeur écrite dans un registre ne peut pas être lue avant le début du
cycle suivant. Cette caractéristique permet à un registre de fournir un opérande sur une entrée
du MAC au début d’un cycle et être rafraîchit par un nouvel opérande issu de la mémoire à la
fin du cycle. Ceci permet aussi de stocker en mémoire le contenu d’un registre résultat et
rafraîchir ce dernier par un nouveau résultat issu du MAC dans le même cycle.
Les registres du MAC sont doubles (2 banks). Seul un bank est accessible à la fois. Le second
bank peut être activé, par exemple dans un sous programme ou une routine d’interruption, ce
qui évite le stockage des données contenues dans les registres. La sélection du bank primaire
ou secondaire est commandée par le bit MSTAT[0] du registre d’état du mode de
fonctionnement MSTAT (voir §2.6.4.3).

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 17

24 bits PMD BUS

16 bits DMD BUS 16 bits


MSB

16 bits MUX
16 bits
Bank 2 Bank 2
Bank 1 Bank 1
MX REGISTERS MY REGISTERS
16 bits 2 x 16 2 x 16 16 bits

16 bits 16 bits

MUX MUX 16 bits

Bank 2
Bank 1
16 bits 16 bits MF REGISTER
1 x 16
X Y
MULTIPLIER

40 bits
P 16 bits
32 bits
16 bits
ADD / SUBTRACT MV

MUX MUX MUX

8 bits 16 bits 16 bits 16 bits

Bank 2 Bank 2 Bank 2


Bank 1 Bank 1 Bank 1
MR2 REGISTER MR1 REGISTER MR0 REGISTER
1x8 1 x 16 1 x 16

8 bits 16 bits 16 bits


M
U
X

16 bits

8 bits 16 bits 16 bits


R BUS 16 bits

Figure 2-11 : Multiplicateur et accumulateur

2.4.2 Fonctions standards


Les fonctions standards du MAC sont les suivantes (R=MR ou MF) :
R = X*Y : Multiplication simple

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 18

R = MR+X*Y : Multiplication et accumulation additive


R = MR-X*Y : Multiplication et accumulation soustractive
R= 0 : Mise à zéro du résultat (MR)
La famille des ADSP21xx permet deux modes pour le multiplicateur / accumulateur, soit le
mode fractionnaire (1.15) et le mode entier (16.0).
En mode fractionnaire 32 bits le port de sortie P du multiplicateur subit un ajustement de
format par un décalage de 1 bis vers la gauche (LSB mis à « 0 ») afin de supprimer
l’extension inutile du bit de signe avant de passer dans le bloc additionneur / soustracteur.
En mode entier, aucun décalage n’est nécessaire avant de passer dans le bloc additionneur /
soustracteur.
Les modes entier ou fractionnaire sont validés par le bit MSTAT[4] du registre d’état des
modes de fonctionnement (MSTAT).
Signe (Sortie P) Résultat de la multiplication (Sortie P)

31 31 31 31 31 31 31 31 31 30 29 29 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

MR2 MR1 MR0

Figure 2-12 : Résultat en format entier MSTAT[4]=1

Signe (Sortie P) Résultat de la multiplication (Sortie P)

31 31 31 31 31 31 31 31 31 30 29 29 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Bit de signe perdu

7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

MR2 MR1 MR0

Figure 2-13 : Résultat en format fractionnaire MSTAT[4]=0

2.4.3 Format d’entrée des opérandes


Afin de facilité les multiplications multiprécision, l’unité MAC accepte sur ces ports
d’entrées X et Y des nombres entiers ou fractionnaires, signés (complément à deux) ou non-
signés.
La définition des formats d’entrées fait partie intégrante de l’instruction et doit être précisée
pour chaque multiplication.
Le mode SS (signé x signé) est utilisé lors de la multiplication de deux nombres signés en
simple précision (16 bits x 16 bits) ou lors de la multiplication partielle des deux bytes de
poids forts lors d’un calcul en multiprécision.
MR=MR+MX0*MY0 (SS) ;

Le mode US ou SU(non-signé x signé) ou (signé x non-signé) est utilisé lors de la


multiplication de deux nombres en simple précision (16 bits x 16 bits) donc l’un est signé et
l’autre pas ou lors de la multiplication partielle d’un byte de poids forts et d’un byte de poids
faible lors d’un calcul en multiprécision.
MR=MR+MX0*MY0 (US) ou (SU) ;

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 19

Le mode UU (non-signé x non-signé) est utilisé lors de la multiplication de deux nombres


non-signés en simple précision (16 bits x 16 bits) ou lors de la multiplication partielle des
deux bytes de poids faibles lors d’un calcul en multiprécision.
MR=MR+MX0*MY0 (UU) ;

Le mode RND (arrondi) du résultat du MAC


L’accumulateur à la possibilité d’exécuter une fonction d’arrondi sur les 40 bits du résultat à
la frontière entre les bits N°15 et 16. Cette fonction est directement spécifiée dans le code
d’instruction. Les deux opérandes doivent être en mode signé
MR=MR+MX0*MY0 (RND) ;

Lorsque le mode arrondi est sélectionné, le résultat est contenu soit dans le registre MF, soit
dans le registre MR. Dans ce dernier cas, la fonction arrondi modifie autant MR2 que MR1.
Afin d’éviter un décalage lors de l’arrondi, le bit N°16 de MR (LSB de MR1), est forcé à 0
après addition de 0x8000 lorsque MR=0x8000.
− Exemple d’un arrondi au sens mathématique
MR2 MR1 MR0
φφφφφφφφ φφφφφφφφ 00100101 1φφφφφφφ φφφφφφφφ
Bit 15=1 et addition avec retenue⇒ + 10000000 00000000
φφφφφφφφ φφφφφφφφ 00100110 0φφφφφφφ φφφφφφφφ
− Exemple d’un arrondi avec compensation d’offset : 37.5 → 38
MR2 MR1 MR0
φφφφφφφφ φφφφφφφφ 00100101 10000000 00000000
Bit 15=1, Bits (14..0) =0 et addition avec retenue⇒ + 10000000 00000000
φφφφφφφφ φφφφφφφφ 00100110 00000000 00000000
φφφφφφφφ φφφφφφφφ 00100110 0φφφφφφφ φφφφφφφφ
− Exemple d’un arrondi avec compensation d’offset : 36.5 → 36
MR2 MR1 MR0
φφφφφφφφ φφφφφφφφ 00100100 10000000 00000000
Bit 15=1, Bits (14..0) =0 et addition avec retenue⇒ + 10000000 00000000
φφφφφφφφ φφφφφφφφ 00100101 00000000 00000000
φφφφφφφφ φφφφφφφφ 00100100 0φφφφφφφ φφφφφφφφ
On voit ainsi que pour les nombres tronqués impairs, 0.5 est forcé vers 1 alors que pour les
nombres tronqués pairs 0.5 est forcé vers 0. Le décalage d’arrondi est donc éliminé.

2.4.4 Registres d’entrées et de sortie du MAC.


Les registres connectés aux ports du MAC sont les suivants
Source Source Destination
Registres connectés au port X Registres connectés au port Y Registre connectés au port R
MAC MX0 (Bus DMD) MY0 (Bus DMD - PMD) MR0 (Bus DMU) et (Bus R)
MX1 (Bus DMD) MY1 (Bus DMD - PMD) MR1 (Bus DMU) et (Bus R)
MR0 (Bus R) MF (MAC : R1) MR2 (Bus DMU) et (Bus R)
MR1 (Bus R) MF (MAC : R1)
MR2 (Bus R)

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 20

Source Source Destination


Registres connectés au port X Registres connectés au port Y Registre connectés au port R
ALU AR (Bus R)
BR SR0 (Bus R)
SR1 (Bus R)

2.4.5 Opérations sur les registres résultats MR


Comme illustré sur la Figure 2-11, MR est divisé en trois registres : MR0[15…0],
MR1[31…16] et MR2 [39…32]. Chacun de ces registres peut être chargé soit par le port R du
MAC, soit par le bus DMD. Ces registres peuvent être lus par le bus DMD ou par le bus R.
Les 8 bits du registre MR2 sont connectés aux 8 bits de poids faibles de ces bus (DMD et R).
Les 8 bits de poids forts sont mis dans un état correspondant à l’extension du bit de signe.
L’écriture du registre MR1 par le bus DMD intègre également l’extension automatique du
signe dans le registre MR2. Pour charger une valeur différente de l’extension du signe de
MR1 dans MR2, il faut impérativement charger MR2 après MR1. Le chargement de MR0
n’affecte aucun des registres MR1 et MR2 (pas d’extension de signe pour MR0).

2.4.6 Mode saturation ou limitation du MAC


L’additionneur / soustracteur du MAC génère un signal d’état de dépassement de capacité
(MV), lequel est chargé dans le registre d’état arithmétique ASTAT[6] à la fin de chaque
opération exécutée dans le MAC. Le résultat placé dans les registres MR (MR2, MR1, MR0)
est considéré comme un mot signé de 32 bits. Un dépassement de capacité peut donc être
détecté si les 8 bits du registre MR2 ne sont pas tous égaux et identiques au bit de poids fort
(MSB) du registre MR1.

MV MR2 MSB(MR1) Registre AR


0 00000000 0 R (sortie du MAC) Résultat du calcul
0 11111111 1 R (sortie de l’ALU) Résultat du calcul
1 OR{MR2}=1 0 0111111111111111 1111111111111111 Pleine échelle positive
1 AND{MR2}=0 1 1000000000000000 0000000000000000 Pleine échelle négative

2.5 LE DÉCALEUR À BARILLET (BARREL SHIFTER)


Le décaleur à barillet propose un ensemble de fonctions sur des entrées de 16 bits de largeur
et dont le résultat est sur 32 bits. Sont inclus les décalages arithmétiques, logiques et de
normalisation. Il est également possible d’extraire la valeur de l’exposant d’un nombre de
simple ou double précision pour une représentation des nombres ne virgule flottante.

2.5.1 Description générale


La Figure 2-14 illustre le schéma bloc du décaleur à barillet tel qu’il est implanté dans tous
les DSP de la famille ADSP21xx. Cette unité de décalage peut être décomposée en quatre
zones distinctes :
− la zone de décalage (shifter array) ;
− la zone de fonction logique OU / PASSE (OR /PASS) ;
− la zone de détection de l’exposant (exponent detector) ;
− la zone de comparaison logique d’exposant (exponent COMPARE logic).

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 21

16 bits DMD BUS

5 bits 16 bits
LSB Bank 2
Bank 1
SI REGISTER
MUX 1 x 16
8 bits
LSB Bank 2
Bank 1
SB REGISTER 16 bits 16 bits
1x5 MUX

SS X
8 bits
LSB
EXPONENT
COMPARE DETECTOR
I X 16 bits
HI/LO R
8 bits SHIFTER
ARRAY
C
O
MUX MUX
32 bits 32 bits
Bank 2
Bank 1
OR / PASS 16 bits
SE REGISTER
1x5 NEGATE

8 bits
MUX MUX

Bank 2 Bank 2
From INSTRUCTION Bank 1 Bank 1
SR1 REGISTER SR0 REGISTER MUX
1 x 16 1 x 16

16 bits
16 bits

R-BUS 16 bits

Figure 2-14 : Décaleur à barillet

La zone de décalage est constituée d’un décaleur à barillet de 16 → 32 bits. Il permet de


placer un mot de 16 bits dans un champ de 32 bits. Il existe donc 49 possibilités de décalage
dans ce champ de 32 bits si les décalages « hors champ » gauche et droite sont inclus. Les
opérations de décalage se font en un cycle d’horloge. En écrivant à l’entrée du bloc décaleur
I=ABCDEFGHIJKLMNPR ; {grandeur de 16 bits définie par la place de chaque bit}
Référence du décalage Sortie du décaleur : O
HI LO MSB(SR1) LSB(SR1) MSB(SR0) LSB(SR0)
1 +16 à +32 +32 00000000 00000000 00000000 00000000
2 +15 +31 R0000000 00000000 00000000 00000000
3 +14 +30 PR000000 00000000 00000000 00000000
4 +13 +29 NPR00000 00000000 00000000 00000000
5 +12 +28 MNPR0000 00000000 00000000 00000000
6 +11 +27 LMNPR000 00000000 00000000 00000000
7 +10 +26 KLMNPR00 00000000 00000000 00000000
8 +9 +25 JKLMNPR0 00000000 00000000 00000000
9 +8 +24 IJKLMNPR 00000000 00000000 00000000
10 +7 +23 HIJKLMNP R0000000 00000000 00000000
12 +6 +22 GHIJKLMN PR000000 00000000 00000000

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 22

Référence du décalage Sortie du décaleur : O


HI LO MSB(SR1) LSB(SR1) MSB(SR0) LSB(SR0)
13 +5 +21 FGHIJKLM NPR00000 00000000 00000000
14 +4 +20 EFGHIJKL MNPR0000 00000000 00000000
15 +3 +19 DEFGHIJK LMNPR000 00000000 00000000
16 +2 +18 CDEFGHIJ KLMNPR00 00000000 00000000
17 +1 +17 BCDEFGHI JKLMNPR0 00000000 00000000
18 0 +16 ABCDEFGH IJKLMNPR 00000000 00000000
19 -1 +15 XABCDEFG HIJKLMNP R0000000 00000000
20 -2 +14 XXABCDEF GHIJKLMN PR000000 00000000
21 -3 +13 XXXABCDE FGHIJKLM NPR00000 00000000
22 -4 +12 XXXXABCD EFGHIJKL MNPR0000 00000000
23 -5 +11 XXXXXABC DEFGHIJK LMNPR000 00000000
24 -6 +10 XXXXXXAB CDEFGHIJ KLMNPR00 00000000
25 -7 +9 XXXXXXXA BCDEFGHI JKLMNPR0 00000000
26 -8 +8 XXXXXXXX ABCDEFGH IJKLMNPR 00000000
27 -9 +7 XXXXXXXX XABCDEFG HIJKLMNP R0000000
28 -10 +6 XXXXXXXX XXABCDEF GHIJKLMN PR000000
29 -11 +5 XXXXXXXX XXXABCDE FGHIJKLM NPR00000
30 -12 +4 XXXXXXXX XXXXABCD EFGHIJKL MNPR0000
31 -13 +3 XXXXXXXX XXXXXABC DEFGHIJK LMNPR000
32 -14 +2 XXXXXXXX XXXXXXAB CDEFGHIJ KLMNPR00
33 -15 +1 XXXXXXXX XXXXXXXA BCDEFGHI JKLMNPR0
34 -16 0 XXXXXXXX XXXXXXXX ABCDEFGH IJKLMNPR
35 -17 -1 XXXXXXXX XXXXXXXX XABCDEFG HIJKLMNP
36 -18 -2 XXXXXXXX XXXXXXXX XXABCDEF GHIJKLMN
37 -19 -3 XXXXXXXX XXXXXXXX XXXABCDE FGHIJKLM
38 -20 -4 XXXXXXXX XXXXXXXX XXXXABCD EFGHIJKL
39 -21 -5 XXXXXXXX XXXXXXXX XXXXXABC DEFGHIJK
40 -22 -6 XXXXXXXX XXXXXXXX XXXXXXAB CDEFGHIJ
41 -23 -7 XXXXXXXX XXXXXXXX XXXXXXXA BCDEFGHI
42 -24 -8 XXXXXXXX XXXXXXXX XXXXXXXX ABCDEFGH
43 -25 -9 XXXXXXXX XXXXXXXX XXXXXXXX XABCDEFG
44 -26 -10 XXXXXXXX XXXXXXXX XXXXXXXX XXABCDEF
45 -27 -11 XXXXXXXX XXXXXXXX XXXXXXXX XXXABCDE
46 -28 -12 XXXXXXXX XXXXXXXX XXXXXXXX XXXXABCD
47 -29 -13 XXXXXXXX XXXXXXXX XXXXXXXX XXXXXABC
48 -30 -14 XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXAB
49 -31 -15 XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXA
1 -32 -16 à -32 XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX

Tableau 2-1 : Caractéristique du bloc décaleur

X : bit d’extension (soit le signe pour un décalage arithmétique ou 0 pour un décalage logique.

Le placement initial des 16 bits d’entrée est déterminé par un code de contrôle HI / LO.
Les blocs de décalage et la logique associée sont contrôlés par l’ensemble de registres
suivants :
− Le registre SI fournit la grandeur de 16 bits à décaler à l’entrée du bloc de décalage et à
l’entrée du détecteur d’exposent. Ce registre de 16 bits peut être lu et écrit directement
par le bus DMD. Comme le montre la structure générale du décaleur à barillet, les
entrées du bloc décaleur et du détecteur d’exposent peuvent également provenir des
registres connectés au bus de résultat (R-bus), soit MR, AR, SR.
− Le registre SR, connecté à la sortie de bloc de décalage via le bloc logique OR / PASS
est un registre de 32 bits divisé en deux registres de 16 bits SR0 et SR1. Ces deux
registres peuvent être chargés par le bus DMD et lus soit par le même bus ou par le bus
résultat R. Le registre SR peut également être utilisé en « feedback » comme entrée du
bloc logique OR / PASS pour les décalages en double précision.

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 23

− Le registre SE (Shifter exponent) a une largeur de 8 bits et contient l’exposent du


nombre contenu dans SI durant une opération de normalisation / dénormalisation. Le
registre SE peut être lu et écrit par le bus DMD (8 bits LSB). Son contenu est un
nombre binaire en complément à deux de format 8.0 (entier signé). En lecture les bits
de poids forts (8 bits MSB) représentent l’extension du signe de la valeur de SE
− Le registre SB (Shifter block) est important pour les opérations en virgule flottante. Il
contient la valeur de décalage nécessaire à la normalisation du nombre contenu dans SI.
Le registre SB peut être lu et écrit par le bus DMD (5 bits LSB). Son contenu est un
nombre binaire en complément à deux de format 5.0 (entier signé). En lecture les bits
de poids forts (11 bits MSB) représentent l’extension du signe de la valeur de SI
N’importe quel registre associé à l’unité de décalage peut être lu et écrit dans un même cycle
d’horloge. Les registres sont lus au début du cycle et écrits à la fin du même cycle. Dans un
cycle donné, la valeur contenue dans un registre quelconque a été chargée à la fin du cycle
précédent. Par conséquent, une nouvelle valeur écrite dans un registre ne peut pas être lue
avant le début du cycle suivant. Cette caractéristique permet à un registre de fournir un
opérande sur une entrée du décaleur à barillet au début d’un cycle et être rafraîchit par un
nouvel opérande issu de la mémoire à la fin du cycle. Ceci permet aussi de stocker en
mémoire le contenu d’un registre résultat et rafraîchir ce dernier par un nouveau résultat issu
du décaleur à barillet dans le même cycle.
Les registres du décaleur à barillet sont doubles (2 banks). Seul un bank est accessible à la
fois. Le second bank peut être activé, par exemple dans un sous programme ou une routine
d’interruption, ce qui évite le stockage des données contenues dans les registres. La sélection
du bank primaire ou secondaire est commandée par le bit MSTAT[0] (voir §2.6.4.3).
La valeur de décalage de l’entrée est déterminée par un mot de contrôle de code (C) et un bit
de référence HI / LO. Le mot de contrôle est un nombre signé de 8 bits indiquant le sens et le
nombre de décalage à effectuer. Une valeur positive correspond à un décalage vers la gauche,
soit dans le sens croissant (upshift) alors qu’une valeur négative correspond à un décalage
vers la droite, soit dans le sens décroissant (downshift). Ce mot de contrôle peut venir de trois
sources. Le registre SE (Shift Exponent), la valeur négative du registre SE (NEGATE) ou une
valeur immédiate d’instruction.
Le bit HI / LO détermine le point de référence du décalage. Si le bit HI /LO vaut « 1 », les
décalages sont référencés au registre SR1 soit les 16 bits MSB du registre résultat SR. Si par
contre le bit HI /LO vaut « 0 », les décalages sont référencés au registre SR0 soit les 16 bits
LSB du registre résultat SR.
Le bit HI / LO détermine le point de référence du décalage. Si le bit HI /LO vaut « 1 », les
décalages sont référencés au registre SR1 soit les 16 bits MSB du registre résultat SR. Si par
contre le bit HI /LO vaut « 0 », les décalages sont référencés au registre SR0 soit les 16 bits
LSB du registre résultat SR.
Lors d’un décalage vers la gauche, les bits ajoutés à droite sont des « 0 ». Par contre dans un
décalage vers la droite, les bits ajoutés à gauche sont des bits d’extension. La valeur des bits
d’extension peut provenir de trois sources. Le bit de poids forts du registre d’entrée SI (bit de
signe), le bit de retenue (AC) du registre d’état arithmétique ASTAT[3] ou un « 0 ».
Le bloc OR / PASS permet la réalisation d’une combinaison de décalage pour les nombres en
double précision. Plusieurs instructions de décalage [SR OR] sont combinées avec un OU
logique bit à bit avec le contenu courant du registre de résultat SR.

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 24

Mode HI Mode HIX Mode LO


ENTREE (MSB) EXP. AV ENTREE (MSB) EXP. SS ENTREE (LSB) EXP.
1 DDDDDDDD DDDDDDDD +1 S NDDDDDDD DDDDDDDD -15
SNDDDDDD DDDDDDDD 0 0 SNDDDDDD DDDDDDDD 0 S SNDDDDDD DDDDDDDD -16
SSNDDDDD DDDDDDDD -1 0 SSNDDDDD DDDDDDDD -1 S SSNDDDDD DDDDDDDD -17
SSSNDDDD DDDDDDDD -2 0 SSSNDDDD DDDDDDDD -2 S SSSNDDDD DDDDDDDD -18
SSSSNDDD DDDDDDDD -3 0 SSSSNDDD DDDDDDDD -3 S SSSSNDDD DDDDDDDD -19
SSSSSNDD DDDDDDDD -4 0 SSSSSNDD DDDDDDDD -4 S SSSSSNDD DDDDDDDD -20
SSSSSSND DDDDDDDD -5 0 SSSSSSND DDDDDDDD -5 S SSSSSSND DDDDDDDD -21
SSSSSSSN DDDDDDDD -6 0 SSSSSSSN DDDDDDDD -6 S SSSSSSSN DDDDDDDD -22
SSSSSSSS NDDDDDDD -7 0 SSSSSSSS NDDDDDDD -7 S SSSSSSSS NDDDDDDD -23
SSSSSSSS SNDDDDDD -8 0 SSSSSSSS SNDDDDDD -8 S SSSSSSSS SNDDDDDD -24
SSSSSSSS SSNDDDDD -9 0 SSSSSSSS SSNDDDDD -9 S SSSSSSSS SSNDDDDD -25
SSSSSSSS SSSNDDDD -10 0 SSSSSSSS SSSNDDDD -10 S SSSSSSSS SSSNDDDD -26
SSSSSSSS SSSSNDDD -11 0 SSSSSSSS SSSSNDDD -11 S SSSSSSSS SSSSNDDD -27
SSSSSSSS SSSSSNDD -12 0 SSSSSSSS SSSSSNDD -12 S SSSSSSSS SSSSSNDD -28
SSSSSSSS SSSSSSND -13 0 SSSSSSSS SSSSSSND -13 S SSSSSSSS SSSSSSND -29
SSSSSSSS SSSSSSSN -14 0 SSSSSSSS SSSSSSSN -14 S SSSSSSSS SSSSSSSN -30
SSSSSSSS SSSSSSSS -15 0 SSSSSSSS SSSSSSSS -15 S SSSSSSSS SSSSSSSS -31

Tableau 2-2 : Caractéristique du détecteur d’exposant


S : bit de signe
N : premier bit de donnée avant l’extension du signe
D : bit de donnée

Le détecteur d’exposant (exponent detector) permet la construction de l’exposant équivalent


à un décalage. Il existe trois manières de réaliser l’interprétation de l’exposant :
− Dans le mode HI, l’opérande d’entrée est soit en simple précision, ou alors il s’agit de
la partie haute d’une entrée en double précision. Dans ce cas le détecteur d’exposant
détermine le nombre de décalages vers la gauche (upshift) à effectuer pour que les bits
d’extension de signe disparaissent. La valeur de l’exposant est dans ce cas négative. On
a donc une expression en virgule flottante avec la mantisse dans le registre SR et
l’exposant dans le détecteur d’exposant. Le bit de signe, MSB du résultat (registre SR),
est également chargé dans le registre d’état ASTAT (SS : shifter Input Sign voir
§2.6.4.2)
− Dans le mode HI étendu (HIX) l’entrée est interprétée comme le résultat d’une
addition ou soustraction exécutée par l’ALU, résultat qui peut être entaché d’un
dépassement de capacité (AV = « 1 » : overflow dans le registre d’état arithmétique).
Dans ce cas le détecteur d’exposant prend en compte le contenu de AV en
considération. Si le contenu de détecteur d’exposant est +1, le bit supplémentaire pour
la normalisation de la mantisse vaut ASTATAC[3] (AC) du registre d’état arithmétique
ASTAT. Si ASTAT[2] (AV) vaut « 0 », le décalage est identique à celui du mode HI.
Dans le mode HIX, le bit de signe, MSB du résultat (registre SR), est également chargé
dans le registre d’état arithmétique, bit ASTAT[7] (SS). Lorsqu’il y a dépassement
(AV= « 1 ») SS est chargé avec le MSB inversé du registre de résultat SR.
− Dans le mode LO, l’entrée est interprétée comme la partie poids faible (LSB) d’un
nombre en double précision. Dans le mode LO, le détecteur d’exposant prend le bit
ASTAT[7] (SS) du registre d’état arithmétique comme le bit de signe du nombre. Le
registre SE est chargé par le détecteur d’exposant seulement si ce dernier contient –15.
Ceci se produit que si la partie poids fort (MSB) du nombre en double précision ne
contient que des bits d’extension de signe.
Le comparateur d’exposant est utilisé pour comparer la valeur fournie par le détecteur
d’exposant avec une valeur contenue dans le registre SB (shifter block). La valeur dudit

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 25

registre est modifiée que si la valeur de l’exposant contenu dans le détecteur d’exposant est
supérieure à la valeur contenue dans SB.

2.5.2 Registres d’entrées et de sortie du décaleur à barillet.


Les registres connectés aux ports du décaleur à barillet sont les suivants
Source Destination
Registres connectés au port I Registre connectés au port O
BR SI (Bus DMD) SR0 (Bus R)
SR0 (Bus R) SR1 (Bus R)
SR1 (Bus R)
ALU AR (Bus R)
MAC MR0 (Bus R)
MR1 (Bus R)
MR2 (Bus R)

2.5.3 Opération de décalage.


Le décaleur à barillet exécute les fonctions suivantes :
− décalage arithmétique (Arithmetic Shift : ASHIFT ;
− décalage logique (Logical Shift : LSHIFT) ;
− normalisation (Normalize : NORM) ;
− définition de l’exposant (Derive Exponent : EXP) ;
− ajustement de l’exposant (Block Exponent Adjust : EXPADJ).

2.5.4 Ajustement de l’exposant EXPADJ


Cette fonction détecte le plus grand exposant entre un ensemble de nombres.
a) Initialisation : charger le registre SB avec –16
Le registre SB (5 bits) est initialisé avec une valeur correspondant à la plus petite
valeur possible d’exposant sur un nombre de 16 bits.
b) Normalisation du premier nombre : charger SI avec 11110101 10110001
Le détecteur d’exposant donne –3
-3 > SB=-16 ⇒ SB=-3
c) Normalisation du deuxième nombre : charger SI avec 00000001 01110110
Le détecteur d’exposant donne –6
-6 < SB=-3 ⇒ SB=-3
d) Normalisation du nombre suivant : charger SI avec …..
A la fin de ces opérations, SB contient l’exposant correspondant au nombre le plus grand.
Grâce à cette opération, il est possible de réaliser une opération de dénormalisation pour un
calcul ultérieur (par exemple une addition).

2.5.5 Décalage immédiat


Un décalage immédiat permet simplement de décaler un mot de 16 bits soit vers la gauche
(left : upshift) soit vers la droite (right : downshift) d’un nombre entier de bits. Le nombre
contrôlant le décalage est un nombre signé de 8 bits. Le registre SE n’est ni utilisé ni modifié
par une opération de décalage immédiat. Quelques exemples :

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 26

Décalage logique de 5 bits vers la gauche référencé au poids forts de SR (SR1)


SI=0xB6A3 SI = 10110110 10100011
SR=LSHIFT SI BY –5 (HI)
Résultat : SR1 = 00000101 10110101 SR0 = 00011000 00000000
Décalage logique de 5 bits vers la droite référencé au poids faible de SR (SR0)
SI=0xB6A3 SI = 10110110 10100011
SR=LSHIFT SI BY 5 (LO)
Résultat : SR1 = 00000000 00010110 SR0 = 11010100 01100000
Décalage arithmétique de 5 bits vers la gauche référencé au poids forts de SR (SR1)
SI=0xB6A3 SI = 10110110 10100011
SR=ASHIFT SI BY –5 (HI)
Résultat : SR1 = 11111101 10110101 SR0 = 00011000 00000000

2.5.6 Dénormalisation
L’opération de dénormalisation effectue le décalage d’une mantisse en fonction de son
exposant, ce dernier se trouvant dans le registre SE. Il s’agit donc d’une opération permettant
de passer un nombre en virgule flottante en virgule fixe. La valeur du décalage doit être
explicitement chargée ou être le résultat d’une ou de plusieurs opérations précédentes.
Les deux exemples qui suivent correspondent à une dénormalisation d’un nombre en double
précision, seul l’ordre de conversion change.

2.5.6.1 Premier possibilité


Décalage arithmétique de SE = -3 référencé aux poids forts de SR (SR1)
SE = -3
SI = 10110110 10100011
SR=ASHIFT SI (HI)
Résultat : SR1 = 11110110 11010100 SR0 = 01100000 00000000
Décalage arithmétique de SE = -3 référencé aux poids faibles de SR (SR0) avec fonction
logique OU afin d’éviter une « surécriture » de SR1 et SR0
SE = -3
SI = 01110110 01011101
SR=SR OR LSHIFT SI (LO)
Résultat : SR1 = 11110110 11010100 SR0 = 01101110 11001011

2.5.6.2 Deuxième possibilité


Décalage logique de SE = -3 référencé aux poids faibles de SR (SR0)
SE = -3
SI = 01110110 01011101
SR= ASHIFT SI (LO)
Résultat : SR1 = 00000000.00000000 SR0 = 00001110 11001011

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 27

Décalage arithmétique de SE = -3 référencé aux poids forts de SR (SR1) avec fonction


logique OU afin d’éviter une « surécriture » de SR1 et SR0
SE = -3
SI = 10110110 10100011
SR=SR OR ASHIFT SI (HI)
Résultat : SR1 = 11110110 11010100 SR0 = 01101110 11001011

2.5.7 Normalisation
Les nombres avec un nombre de bits de signe redondant peuvent être normalisés. Il s’agit ni
plus ni moins que d’une conversion entre les représentations en virgule fixe et virgule
flottante. L’opération de normalisation se déroule en deux étapes. La première permet de
connaître la valeur de l’exposant en observant les nombres de bits d’extension de signe et la
deuxième permet grâce à des décalages de normaliser la mantisse du même nombre. Pour la
seconde partie de l’opération, le nombre issu de la détection de l’exposant est chargé dans le
registre SE, puis grâce à l’instruction NORM, permet le contrôle du décalage de la mantisse
en utilisant la valeur contenue dans SE mais changée de signe (bloc NEGATE).

2.5.7.1 Normalisation d’un nombre en simple précision


Normalisation d’un nombre en simple précision (16 bits) contenu dans le registre AR.
Première étape, détection de l’exposant.
SE = EXP AR (HI)
AR = 11110110 11010100
Résultat : SE=-3
Dans cette première étape, il faut utiliser la référence HI pour préciser que le MSB de AR
doit être considéré comme un bit de signe.
Deuxième étape, normalisation de la mantisse.
SE = -3
AR = 11110110 11010100
SR=NORM AR (HI)
Résultat : SR1 = 10110110 10100000 SR0 = 00000000 00000000
Dans cette deuxième étape on aurait pu se référencé aux poids faible de SR (SR0) en utilisant
l’instruction SR=NORM AR (LO).

2.5.7.2 Normalisation d’un nombre en double précision


Pour un nombre en double précision, la normalisation se déroule selon un schéma identique à
celui utilisé pour la simple précision.
Normalisation d’un nombre en double précision (16 bits) contenu dans le registre AR.
Première étape, détection de l’exposant
− Détection de l’exposant (MSB)
SE = EXP SI (HI)
SI = 11110110 11010100
Résultat : SE=-3

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 28

− Détection de l’exposant (LSB).


Dans ce cas SE est modifié que s’il vaut –15 avant l’exécution de l’instruction
SE = EXP SI (LO)
SI = 01101110 11001011
Résultat : SE=-3 (pas de chargement)
Deuxième étape, normalisation de la mantisse.
− Normalisation des MSB
SE = -3
SI = 11110110 11010100
SR=NORM SI (HI)
Résultat : SR1 = 10110110.10100000 SR0 = 00000000 00000000
− Normalisation des LSB
SE = -3
SI = 01101110 11001011
SR=SR OR NORM SI (LO)
Résultat : SR1 = 10110110.10100011 SR0 = 01110110 01011000

2.6 CONTRÔLE DE PROGRAMME DE LA FAMILLE ADSP2100

2.6.1 Le séquenceur de programme

2.6.1.1 Caractéristiques du séquenceur


Le séquenceur de programme de l'ADSP2171 crée les adresses des instructions à exécuter et
gère les divers contrôles de fonctionnement du programme. Le diagramme par schéma blocs
du séquenceur est présenté à la Figure 2-15.
Les instructions sont adressées grâce au bus PMA et les données programme correspondant à
ces adresses sont envoyées vers le registre des instructions.
Le compteur de programme (Program Counter incrémenter ou PC incrémenter) permet
l'adressage de manière progressive et ordonnée des instructions du programme principal. Le
rôle du séquenceur intervient surtout pour des programmes secondaires, durant le
fonctionnement des sous-programmes, des boucles ou des interruptions.
− Une boucle « démarre » après chaque instruction DO UNTIL.
− Une instruction de branchement est introduite après chaque instruction JUMP
− Un sous programme est « appelé » par l'instruction CALL.
− Le retour du sous-programme impose l'instruction RTS (ReTurn from a Subroutine).
− Le retour d'une interruption impose l'instruction RTI (ReTurn from an Interrupt).
Toutes ces instructions font fonctionner le processeur en programme secondaire. Pour
sauvegarder la future instruction du programme principal, le processeur utilise des piles
(stack) comme on peut le voir sur la Figure 2-15.
Pour chaque nouvelle instruction située dans la mémoire de programme, le multiplexeur
« adresse suivante » envoie l'adresse nécessaire par l'intermédiaire du bus PMA. Il
sélectionne la source d'adresse à utiliser, selon la commande venant du registre d'instruction

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 29

(JUMP / CALL), du comparateur de boucle, du système de logique de décision


conditionnelle ou du registre de contrôle d'interruption.
24 bits PMD BUS

DMD BUS 16 bits


From instruction register
14 bits 8 bits
COUNT LSB LSB ADDRESS : JUMP / CALL
STACK
14 bits 4 x 14 CONDITION CODE
LSB
FUNCTION FIELD

MUX ADDRESS OF LAST


14 bits INSTRUCTION
14 bits &
14 bits 8 bits TERMINATION
CONDITION
CNTR
(Counter)

8 bits
LOOP
LSB LOGIC STACK
STATUS CONDITION 4 x 18
STACK
14 bits

MUX LOOP
COMPARATOR
8 bits 8 bits

Arithmetic
Status STATUS
REGISTER 14 bits

14 bits

Interrupt PC PROGRAM
INTERRUPT STACK COUNTER
CONTROLLER 16 x 14

MUX

INCREMENT
From
14 bits FI Pin

14 bits 14 bits

NEXT
ADDRESS
NEXT ADDRESS MUX SOURCE
SELECTION 14 bits
14 bits

14 bits 14 bits
PMA BUS

Figure 2-15 : Séquenceur de programme

La source d'adresses principale est le compteur de programme et d'incrémentation (PC


d'incrémentation) qui fournit l'adresse de l'instruction suivante, lorsque le processeur
fonctionne en programme principal. Quand l'adresse est envoyée sur le bus PMA,elle est
aussi rechargée dans le compteur pour commencer un nouveau cycle.

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 30

Une autre source d'adresses est la pile du compteur (PC Stack), qui fournit l'adresse de
l'instruction suivante, lorsque le processeur fonctionne à la fin d'un programme secondaire:
retour de sous-programme (RTS) ou d'interruption (RTI). Le haut de la pile est aussi utilisé en
source d'adresses en fin de boucle (DO UNTIL).
Le contrôleur d'interruption fournit l'adresse suivante du programme quand une interruption
est en fonctionnement. L’étude plus complète des interruptions est développée au § 2.9.2.
Une dernière source d'adresses possible est le générateur d'adresses DAG2, qui peut pointer
vers la mémoire programme (registres d'index pointeurs I4 à I7).

2.6.1.2 Compteur de programme et pile de sauvegarde


Le compteur de programme (PC) est un registre de 14 bits qui contient l'adresse de
l'instruction à exécuter. La sortie de ce registre est reliée à un « système d'incrémentation »
qui ajoute « 1 » à la valeur courante. La sortie du système va vers le multiplexeur de sélection
des sources d'adresses.
À ce compteur est associée une pile de 16 mots (PC Stack), dans laquelle est chargée la sortie
du système d'incrémentation (adresse PC + 1) lorsque l’instruction CALL est exécutée. La
pile du compteur de programme est également utilisée lorsqu’une boucle DO UNTIL est
exécutée ainsi que lors du traitement d’une interruption. Dans le cas d'une interruption, le
système d'incrémentation est désactivé, si bien que c'est l'adresse (PC) qui est chargée dans la
pile.
La sauvegarde et la récupération de l'adresse PC ou PC + 1 est effectuée automatiquement
par le processeur, grâce aux instructions RTS ou RTI.
Dans le cas d’un saut indirect, l’unité DAG2 fournit l’adresse de la prochaine instruction sur
le bus PMA et le compteur de programme PC est directement chargé depuis ce même bus.
Il est possible de lire ou écrire dans la pile du compteur de programme en utilisant un pseudo
registre TOPPCSTACK.

2.6.1.3 Compteurs, pile de compteur et comparateur de boucle


La boucle (DO UNTIL) est pratiquement toujours utilisée dans les programmes de DSP, pour
mettre en place un filtre numérique, une transformée de Fourier ou une corrélation sur des
signaux.
Le compteur de boucle et la pile de compteur de boucle fonctionnent avec des valeurs
« entières » de 14 bits (sans signe). Le compteur (registre CNTR) est chargé, avant le
démarrage de la boucle, d'une valeur venant des 14 bits de faibles poids du bus DMD (les
deux bits de poids forts sont mis à 0). À chaque exécution d'une boucle de programme, il est
automatiquement décrémenté de « 1 ». Le signal logique de statut CE (Counter Expired)
indique la fin de la boucle, en agissant sur le système de décision logique conditionnelle. Le
compteur peut aussi être testé et automatiquement décrémenté par une instruction de saut
conditionnel (IF…JUMP) qui utilise le signal CE. Citons par exemple:
IF NOT CE JUMP (nom de la boucle) ;
Dans ce cas, le registre CNTR est décrémenté, sauf s'il est en fin de boucle.
La pile de compteur de boucle intervient lorsqu'on programme plusieurs boucles emboîtées
les unes dans les autres (jusqu'à quatre boucles). Elle permet de conserver les valeurs de
CNTR des boucles en attente, alors que l'une d'entre elles est en exécution. En effet, quand
une nouvelle valeur est chargée dans le compteur CNTR, la valeur qui y est présente est

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 31

sauvegardée dans cette pile. Elle est récupérée, lorsque la variable CE indique la fin de la
dernière boucle en service, pour exécuter les instructions de la boucle précédente.
La sauvegarde de la valeur dans CNTR n'a pas lieu dans deux cas :
− après un Reset ;
− si la pile est pleine : mise à 1 du bit SSTAT[3].
REMARQUE
− Dans ce dernier cas, il est possible de « forcer » une valeur dans CNTR sans
sauvegarde éventuelle dans la pile du compteur, en utilisant l'instruction OWRCNTR
(OverWRite CouNTeR).
− Cette instruction peut être utilisée pour la boucle la plus « intérieure ».
Il faut remarquer que la condition de fin de boucle n'est pas uniquement obtenue par le signal
CE ; il est possible d'utiliser d'autres conditions, à partir des bits d'état de l'ALU ou du MAC,
ou même de faire effectuer au processeur une boucle infinie, qui ne s'arrête qu'avec le Reset.
Syntaxe Condition Si vraie
EQ Egale zéro AZ=1
NE Différent de zéro AZ=0
LT Plus petit que zéro AN .XOR. AV=1
GE Plus grand ou égal à zéro AN .XOR. AV=0
LE Plus petit ou égal à zéro (AN .XOR. AV) .OR. AZ=1
GT Plus grand que zéro (AN .XOR. AV) .OR. AZ=0
AC Report (ALU carry) AC=1
NOT AC Pas de report (not ALU carry) AC=0
AV Dépassement (ALU overflow) AV=1
NOT AV Pas de dépassement (not ALU overflow) AV=0
MV Dépassement (MAC overflow) MV=1
NOT MV Pas de dépassement (not MAC overflow) MV=0
NEG Signe négatif sur entrée x (ALU) AS=1
POS Signe positif sur entrée x (ALU) AS=0
CE Compteur à zéro (counter expired) CE=0
FOREVER Toujours
L’ensemble de toutes les conditions possibles de fin de boucle s'exprime sur 4 bits.
Le but du comparateur de boucle est d'intervenir quand la dernière instruction de la boucle est
exécutée. Quand une boucle est introduite par l'instruction DO UNTIL, les 14 bits d'adresse
de la dernière instruction en cours dans la boucle et les 4 bits représentant la condition de fin
de boucle (indiquée dans l'instruction associée à DO UNTIL) forment un mot de 18 bits qui
est envoyé dans la pile de boucle (loop stack). En même temps, la sortie de l'incrémentation
du PC est chargée dans la pile du compteur PC. Comme l'instruction DO UNTIL est placée
juste avant la première adresse de l'instruction de la boucle, c'est cette adresse qui est chargée
dans la pile du PC. Le comparateur de boucle est activé, dès que la pile de boucle est chargée.
Il constate la fin de boucle lorsque les deux adresses, celle de la pile du PC et celle de la pile
de boucle sont égales. Il envoie au sélecteur de la source d'adresses, un signal de commande
qui dépend du type d'instruction de fin de boucle. Plusieurs cas sont possibles :
− Cas 1
Si cette dernière instruction n'est ni un saut (JUMP), ni un appel à un sous-programme
(CALL), ni un retour (RTS ou RTI), ni une attente d'interruption (IDLE), le circuit

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 32

fournissant l'adresse suivante sera déterminé par rapport à la condition enregistrée en


haut de la pile de boucle. Si cette condition terminale est fausse ou non vérifiée,
l'adresse de l'instruction suivante est celle qui a été sauvegardée dans le haut de la pile
du compteur PC. Si cette condition est vérifiée, le système d'incrémentation du
compteur PC devient la source d'adresses, la boucle est terminée et toutes les données
anciennes dans les piles (pile du PC, pile du compteur de boucle, pile de boucle) sont
automatiquement « restaurées » (popped) comme si la boucle n'avait jamais fonctionné
(le processeur revient à l'état initial).
− Cas 2
Si la dernière instruction est un saut (JUMP), un appel à un sous-programme (CALL),
ou un retour (RTS ou RTI), cette instruction devient prioritaire sur la procédure de fin
de boucle. Dans ce cas, les données anciennes dans les piles ne sont pas « restaurées »
et le programmeur devra éventuellement en tenir compte, ou même prévoir dans le
programme les instructions pour restaurer l'état initial correct du processeur (POP
CNTR, POP PC, POP LOOP).
Si la condition validant cette instruction n'est pas vérifiée, la procédure de fin de boucle
est alors appliquée, comme pour le cas 1 précédant.
− Cas 3
Si la dernière instruction de la boucle est IDLE, le déroulement du programme est alors
contrôlé par cette instruction, qui correspond à un état d'attente d'interruption à faible
consommation. Dès qu'une interruption se produit, le processeur est activé, la boucle
est exécutée jusqu'à la fin et le programme se poursuit avec la première instruction qui
suit la boucle.
On a vu que les instructions de contrôle de programme suivantes: JUMP, CALL,
DO UNTIL et IDLE nécessitent l'utilisation des piles pour les compteurs du séquenceur.
Chacune de ces instructions intervient différemment dans le processus d'utilisation du
séquenceur, ce qui donne les instructions décrites dans le paragraphe suivant.

2.6.2 Instruction de contrôle de séquence de programme

2.6.2.1 Instruction de saut direct JUMP


L’adresse de saut (14 bits) est intégrée dans l’instruction JUMP. Lorsque cette instruction est
décodée, l’adresse de saut représentant l’adresse de la prochaine instruction est fournie par la
sortie du séquenceur de programme (multiplexeur). L’adresse est aiguillée puis chargée dans
le compteur de programme, via le bus PMA, pour le cycle suivant.
− Instruction de saut (JUMP) direct :
JUMP fir_start ;
« fir » est l'étiquette d'une partie de programme permettant au programmeur de préciser
la réalisation effectuée par le processeur.
− Instruction de saut conditionnel :
IF(condition) JUMP fir_start

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 33

2.6.2.2 Instruction de saut indirect JUMP()


Le saut peut également être indirect. L’adresse est alors contenue dans un des registres
pointeurs Ix de l’unité DAG2 (I4 à I7). L’adresse est transmise via le bus PMA (adresse de la
mémoire de programme). C'est pour cela qu’il est nécessaire d'utiliser le générateur
d'adresses DAG2, en association avec le séquenceur.
JUMP (I4) ;

2.6.2.3 Instruction d'appel de sous-programme CALL


L’adresse du sous-programme (subroutine) est associée avec l'instruction CALL, et une fois
extraite du registre d'instruction, cette adresse est chargée dans le compteur de programme
(PC) au cycle suivant, en passant par le multiplexeur de sortie. Par ailleurs, le compteur de
programme est incrémenté et sauvegardé dans la pile du compteur. Au retour du sous-
programme, on extrait l'adresse sauvegardée dans la pile du compteur ce qui permet de
continuer ainsi le programme.
CALL fir ;

2.6.2.4 Instruction de boucle DO UNTIL


La forme la plus utilisée de la création de boucle DO UNTIL utilise le registre de contrôle
(CNTR) comme compteur d’itération. Lorsque le registre CNTR est utilisé pour le contrôle
d’itération de boucle, la condition de fin de boucle CE (counter expired) doit être utilisée.
L0=10 ; {définition de longueur d’un buffer}
I0=^data-buffer ; {I0 = adresse de début du buffer}
M0=1 ; {défini l’incrément du pointeur I0}
CNTR = 10 ; {CNTR = longueur du buffer}

DO end_of_loop UNTIL CE ; {répète la boucle jusqu’à CNTR=0}


DM(I0,M0)=0 ; {exécute une instruction}
…………… ;
end_of_loop : MR =............... ;
Cette instruction utilise le registre compteur CNTR pour fixer le nombre de boucles à
effectuer. Ici l'étiquette « end_of_loop » indique que toutes les instructions écrites entre DO...
UNTIL et « end_of_loop » sont exécutées dans la boucle.
Lorsque l’instruction CNTR=10 ; est exécutée, le compteur est chargé via le bus DMD. Si la
boucle est imbriquée dans une autre ( CNTR≠0 ), la valeur présente de CNTR est sauvée dans
la pile du compteur de boucle (count stack).
L’instruction DO end_of_loop UNTIL CE ; fixe les conditions de boucle.
L’exécution d’une boucle DO UNTIL sauve l’adresse de l’instruction suivante (PC+1)
immédiatement DO UNTIL dans la pile du compteur de programme (PC stack). Dans le
même cycle, l’adresse de fin de boucle (end_of_loop) et la condition de terminaison sont
sauvées dans la pile du compteur de boucle (loop stack).
A chaque exécution d’une instruction à l’intérieur de la boucle, le comparateur de boucle
vérifie l’adresse de l’instruction en cours avec l’adresse de fin de boucle (end_of_loop).
Chaque fois que la fin d’une boucle est atteinte, le comparateur de boucle, démarre une
évaluation de la condition de terminaison de boucle.
− Si la condition de terminaison est fausse, l’adresse de l’instruction suivante n’est pas
une incrémentation du compteur de programme, mais l’adresse suivant l’instruction DO
UNTIL. Cette adresse se trouve dans la pile du compteur de programme (PC stack).

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 34

− Si la condition de terminaison est vraie, les piles du compteur de programme et de


boucle restituent la valeur supérieure de la pile (mise à jour). Le compteur de
programme prend l’adresse de l’instruction suivante par une simple incrémentation.

2.6.2.5 Instruction d'attente d'interruption (IDLE)


Elle permet de réduire la consommation du processeur pendant l'attente d'une interruption. Il
est possible, selon l'instruction, de diviser la fréquence de l'horloge interne, selon un rapport n
parmi n = 16, 32, 64 ou 128.
IDLE(n) ;
Par défaut on écrit IDLE sans préciser n. Dans ce cas le DSP se met en mode de veille et
attend une interruption pour continuer. La fréquence d’horloge interne ne change pas. Le
délai avant le traitement de l’interruption est d’un cycle d’horloge. IDLE(n) augmente de
délai de réponse d’un facteur n.

2.6.3 Les interruptions


Les interruptions permettent de stopper une tâche en cours pour exécuter une tâche qui, en
général, répond à des contraintes de temps réel. Les interruptions propres à un processus ne
répondent pas toutes aux mêmes critères d’urgence. Il faut donc instaurer un régime de
priorité afin de les traiter par ordre d’importance.

2.6.3.1 Séquence des opérations lors d’une interruption


Le contrôleur d’interruptions du séquenceur de programme répond à une interruption en
sauvant le contenu du compteur de programme dans une pile (PC stack) et en chargeant le
compteur de programme avec l’adresse de la première instruction de la routine à exécuter.
Les interruptions activent un vecteur d’interruption associé à l’interruption à exécuter. Les
emplacements pointés par le vecteur d’interruption sont espacés de quatre positions mémoire,
autorisant l’intégration d’une routine d’interruption très courte. Pour des routines
d’interruption de plus de quatre instructions, le contrôle de la routine d’interruption peut être
transféré à un autre endroit de la mémoire à l’aide d’une instruction de saut direct (JUMP).
Sources d’interruptions Adresses du vecteur d’interruption associé
RESET (non masquable) 0x0000 priorité la plus élevée
PWD (non masquable) 0x002C
IRQ2 (périphériques) 0x0004
SPORT0 Transmission 0x0010
SPORT0 Réception 0x0014
Software 0 0x0018
Software 1 0x001C
SPORT1 Transmission ou IRQ1 0x0020
SPORT1 Réception IRQ0 0x0024
Timer 0x0028
Tableau 2-3 : Interruptions et vecteurs associés

Après qu’une interruption eut été exécutée, une instruction de retour d’interruption (RTI)
permet le retour au programme précédemment interrompu en effectuant la mise à jour du
compteur de programme à l’aide de la dernière valeur introduite dans la pile (PC Stack).

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 35

Lors du traitement d’une interruption, les registres d’état ASTAT, MSTAT et SSTAT sont
également sauvés dans une pile qui leur est propre (Status stack).
Toutes les lignes d’interruptions peuvent également être activées /désactivées de manière
software.
MAIN PROGRAM

TIMER INTERRUPT SERVICE ROUTINE


AX0=DM(I4,M3);
....
.... TIMER_ISR : ENA SEC_REG ;
MR=MR+MX0*MY0 (SS); I5=^TABLE ;
DM(MULT)=MR1; ... ;
INTERRUPT CONTROLLER ... ;
RTI ;

PC PC Stack

Interrupt vector dedicated to Timer


0X0028 : JUMP TIMER_ISR ;
0x0028 PC NOP ;
NOP ;
NOP ;

MAIN PROGRAM

MR=MR+MX0*MY0 (SS);
DM(MULT)=MR1;
... ;
... ;
... ;

Figure 2-16 : Déroulement d’une interruption

2.6.3.2 Configuration des interruptions


Les registres suivants sont utilisés pour la configuration des interruptions :
− ICNL : Interrupt CoNtroL register
Détermine si les interruptions peuvent être imbriquées ou non.
Définit la sensibilité des signaux (état ou transition) externes
d’interruptions IRQ0 , IRQ1 , IRQ2 .
− IMASK : Interupt MASK register
Permet de masquer ou non les interruptions de manière individuelle.
− IFC : Interrupt Force / Clear register
Force une interruption ou annule une interruption en attente

Les interruptions externes IRQ0 , IRQ1 , IRQ2 peuvent être sensibles aux transitions (flanc
descendant) ou aux niveaux. Les interruptions internes doivent être comparées aux
interruptions sensibles aux transitions.
Pour les interruptions IRQx sensibles aux transitions, la demande d’interruption est
mémorisée jusqu’à ce cette dernière soit traitée, ensuite elle est automatiquement supprimée.
Une interruption en attente peut être supprimée par software en écrivant un « 0 » dans le bit
correspondant du registre IFC.
Les interruptions sensibles aux transitions demandent en général moins de hardware que
celles qui sont sensibles à un niveau. En effet ces dernières doivent être maintenues jusqu’à

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 36

ce que l’interruption soit traitée mais supprimée avant l’instruction de retour (RTI), ceci pour
éviter un second traitement de l’interruption.
Il est également possible de déterminer si les interruptions peuvent être imbriquées en
fonction de leur niveau de priorité. Dans le cas d’une imbrication, une interruption peut être
stoppée afin de traiter une interruption plus prioritaire.

2.6.3.3 Délai d’activation des interruptions


Pour les sources d’interruptions IRQx , SPORTx et Timer, le délai entre l’apparition d’une
interruption et l’exécution de la première instruction de la routine d’interruption est de 3
cycles d’horloge. Les 2 premiers cycles servent à la synchronisation interne. Le troisième
cycle est nécessaire pour aller chercher la première instruction de la routine d’interruption à
traiter (fetch). Durant ce cycle le DSP exécute une instruction NOP. Au cycle suivant la
première instruction de la routine d’interruption est exécutée. Dans le même cycle l’adresse
de l’instruction non exécutée de la routine interrompue est sauvée dans la pile de programme,
les registres d’état étant mémorisés dans la pile des registres d’état.
CLKOUT

t
INTERRUPTION

t
INSTRUCTION

n-2 n-1 n NOP 1ère instruct. ...


routine d'int.
t
"FETCH"

n-1 n n+1 Vecteur


d'interruption I+1
t

Figure 2-17 : Délai de reconnaissance d’une interruption

2.6.3.4 Gestion des piles STATUS, COUNT, LOOP et PC

2.6.3.4.1 Gestion des piles à l’aide des instructions PUSH et POP


Les pointeurs des piles de programme (PC stack), d’état (Status stack) et de boucle (Loop
Stack) peuvent être modifiés par les instructions suivantes :
PUSH
STS POP CNTR POP PC POP LOOP
POP

PUSH STS incrémente le pointeur de pile d’état (Status Stack) de manière à pointer le
prochain emplacement disponible. Les registres d’état arithmétique (ASTAT), de mode de
fonctionnement (MSTAT) et de masquage des interruptions (IMASK) sont sauvés dans la
pile d’état. PUSH STS est exécutée automatiquement lorsqu’une interruption est activée.
POP STS décrémente le pointeur de pile d’état (Status Stack) de manière à pointer le
prochain emplacement disponible. Les registres d’état arithmétique (ASTAT), de mode de

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 37

fonctionnement (MSTAT) et de masquage des interruptions (IMASK) sont mis a jour avec le
contenu des emplacements respectifs de la pile d’état. PUSH STS est exécutée
automatiquement lors d’un retour d’interruption (RTI).
POP CNTR décrémente le pointeur de pile du décompteur (Count Stack) de manière à
pointer le prochain emplacement disponible. Le décompteur de boucle CNTR est mis à jour
avec le contenu de la pile.
POP PC et POP LOOP décrémente le pointeur de pile de programme (PC Stack) mais dans
ce cas l’information contenue dans la pile est perdue.

2.6.3.4.2 Gestion de la pile de programme TOPPCSTACK


Pour certaines applications, il est intéressant d'utiliser le contenu du haut de la pile. Si par
exemple on utilise l'instruction POP PC, le contenu du haut de la pile du PC (PC stack) est
perdu (il en est d'ailleurs de même avec l'instruction POP LOOP c'est le contenu du haut de la
pile de boucle qui est perdu). Pour récupérer le contenu du haut de la pile du PC, on utilise
l'instruction TOPPCSTACK, qui est chargée dans un registre de 16 bits. Pour que l'opération
s'effectue correctement, on prévoit une non-opération supplémentaire, ce qui donne
reg = TOPPCSTACK ; {reg signifie registre}
NOP ;

A cette fin, il est possible d'utiliser tous les registres des unités de calcul du DSP AX0, AX1,
AY0, AY1, MX0, MX1, MY0, MY1, SI, SE, SR0 et SR1, ainsi que tous les registres des
deux générateurs d'adresses : I0 à I7, M0 à M7 et L0 à L7.
Il est également possible de charger une valeur dans le haut de la pile du PC en écrivant
l'instruction suivante :
TOPPCSTACK = reg ;

Certaines restrictions d’utilisations de cette instruction doivent être prises en compte car
sinon, on risque de perturber le fonctionnement de la boucle dans les cas suivants :
− juste avant une instruction de retour (RTI)
− à l’intérieur d’une boucle.

2.6.4 Les registres d’état et de contrôle


Les registres internes d’état du processeur déterminent son fonctionnement, à partir des bits
qui ont été chargés, soit au départ du programme, soit en cours d’exécution. Ces registres
peuvent être lus ou écrits de manière indépendante par le bus de données de la mémoire de
données DMD. Les registres d’état sont les suivants :
- ASTAT : Arithmetic STATus register
- SSTAT : Stack STATus register
- MSTAT : Mode STATus register
D’autre part, les registres de contrôle des interruptions sont les suivants
- ICNTL : Interrupt CoNTroL register
- IMASK : Interupt MASK register
- IFC : Interrupt Force / Clear register

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 38

Le contenu des registres d’état est sauvegardé dans une pile des registres d’état lorsque le
processeur répond à une interruption. Ce contenu est récupéré après l’instruction RTI. La
profondeur de cette pile dépend du processeur (de la série ADSP21xx). Néanmoins le
constructeur a prévu suffisamment de place dans la pile pour assurer le fonctionnement des
interruptions et du processeur en fin d’interruption pour le cas le plus défavorable, par
exemple quand une interruption déclenche un sous-programme, qui fonctionne avec plusieurs
boucles emboîtées.
Deux bits d’état SSTAT[4] et SSTAT[5] indiquent si la pile est vide ou pleine.

2.6.4.1 Registre d’état arithmétique (ASTAT)


Ce registre de 8 bits contient les états du processeur consécutifs aux opérations exécutées par
l’une des trois unités de calcul : ALU, MAC, ou Décaleur (Barel Shifter). C’est surtout
l’ALU qui fournit des bits d’état de sortie (6 bits). La répartition est celle de la Figure 2-18
Label Registre en lecture et écriture Allocation
7 6 5 4 3 2 1 0
ASTAT : 0 0 0 0 0 0 0 0 Registre DSP Unité de calcul
SS MV AQ AS AC AV AN AZ
Résultat nul ALU
Résultat négatif ALU
Dépassement ALU
Retenue ALU
Signe entrée X ALU
Fonctionnement en division ALU
Dépassement MAC
Signe Décaleur

Figure 2-18 : Répartition des bits d’état du registre ASTAT

L’état du registre ASTAT est chargé à la fin de chaque cycle où l’une des trois unités de
calcul intervient, et ne peut être utilisé avant le cycle suivant. L’utilisation du bus DMD ne
modifie pas le registre ASTAT. Par contre, des bits d’état y sont éventuellement chargés si
l’on utilise l’instruction
AR = PASS AX0 ; {ou soit AX1, AY0, AY1}

2.6.4.2 Registre d’état des piles (SSTAT)


Ce registre de 8 bits contient des états des piles, pour indiquer soit qu’il y a dépassement de
capacité de piles, soit qu’elles sont vides. Si le bit correspondant est à « 1 », l’état est vrai ;
sinon, il est à « 0 ». La répartition des bits d’états des piles est illustrée par la Figure 2-19.
L’état pile vide indique que le nombre d’opérations de récupération (pop operation) des
valeurs sauvegardées dans la pile est supérieur ou égal au nombre d’opérations de sauvegarde
dans la pile. L’état pile en dépassement de capacité indique que le nombre de sauvegardes a
été tel par rapport au nombre de récupération que l’on a rempli complètement la pile. Le
processeur considère alors que les valeurs précédemment sauvegardées sont plus importantes
que la nouvelle, et celle-ci risque d’être perdue.

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 39

Label Registre en lecture seule Allocation


7 6 5 4 3 2 1 0
SSTAT : 0 0 0 0 0 0 0 0 Registre DSP Pile concernée
LSO LSE SS0 SSE CS0 CSE PS0 PSE
Pile vide Pile de compteur de programme (PC stack)
Pile en dépassement de capacité Pile de compteur de programme (PC stack)
Pile vide Pile de compteur de boucle CNTR (Count stack)
Pile en dépassement de capacité Pile de compteur de boucle CNTR (Count stack)
Pile vide Pile des registres d’état (Status stack)
Pile en dépassement de capacité Pile des registres d’état (Status stack)
Pile vide Pile de boucle (Loop stack)
Pile en dépassement de capacité Pile de boucle (Loop stack)

Figure 2-19 : Répartition des bits d’état du registre SSTAT

Comme le dépassement de capacité représente un risque de pertes d’information, le bit d’état


dépassement reste en permanence, même si l’on effectue par la suite des opérations de
récupération. C’est le cas, par exemple, de la pile du compteur de boucle, qui est « saturée »
au-dessus de quatre sauvegardes, même si on effectue cinq opérations de récupération : le bit
de dépassement reste à « 1 ». Il faut alors effectuer un RESET du processeur pour remettre le
bit d’état de dépassement à « 0 ».

2.6.4.3 Registre d’état des modes de fonctionnement (MSTAT)


Ce registre de 7 bits détermine certaines caractéristiques imposées au fonctionnement du
processeur (Figure 2-20).

Label Registre en lecture et écriture Allocation


6 5 4 3 2 1 0
MSTAT : 0 0 0 0 0 0 0 Registre DSP Destination
Sélection de l’ensemble des registres Unités de calcul :
0 : Bank 1, 1 : Bank 2 ALU, MAC, Décaleur
Bit-reverse (pour les calculs FFT) Générateur d’adresses DAG1
Enregistrement du bit de dépassement ALU
Mode de saturation des valeurs en cas de dépassement ALU
Format des données dans le multiplier
MAC
0 : Fraction, 1 : Entier
Validation du Timer Timer
Mode de fonctionnement durant l’accès aux bus (GO mode) Bus d’adresses et de données

Figure 2-20 : Répartition des bits d’état du registre MSTAT

Le bit d’état de sélection de l’ensemble des registres d’entrée et de sortie des unités de calcul,
(Bank1 et Bank2) est le bit MSTAT[0]. Lorsqu’il est à « 0 », l’ensemble est primaire
(Bank1). Il est utilisé pour l’exécution du programme principal. On peut mettre ce bit à « 1 »
pour le traitement d’un sous programme, ce qui évite la sauvegarde des contenus des registres
du programme principal. Seul un ensemble donné de registres peut fonctionner pour une
séquence du processeur (voir Figure 2-8, Figure 2-11 et Figure 2-14).
La liste des registres dédoublés est la suivante :
- Pour l’ALU : AX0, AX1, AY0, AY1, AF, AR
- Pour le MAC : MX0, MX1, MY0, MY1, MF, MR0, MR1, MR2
- Pour le décaleur : SI, SE, SB, SR0, SR1

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 40

Le passage d’un ensemble (bank) à l’autre est très rapide. Pour le réaliser, il suffit d’écrire
l’instruction suivante
ENA SEG_REG; {passage à l’ensemble secondaire (Bank2) des registres}

Pour revenir de l’ensemble secondaire (Bank2) à l’ensemble primaire (Bank1), on écrit


DIS SEG_REG ; {retour à l’ensemble primaire (Bank1) des registres}

Le mode d’adressage bit-reverse (MSTAT[1]) est utilisé pour les calculs de transformée de
Fourier rapide (FFT). Il ne concerne que le générateur d’adresses DAG1.
Le mode d’enregistrement (MSTAT[2]) du dépassement de l’ALU (bit d’état AV), lorsqu’il
est validé, maintien AV=1 dès le premier dépassement pendant les calculs dans l’ALU,
même si par la suite aucun dépassement n’a lieu. En écrivant « 0 » dans MSTAT[2], le bit
d’état AV revient à « 0 » si le dépassement disparaît.
Le mode de saturation (MSTAT[3]) impose que les données dans l’ALU aient, en cas de
dépassement, soit la valeur minimum négative 0x8000, soit la valeur maximum positive
0x7FFF selon leur signe.
La validation du Timer (MSTAT[5] = « 1 ») provoque le début de la décrémentation de
celui-ci. (voir §2.10)
Le « GO mode » est un mode de fonctionnement (validité si le bit MSTAT[6] est à « 1 ») qui
permet au processeur de continuer à fonctionner alors qu’un accès à un bus (d’adresses ou de
données) est en cours. Cependant, quand un accès au bus vient d’une mémoire externe, le
processeur sera en attente du transfert sur le bus. Si GO mode est désactivé, le processeur
sera toujours en attente, dans tous les cas d’accès.

2.6.4.4 Registre de contrôle des interruptions ICNTL


ICNTL est un registre à 5 bits utilisé pour la configuration des interruptions externes. Les bits
sont indéfinis après un RESET
ICNTL permet de définir la sensibilité de chaque interruption externe IRQx . Cette sensibilité
correspond soit à une détection de niveau (état logique « 0 »), soit à une transition négative
(passage du niveau logique « 1 » au niveau logique « 0 »). Il n’y a pas de contrôle de
sensibilité pour les interruptions internes.
Le bit ICNTL[4] permet la réalisation d’interruptions imbriquées selon le niveau de priorité.
Lorsque qu’un bit de ICNTL est modifié, il faut attendre un délai de un cycle d’horloge avant
le changement de la configuration des interruptions.
Label Allocation
4 3 2 1 0
ICNTL : 0 Registre DSP
IRQ0 : sensibilité
0 : niveau
IRQ1 : sensibilité
1 : flanc
IRQ2 : sensibilité
Autorisation d’interruptions imbriquées

Figure 2-21 : Registre de contrôle des interruptions ICNTL

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 41

2.6.4.5 Registre de masquage des interruptions IMASK


Le registre IMASK permet le masquage individuel de chaque interruption (« 0 » :
interruption masquée, « 1 » interruption non masquée). Tous les bits sont mis à « 0 » lors
d’un RESET.
Toutes les interruptions sont automatiquement masquées durant un cycle d’instruction après
modifications d’un ou plusieurs bits de IMASK.

Label Registre en lecture et écriture Allocation


15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
IMASK : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Registre DSP

IRQ2 Timer
SPORT0 Transmission SPORT1 Réception ou IRQ0
SPORT0 Réception SPORT1 Transmission ou IRQ1
Software 0
Software 1

Figure 2-22 : Registre de masquage des interruptions IMASK

Lorsqu’une interruption masquée est détectée sur une transition, cette dernière est mémorisée
(latched). Elle peut donc être traitée par software.
Le contenu du registre IMASK est automatiquement sauvé dans la pile des registres d’état
(Status Stack) lors du traitement d’une interruption. IMASK est remis à jour lors du retour de
l’interruption (RTI). La configuration de IMASK est modifiée durant le traitement d’une
interruption. Le changement effectué dépend de l’état du bit ICNTL[4] autorisant ou non
l’exécution de routines d’interruption imbriquées.
− ICNTL[4] à « 0 ». Dans ce cas l’imbrication de routines d’interruption n’est pas
admise.
Niveau de Contenu de IMASK avant Contenu de IMASK lors du
priorité de l’interruption (sauvée dans la traitement d’une routine
l’interruption pile des registres d’état) d’interruption
0 (priorité basse) ijklmn 000000
1 ijklmn 000000
2 ijklmn 000000
3 ijklmn 000000
4 ijklmn 000000
5 (priorité haute) ijklmn 000000
Tableau 2-4 : Modification de IMASK lors d’une interruption pour ICNTL[4] = « 0 »

Les bits de IMASK sont automatiquement mis à « 0 » afin de masquer toute demande
d’interruption supplémentaire. C’est lors de la mise à jour de IMASK lors de la sortie
de l’interruption courante qui permettra de traiter les interruptions pendantes.
− ICNTL[4] à « 1 ». Dans ce cas le registre IMASK est modifié de manière à masquer
uniquement les interruptions de priorité inférieure à celle de l’interruption en cours de
traitement.

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 42

Niveau de Contenu de IMASK avant Contenu de IMASK lors du


priorité de l’interruption (sauvée dans la traitement d’une routine
l’interruption pile des registres d’état) d’interruption
0 (priorité basse) ijklmn ijklm0
1 ijklmn ijkl00
2 ijklmn ijk000
3 ijklmn ij0000
4 ijklmn i00000
5 (priorité haute) ijklmn 000000
Tableau 2-5 : Modification de IMASK lors d’une interruption pour ICNTL[4] = « 1 »

2.6.4.6 Registre de commande software des interruptions IFC


IFC est un registre permettant de forcer ou de supprimer une interruption activée sur une
transition. La commande se fait par software en écrivant un « 1 » dans la position
correspondant au bit d’activation ou de suppression de l’interruption désirée.

Label Registre en écriture seule Allocation


15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
IFC : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Registre DSP
Activation Suppression
IRQ2 Timer
SPORT0 Transmission SPORT1 Réception ou IRQ0
SPORT0 Réception SPORT1 Transmission ou IRQ1
Software 1 Software 0
Software 0 Software 1
SPORT1 Transmission ou IRQ1 SPORT0 Réception
SPORT1 Réception ou IRQ0 SPORT0 Transmission
Timer IRQ2

Figure 2-23 : Registre de commande software des interruptions IFC

Seules les interruptions activées sur transition peuvent être forcées. Une fois activée
l’interruption est exécutée une fois si elle n’est pas masquée. Les interruptions internes
peuvent être considérées comme sensible aux transitions.
Les interruptions en attente activée sur transition peuvent être supprimées. Ces
interruptions sont supprimées automatiquement lorsqu’elles sont appelées.

2.7 TRANSFERT DE DONNÉES


Cette section décrit les diverses unités permettant le transfert des données entre bus de
données (DMD et PMD). Il s’agit des Générateurs d’adresses et de l’unité d’échange entre
bus.

2.7.1 Les générateurs d’adresses (Data Address Generators)

2.7.1.1 Description des unités DAG


Chaque DSP de la famille ADSP2100 contient deux générateurs d’adresses permettant
d’accéder simultanément aux mémoires d’adresses et de données. Les unités DAG
permettent l’adressage indirect. Il existe deux structures de buffers l’une linéaire, l’autre

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 43

circulaire avec un contrôle en modulo 2n. Ces deux unités présentent chacun une
particularité :
DAG1 : Contrôle uniquement les adresses de la mémoire de données.
Possède la particularité de l’inversion de bit pour le traitement de la FFT.
DAG2 : Contrôle autant les adresses de la mémoire de données que celles de la
mémoire de programme.
Ne possède la particularité de l’inversion de bit pour le traitement de la
FFT.
La Figure 2-24 montre la structure de l’unité DAG1. On peut voir trois blocs de registres. Le
bloc de registres de modification M, le bloc de registres pointeurs I et le bloc de registres de
longueur L.
14 bits DMD

14 bits
14 bits 14 bits 14 bits 14 bits
14 bits 14 bits

From
instruction
MUX

2 bits 2 bits 2 bits

L MODULUS I M
REGISTERS LOGIC REGISTERS REGISTERS
4x14 4x14 4x14

14 bits 14 bits
14 bits

ADD
14 bits

BIT
REVERSE DAG1 only

14 bits

Figure 2-24 : Générateurs d’adresses

Chaque bloc de registre contient quatre registres de 14 bits qui peuvent être lus ou écrit via le
bus DMD. Le contenu des registres I et L est considéré comme non-signés, par conséquent
les deux bits MSB du bus DMD sont mis à « 0 ». Par contre les registres M contiennent des
grandeurs signées, les deux bits MSB du bus DMD prennent des valeurs correspondant à
l’extension du signe.
− Les registres pointeurs I0 à I3 pour l’unité DAG1 et I4 à I7 pour l’unité DAG2
contiennent les adresses réelles utilisées pour accéder à des positions mémoire. Lors
d’un adressage en mode indirect l’adresse stockée dans le registre sélectionné Ix devient
l’adresse de la mémoire.
Pour l’unité DAG1, l’adresse générée passe à travers une logique permettant l’inversion
de bit. Cette caractéristique est activée en forçant le bit MSTAT[1] (§ 2.6.4.3) à « 1 » ou
en utilisant l’instruction EN BIT_REV. De plus, la sortie de cette unité n’est connectée

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 44

qu’au bus d’adresses de la mémoire de donnée DMA.


Pour l’unité DAG2, l’adresse générée peut activer les deux bus d’adresses, soit les bus
DMA et PMA.
− Les registres de modification (M), désignés par M0 à M3 pour l’unité DAG1 et M4 à
M7 pour l’unité DAG2 contiennent les incréments algébriques (grandeurs signées) à
ajouter aux registres pointeurs I juste après un adressage effectif. Les registres (M) de
l’unité DAG1 ne peuvent pas commander les registres (I) de l’unité DAG2 et
réciproquement. Par contre n’importe quel registre de modification M d’une unité peut
commander n’importe quels registres pointeurs de la même unité.
L’adressage peut être linéaire ou circulaire. Contrairement aux registres de modifications
(M), les registres de longueurs (L) appartiennent aux registres pointeurs de même ordre (L0 à
I0, L1 à I1, ….L7 à I7).

2.7.1.2 Caractéristique de l’adressage indirect


Les DSP de la famille ADSP2100 permettent les modes d’adressage direct et indirect.
L’adressage indirect est possible en utilisant les registres I, M, L des unités DAG1 et DAG2.

2.7.1.3 Adressage linéaire


Le programmeur doit écrire par exemple L0=0 pour imposer un adressage linéaire au
pointeur I0.

2.7.1.3.1 Adressage indirect simple, exemple


I3 = 0x4700 ; {initialisation du pointeur I3}
M2 = 0 ; { pas d’incrémentation du pointeur }
L3 = 0 ; {« 0 » → buffer linéaire}
AX0 = DM(I3,M2) ; {charge la donnée de DMD pointée par I3 dans AX0}

L’adressage est indirect puisque l’on utilise I3. La valeur 0x4700 signifie que l’écriture du
programme est en hexadécimale. Il est linéaire puisque L3=0 et il n’y a pas de post-
modification de I3 puisque, après chargement dans le registre AX0 de l’ALU de la donnée
(pointée par I3 dans la mémoire de donnée à l’adresse 0x4700) la modification est nulle ;
M2=0.

2.7.1.3.2 Buffer avec adresse de base stockée dans DMD à l’adresse adr_ptr
Il est possible de déclarer une variable par exemple dans la mémoire de donnée pour changer
l’adresse qui sera ensuite dans un pointeur :
.VAR/DM/RAM adr_ptr ; {adresse de la mémoire ou se trouve le pointeur}
I3 = DM(adr_ptr) ; {initialisation du pointeur I3}
M1 = 1 ; {incrémentation du pointeur}
L3 = 0 ; {« 0 » → buffer linéaire}
AX0 = DM(I3,M1) ; {charge la donnée de DMD pointée par I3 dans AX0 et
incrémentation de I3}

La déclaration d’une variable revient à fixer une adresse qui sera reprise par un pointeur ;
celui-ci est indispensable ensuite pour charger la donnée ainsi adressée dans le registre AX0.

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 45

2.7.1.4 Adressage circulaire


L’intérêt de ce mode d’adressage est qu’il permet de revenir à l’adresse de départ
automatiquement lorsque toutes les lignes d’adresses prévues sont utilisées. Le module
logique des unités DAG fonctionne alors en « buffer circulaire » en utilisant les informations
suivantes :
− la valeur courante de l’adressage dans le pointeur I (valeur non signée) ;
− la valeur de modification dans le registre M (valeur signée) ;
− la longueur du buffer circulaire dans le registre L (valeur non signée) ;
− l’adresse de base d’un buffer circulaire, notée B est une puissance de 2. Si le
programmeur en a décidé autrement, l’éditeur de lien arrondit la longueur (L) déclarée
à la puissance de 2 supérieure.
Grâce à ces quatre informations, la prochaine adresse du pointeur I est donnée par la relation :

Prochaine Adresse = ModuloL {I + M −B}+ B 2.5

avec
I : adresse courante
M : valeur de modification (signée)
B : adresse de base
L : longueur du buffer
M+I : adresse modifiée (adresse suivante)
De plus, il faut respecter la condition

M <L 2.6

Cette condition assure que la prochaine adresse sera comprise dans le cycle suivant du buffer
circulaire.

2.7.1.5 Calcul de l’adresse de base


L’adresse de base d’un buffer circulaire de longueur L vaut 2n ou un multiple de 2n ou n
satisfait la condition

n −1 n
2 <L≤2 2.7

En d’autres mots, l’adresse de base est L arrondie vers la puissance de 2 supérieure.


En pratique, il n’est pas nécessaire de calculer n. Le Linker place automatiquement les
buffers circulaires aux adresses adéquates.

2.7.1.5.1 Adresse de base d’un registre circulaire, exemple


Supposons un buffer de longueur L=8, la valeur de n, selon la relation 2.7, est donc n=3 et
par conséquent l’adresse de base :

B∈{0x0008, 0x010, 0x018,...} 2.8

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 46

2.7.1.5.2 Opération à l’aide d’un buffer circulaire, exemple 1


Supposons que I0=5, M0=1, L0=3, et l’adresse de base B=4, ( n=2, B ∈{0x0004, 0x0008, ...} ,
la prochaine adresse prise par le pointeur vaut
ModuloL0 (I0+ M0−B)+ B=Modulo3(5+1−4)+4=6
1442443 2.9
2

Les adresses successives du pointeur d’adressage indirect produisent la séquence :


5, 6, 4, 5, 6, 4, 5, 6, 4, …..
pour M0=-1 (0x3FFF), on aura la séquence
5, 4, 6, 5, 4, 6, 5, 4, 6, …..

2.7.1.5.3 Adressage avec inversion de bit, exemple


La logique d’inversion de bit (Bit reverse logic) est principalement destinée pour la
programmation des algorithmes de FFT. Seul l’unité DAG1 possède cette fonctionnalité. Le
point de pivot de l’inversion est au milieu des 14 bits d’adresses, soit entre les bits 6 et 7. On
obtient donc la caractéristique suivante :
Ligne d’adresse individuelle (ADn) :
Ordre normal 00 01 02 03 04 05 06 07 08 09 10 11 12 13
Ordre inverse 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Ce mode est activé par le bit MSTAT[1] (§ 2.6.4.3) et concerne tous les pointeurs de l’unité
DAG1, soit I0 à I3.
Il est possible de travailler en inversion de bit sur un nombre restreint de bits d’adresses.
Dans ce cas il faut définir la première adresse et initialisé M de manière à obtenir le nombre
de bits désiré. La valeur de M est définie comme :

M =2(14− N) 2.10

Ou N correspond au nombre de bits sur lesquels se reporte l’inversion.

2.7.2 Variables et matrices


Les matrices ou tableaux sont déclarés par des directives assembleur et peuvent être
référencés indirectement par un nom. Ils peuvent être initialisés par plusieurs méthodes :
− par des valeurs immédiates par l’intermédiaire de directives assembleurs ;
− par des fichiers de données externes.
Un tableau est défini par la directive assembleur suivante
.VAR/DM coefficients[128] ;

La variable coefficient est ainsi déclarée comme un tableau de 128 valeurs de 16 bits situé
dans la mémoire de donnée (DM). Chaque composante du tableau peut être adressée de la
manière définie ci-dessous.
I0=^coefficients ; {pointe l’adresse de la première composante du tableau}

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 47

L0=0 ; {défini un buffer (tableau) linéaire}


MX0=DM(I0,M0) ; {place le contenu de la composant du tableau pointée dans MX0}

L’opérateur ^ indique que coefficients est de type pointeur.


Si l’on veut par exemple charger dans MX0 que la première valeur du tableau, on peut
utiliser le nom du tableau comme étiquette (label) :
MX0=DM(coefficients) ; {place le contenu de la 1ère composante du tableau coefficients dans MX0}

L’assembleur substitue l’adresse réelle à l’étiquette.


Comme mentionné, il est également possible d’initialiser un tableau complet à l’aide d’un
fichier :
.INIT coefficients <nom_du_fichier.dat>

2.7.3 Buffers circulaires


Il est possible, à l’aide d’une directive assembleur, de déclarer un buffer circulaire
.VAR/DM/CIRC coefficients[128] ;
Cette commande permet à l’éditeur de lien (Linker) de placer ce buffer dans une zone
particulière. Il suffit alors de définir les registres I, M et L comme le montre l’exemple
suivant :
L0=%coefficients ; {déclaration de la longueur du buffer}
I0=^coefficients ; {I0 pointe la première composantes du buffer}
M0=1 ; {Incrémentation de 1 du pointeur I0}
L’opérateur ^ indique que coefficients est de type pointeur.
L’opérateur % indique que L0 est chargé avec une valeur immédiate.

2.7.4 Transfert entre bus de données programme (PMD) et bus de données (DMD)
L’unité d’échange entre les bus DMD et PMD permet le transfert de données entre ces
derniers, ceci dans les deux directions. Le bus PDM étant sur 24 bits alors que le bus DMD
est sur 16 bits, seuls les 16 bits de poids forts (MSB) du bus PMD sont transférés de manière
directe. Un registre interne (PX) permet le transfert des 8 bits de poids faibles (LSB) de
chaque bus.

8 bits (LSB) 24 bits 8 bits (LSB) 16 bits (MSB) PMD BUS

PX
R
M E 8 bits
U G
X I 16 bits (MSB)
S
E
R 16 bits

8 bits (LSB) 16 bits 8 bits (LSB) 16 bits


DMD BUS

Figure 2-25 : PDM – DMD transfert

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 48

La Figure 2-25 illustre la structure de l’unité d’échange de données entre les bus DMD et
PMD. Deux types de connexions sont possibles.
Le premier type de connexion concerne l’échange direct entre les bus et ceci dans les deux
sens. Cette fonction est réalisée par des buffers tristates. L’un de ces buffers est utilisé lors
d’une écriture dans un registre interne connecté au bus DMD uniquement (AX0,AX1, AR,
MX0, MX1, MR, SB, SI, SE, SR) par l’intermédiaire du bus PMD, l’autre permet une
écriture d’un registre interne dans la mémoire programme.
Le second type de connexion passe par le registre PX. Ce dernier à une largeur de 8 bits. Il
peut être chargé ou lu par les 8 bits de poids faibles (LSB) de chaque bus de données (DMD
et PMD).
L’accès au registre PX obéit aux principes suivants :
Depuis le bus PMD, le registre PX est
1. chargé automatiquement lorsqu’une donnée (pas une instruction) écrite de la
mémoire programme dans n’importe quel registre interne au DSP
Par exemple : AX0=PM(I4,M4)
Dans cet exemple, les 16 bits de poids forts du bus PMD (24 bits) sont chargés
dans AX0 et les 8 bits de poids faibles dans le registre PX
2. Lu automatiquement lorsqu’une donnée écrite de n’importe quel registre interne
au DSP dans la mémoire programme.
Par exemple : PM(I4,M4)= AX0
Dans cet exemple, les 16 bits du registre interne AX0 sont stockés dans les 16
bits de poids fort de la mémoire programme, les 8 bits de PX sont
automatiquement stockés dans les 8 bits de poids faibles de la mémoire
programme.
Depuis le bus DMD, le registre PX est :
1. chargé par une donnée par une instruction explicite. Les 8 bits de poids forts
sont perdus.
Par exemple : PX = AX0 .
2. Lu afin que son contenu soit chargé dans un registre interne du DSP
Par exemple : AX0=PX .
Dans cet exemple, les 8 bits de poids forts du registre AX0 sont tous mis à « 0 ».
Lors d’un chargement du contenu d’un registre dans la mémoire programme, les 16 bits de
poids forts sont définis. Les 8 bits de poids faibles correspondent au contenu du registre PX.
Si ces 8 bits de poids faibles sont importants, il faut commencer par charger le registre PX via
le bus DMD avant d’exécuter l’opération d’écriture dans la mémoire programme.

2.8 CONFIGURATION DE LA MÉMOIRE


L’ADMC401 utilise une architecture Harvard modifiée, dans laquelle les données peuvent
être stockées aussi bien dans la mémoire de données que dans la mémoire de programme.
Cependant cette dernière contient également les vecteurs d’interruption et les instructions du
programme. Il faut donc y répartir les adresses pour qu’il n’y ait pas superposition des
données et des instructions. A ces deux types de mémoires, il faut ajouter une mémoire
interne (ROM) contenant un moniteur capable d’effectuer un certain nombre de tâches
d’amorçage (boot) de dépannage (debug).

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 49

Deux mémoires externes pouvant contenir une application résidente qui sera chargée à
chaque mise sous tension :
− une mémoire sérielle externe (SROM) ;
− une mémoire externe (EEPROM).
La configuration générale de plan mémoire et la manière de charger les programme
d’application peuvent être modifiés selon l’état de deux signaux d’entrée, soit : MMAP
(Memory Map) et BMODE (Boot mode).

2.8.1 Configuration de la mémoire interne


Les mémoires internes sont connectées aux différentes unités fonctionnelles par quatre bus
distincts :
− bus de données de la mémoire de données (DMD : Data Memory Data) ;
− bus d’adresses de la mémoire de données (DMA : Data Memory Address) ;
− bus de données de la mémoire de programme (PMD : Program Memory Data) ;
− bus d’adresses de la mémoire de programme (PMA : Program Memory Address).

PMA-BUS 14 bits

ROM RAM
2Kx24 2Kx24
(Monitor) (Program)

EXTERN AL DARA BUS


PMD-BUS 24 bits 24 bits
24 bits
24 bits
M
U
X
DMD-BUS 14 bits 16 bits 16 bits 16 bits

RAM RAM RAM


1Kx16 1Kx16 1Kx16
DSP CORE / Reserved (Peripheral Registers) (User & Monitor)
Register
EXTERN AL ADRE SS BUS

DMA-BUS 14 bits
16 bits
M
U
X

Figure 2-26 : Architecture de la mémoire interne

Lors de l’utilisation de la mémoire interne, les signaux RD , WR , PMS et DMS ne sont pas
activés, ils restent donc à « 1 ». Les drivers des bus de données et d’adresses sont maintenus
en haute impédance (tristated).
Pour intégré la mémoire ROM interne dans le plan mémoire, il faut activer (« 1 ») le bit de
contrôle ROMENABLE (bits MEMWAIT[15]). Dans le cas contraire, la place mémoire est
réservée pour de la mémoire externe.
Le bit de contrôle ROMENABLE est mis à « 0 » après un reset, à moins que MMAP= « 1 »
et BMODE= « 1 ».

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 50

2.8.2 Configuration de la mémoire externe


Les bus externes sont au nombre de deux, soit :
− un bus de données résultant du multiplexage des bus internes de DMD et PMD ;
− un bus d’adresses résultant du multiplexage des bus internes de DMA et PMA.
La largeur du bus d’adresses est de 14 bits (A13 – A0) alors que celle du bus de données est
de 24 bits (D23 – D0). Ce sont les 16 MSB du bus de données externes (D23 – D8) qui sont
reliés au bus de données interne DMD (D15 – D0).
L’ADMC 401 peut adresser 14Kx24 bits de mémoire programme et jusqu’à 13Kx16bits de
mémoire de données. Pour les phases de chargement (lecture : WR ) d’une instruction (fetch)
dans les mémoires externes, la donnée de la mémoire de programme est lue en premier. La
sélection physique de la mémoire ( CS : Chip Select or CE : Chip Enable) se fait à l’aide de
PMS (Program Memory Select). Puis c’est le tour de la donnée de la mémoire de données.
A 13-0
14 bits BOOT MEMORY

1/2 CLOCK CLKIN ADDR 13-0 D 23-22 ADRR 15-0


or
24 bits
CRISTAL
D 15-8
XTAL DATA 23-0
DATA 7-0
BMS CS
EEPROM
OE 64Kx8Bits
RD
SERIAL ROM
or WR PROGRAM MEMORY
E 2 PROM A 13-0
CLK SCLK1 ADRR 13-0
D 23-0
RESET RFS1/SPROM
DATA 23 -0
DATA DR1A
WE
PMS CS
RS232 LINK EEPROM
16Kx24Bits
PC SERIAL LINK RS232

OE
(DEBUGGER)

ADDRESS-BUS

RX DR1B DATA MEMORY


A 13-0
TX DT1
ADRR 13-0
RESET D 23-8
DATA-BUS

DATA 15-0

WE
RESET DMS CS EEPROM
16Kx16Bits
OE

Figure 2-27 : Architecture de la mémoire externe

La sélection se fait à l’aide de DMS (Data Memory Select).

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 51

Figure 2-28 : Lecture de la mémoire externe

Pour une phase d’écriture, c’est bien entendu le signal RD qui est activé.

Figure 2-29 : Ecriture de la mémoire externe

2.8.3 Allocation des zones mémoires


L’allocation ou le plan des zones mémoires de programme est fonction de deux entrées
externes MMAP (Memory MAP), BMODE (Boot MODE) et du bit de contrôle
ROMENABLE. Les cas suivants peuvent se produire :
− MMAP=0, BMODE=0 :
La taille de la mémoire de programme interne est fixée à 2Kx24bits avec son adresse
de départ à 0x0000. Le reste de la mémoire de programme 12Kx24bits est externe
avec son adresse de départ à 0x1000. La zone d’adresses allant de 0x0800 à 0x0FFF
dépend de la valeur du bit de contrôle ROMEBABLE.
− MMAP=0, BMODE=1 :
Ce mode est, réservé à l’ADSP2171 n’est pas valide pour l’ADMC401.
− MMAP=1, BMODE=0 :
La zone de mémoire programme commence en 0x0000 par 12Kx24bits de mémoire

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 52

externe. Suivie par de la mémoire RAM de programme interne, soit 2Kx24bits avec
son adresse de départ à 0x3800, soit dans la partie supérieure du plan mémoire. La
zone d’adresses allant de 0x0800 à 0x0FFF dépend de la valeur du bit de contrôle
ROMEBABLE.
− MMAP=1, BMODE=1 :
La taille de la mémoire RAM de programme interne est fixée à 2Kx24bits avec son
adresse de départ à 0x0000. Le bit ROMENABLE est fixé à « 1 » par défaut, on a
donc la mémoire de programme ROM interne qui occupe l’espace allant de 0x0800 à
0x0FFF. Le reste de la mémoire de programme 12Kx24bits est externe avec son
adresse de départ à 0x1000.
0x0000

EXTERNAL MEMORY 8Kx16

0x1FFF
0x2000
PERIPHERAL REGISTERS 1Kx16
0x23FF
0x2400

EXTERNAL MEMORY 5Kx16

0x37FF
0x3800
INTERNAL USER RAM
0x3B5F 1Kx16
0x3B60
RESERVED BY MONITOR
0x3BFF
0x3C00
RESERVED BY DSP CORE
0x3FEE 1Kx16
0x3FEF
DSP CORE REGISTERS
0x3FFF

16 Bits wide

Figure 2-30 : Plan de la mémoire de données

0x0000 0x0000 0x0000


VECTOR TABLE
INTERNAL RAM 0x005F
0x0060
(Booted from 2Kx24 EXTERNAL RAM 2Kx24 INTERNAL RAM 2Kx24
byte-wide EPROM) (Booted from
SPORT1)
0x07FF 0x07FF 0x07FF
0x0800 0x0800 0x0800 INTERNAL ROM
INTERNAL ROM INTERNAL ROM
(ROMEENABLE
(ROMEENABLE=1 ) (ROMEENABLE=1 ) defaults to 1
2Kx24 2Kx24 2Kx24
OR OR during RESET)
0x0FEF
EXTERNAL RAM EXTERNAL RAM 0x0FF0
(ROMEENABLE=0) (ROMEENABLE=0) RESERVED
0x0FFF
0x0FFF 0x0FFF
0x1000
0x1000 0x1000

EXTERNAL RAM 10Kx24


EXTERNAL RAM 12Kx24
EXTERNAL RAM 12Kx24

0x37FF
0x3800
EXTERNAL RAM 2Kx24
0x3FFF
0x3FFF 0x3FFF

24 Bits wide
24 Bits wide 24 Bits wide

MMAP=0, BMODE=0 MMAP=1, BMODE=0 MMAP=1, BMODE=1

Figure 2-31 : Plans de la mémoire de programme

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 53

2.8.4 Adaptation des temps d’accès mémoire


Le temps d’accès des mémoires externes varie beaucoup en fonction de la technologie. De
plus, la mémoire de données peut être remplacée par des périphériques quelconques
présentant des temps d’accès incompatibles avec les signaux de contrôle du DSP. Grâce à
plusieurs registres de contrôle, il est possible d’augmenter les temps d’accès standard du
DSP. Pour la mémoire de données
Label Registre en écriture seule Allocation
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
MEMWAIT : 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 DM(0x3FFE)

DWAIT4 DWAIT3 DWAIT2 DWAIT1 DWAIT0

ROM ENABLR
1 = ENABLE
0 = DISABLE

Pour MMP=1 et BMODE=1, on a par défaut MEMWAIT = 0x8000

Figure 2-32 : Registre de contrôle MEMWAIT

0x0000

DWAIT0 1Kx16
0x03FF
0x0400
DWAIT1 1Kx16
0x07FF
0x0800

DWAIT2 8Kx16

0x2FFF
0x3000
DWAIT3 1Kx16
0x33FF
0x3400

DWAIT4 1Kx16
0x34FF
0x3800

NO WAIT STATE 2Kx16

0x3FEF

16 Bits wide

Figure 2-33 : Attribution des temps d’accès mémoire de données

Pour la mémoire de programme et la mémoire de chargement (EEPROM)


Label Registre en écriture seule Allocation
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
SYSCNTL : 0 0 0 1 0 0 0 1 1 1 1 1 1 DM(0x3FFF)

BWAIT PWAIT
Mémoire de Mémoire de
Boot programme

Figure 2-34 : Registre de contrôle SYSCNTL

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 54

Les temps ajoutés aux signaux présentant les contraintes les plus sévères sont définis par la
relation suivante :

w=wait _ states⋅tCLKOUT avec 0 ≤ wait _ states ≤ 7 2.11

2.9 CHARGEMENT ET DÉMARRAGE D’UNE APPLICATION (BOOT LOADING)

2.9.1 Chargement de l’application


Le chargement d’une application et le démarrage de son exécution varie en fonction des
entrées MMAP et BMODE.

− MMAP=0, BMODE=0 :
Mode de chargement par EPROM 8bits (Byte-Wide EEPROM Boot Mode)
La phase d’amorçage (boot loading) provoque le chargement d’une partie ou de la
totalité de la mémoire programme interne par une mémoire externe de type EEPROM
ayant une largeur des données sur 8 bits. Le chargement se fait byte par byte. La
mémoire EEPROM est organisée en 8 pages de 8Kx8bits chacune. Chaque page
contient des instructions permettant le chargement de cette dernière. Le chargement
de la page 0 est déclenché par les états de MMAP = « 0 » et BMODE = « 0 » et le
contenu du registre de contrôle SYSCNTL
Label Registre en écriture seule Allocation
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
SYSCNTL : 0 0 0 1 0 0 0 1 1 1 DM(0x3FFF)
BFORCE
(Boot Force Bit)
BPAGE BWAIT
Boot Page Select (Boot Wait States)

Figure 2-35 : Registre de contrôle SYSCNTL

Chaque page contient des instructions pour le générateur d’adresses de chargement


(Boot Generator Address), notamment la commande de chargement de la page
suivante en forçant le bit de contrôle BFORCE à « 1 » et le numéro de la page
suivante en mettant à jour les 3 bits de BPAGE. La dernière page chargée ne contient
pas d’instruction de chargement. Cette dernière page correspond à la première page
de 2Kx24 bits contenant le programme d’application dont la première instruction est
placée à l’adresse 0x0000 de la mémoire de programme.
La zone d’adresses allant de 0x0800 à 0x0FFF dépend de la valeur du bit de contrôle
ROMEBABLE. Le programme d’application démarre à partir de l’adresse 0x0000.
Pour plus d’information, voir ADSP2100 Family, Assembler Tools & Simulation
Manual, Chap. 5 et ADSP2100 Family, User’s Manual, Chap. 10, § 10.4.
− MMAP=0, BMODE=1 :
Ce mode est, réservé à l’ADSP2171 n’est pas valide pour l’ADMC401

− MMAP=1, BMODE=0 :
La zone de mémoire programme commence en 0x0000 par 12Kx24bits de mémoire
externe. Suivie par de la mémoire RAM de programme interne, soit 2Kx24bits avec
son adresse de départ à 0x3800, soit dans la partie supérieure du plan mémoire. Il n’y

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 55

a pas de phase d’amorçage. La zone d’adresses allant de 0x0800 à 0x0FFF dépend de


la valeur du bit de contrôle ROMEBABLE.
− MMAP=1, BMODE=1 :
Mode autonome (Standalone mode)
Le programme d’application démarre à partir de l’adresse 0x0800. Comme dans ce
mode ROMENABLE = « 1 » par défaut, on se trouve dans la ROM interne
(moniteur). Le moniteur commence par quelques initialisations dont notamment la
mise à « 0 » des bits MEMWAIT[14 … 0] (suppression des délais d’attente lors de
l’accès aux mémoires de données. Puis il copie une table de vecteurs d’interruption
aux adresses 0x0000 à 0x005F de la mémoire de donnée. Le moniteur configure
ensuite le port série SPORT1 en forçant le bit MODECRTL[4] à « 0 » et le bit
MODECRTL[5] à « 1 » du registre de contrôle MODECRTL. Ainsi l’entrée DR1A
est connectée à DR1 et la sortie RFS1/ SROM à FL1.
Label Registres en lecture et écriture Allocation
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
MODECTRL : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DM(0x2015)

1 = DR1B DATA RECEIVE


0=DR1A SELECT

1=UART MODE SPORT1


0 = SPORT MODE MODE

Figure 2-36 : Registre de contrôle de mode

DT1 DT1

DR1A
DR1
DR1B
DSP CORE
TFS1 TFS1

RFS1

RFS1/SROM

SCLK1 SCLK1

FL1

[4] [5]
MODECTRL[5,4]

ADMC401

Figure 2-37 : Configuration du port sériel SPORT1

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 56

Une fois ces initialisations effectuées, le moniteur provoque le chargement d’une


application via une SROM, SPROM ou EEPROM série en effectuant un reset de
cette dernière :
SROMRESET : SET FL1 ; {mise a « 1 » du Flag 1}
TOGGLE FL1 ; {transition d’état du Flag 1}
TOGGLE FL1 ; {transition d’état du Flag 1}
RTS ; {sortie de la routine}

Si la mémoire sérielle est présente et correctement programmée, les données sont


transmises de manière synchrone avec une horloge (CLK) de 1MHz. Ainsi les
mémoires internes et externes aux DSP peuvent être chargées. A la fin du
chargement, la première instruction exécutée se trouve à l’adresse 0x0060, soit juste
après la table des vecteurs d’interruption.
Si la mémoire sérielle n’est pas présente ou pas correctement programmée, le
moniteur configure le port sériel SPORT1 en UART en forçant les bits
MODECRTL[4] et MODECRTL[5] à « 1 » du registre de contrôle MODECRTL. Le
moniteur attend de recevoir deux bytes au travers du port série. Ces bytes sont reçus
de manière asynchrone ainsi aucun signal d’horloge n’est nécessaire. Le premier byte,
dont la valeur doit impérativement être 0x70, permet la détection automatique de la
vitesse de transmission (autobaud rate detection). Le second byte permet d’identifier
le type d’interface qui est connecté au port sériel. Six interfaces sont supportés par le
moniteur, on donnera ici le seul utilisé au laboratoire, soit l’« UART debugger
interface » pour le software de développement « Motion Control Debugger »
d’Analog Devices.
Pour plus d’information, voir ADMC401 DSP Motor Controller, Developer’s
Reference Manual §6.1 et §9.3.

2.9.2 Définition de la table des vecteurs d’interruption


Lorsqu’une interruption est activée, le contrôleur d’interruption (Interrupt Controller) charge
le pointeur de programme avec une adresse correspondant à la source de l’interruption. Les
interruptions générées par le cœur du DSP se trouvent dans la mémoire de programme PM,
aux adresses comprise entre PM0x0000 et PM0x002C. La place mémoire prévue pour ces
interruptions est limitée à 4 positions. Il est donc possible d’y insérer trois lignes de code et
une instruction de retour d’interruption : RTI. Pour des routines d’interruptions plus longues,
il faut utiliser une instruction de saut à une position mémoire correspondant au début de la
routine d’interruption. La première position mémoire de la table d’interruption doit être un
saut au début du programme. Cette instruction est exécutée juste après un RESET ou pour
sortir d’une commande IDLE si le bit PCUR (SPORT1_AUTOBUF_CRTL[12]) est à « 1 ».
Dans l’exemple qui suit, on a admis que le programme principal démarre à l’adresse
« Startup » et que deux routines d’interruptions sont déclarées. Ces routines d’interruptions
concernent un périphérique, soit le modulateur PWM. Les adresses de début de ces routines
sont données par les étiquettes « PWMSYNC_ISR » et « PWMTRIP_ISR ». Par habitude on
ajoute au nom le terme ISR qui signifie Interrupt Service Routine.

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 57

.MODULE/RAM/ABS=0 Table_des_vecteurs_interruptions ;

.EXTERNAL Startup, pwmsync_isr, pwmtrip_isr ; {liste des adresses de début des routines
d’interruptions}
.VAR/DM/RAM/SEG=USER_DM3 TEMP_I4_SAVE ; {position de la mémoire DM pour le stockage
temporaire du pointeur contenu dans I4}
# include <admc401.h>
{Table des vecteurs d’interruption propre cœur du DSP}
RESET 0x0000: ivt : JUMP Startup ; {Saut au début de programme}
NOP ;
NOP ;
NOP ;
IRQ2 0x0004 : DM(TEMP_I4_SAVE)=I4 ; {stockage temporaire de I4}
I4=DM(PICVECTOR) ; {adresse de la routine d’interruption}
JUMP (I4) ; {du périphérique source de l’interruption}
NOP ; {saut a l’adresse pointée par I4}
Reservé 0x0008 : RTI ;
NOP ; NOP ; NOP ;
Reservé 0x000C : RTI ;
NOP ; NOP ; NOP ;
SPORT0 Transmission 0x0010 : RTI ; {retour sans opérations}
NOP ; NOP ; NOP ;
SPORT0 Réception 0x0014 : RTI ; {retour sans opérations}
NOP ; NOP ; NOP ;
Software 0 0x0018 : RTI ; {retour sans opérations}
NOP ; NOP ; NOP ;
Software 1 0x001C : RTI ; {retour sans opérations}
NOP ; NOP ; NOP ;
SPORT1 Transmission ou 0x0020: RTI ; {retour sans opérations}
IRQ1 NOP ; NOP ; NOP ;
SPORT1 Réception 0x0024 : RTI ; {retour sans opérations}
ou IRQ0 NOP ; NOP ; NOP ;
Timer 0x0028 : RTI ; {retour sans opérations}
NOP ; NOP ; NOP ;
PWD (non masquable) 0x002C : RTI ; {retour sans opérations}
NOP ; NOP ; NOP ;
{Table des vecteurs d’interruption propre aux périphériques}
Fin de conversion AD 0x0030 : I4=DM(TEMP_I4_SAVE) ; {restitution de I4 et retour sans opération}
RTI ; NOP ; NOP ;
PWMSYNC 0x0034 : I4=DM(TEMP_I4_SAVE) ; {restitution de I4 et saut dans la routine}
JUMP pwmsync_isr ; {d’interruption dont l’adresse de début est}
NOP ; NOP ; {pwmsync_isr}
EIU (timeout) 0x0038 : I4=DM(TEMP_I4_SAVE) ; {restitution de I4 et retour sans opération}
RTI ; NOP ; NOP ;
PIO4 à PIO11 0x003C : I4=DM(TEMP_I4_SAVE) ; {restitution de I4 et retour sans opération}
RTI ; NOP ; NOP ;
EIU 0x0040 : I4=DM(TEMP_I4_SAVE) ; {restitution de I4 et retour sans opération}
(erreur de comptage) RTI ; NOP ; NOP ;
ETU 0x0044 : I4=DM(TEMP_I4_SAVE) ; {restitution de I4 et retour sans opération}
RTI ; NOP ; NOP ;
PIO0 0x0048 : I4=DM(TEMP_I4_SAVE) ; {restitution de I4 et retour sans opération}
RTI ; NOP ; NOP ;
PIO1 0x004C : I4=DM(TEMP_I4_SAVE) ; {restitution de I4 et retour sans opération}
RTI ; NOP ; NOP ;
PIO2 0x0050 : I4=DM(TEMP_I4_SAVE) ; {restitution de I4 et retour sans opération}
RTI ; NOP ; NOP ;
PIO3 0x0054 : I4=DM(TEMP_I4_SAVE) ; {restitution de I4 et retour sans opération}
RTI ; NOP ; NOP ;
PWMTRIP 0x0058 : I4=DM(TEMP_I4_SAVE) ; {restitution de I4 et saut dans la routine}
JUMP pwmtrip_isr ; {d’interruption dont l’adresse de début est}
NOP ; NOP ; {pwmtrip_isr}
.ENDMOD ;

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 58

2.9.3 Ecriture dans la table d’interruption


Lorsque le debugger est utilisé, le moniteur interne initialise la table d’interruption aux
adresses 0x0020 (SPORT1 Transmission) et 0x0024 (SPORT1 Reception). Les autres
routines d’interruptions doivent être déclarées par l’utilisateur. Une routine du moniteur, dont
l’adresse est déclarée dans le fichier d’entête ADMC401.h permet de remplacer l’instruction
RTI de la table d’interruption par un saut à l’adresse d’interruption fixée par l’utilisateur.
Pour ce faire, on doit écrire le code suivant :
I4=xxx_INT_ADDR; {I4 contient l'adresse de la table d'interruption pour xxx}
MR0=^xxx_ISR; {MR0 contient l'adresse de la routine d'interruption xxx}
CALL PUT_VECTOR; {Routine placée dans le moniteur en ROM}

Où xxx vaut, est déduit des constants définie dans le fichier ADMC401.h
.CONST ADC_INT_ADDR = 0x30+1; {ADC INTERRUPT }
.CONST PWMSYNC_INT_ADDR = 0x34+1; {PWMSYNC interrupt }
.CONST EIUTIMER_INT_ADDR = 0x38+1; {EIU timer interrupt }
.CONST PIO_INT_ADDR = 0x3C+1; {PIO4 - PIO11 interrupt }
.CONST EIUERROR_INT_ADDR = 0x40+1; {EIU error interrupt }
.CONST ETU_INT_ADDR = 0x44+1; {ETU interrupt }
.CONST PIO0_INT_ADDR = 0x48+1; {PIO0 interrupt }
.CONST PIO1_INT_ADDR = 0x4C+1; {PIO1 interrupt }
.CONST PIO2_INT_ADDR = 0x50+1; {PIO2 interrupt }
.CONST PIO3_INT_ADDR = 0x54+1; {PIO3 interrupt }
.CONST PWMTRIP_INT_ADDR = 0x58+1; {PWMTRIP interrupt}
.CONSTTX0_INT_ADDR = 0x10; {SPORT0 transmit interrupt}
.CONST RX0_INT_ADDR = 0x14; {SPORT0 receive interrupt}
.CONST SW1_INT_ADDR = 0x18; {software interrupt 1}
.CONST SW0_INT_ADDR = 0x1C; {software interrupt 0}
.CONST TX1_INT_ADDR = 0x20; {SPORT1 transmit interrupt}
.CONST RX1_INT_ADDR = 0x24; {SPORT1 receive interrupt}
.CONST TIMER_INT_ADDR = 0x28; {Timer interrupt}

2.10 TIMER
Le Timer est un périphérique car il n’est pas indispensable au fonctionnement du DSP. Son
rôle est de provoqué des interruptions selon une période Tint qui est toujours un multiple de la
période d’horloge interne du DSP. Ce facteur de multiplication dépend des registres de
contrôle du Timer.
L’interruption provoquée par le Timer peut être masquée par le bit IMASK[0], forcée par le
bit IFC[8] ou annulée par le bit IFC[0].
L’activation du timer est obtenue en forçant à 1 le bit MSTAT[5].

2.10.1.1 Architecture du Timer


La Figure 2-38 illustre l’architecture du Timer.

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 59

16 bits DMD BUS

8 bits 16 bits 16 bits

TSCALE TPERIOD

Count Register Load Logic

CLKOUT Timer Enable


& Prescale Logic CLK TCOUNT Zero
Timer Interrupt

Timer Enable

Figure 2-38 : Architecture du Timer

2.10.1.2 Registres de contrôle pour les timers


Le Timer comprend deux registres de 16 bits TCOUNT et TPERIOD et un registre de 8 bits
TSCALE.
Label Registres en lecture et écriture Allocation
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
TPERIOD : DM(0x3FFD)
TCOUNT : DM(0x3FFC)
TSCALE : 0 0 0 0 0 0 0 0 DM(0x3FFB)

Figure 2-39 : Registres des valeurs converties

2.10.1.3 Opérations du Timer


Le registre TCOUNT est un compteur. Quand le Timer est en service, ce compteur est
décrémenté à chaque cycle de fonctionnement. Lorsque le compteur atteint 0, une
interruption est provoquée, tandis que TCOUNT est rechargé à la valeur inscrite dans le
registre TPERIOD.
Le registre TSCALE indique le facteur d’échelle temporel vis à vis de l’horloge interne du
DSP (CLKOUT). Comme ce registre est de 8 bits, le facteur d’échelle Ts (ou « saut de
temps » entre deux décrémentations de TCOUNT) peut varier entre 1⋅TCLK (pour
TSCALE=0) et 256⋅TCLK (pour TSCALE=255).
On a donc la relation suivante pour le temps entre deux interruptions
Tint =(TPEDIOD+1)(TSCALE +1)TCLK
Il est possible de changer les valeurs de TSCALE et TCOUNT en cours de fonctionnement,
ce qui prend effet immédiatement. Par contre la modification du contenu de TPERIOD n’est
prise en compte qu’à la suite du chargement de TCOUNT.

CD\DSP\Cours\Chap2
DESCRIPTION DU CŒUR DE L’ADSP2171 Page 60

2.11 SYNTHÈSE DES REGISTRES D’ÉTAT, DE CONTRÔLE ET DE DONNÉES DU CŒUR DU DSP


La Figure 2-40 illustre l’ensemble des registres de données d’état et de contrôle dédicacé au
coeur de l’ADMC401.
− Les registres de données font partie du cœur du DSP, ils n’ont donc pas d’adresses
spécifiques et ne font pas partie de la mémoire RAM interne
− Les registres d’état font partie du cœur du DSP, ils n’ont donc pas d’adresses
spécifiques et ne font pas partie de la mémoire RAM interne
− Les registres de contrôle sont en réalités situés dans une zone mémoire réservée de la
mémoire de donnée (DM) interne. Cette zone mémoire est comprise entre 0x3C00 et
0x3FFF.
DSP CORE DATA MEMORY
MEMORY INTERFACE
DATA ADDRESS GENERATORS
DM_0X3FFF SYSCNTL[15...0]
DAG1 DAG2
I0[14...0] L0[14...0] M0[14...0] I4[14...0] L4[14...0] M4[14...0] DM_ 0X3FFE MEMWAIT[15...0]
I1[14...0] L1[14...0] M1[14...0] I5[14...0] L5[14...0] M5[14...0] TIMER
I2[14...0] L2[14...0] M2[14...0] I6[14...0] L6[14...0] M6[14...0] DM_ 0X3FFD TPERIOD[15...0]
I3[14...0] L3[14...0] M3[14...0] I7[14...0] L7[14...0] M7[14...0]
DM_ 0X3FFC TCOUNT[15...0]
DM_ 0X3FFB TSCALE[15...0]
ARITHMETIC / LOGIC UNIT (ALU) SPORT 0

AX0[15..0] AX1[15..0] AY0[15..0] AY1[15..0]


RX0 DATA BUFFER
TX0 DM_ 0X3FFA RX_WORDS1[31...16]
AR[15..0] AF[15..0] DM_ 0X3FF9 RX_WORDS0[15...0]

MULTIPLIER / ACCUMULATOR (MAC) DM_ 0X3FF8 TX_WORDS1[31...16]


DM_ 0X3FF7 TX_WORDS0[31...16]
MX0[15..0] MX1[15..0] MY0[15..0] MY1[15..0]
CONTROL REGISTERS
DM_ 0X3FF6 CTRL_REG[15...0]
MR2[15..0] MR1[15..0] MR0[15..0] MF[15..0] DM_ 0X3FF5 SCLKDIV[15...0]
DM_ 0X3FF4 RFSDIV[15...0]
BAREL SHIFTER
DM_ 0X3FF3 AUTOBUF_CTRL[15...0]
SPORT 1
SI[15..0] SE[7..0] SB[4..0]

RX1 CONTROL REGISTERS


SR1[15..0] SR0[15..0] TX1
DM_ 0X3FF2 CTRL_REG[15...0]
PROGRAM SEQUENCER DM_ 0X3FF1 SCLKDIV[15...0]
DM_ 0X3FF0 RFSDIV[15...0]
ICNTL[4...0]
LOOP STACK PC STACK DM_ 0X3FEF AUTOBUF_CTRL[15...0]
4x[17...0] IFC[15...0] 16x[13...0]

SSTAT[7...0]
OWRCNTR[13 ...0] IMASK[15...0] MSTAT[6...0] ASTAT[7...0]
CNTR[13 ...0]
COUNT STACK STATUS STACK
4x[13...0]

Figure 2-40 : Registres de données d’état et de contrôle

CD\DSP\Cours\Chap2
DESCRIPTION CŒUR DE L’ADMC401 Page 61

Adresses Nom Type Bits Fonction


0x3FFF SYSCNTL R/W [15 … 0] Registre de contrôle système
0x3FFE MEMWAIT R/W [15 … 0] Contrôle des temps d’accès de la mémoire
0x3FFD TPERIOD R/W [15 … 0] Période du timer
0x3FFC TCOUNT R/W [15 … 0] Registre de comptage du timer
0x3FFB TSCALE R/W [7 … 0] Facteur d’échelle pour la base de temps du timer
0x3FFA SPORT0_RX_WORDS1 R/W [15 … 0] Registre pour la réception de données sérielles multicanaux
0x3FF9 SPORT0_RX_WORDS0 R/W [15 … 0] Registre pour la réception de données sérielles multicanaux
0x3FF8 SPORT0_TX_WORDS1 R/W [15 … 0] Registre pour la transmission de données sérielles multicanaux
0x3FF7 SPORT0_TX_WORDS0 R/W [15 … 0] Registre pour la transmission de données sérielles multicanaux
0x3FF6 SPORT0_CTRL_REG R/W [15 … 0] Registre de contrôle
0x3FF5 SPORT0_SCLKDIV R/W [15 … 0] Registre de division pour l’horloge de synchronisation de la transmission sérielle
0x3FF4 SPORT0_RFSDIV R/W [15 … 0] Registre de trame de synchronisation
0x3FF3 SPORT0_AUTOBUF_CTRL R/W [15 … 0] Registre de contrôle de mémorisation automatique
0x3FF2 SPORT1_CTRL_REG R/W [15 … 0] Registre de contrôle
0x3FF1 SPORT1_SCLKDIV R/W [15 … 0] Registre de division pour l’horloge de synchronisation de la transmission sérielle
0x3FF0 SPORT1_RFSDIV R/W [15 … 0] Registre de trame de synchronisation
0x3FEF SPORT1_AUTOBUF_CTRL R/W [15 … 0] Registre de contrôle de mémorisation automatique
Tableau 2-6 : Plan d’adressage des registres du cœur de l’ADMC401

CD\DSP\Cours\Chap2
DESCRIPTION CŒUR DE L’ADMC401 Page 62

BIBLIOGRAPHIE
[1] Single-Chip, DSP-Based
High Performance Motor Controller
REV. B
[2] ADMC401 DSP Motor Controller
Developer’s Reference Manual
Rev. 2.1, 11 Septembre 2000
[3] ADSP-2100 Family
Assembler Tools & Simulator Manual
Second Edition (11/94)
[4] ADSP-2100 Family
User’s manual
Third Edition (9/95)

CD\DSP\Cours\Chap2

Vous aimerez peut-être aussi