Visiteurs :
Les DSP (Digital Signal
Processors) sont,
comme leur nom l'indique, des processeurs dédiés au traitement des signaux
numériques.
Au sommaire |
Les particularités de ces puces, par rapport aux processeurs généraux (Intel, Cyrix, AMD...) sont, en général :
Ces différents atouts ne
se retrouvent pas sur tous les DSP. Les DSP bas de gamme ne disposant, en
général que d'une architecture Harvard, d'instructions adaptées et de mode d'adressage
à inversion de bits.
Ce qui distingue deux DSP différents sont, pour les caractéristiques principales :
Le choix d'un DSP pour une application particulière sera conditionné par le coût relatif du DSP par rapport au BOM (Bill of Material) de l'application, et de la complexité des opérations à effectuer. Il est clair qu'un DSP introduit dans un appareil grand public est plus souvent à virgule fixe. Si les coûts de développement d'une application en virgule fixe sont beaucoup plus importants qu'un design en virgule flottante, les volumes viendront amortir cette dépense... Il faut l'espérer.
Pour ce qui à trait à la
vitesse, on peut se poser la question en ces termes:
"Quel est le flux de
données maximum à traiter ? Puis-je déplacer le problème de vitesse en problème
de mémoire ?"
En effet, pour certaines
applications, on n'aura pas besoin d'une grande vitesse, à condition d'avoir de
la mémoire. Les algorithmes seront plus simples. Il suffit de prendre l'exemple
suivant pour se rendre compte.
Pour implémenter un
algorithme de traitement de signal adaptatif, nous pouvons utiliser un
algorithme simple stable du type LMS qui ne nécessite pas de grandes ressources
en terme de calcul. En revanche, un nombre élevé de coefficients sera
nécessaire pour parvenir à converger rapidement. En utilisant un algorithme
plus complexe du type RMS, le nombre de coefficients du filtre sera beaucoup
moins élevé, mais les quantités de calculs par coefficients seront plus
importantes.
Le travail du concepteur sera
alors dans le choix d'un compromis, et éventuellement, d'astuces de
programmation - voire même en assembleur - pour parvenir à ses fins en
réduisants les coûts, en fonction de la stratégie générale de son entreprise.
Deux familles principales de DSP se partagent le marché. Les premiers sont les DSP à virgule fixe, qui nécessitent une attention accrue du développeur lors de la programmation. Les seconds sont les DSP à virgule flottante, aisés d'utilisation mais plus onéreux.
Dans un
DSP à virgule fixe, c'est au programmeur de connaître à tout instant l'état de
ses opérateurs. Supposons que nous voulions faire le produit de deux nombres a
et b.
Les questions que devra se
poser le programmeur sont :
1. Quelles
sont les dynamiques réelles des nombres a et b ?
Réponse : - 3.5 < a
< 3.5 et 0 < b < 100
2. Quelle
est la dynamique du résultat P = ab ?
Réponse : -350 < P <
350
3. Quelle
est la dynamique de mon DSP ?
Réponse : 16 bits
4. Quelle
est la précision que je désire ?
Réponse : Le maximum à
condition de coder mes nombres sur 16 bits.
5. Alors ?
Quelles solutions ?
Réponse :
Et bien, tout d'abord, a peut-être codé en format Q2.13, b peut-être codé en format Q7.8.
Qi.f signifie : coder la partie entière du nombre avec i bits, coder la partie fractionnaire avec f bits. i+f=15, il reste ainsi 1 bit pour coder le signe.
L'exemple ci-dessus représente un codage Q7.8 pouvant coder des nombres compris entre -128 et +127.99609375.
Pour retrouver ce résultat, il suffit d'appliquer la formule suivante :
avec i=7 et f=8.
3 peut être codé avec 2 bits, il reste donc 13 bits pour coder la partie fractionnaire de a. 100 peut être codé sur 7 bits, laissant ainsi 8 bits pour la partie fractionnaire de b.
Une multiplication d'un nombre codé en Qi.f par un nombre codé en Qi'.f' donne un résultat dont le codage est Qi+i'.f+f' avec...2 bits de signe.
L'accumulateur d'un DSP
sur D bits a une longueur minimale de 2D bits. Ainsi, dans notre exemple, le
résultat de la multiplication sera en Q9.21.A présent, il est judicieux
de se référer à la condition 4 : à savoir, avoir le maximum de précision tout
en restant sur 16 bits.350 doit être codé au minimum sur 9 bits. Il reste ainsi
6 bits pour coder la partie fractionnaire du résultat.
Application
numérique :
Prenons a = 3.5 codé 0 1 1 . 1 0 0 0 0 0 0 0 0 0 0 0 0 en Q2.13 et b = 70.25 codé 0 1 0 0 0 1 1 0 . 0 1 0 0 0 0 0 0 en format Q7.8. La multiplication binaire donnera le résultat suivant sur 32 bits : ab = 0 0 0 1 1 1 1 0 1 0 1 . 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 en format Q9.21. On retrouve ainsi ab = 245.875. On ne stockera que les 9 bits de partie entière [bit29 … bit21] et les 6 bits les plus significatifs de la partie fractionnaire, i.e. [bit 20…bit 15] en format 16 bits Q9.6. Avec le bit de signe.
Au bout du compte, la précision que l'on pourra obtenir, en stockant le résultat sur 16 bits, sera : -512 < P < +511.984375.
Sur un DSP à virgule flottante, les calculs sont transparents pour l'utilisateur. Les temps de développement sont réduits de façon conséquente. Les nombres sont codés sous la forme :
Signe Exposant Mantisse, généralement sur 32 à 40 bits.
Ainsi, la dynamique est bien meilleure ! Mais les opérations effectuées par les circuits (hardware) sont beaucoup plus complexes qu'avec un DSP à virgule fixe. Ceci implique que les DSP à virgule flottante sont vendus à des prix bien supérieurs aux fixes...
Les projets impliquant des
DSP à virgule flottante nécessitent soit de grandes capacités de calcul, soit
une grande précision, pour des volumes de production peu importants, ou des
prix de ventes élevés. Les principaux consommateurs de DSP à virgule flottante
sont les militaires et les grands systèmes de télécommunications.
Voici quelques conseils de programmation de DSP :
Les DSP sont la plupart du temps impliqués dans des applications temps réel. Les programmes et les tâches doivent ainsi souvent être optimisés pour réduire les charges CPU...et, au besoin (marketing) ajouter le maximum de fonctionnalités.
Ainsi, le programmeur cherchera à réduire les instructions dans son programme, utilisant le minimum de périodes d'horloge.
Pour cela il évitera :
Il veillera à :
Eviter les tests et les branchements est certes difficile, mais il existe souvent des astuces permettant de ruser d'une façon habile. Par exemple, sur le Motorola 563xxx, l'instruction MOVE peut être conditionnée par le registre d'état, sans nécessiter de temps de cycle superflu.
Il reste que chaque DSP a sa propre philosophie, qu'il faut appréhender avec un peu de temps.
Adaptyv: site consacré au traitement du signal
Un article remarquable de Laurent Battista