boutger
Les processeurs pour
le traitement du signal

[Previous]  [Next]  [Summary]
  1. Unité de calcul MAC
  2. Traitement des TFD et adressage "bit reverse"
  3. Calcul d'une convolution
    1. Cas du 56000
    2. Cas du 320C25
  4. Tables de constantes
  5. Communications
  6. Traitements arithmétiques
  7. Caractéristiques liées à l'architecture
    1. Branchements retardés
    2. Instructions parallèles
    3. Caches

Les techniques telles que architecture Harvard, caches, pipe-line sont systématiquement mises en oeuvre dans les processeurs classiques utilisés pour le traitement du signal. On peut d'ailleurs estimer qu'à terme il n'y aura plus de différence entre ces deux types de processeurs.

D'une façon générale les microprocesseurs de traitement du signal récents sont dotés :

  1. d'une architecture de type Harvard, et donc généralement, de deux caches pour les données et les programmes,
  2. d'un fonctionnement pipe-line,
  3. de registres à décalage rapide (registres à barillet ou barrel shifter) : prédécalage (preshifter) avant traitement dans l'ALU et postdécalage (postshifter) sur le résultat.
En ce qui concerne les traitements, les principales caractéristiques que doivent présenter les processeurs de traitement du signal sont les suivantes :
  1. traitement de nombres codés en flottant, évitant les traitements en virgule fixe,
  2. existence d'instructions de multiplication-accumulation facilitant la programmation des convolutions,
  3. instructions pour le calcul d'un carré et d'une racine carrée,
  4. instruction de calcul d'inverse,
  5. adressage bit reverse et modulo N pour faciliter le balayage de tableau de données et le calcul de transformées de Fourier discrète par FFT,
  6. traitements 2D et des nombres complexes.

1. Unité de calcul MAC

La figure qui suit donne l'architecture (simplifiée) de l'unité de calcul "multiplication-accumulation" du processeur ADSP2101 de Analog Device(1). Ce processeur comporte trois unités séparées pour le calcul : l'unité arithmétique et logique, l'unité de "multiplication-accumulation" et l'unité de décalage.

fig.1. - L'unité MAC de l'ADSP 2101
Un bit d'état MV indique s'il y a eu un débordement dans le registre 8 bits MR2.

2. Traitement des TFD et adressage "bit reverse"

L'algorithme de calcul de FFT utilisé pour estimer la TFD utilise le renversement binaire des indices. Les processeurs de traitement du signal disposent en particulier de la possibilité d'obtenir directement la configuration bit reverse d'un indice d'un tableau de valeurs.

L'arithmétique bit reverse permet de gérer des buffers circulaires avec addition reverse (arithmétique modulo N).

Exemple : le TMS320C30 dispose d'un mode d'adressage permettant d'accéder à un tableau de N éléments dans un ordre bit reverse. Ce mode d'adressage indirect utilise comme pointeur un des registre ARn (n=0 à 7). Celui-ci reçoit l'adresse de base du tableau en mémoire et doit donc commencer à une adresse multiple de N. Le registre d'index IR0 reçoit N/2. La construction de l'adresse est alors notée : *ARn++(IR0)B

Si l'on suppose que N=8 et que l'adresse du tableau est donnée par AR1=1100 1000, les instructions successives *AR1++(IR0)B vont engendrer pour AR1 les valeurs suivantes :

AR1 = 1100 1000, 1100 1100, 1100 1010, 1100 1110, ...

On note le renversement binaire effectué sur les trois bits de poids faible. Considérons en exemple un renversement binaire(2) (bit reversal) sur un tableau. Celui-ci peut être réalisé de la façon suivante :

        LDI    @N,RC         ; N = taille de la FFT
SUB 1,RC ; on va de 0 à N-1
LDI @N, IR0
LSH -1,IR0 ; IR0=N/2
LDI @tab,AR0 ; adresse tableau
LDI @tab,AR1

RPTB boucle ; on répète la boucle
CMPI AR0,AR1 ; on ne permute que si AR0<AR1
BGE suite ; la première fois, on va à suite
;
LDF *AR0,R0 ; échange -------------------
|| LDF *AR1,R1 ; instruction parallèle
STF R0,*AR1
|| STF R1,*AR0 ; instruction parallèle -----
suite: NOP *AR0++
boucle: NOP *AR1++(IR0)B ; calcul adresse avec renversement

3. Calcul d'une convolution

Le calcul des convolutions est grandement facilité par l'existence de l'instruction de multiplication-accumulation. Celle-ci exécute l'opération S := S + x * y en un cycle. Ce type d'instruction qui était caractéristique des processeurs de traitement du signal se retrouve maintenant mis en oeuvre dans des processeurs standards en raison de l'émergence du multimedia (traitement de son et image). C'est en particulier le cas du PowerPC 601.

3.1. Cas du 56000

L'exemple ci-après est pris sur le microprocesseur Motorola 56000(3) Ce dernier est doté de deux mémoires de données internes appelées Xmemory et Ymemory et d'un multiplicateur dont les registres d'entrées sont notés X0, X1, Y0 et Y1. Le programme réalise une convolution Les données xi et les coefficients du filtre hi sont rangés en mémoire X et Y respectivement à partir d'un multiple entier de 2m où 2m>=N. A chaque registre Ri est associé un registre Mi dont le contenu joue sur le mode d'adressage : si Mi est nul l'adressage est fait en mode bit reverse, s'il est égal à $FFFF l'adressage est linéaire, sinon l'adressage se fait modulo (Mi)+1.

      mov      #N-1,m0       ; on initialise les m0 et m4
mov m0,m4 ; (registres modulo)
mov #xAdr,r0 ; r0 et r4 servent de pointeur
mov #hAdr,r4 ; dans les mémoires X et Y

; instruction parallèle : l'accumulateur A est mis à zéro et on ; transfère les deux premiers mots (xn et h0) dans les registres X0 et Y0 ; du multiplicateur clr a x:(r0)+,x0 y:(r4)+,y0 rep #N-1 ; on répète la multiplication/ ; accumulation N-1 fois mac x0,y0,a x:(r0)+,x0 y:(r4)+,y0

macr x0,y0,a ; dernière multiplication/accumulation ; assortie d'un arrondi sur le résultat

3.2. Cas du 320C25

Considérons le filtre RIF : La programmation de cette convolution donne lieu sur processeur Texas 320C25 aux instructions suivantes :
CNFP                 ; configure le bloc B0 en mémoire de progr.
LARP AR1 ; registre d'indirection = AR1
LRLK AR1,>3FF ; AR1 pointe sur la fin du bloc B1 (données)
; rangés dans l'ordre X(n) à X(n-N+1)
RPTK n ; n=N-1
MACD >FF00,*- ; on utilise un registre auxiliaire
; d'indirection. >FF00 = adresse des coeff.
; rangés de h(N-1) à h(0)
APAC ; derniere accumulation
Après chaque multiplication-accumulation la donnée pointée par le registre d'indirection (ici AR1) est décalée d'une case mémoire (adresse+1).

Considérons donc l'organisation suivante des données avant MACD :

Exemple d'exécution pour N=3 :

- Situation initiale :

- exécution des multiplications-accumulations :

La dernière instruction APAC effectue la dernière accumulation. On remarque que, du fait des décalages sur les données, on peut introduire un nouvel échantillon et relancer le filtrage.

4. Tables de constantes

Certains microprocesseurs ont en ROM des tables de conversion pour les codage en loi u ou A, ou des tables de valeurs de sinus et cosinus pour le calcul des transformées de Fourier, Hartley, ... Les microprocesseurs Motorola 56000 ou 96000 disposent de telles tables.

5. Communications

Les communications entre processeurs peuvent être effectuées :
  1. par lignes série rapides (processeurs faiblement couplés, loosely coupled processors),
  2. par le bus de la machine hôte,
  3. ou par bus dédié avec protocole (processeurs fortement couplés, tightly coupled processors).
Exemple du 320C30 : ce processeur est doté de possibilités de synchronisation entre processeurs ou d'accès à une mémoire commune. Pour ce faire, il dispose de deux lignes et et de cinq instructions permettant de lire (LDFI pour lecture d'un nombre flottant et LDII pour un entier), écrire (SDFI et STII) ou de se synchroniser (SIGI) :
  1. les cycles de lecture commencent par une mise à zéro de . La lecture effective s'effectue lorsque et sont à zéro. L'attente de ces deux signaux s'effectue par insertion de Wait States dans le cycle instruction. Le seul cas où les lignes et ne sont pas utilisées est le cas où l'accès se fait sur la mémoire interne. L'accès aux unités périphériques internes donne lieu aussi à synchronisation. LDFI et LDII sont interruptibles pendant l'attente sur , à la condition que soit à zéro. Ceci permet de se sortir de situations éventuelles d'interblocage (deadlocks).
  2. les cycles d'écriture commencent par une mise à 1 de . L'écriture a lieu lorsque la ligne passe à zéro. Les instructions STFI et STII sont indivisibles (ininterruptibles).
  3. le cycle de l'instruction SIGI commence par une mise à zéro de puis passe en attente jusqu'à ce que la ligne passe à 0. En fin de cycle, est mis à 1. SIGI est interruptible sous les mêmes conditions que LDII et LDFI. Il permet d'affectuer la synchronisation des traitements de deux processeurs directement connectés.
Il faut noter que la ligne peut être programmée directement par accès au registre IOF. Ainsi l'instruction OR 4,IOF force la ligne à 1.

Ces instructions permettent d'assurer une exclusion mutuelle dans l'accès à la mémoire partagée par réalisation de technique d'attente active ou de sémaphores.

6. Traitements arithmétiques

Une des tâches souvent répétées dans les algorithme de traitement de signal consiste à faire des conversions de nombres entiers ou virgule fixe en flottant et inversement.

La première opération, dans une conversion entier vers flottant, est la normalisation. Ainsi, chez Analog Devices, l'instruction norm permet-elle d'effectuer un décalage "vers la gauche" d'un nombre de fois égal au "nombre de bits de signe moins 1". Ce nombre est fourni par l'instruction exp (une autre instruction - block exponent adjust - facilite la recherche du plus grand exposant dans un ensemble de valeur : expadj).

Exemple :

SE = EXP AR0 (HI); charge le registre SE avec la valeur 
; de l'exposant
; (en fait sa valeur opposée) de AR0
SR = NORM SI (HI); fait la normalisation
Si au départ on a 1111 1100 1010 0000 (-86410), SE est chargé avec la valeur -5 et le résultat obtenu est 1001 0100 0000 0000 0000 0000 0000 0000.

Exemple("Analog Devices-ADSP-2100, Applications Handbook Vol.1") : un nombre codé en flottant simple précision au standard IEEE-754 a le format suivant :

<signe><exposant><mantisse>

correspondant à

<+/-><1.mantisse>2<exposant>-127

où <signe> est codé sur 1 bit, <exposant> sur 8 bits et <mantisse> sur 23 bits.

La représentation virgule fixe généralement utilisée est désignée par le sigle "1.15" soit 1 chiffre avant la virgule, qui correspond au bit de signe, et 15 chiffres après, le tout en complément à 2. Les nombres x ainsi codés correspondent à la plage de valeurs :

-0,1 ... 1 = -(1-2-15) <= x <= 1,0 ... 0 = 1

Le passage en flottant consiste à :

vf2flot : AY0=H#8000;          {cas du -1}
AY1=126; {pour le codage de l'exposant}
AR=AX0-AY0; {AX0 =? -1}
IF NE JUMP pasm1;
AR=H#BF80; {codage de -1}
SR=LSHIFT AR BY 0 (HI);
RTS;
pasm1: AR=PASS AX0;
AF=ABS AR;
IF NE JUMP pas0;
SR=LSHIFT AR BY 0 (HI);
RTS;
pas0: IF NEG JUMP negatif;
SI=H#0000; {bit de signe a 0}
JUMP suite;
negatif: SI=H#8000; {bit de signe a 1}
suite: AR=PASS AF;
SE=EXP AR (HI);
SR=NORM AR (HI);
AX1=SE;
AR=AX1+AY1; {exposant+126}
SR=LSHIFT SR1 BY +2 (HI); {bit de signe et bit cache a 0}
SR=LSHIFT SR1 BY -9 (HI); {champ signe et exposant}
SR=SR OR LSHIFT SI BY 0 (HI);
SR=SR OR LSHIFT AR BY 7 (HI);
RTS
Exemple : soit la valeur -0,510=1,100...0 en virgule fixe 1.15. Le traitement précédent donne :

7. Caractéristiques liées à l'architecture

7.1. Branchements retardés

Les instructions de branchement retardé permettent de résoudre en partie le problème des branchements dans les architectures pipe-line. Ces instructions forcent l'exécution des k instructions qui suivent le branchement de telle sorte que le pipe-line reste dans un état de fonctionnement régulier.

Exemple : le TMS320C40 est doté de trois instructions de branchement retardés : BcondD (branchement conditionnel) , BRD (branchement inconditionnel) et DBcondD (décrément et branchement conditionnel). Les trois instructions (k=3) qui suivent sont obligatoirement exécutées. Aucune d'elle ne doit être un branchement, au risque de laisser le pipe-line dans un état imprévisible.

7.2. Instructions parallèles

Il est possible de profiter pleinement du parallélisme des opérations dans une architecture pipe-line lorsque les instructions qui se suivent n'utilisent pas les mêmes registres. Ainsi, dans l'exemple du bit reverse donné précedemment, ces instructions sont indiquées, dans le langage d'assemblage, par deux barres verticales en début de ligne. En pratique ces deux instructions sont codées sur un seul mot de 32 bits où les deux sources et les deux destinations apparaissent.

Exemple : considérons la suite d'instructions suivante dans les microprocesseurs TMS320C30 ou TMS320C40 :

    LDI  *AR0,R0           ; LDI src1(INDIRECTION),dst1(REGISTRE)
|| LDI *+AR0(1),R1 ; LDI src2(INDIRECTION),dst2(REGISTRE)
La première instruction utilise une indirection sur le registre d'adresse AR0; la seconde une indirection avec pré-déplacement de 1 sur AR0. Ces deux instructions sont simultanément codées sur un même mot de 32 bits de la façon suivante :
31  | 29        | 24    | 21    | 18    | 15        | 10    | 7         | 2    
-------------------------------------------------------------------------------
1 1 | 0 0 0 1 1 | 0 0 0 | 0 0 1 | 0 0 0 | 0 0 0 0 0 | 0 0 0 | 1 1 0 0 0 | 0 0 0
-------------------------------------------------------------------------------
| op. | src1 | | src2 | mode | reg. | mode | reg.
-------------------------------------------------------------------------------
| | | | | dest2 | dest1
-------------------------------------------------------------------------------
|| | LDI | R0 | R1 | | *+AR0(1) | *AR0

Exemple : sur le même processeur :
    STI  R1,*AR0         ; STI src1(REGISTRE),dst1(INDIRECTION)
|| STI R4,*+AR1(IR1) ; STI src2(REGISTRE),dst2(INDIRECTION)
La première instruction utilise une indirection sur le registre d'adresse AR0; la seconde une indirection sur AR0 avec pré-indexation sur IR1.
31  | 29        | 24    | 21    | 18    | 15        | 10    | 7         | 2    
-------------------------------------------------------------------------------
1 1 | 0 0 0 0 1 | 0 0 1 | 0 0 0 | 1 0 0 | 1 0 0 0 0 | 0 0 1 | 1 1 0 0 0 | 0 0 0
-------------------------------------------------------------------------------
| op. | src1 | | src2 | mode | reg. | mode | reg.
-------------------------------------------------------------------------------
| | | | | dest2 | dest1
-------------------------------------------------------------------------------
|| | STI | R1 | | R4 | *+AR1(IR1) | *AR0

Exemple : sur le même processeur :
    STF  R0,*+AR0(1)     ; STF src1(REGISTRE),dst1(INDIRECTION)
|| STF R0,*AR0++(IR0) ; STF src2(REGISTRE),dst2(INDIRECTION)
La première instruction utilise une indirection sur le registre d'adresse AR0 avec pré-deplacement de 1; la seconde une indirection sur AR0 avec post-indexation sur IR0 et modification de AR0.
31  | 29        | 24    | 21    | 18    | 15        | 10    | 7         | 2       
-------------------------------------------------------------------------------
1 1 | 0 0 0 0 0 | 0 0 0 | 0 0 0 | 0 0 0 | 0 1 1 0 0 | 0 0 0 | 0 0 0 0 0 | 0 0 0
-------------------------------------------------------------------------------
| op. | src1 | | src2 | mode | reg. | mode | reg.
-------------------------------------------------------------------------------
| | | | | dest2 | dest1
-------------------------------------------------------------------------------
|| | STI | R0 | | R0 | *AR0++(IR0) | *+AR0(1)

Exemple : nous avons vu dans le DSP56000 un exemple d'instruction parallèle où l'on fait simultanément une mise à zéro de l'accumulateur A et deux transferts. Le codage de cette instruction se fait en un mot de 24 bits. Le pipe-line du DSP56000 est dit visible. Il faut prendre en compte les problèmes d'accès à la mémoire (il faut un cycle de plus) et de conflits de dépendance. Le pipe-line possède trois niveaux : fetch, decode, execute. Le calcul des adresses se fait pendant la phase de décodage.

1. Dans le premier cas, la séquence suivante :

      clr  a  x:(r0)+,y0
move x:(r3)+,x0
pose un problème d'accès à la mémoire X. La programmation doit en être :
      clr  a  x:(r0)+,y0
move x:(r3)+,x0
pour indiquer qu'on laisse une phase de retard.

2. Dans le second cas, une séquence telle que :

      move x0,r1
move x:(r1),a
provoque un conflit dû au fait que l'exécution du transfert x0->r1 et le calcul d'adresse x:(r1) se font dans la même phase. La séquence doit être programmée :
      move x0,r1
nop ; ou tout autre instruction n'entrant pas en
; conflit avec la suivante.
move x:(r1),a

7.3. Caches

Les caches des microprocesseurs de traitement du signal, avec la logique de gestion, sont généralement intégrés sur le chip du microprocesseur. Le cache de données n'est pas toujours présent. La présence de mémoire RAM sur le chip assure une rapidité d'accès suffisante sans avoir besoin d'un cache.

Exemple : le TMS320C40 est doté d'un cache de 128 mots de 32 bits. Il est organisé comme un cache à accès direct avec une ligne de 32 mots. Sa particularité provient du fait que la mise à jour se fait sur la base du mot et non de la ligne de 32 mots. Chaque mot est accompagné d'un bit de validité (ici appelé Present Bit).

fig.2 - Cache du DSP320C40
L'étiquette est comparée simultanément au contenu de quatre registres appelés Segment Start Address Registers. On a deux cas de miss :
  1. égalité avec un registre SSAi et P=0 : on charge le mot à partir de la mémoire,
  2. aucune égalité avec un registre SSAi :
    1. on choisit la ligne LRU,
    2. on met les 32 bits P de la ligne à 0,
    3. on modifie le registre SSAi,
    4. on charge un mot et on met le bit P correspondant à 1,
    5. on modifie la pile de gestion d'ancienneté.
L'algorithme de remplacement est LRU. S'il y a égalité entre les contenus de deux des registres c'est la ligne correspondant au MRU qui est utilisée. Il est possible de geler le fonctionnement du cache en positionnant le bit CFB (Cache Freeze Bit). En cas d'interruption le cache est automatiquement gelé. Pour pouvoir restituer l'état du bit CFB après traitement, celui-ci est automatiquement recopié dans le bit PCFB (Previous CFB) et restitué lors de l'exécution de l'instruction de retour d'interruption.


[Top] [Previous]  [Next]  [Summary]