Un Processeur de signal numérique (de l'anglais « » DSP), qu'on pourrait traduire par « processeur de signal numérique », « processeur de traitement de signal numérique » ou « processeur de traitement numérique de signal ») est un microprocesseur optimisé pour exécuter des applications de traitement numérique du signal (filtrage, extraction de signaux) le plus rapidement possible.

Les DSP sont utilisés dans la plupart des applications du traitement numérique du signal en temps réel. On les trouve dans les modems (modem RTC, modem ADSL), tout type d'appareil audio électronique, les téléphones mobiles, les appareils multimédia (lecteur MP3), les récepteurs GPS… Ils sont également utilisés dans des systèmes vidéo, les chaînes de traitement de son, partout où l'on reçoit un signal complexe que l'on doit modifier à l'aide du filtrage. Au début des années 1990, ils avaient été utilisés dans certains ordinateurs comme le NeXT Cube et l'Atari Falcon.

Traitement numérique du signal

Le traitement numérique du signal implique la réalisation de nombreuses opérations mathématiques. En comparaison, un logiciel de traitement de texte ou une base de données va plutôt passer son temps à manipuler des données en mémoire. Cela implique que des ordinateurs conçus pour la bureautique ou d'autres applications générales ne sont pas optimisés pour exécuter des algorithmes de traitement du signal, comme le filtrage numérique ou la réalisation d'une analyse de Fourier.

Manipulation de données Calculs mathématiques Applications typiques Traitement de texte Base de données Tableur Système d'exploitation Traitement numérique du signal Contrôle de vitesse Simulation scientifique Simulation électronique Opérations principales Mouvement de données (A → B) Test de condition (si A=B alors …) Addition (A + B = C) Multiplication (A x B = C)

En ce qui concerne les filtres, les DSP en simplifient grandement la réalisation pour plusieurs raisons : résultat prédictible et hautement répétable (caractéristique des circuits numériques, par opposition aux circuits analogiques) ; nombre de composants externes réduit ; changement de filtre dynamique par simple programmation ; filtrage à phase linéaire.

Instructions arithmétiques

Un DSP fournit des instructions usuelles comme la multiplication, l'addition, la soustraction Mais, le jeu d'instructions d'un DSP est aussi optimisé de façon à exécuter des opérations très courantes dans les algorithmes de traitement de signal les plus usuels.

Par exemple, de nombreux algorithmes de traitement du signal ont besoin d'effectuer des multiplications suivies d'une addition. Les DSP accélèrent ce genre de calcul en fournissant des instructions capables de multiplier deux nombres et d'en additionner un troisième en une seule fois (fonction très utilisée dans les calculs d'asservissement et de filtrage). L'instruction de ce type la plus connue est l'instruction . D'autres instructions similaires existent, comme l'instruction . Les DSP sont capables d'effectuer ces opérations en un seul cycle d'horloge. Certains modèles sont même capables de réaliser plusieurs de ces opérations en un cycle d'horloge.

La majorité des DSP calculent exclusivement avec des nombres entiers. L'absence d'unité arithmétique en nombre flottant rend le composant meilleur marché tout en permettant une grande vitesse de traitement des données. Un additionneur entier est en effet beaucoup plus simple qu'un additionneur à virgule flottante. Les nombres entiers permettent d'obtenir une précision suffisante pour la plupart des applications.

Cependant, certains DSP possèdent des unités de calcul en virgule flottante comme le TMS320C67x ou le ADSP-TS20x. Des applications scientifiques ou, d'une manière générale, des applications qui nécessitent une grande précision relative des résultats ou une large dynamique des valeurs peuvent imposer le choix d'un DSP à virgule flottante.

Les instructions de manipulation de bit sont aussi très courantes. Ces instructions servent à manipuler la représentation binaire des nombres traités par le processeur. Elles rassemblent des instructions bit à bit comme des ET, OU, NOT bit à bit, mais aussi des décalages, des rotations, des instructions de permutation de bits, et bien d'autres.

Les DSP les plus récents incorporent des instructions SIMD, capables d'effectuer une même opération sur plusieurs données indépendantes à la fois. Ces instructions très utiles dans le traitement de signal, dont la plupart des algorithmes doivent manipuler des tableaux, qui sont des structures de données linéaires, dans lesquelles on effectue souvent des parcours répétitifs en traitant chaque donnée plus ou moins indépendamment. La ligne de démarcation entre les DSP et les microprocesseurs à usages généraux n'est pas toujours claire, ces derniers ayant incorporé ces instructions depuis un moment. Ainsi par exemple, l'extension MMX des processeurs Pentium MMX comprend, selon Intel,

Les DSP sont majoritairement des processeurs d'architecture VLIW.

Arithmétique saturée

La représentation des résultats et leur précision jouent un rôle essentiel dans la majorité des algorithmes de traitement de signal. Et les DSP doivent être conçus en conséquence. Pour donner un exemple, ceux-ci doivent gérer les dépassements d'entier de plusieurs façons différentes.

Il arrive qu'un calcul donne un résultat qui demande plus de bits que disponible pour être représenté. Par exemple, si un processeur a des registres de , il ne pourra pas stocker un nombre comme , qui a besoin de . Ce genre de situation s'appelle un dépassement d'entier. Sur les processeurs généralistes, ces situations sont gérées via l'arithmétique modulaire. Pour faire simple, le résultat stocké dans les registres sera identique au vrai résultat, à part que les bits de poids fort (les bits en trop) seront perdus. Cela a un défaut majeur : l'addition (ou la multiplication) de deux nombres très grands peut donner un nombre très petit. Et cela peut donner des résultats assez bizarres : un son trop fort peut devenir soudainement très faible au lieu de saturer (mais inaudible car bien trop courte).

Pour éviter cela, les DSP permettent de gérer ces situations différemment en utilisant l'arithmétique saturée. Avec cette arithmétique, si un résultat devient trop grand pour être stocké dans un registre, le résultat est arrondi à la plus grande valeur que peut contenir ce registre.

Les DSP peuvent gérer les dépassements d'entier des deux façons. La manière de réagir peut être précisée par la valeur de certains bits, placés dans certains registres du processeur, comme pour d'autres paramètres. Une autre façon de faire aurait été de fournir les instructions de calcul en double : une version qui gère la situation avec l'arithmétique modulaire, et une autre avec l’arithmétique saturée. Mais cela aurait eu des désavantages, entre autres demander de doubler le nombre d'instructions.

Pour plus d’efficacité dans certaines applications numériques, les DSP peuvent gérer nativement un format de données spécial : les nombres flottants par blocs. Comme leur nom l’indique, il s'agit de nombres flottants, c'est-à-dire de nombres à virgules dont le nombre de décimales après la virgule peut varier. Ceux-ci sont représentés en mémoire sous la forme d'un bit de signe, d'une mantisse, et d'un exposant.

Dans certains cas, il arrive que les nombres flottants à manipuler dans différents calculs aient tous le même exposant. Les nombres flottants par blocs permettent de mutualiser cet exposant entre plusieurs nombres flottants. L'exposant est ainsi stocké une seule fois en mémoire, et n'est pas dupliqué. Par exemple, s'il faut encoder flottants dans ce format, il faudra utiliser un mot mémoire pour l'exposant, et pour les mantisses et les signes de chaque nombres. Avec des flottants normaux, il faudrait utiliser mémoires pour les mantisses et les signes, et pour les exposants.

Bien sûr, nos DSP supportent des instructions pour ces flottants par blocs. Ils contiennent notamment des instructions de calcul sur de tels flottants. Ils contiennent aussi une instruction pour charger l'exposant dans un registre, les calculs effectués dans ce format sont alors automatiquement effectués avec cet exposant. On trouve aussi des instructions de conversions entre les divers formats de flottants.

Les DSP sont aussi fortement optimisés pour exécuter des boucles le plus rapidement possible. En effet, il n'est pas rare que les programmes de traitement du signal utilisent des boucles, notamment pour parcourir des tableaux. Accélérer ces boucles est donc un enjeu majeur de la conception des DSP.

Pour accélérer ces boucles, les DSP fournissent des instructions spéciales, capables d'effectuer un test et un branchement en un seul cycle d'horloge.

Gestion du compteur de boucle

Les DSP sont capables de gérer des boucles FOR en un seul cycle d'horloge. Ces boucles s’exécutent un nombre fixé de fois, fixé par un indice. Cet indice est incrémenté ou décrémenté à chaque itération de la boucle. Nos DSP possèdent des instructions capables d'effectuer un branchement, ainsi qu'une décrémentation / incrémentation de cet indice. Pour faciliter l'implémentation de ces instructions, cet indice est souvent placé dans des registres spécialisés, dont le seul rôle est de stocker ces compteurs.

Instructions auto-répétantes

Autre fonctionnalité d’accélération des boucles : les instructions auto-répétantes. Dans certains cas, il n'est pas rare que les boucles d'un programme ne fassent s'appliquer une seule et unique instruction sur tous les éléments d'un tableau. C'est par exemple le cas pour l'addition de tous les éléments d'un tableau. Ou encore, la multiplication de tous les éléments d'un tableau entre eux.

Certains DSP sont capables d'effectuer des boucles en une seule instruction. Ces instructions effectuent cette opération, ainsi que toutes les instructions de gestion de la boucle en un seul cycle d'horloge. Qui plus est, elles se répètent automatiquement toutes seules, tant qu'elles ne rencontrent pas la condition de sortie de boucle.

Pour gagner en performance, cette instruction est stockée dans une petite mémoire temporaire, afin d'éviter d'avoir à charger celle-ci depuis la mémoire à chaque exécution (chaque tour de boucle).

Cette fonctionnalité a parfois été améliorée en permettant d'effectuer cette répétition non seulement sur des instructions uniques, mais aussi sur de petites suites d'instructions. Pour ce faire, ils peuvent utiliser une petite mémoire cache pour exécuter de petites boucles rapidement et sans accéder à la mémoire. Cette mémoire a souvent une taille limitée à quelques instructions : environ.

Modes d'adressages spécialisés

Les DSP supportent souvent des modes d'adressages assez particuliers, qu'on ne retrouve pas sur les autres jeux d'instructions. Ces modes d'adressages sont spécialisés dans des situations qu'on ne trouve que dans le traitement de signal.

Indirect à registre avec post ou pré-incrément/décrément

vignette|Adressage indirect à registre post-incrémenté.

Les données manipulées par nos DSP sont très souvent rassemblées dans des tableaux, qui sont parcourus du début à la fin (ou de la fin vers le début). Pour accélérer ces parcours de tableaux, les DSP incorporent des modes d'adressages spécialisés. Ils utilisent notamment le mode d'adressage post-incrémenté (décrémenté). Avec ce mode d'adressage, l'adresse de l’élément du tableau à lire ou écrire est stockée dans un registre. À chaque fois qu'une instruction accède à l'adresse contenue dans ce registre, cette adresse est incrémentée ou décrémentée de façon à pointer sur le prochain élément dans le tableau. Ce mode d'adressage permet d'effectuer cette incrémentation ou décrémentation automatiquement. Ils implémentent aussi une variante de ce mode d'adressage dans lequel l'incrémentation ou décrémentation s'effectue avant l'utilisation effective de l'adresse.

Adressage Modulo