Les processeurs de signaux numériques (DSP) sont des microprocesseurs spécialisés conçus pour les calculs numériques à grande vitesse, en particulier pour les tâches de traitement de signaux telles que l'audio, la vidéo et les communications. La programmation de ces processeurs nécessite une compréhension approfondie de leur architecture et l'utilisation du langage de montage pour une performance optimale.

Comprendre l'architecture DSP

Avant de plonger dans la programmation d'assemblage, il est crucial de comprendre l'architecture des DSP. La plupart des DSP disposent de composants spécialisés qui les distinguent des CPU à usage général, permettant le traitement en temps réel de flux de données continues.

Harvard Architecture et bus multiples

Contrairement aux machines von Neumann, les DSP emploient généralement une architecture Harvard modifiée [ avec des espaces séparés de programmes et de mémoire de données. Cette conception permet un accès simultané aux instructions et données sur plusieurs bus. De nombreux DSP comprennent trois bus internes ou plus : un bus de programme, un bus de lecture de données et un bus de écriture de données. Ce parallélisme est critique pour exécuter des opérations multi-accumulations (MAC) en un seul cycle.

Unités multiplis-Accumul (MAC)

Le cœur de tout DSP est son unité de multiplicateur-accumulateur dédiée. Un MAC effectue dans un cycle d'horloge, alors qu'un CPU à usage général peut nécessiter plusieurs cycles. Les DSP modernes comprennent souvent plusieurs unités MAC pour exploiter le parallélisme de niveau d'instruction.

Bouffers circulaires et adresse modulo

Les algorithmes de traitement des signaux fonctionnent fréquemment sur des fenêtres coulissantes de données. Les DSP fournissent des tampons circulaires[ supportés par l'adressage modulo matériel. Le programmeur configure une adresse de démarrage tampon et la longueur, et le matériel d'adressage se enveloppe automatiquement lorsque le pointeur atteint la fin. Cette fonction élimine le dépassement des contrôles de limites en boucles, ce qui le rend essentiel pour les implémentations de filtres et les papillons FFT.

Modes d'adressage spécialisés

Les DSP supportent plusieurs modes d'adressage au-delà de la norme directe et indirecte : adressage inversé par bits[ pour la réordonnancement des FFT, [adressage circulaire[ comme mentionné, et enregistrement-indirect avec post-incrément/décret. Ces modes permettent des modèles d'accès zéro-overhead aux données qui correspondent aux besoins des algorithmes communs.

Bases linguistiques pour les PSD

Le langage de montage permet un contrôle de bas niveau sur le matériel DSP. Bien que les compilateurs de haut niveau se soient améliorés, les boucles internes critiques dans le traitement des signaux sont toujours codées à la main pour obtenir un débit maximum.

  • Enregistrements: Les DSP possèdent généralement des fichiers de registres spécialisés: registres de données à usage général, registres d'accumulateurs (souvent plus larges que les registres de données pour prévenir les débordements), registres de pointeurs pour l'adressage et registres de contrôle/statut.
  • Instructions:[ Les instructions communes comprennent (charge/magasin), , , , , et les branches conditionnelles. De nombreuses instructions DSP peuvent être exécutées en parallèle avec la prochaine instruction, une fonctionnalité souvent indiquée par une barre parallèle dans la syntaxe d'assemblage.
  • Formats d'instruction:[ Les mots d'instruction DSP sont souvent de longueur fixe pour simplifier le décodage. Certaines familles utilisent des instructions de longueur variable pour réduire la taille du code.
  • Slots de relais: Les DSPs pipelines exposent souvent slots de relais—l'instruction après l'exécution d'une branche avant que la branche ne prenne effet. Les programmeurs doivent remplir ces fentes avec le travail utile (optimisation de la fente de retard de la branche).
  • Loop Constructs: La boucle matérielle (boucles zéro-hors-tête) est une caractéristique des DSP. Des instructions comme (repeat), (boucle de blocs) permettent à un bloc de code d'exécuter un nombre défini de fois sans compteurs de boucles logicielles, en économisant des cycles.

La maîtrise de ces bases est essentielle pour écrire des routines d'assemblage efficaces pour les applications DSP. Un bon point de départ est de travailler à travers le tutoriel d'assemblage dans la fiche technique DSP ou le guide du programmeur officiel pour votre architecture choisie.

Mise en place d'un environnement de développement du PSD

La plupart des fabricants offrent des environnements de développement intégrés (IDE) qui simplifient le déroulement du travail.

Assembleur et Linker

Les principales caractéristiques à comprendre comprennent directives d'assemblage[ (p. ex., , , , ) qui contrôlent le placement du code et la définition des données. Le linker combine des modules d'objets et résout des références externes, produisant une image exécutable. Les fichiers de commande de linker définissent des cartes de mémoire et le placement de sections, ce qui est critique pour respecter les contraintes de temps.

Simulator et émulateur

Avant de déployer sur le matériel réel, utilisez un simulateur d'instructions pour tester le code. Les simulateurs offrent des capacités d'exécution et de profilage précises en cycle, vous permettant de mesurer les goulets d'étranglement de performance.

Familles et outils populaires du PSD

  • Texas Instruments TMS320C600/C5000: Utilisez le code Compositeur Studio (CCS) IDE avec compilateur/assembleur C6000 ou C5000. Une documentation détaillée est disponible sur le portail DSP de TI.
  • Dispositifs en analog SHARC ou ]Blackfin:[Utilisez CrossCore Embedded Studio (CCES) pour la programmation d'assemblage.Voir Dispositifs en analog DSP produits.
  • NXP StarCore[ ou MSC815x: Utilisez CodeWarrior ou des outils équivalents.
  • CEVA XC/TL:[ Outils de simulation et de débogage disponibles dans l'environnement de développement de CEVA.

Pour l'apprentissage, le module d'évaluation TI TMS320C5515 (EVM) est un choix populaire en raison de son faible coût et de sa bibliothèque logicielle complète.

Techniques d'optimisation dans l'assemblage DSP

La programmation efficace des assemblages DSP implique plusieurs techniques qui ont une incidence directe sur les performances en temps réel.

Pipeline logicielle

Le logiciel de pipeline réarrange les itérations de boucles de sorte que plusieurs itérations se chevauchent en exécution. Le prolog de boucle, le noyau et l'épilog sont construits pour maintenir les unités fonctionnelles occupées à chaque cycle. Par exemple, dans une boucle de filtre FIR, une itération peut charger le coefficient suivant pendant que le MAC précédent est terminé. Cette technique est particulièrement efficace sur VLIW (Très Long Instruction Word) DSPs comme le TMS320C6000.

Déroulement de boucle

Le dérouillage réduit les frais généraux de boucle (branches et mises à jour pointeuses) en répliquant plusieurs fois le corps de boucle. Avec le looping matériel, le déroulement peut également permettre un meilleur emballage d'instruction. Cependant, le déroulement augmente la taille du code, de sorte qu'il ne devrait être appliqué qu'aux boucles intérieures critiques de performance qui occupent une petite partie du programme.

Mouvement efficace des données

Minimisez les instructions de chargement/stockage en conservant les données fréquemment utilisées dans les registres. Les DSP ont souvent un nombre limité de registres, de sorte que l'attribution des registres est essentielle. Utilisez rotation de registre ou des fichiers de registre circulaires lorsque disponibles.

Utilisation des unités MAC

Utilisez des instructions multi-accumulation pour filtrer, convolution, corrélation et transformées rapides de Fourier. Assurez-vous que les données et les coefficients sont correctement alignés de façon à ce que MAC puisse être émis chaque cycle. Sur de nombreux DSP, une instruction MAC peut être jumelée avec une double charge ou stocker dans le même mot d'instruction, obtenant deux résultats par cycle.

Utilisation de tampons circulaires

Pour les algorithmes qui traitent les données de streaming (par exemple, filtres adaptatifs, boucles verrouillées en phase), configurer des tampons circulaires en mémoire avec des adresses modulo matérielles. Ceci élimine les contrôles de limites explicites et rend le corps de boucle plus rapide et prévisible. Configurer l'adresse de démarrage du tampon et la longueur dans les registres de l'unité de génération d'adresses spéciales (AGU).

Instruction Calendrier et mise en bundling

Sur les DSP VLIW et super-scallaires, l'ordre des instructions est important. Disposer des instructions pour éviter les décrochages de pipelines en raison des dépendances de données. De nombreux assembleurs permettent une exécution parallèle explicite avec des jetons .

LDW .D1T1 *A0++, A1 ; load data into A1
|| MPY .M1 A1, A2, A3 ; multiply A1 and A2 into A3 (parallel issue)

Unir des opérations indépendantes dans le même paquet d'exécution maximise le débit.

Exemple pratique : Mettre en place un filtre FIR

Envisager de mettre en place un filtre de réponse à l'impulsion Finite (FIR) en montage. Voici l'exemple classique de l'enseignement DSP. Les étapes clés comprennent :

  • Configuration d'un tampon circulaire pour l'historique de l'échantillon d'entrée (ligne delay).
  • Chargement des échantillons d'entrée et des coefficients de filtration dans les registres.
  • Effectuer des opérations de cumul multi-accumulation pour chaque échantillon.
  • Stocker la sortie filtrée dans la mémoire.

Pseudo-Assembly pour filtre TMS320C55x FIR (N robinets)

En supposant un tampon de longueur N, un tableau de coefficients , et un nouvel échantillon dans :

  1. Initialiser le pointeur vers le début du tampon circulaire (p. ex. ] comme pointeur tampon, comme taille du tampon).
  2. Écrivez un nouvel échantillon dans le tampon à la position actuelle (enveloppe de poignées d'adressage de model).
  3. Réglez le nombre de boucles à N-1 ( boucle hardware).
  4. Dans chaque itération : charger un échantillon de données et un coefficient, puis effectuer la MAC.
  5. Après la boucle, entreposez l'accumulateur pour la sortie et mettez à jour le pointeur.

Sur le C55x, cela peut être fait avec une seule répétition (RPT) ou une répétition par blocs (RPTB). Instructions clés : avec adresse circulaire, et pour la gestion de l'accumulateur. Le code réel variera selon les dimensions d'exploitation (16-bit ou 32-bit) et les exigences de saturation.

Notes d'optimisation

Pour obtenir un MAC par cycle, assurez-vous que les accès aux données et aux coefficients ne sont pas en conflit avec les bus internes. Si le DSP a deux espaces de mémoire de données (p. ex., mémoire séparée pour les coefficients et les données), placez-les dans différents blocs de mémoire pour permettre des charges parallèles.

Pour les filtres à ordre supérieur, envisager de décomposer le filtre en sections parallèles (mise en œuvre en polyphase) ou en utilisant l'arithmétique distribuée.

Applications avancées: Filtres IIR et FFT

Filtres à réponse à l'impulsion à l'infini (IRI)

Les filtres IIR nécessitent une rétroaction des sorties antérieures, ce qui crée des dépendances de données qui dégradent les performances des pipelines.

  • Utiliser la forme directe I ou transposer les structures de forme directe II pour minimiser les variables d'état.
  • Combiner les opérations de MAC en sections biquad.
  • Pré-compenser des sommes partielles pour réduire la latence.

Comme la stabilité est une préoccupation dans les DSP à point fixe, la manipulation des débordements (saturation ou échelle) doit être soigneusement intégrée dans le code de montage.

Transformateur de Fourier rapide (FFT)

Le FFT est l'épine dorsale de l'analyse spectrale et des modems OFDM. L'optimisation de l'assemblage pour FFT comprend:

  • Utilisation de adressage inversé par bits[ pour la réorganisation des entrées.
  • Logiciel de pipeline du noyau papillon.
  • Utilisation de tables de facteur en twiddle stockées dans une banque de mémoire séparée.
  • Utilisation de la multiplication complexe avec des instructions spécifiques au DSP (p. ex. ou avec des nombres complexes).

Un papillon FFT radix-2 décimation-in-time peut être écrit en moins de 10 cycles d'instruction sur un DSP VLIW moderne. Pour y parvenir nécessite une connaissance intime du pipeline et une affectation de registre soigneuse. De nombreux fabricants fournissent des routines de bibliothèque FFT optimisées; les étudier est une excellente façon d'apprendre les techniques de codage avancées.

Pièges et conseils de débogage communs

Même les développeurs expérimentés rencontrent des bugs subtils dans l'assemblage DSP. Voici des problèmes communs et comment les éviter:

  • Dangers liés à la tuyauterie :[ Insérer les NOP seulement si nécessaire; utiliser la pipeline du logiciel pour éliminer les décrochages.
  • Configuration du tampon circulaire incorrecte:[ Vérifiez que la taille du tampon est une puissance de deux si nécessaire par l'adressage du module matériel. Vérifier l'alignement de l'adresse de départ.
  • Overflow:[ Les DSP fournissent des bits de protection d'accumulateur, mais ils peuvent encore déborder dans des cas extrêmes. Utilisez des instructions de saturation ou de graduation pour éviter toute distorsion.
  • Alignement de mémoire:[ De nombreux FSD exigent que les accès 32 bits ou 64 bits soient alignés sur leurs limites naturelles.
  • Manipulation intermittente:[ Enregistrer et restaurer tous les registres utilisés dans les routines de service d'interruption (RSI), y compris les octets d'extension d'accumulateur. Utilisez le nombre minimum d'instructions pour obtenir une réponse en temps réel acceptable.
  • Outils de débogage:[ Utilisez la vue de démontage[ dans l'IDE pour vérifier que l'assembleur a généré le code de machine attendu. Utilisez points de rupture avec condition pour piéger des valeurs de registre spécifiques. Pour le débogage en temps réel, utilisez un analyseur logique sur le bus mémoire externe pour observer le mouvement des données.

Conclusion

La programmation des processeurs DSP en langage de montage offre un contrôle et une efficacité inégalés pour les tâches de traitement des signaux. Comprendre l'architecture, maîtriser les instructions de montage et appliquer des techniques d'optimisation sont essentiels pour développer des applications de haute performance.Avec les bons outils et connaissances – notamment la connaissance de l'architecture Harvard, les unités MAC, les tampons circulaires et la pipeline logicielle – les étudiants et les éducateurs peuvent exploiter tout le potentiel de la technologie DSP pour diverses applications du monde réel telles que les codecs audio, le traitement radar, les radios définies par logiciel et le contrôle moteur.