Apport de la modélisation et de la synthèse haut niveau dans la
Transcription
Apport de la modélisation et de la synthèse haut niveau dans la
N o d'ordre : 2007TELB0029 Thèse présentée à l'École Nationale Supérieure de Télécommunications de Bretagne en habilitation conjointe avec l'Université de Bretagne Sud pour obtenir le grade de : Docteur de l'ENST Bretagne Mention : Sciences pour l’Ingénieur par Erwan Piriou Apport de la modélisation et de la synthèse haut niveau dans la conception d'architecture exible dédiée aux turbocodes en blocs Soutenue le 31 janvier 2007 devant la commission d'Examen : Composition du Jury : E. MARTIN, Professeur des Universités à l'UBS, président E. CASSEAU, Professeur des Universités à l'ENSSAT, rapporteur J.L. DANGER, Directeur d'études à l'ENST, rapporteur M. JEZEQUEL, Directeur d'études à l'ENST-Bretagne, directeur de thèse J.F. HELARD, Professeur des Universités à l'INSA de Rennes, examinateur C. JEGO, Maître de conférence à l'ENST-Bretagne, examinateur P. ADDE, Directeur d'études à l'ENST-Bretagne, invité Remerciements Ce travail de thèse a été réalisé à l’ENST-Bretagne au sein du département électronique et effectué dans le cadre du projet régional PALMYRE. Je tiens à exprimer, en premier lieu, toute ma reconnaissance et ma sympathie à Monsieur Michel Jézéquel, directeur d’étude et responsable scientifique du département électronique de l’ENSTBretagne, pour m’avoir accueilli au sein du département et pour avoir accepté d’être mon directeur de thèse. Je le remercie également pour les conseils qu’il m’a prodigués. Je tiens à remercier Monsieur Christophe Jégo, Maı̂tre de conférence à l’ENST-Bretagne, pour la qualité de son encadrement et sa disponibilité. Ce fut un plaisir de travailler avec lui et d’échanger différents points de vue tout au long de ces trois années. D’ailleurs, ce travail de thèse n’aurait pu voir le jour sans son soutien exemplaire et ses conseils éclairés. J’espère que de futures collaborations seront envisageables. Je tiens également à remercier Monsieur Patrick Adde, directeur d’étude à l’ENST-Bretagne, pour son aide, ses remarques pertinentes et m’avoir fait bénéficier de son expérience dans la conception de circuit. Je voudrais également exprimer ma gratitude à toutes les personnes qui m’ont fait l’honneur de participer à ce jury de thèse : – M. Emmanuel Casseau, professeur à l’École Nationale Supérieure de Sciences Appliquées et de Technologie et M. Jean-Luc Danger, directeur d’étude à l’École Nationale Supérieure des Télécommunications, pour l’attention qu’ils ont accordée à la lecture de ce mémoire et pour avoir bien voulu en être les rapporteurs. – M. Eric Martin , professeur à l’Université de Bretagne-Sud, et M. Jean-François Hélard, professeur à l’Institut National des Sciences Appliquées de Rennes, pour l’intérêt qu’ils ont porté à ce travail en tant que membres du jury. J’adresse mes remerciements aux collègues du département électronique de l’ENST-Bretagne avec qui j’ai partagé de bons moments et pour l’aide qu’ils ont su m’apporter. J’ai également une pensée émue pour Gérard et Patrice. Merci aux camarades thésards pour l’aide précieuse qu’ils m’ont fournie chaque fois que cela était nécessaire. Ils ont su créer une ambiance chaleureuse et amicale dans le département électronique. Je remercie : Laura, Horacio, Raul, Javier, Jérôme, Matthieu, Makram, Irène, Daoud, Hazem, Jorge, Yi, Emeric et les ex-membres du bureau c-223 Olivier, Camille et Charbel. Pardon à ceux que j’oublie et qui se reconnaı̂tront. Un grand merci à Charbel pour son amitié. Enfin, je remercie ma famille ainsi qu’Eunice qui ont fait preuve de patience et m’ont soutenu durant cette période. Table des matières Sommaire ii Introduction 1 1 Etat de l’Art 7 1.1 Espace de conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.1.1 Les besoins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.1.2 Les solutions d’intégration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.1.2.1 Les architectures dédiées . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.1.2.2 Les processeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.1.2.3 Les architectures hétérogènes . . . . . . . . . . . . . . . . . . . . . . . 22 Les méthodologies de conception . . . . . . . . . . . . . . . . . . . . . . . . . . 24 1.1.3.1 Les niveaux d’abstraction . . . . . . . . . . . . . . . . . . . . . . . . . 24 1.1.3.2 La conception conjointe logicielle-matérielle . . . . . . . . . . . . . . . 27 La synthèse architecturale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 1.2.1 Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 1.2.2 Les techniques de synthèse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 1.2.3 Les outils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 1.2.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 La reconfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 1.3.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 1.3.2 Les architectures hétérogènes reconfigurables . . . . . . . . . . . . . . . . . . . 41 1.3.3 Les tendances dans le domaine des télécommunications . . . . . . . . . . . . . 45 Notre positionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 1.1.3 1.2 1.3 1.4 2 Les codes correcteurs d’erreurs - Turbocodes 2.1 49 Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 2.1.1 Le codage/décodage de source . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 2.1.2 Le codage/décodage de canal . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.1.3 Le modulation/démodulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.1.4 Le canal de transmission . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.1.5 Performances d’un système de transmission : gain de codage 53 . . . . . . . . . . iv TABLE DES MATIÈRES 2.2 2.3 2.4 Les codes en blocs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 2.2.1 Les codes en blocs linéaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 2.2.2 Les codes cycliques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 2.2.2.1 Les codes BCH binaires . . . . . . . . . . . . . . . . . . . . . . . . . . 57 2.2.2.2 Les codes Reed-Solomon . . . . . . . . . . . . . . . . . . . . . . . . . 63 Les codes produits et le turbo décodage . . . . . . . . . . . . . . . . . . . . . . . . . . 67 2.3.1 Code produit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 2.3.2 Décodage pondéré des codes produits . . . . . . . . . . . . . . . . . . . . . . . 69 2.3.3 Décodage itératif des codes produits . . . . . . . . . . . . . . . . . . . . . . . . 70 2.3.4 Performances du turbo décodage des codes produits . . . . . . . . . . . . . . . 75 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 3 Étude et implantation d’un turbocode en blocs flexible 81 3.1 Etat de l’art sur les turbo décodeurs reconfigurables . . . . . . . . . . . . . . . . . . . 81 3.2 Aspect flexiblité pour le décodeur élémentaire . . . . . . . . . . . . . . . . . . . . . . . 88 3.2.1 Etude de la complexité algorithmique . . . . . . . . . . . . . . . . . . . . . . . 88 3.2.2 Amélioration du traitement lié au processus de turbo décodage . . . . . . . . . 96 3.2.3 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 3.3 Conception du codeur flexible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 3.4 Conception du turbo décodeur flexible . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 3.4.1 3.4.2 3.5 Architecture générale du décodeur élémentaire . . . . . . . . . . . . . . . . . . 102 3.4.1.1 Partie réception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 3.4.1.2 Partie traitement 3.4.1.3 Partie émission . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 3.4.1.4 Mémoire interne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 L’unité de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 3.4.2.1 la gestion de la communication entre le processeur et des périphériques : le bus système Avalon . . . . . . . . . . . . . . . . . . . . . . 113 3.4.2.2 la communication dans notre architecture . . . . . . . . . . . . . . . . 114 3.4.2.3 Evolution de la communication dans notre architecture . . . . . . . . 117 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 4 De la description algorithmique jusqu’au prototypage 4.1 4.2 121 Flot de conception expérimenté . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 4.1.1 Description du flot de conception expérimenté . . . . . . . . . . . . . . . . . . . 122 4.1.2 Modélisation d’un décodeur élémentaire générique pour le turbo décodage de codes produits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 4.1.3 Synthèse logique d’un turbo décodeur BCH à longueur variable . . . . . . . . . 125 Synthèse logique et placement/routage de l’ensemble codeur/turbo décodeur flexible . 127 4.2.1 Synthèse logique et placement/routage des différents blocs du codeur . . . . . . 127 4.2.2 Synthèse logique et placement/routage des différents blocs du décodeur élémentaire flexible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 4.2.3 Synthèse logique et placement/routage du turbo décodeur flexible . . . . . . . 130 TABLE DES MATIÈRES 4.3 Synthèse architecturale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 4.3.1 Les opérations dans le corps de Galois . . . . . . . . . . . . . . . . . . . . . . . 132 4.3.2 Exploration des solutions architecturales . . . . . . . . . . . . . . . . . . . . . . 133 4.3.3 4.4 4.5 v 4.3.2.1 Les blocs de la partie réception . . . . . . . . . . . . . . . . . . . . . . 135 4.3.2.2 Les blocs de la partie de traitement . . . . . . . . . . . . . . . . . . . 139 4.3.2.3 Les blocs de la partie émission . . . . . . . . . . . . . . . . . . . . . . 141 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 Prototypage du turbo décodeur flexible . . . . . . . . . . . . . . . . . . . . . . . . . . 143 4.4.1 Les différentes étapes aboutissant au prototypage . . . . . . . . . . . . . . . . . 144 4.4.2 La plate-forme de validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 4.4.3 Les caractéristiques du prototype . . . . . . . . . . . . . . . . . . . . . . . . . . 146 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 5 Conclusion et perspectives 149 c A Le langage SystemC 153 B La plate-forme Palmyre 157 Glossaire 159 Liste des figures . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 Les différentes normes en fonction du débit et de la distance de fonctionnement . . . . 3 1.1 Les solutions d’intégration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2 Bloc diagramme d’un FPGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.3 Architecture ı̂lots de calcul pour un FPGA . . . . . . . . . . . . . . . . . . . . . . . . 13 1.4 Architecture hiérarchique pour un FPGA . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.5 Elément configurable des FPGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.6 Bloc diagramme d’un CLB de Virtex 5 . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.7 Slice d’un Virtex 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.8 Caractéristiques des composants Stratix . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.9 Structure en LAB du Stratix II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.10 Bloc diagramme d’un ALM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.11 Architecture Von Neumann . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.12 Architecture Harvard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.13 Pipeline d’instructions d’un processeur RISC sur 5 niveaux . . . . . . . . . . . . . . . 20 1.14 Pipeline d’un DSP VLIW à 5 étages . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 1.15 Pipeline d’un DSP superscalaire à 5 étages . . . . . . . . . . . . . . . . . . . . . . . . 22 1.16 SoC : une structure hétérogène . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 1.17 SoC sur une cible ASIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 1.18 SoPC sur un circuit FPGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 1.19 Flot de conception ASIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 1.20 Les étapes constituant le flot de codesign . . . . . . . . . . . . . . . . . . . . . . . . . 28 1.21 Différentes étapes constituant la synthèse de haut-niveau . . . . . . . . . . . . . . . . . 32 1.22 Positionnement des solutions d’intégration les unes par rapport aux autres selon différents critères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 1.23 L’architecture DART 42 1 Le « Cell » de Sony, IBM et Toshiba 2 Situation des fonctions sur la puce Cell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.24 Structure d’un cluster de l’architecture DART . . . . . . . . . . . . . . . . . . . . . . 42 1.25 L’architecture MorphoSys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 1.26 Structure d’une Reconfigurable Cell . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 1.27 L’architecture Systolic Ring 44 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . viii LISTE DES FIGURES 1.28 Structure d’un Dnode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 2.1 Modélisation d’une chaı̂ne de transmission numérique . . . . . . . . . . . . . . . . . . 50 2.2 Graphe de transition du canal binaire symétrique . . . . . . . . . . . . . . . . . . . . . 52 2.3 Peb en fonction du SNR pour un code Golay (23,12) avec décision ferme pour une modulation de type BPSK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 2.4 Représentation d’un mot de code pour un code systématique . . . . . . . . . . . . . . 55 2.5 Constitution de la matrice associée à un code produit . . . . . . . . . . . . . . . . . . 68 2.6 Illustration du décodage de Chase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 2.7 Principe du décodage de la matrice Rp à la p-ième itération . . . . . . . . . . . . . . 74 2.8 Performances des TCB-BCH (t=1) pour une modulation BPSK sur un canal BBAG . 76 2.9 Performances des TCB-BCH (t=2) pour une modulation BPSK sur un canal BBAG . 76 2.10 Performances des TCB-RS (t=1, t=2) pour une modulation BPSK sur un canal BBAG 77 2.11 Performances du turbo décodage de codes produits . . . . . . . . . . . . . . . . . . . . 78 3.1 Le treillis et les métriques associées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 3.2 L’architecture de Virturbo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 3.3 Architecture du décodeur implantant l’ASOVA . . . . . . . . . . . . . . . . . . . . . . 87 3.4 Gestion des différentes configurations envisagées . . . . . . . . . . . . . . . . . . . . . 96 3.5 Aspect itératif du processus de turbo décodage . . . . . . . . . . . . . . . . . . . . . . 97 3.6 TEB en fonction du rapport signal à bruit pour différentes itérations . . . . . . . . . . 99 3.7 Bloc diagramme du codeur dédié aux codes produits . . . . . . . . . . . . . . . . . . . 100 3.8 Schéma du codeur élémentaire 3.9 Schéma-bloc du décodeur élémentaire RS/BCH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 . . . . . . . . . . . . . . . . . . . . . 103 3.10 Structure temporelle pour le décodage de mot de code de 32 symboles . . . . . . . . . 104 3.11 Bloc de calcul du syndrome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 3.12 Bloc élémentaire du syndrome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 3.13 Schéma du bloc des symboles les moins fiables . . . . . . . . . . . . . . . . . . . . . . . 106 3.14 Schéma du bloc de construction des vecteurs de test . . . . . . . . . . . . . . . . . . . 107 3.15 Décodeur algébrique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 3.16 Schéma du bloc de calcul des métriques . . . . . . . . . . . . . . . . . . . . . . . . . . 109 3.17 Schéma du bloc de calcul de l’information extrinsèque . . . . . . . . . . . . . . . . . . 111 3.18 Schéma du bloc de calcul du nouveau R” . . . . . . . . . . . . . . . . . . . . . . . . . . 112 3.19 Schéma bloc de la mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 3.20 Fonctionnement des mémoires RAM au cours du temps . . . . . . . . . . . . . . . . . 113 3.21 Architecture hétérogène retenue pour l’implantation . . . . . . . . . . . . . . . . . . . 115 3.22 Algorithme du programme exécuté sur le processeur NIOS . . . . . . . . . . . . . . . 116 3.23 Utilisation des mémoires lors du décodage itératif . . . . . . . . . . . . . . . . . . . . . 117 3.24 Architecture de l’application intégrant des DMA . . . . . . . . . . . . . . . . . . . . . 118 4.1 Le flot de conception expérimenté . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 4.2 Modélisation de la chaı̂ne de communications numériques sous System Studio . . . . . 124 LISTE DES FIGURES ix 4.3 Modélisation du turbo décodeur sous System Studio . . . . . . . . . . . . . . . . . . . 125 4.4 Schéma-bloc du décodeur élémentaire RS/BCH 4.5 Schéma de l’architecture du turbo décodeur flexible 4.6 Modèle architectural ciblé par l’outil GAUT . . . . . . . . . . . . . . . . . . . . . . . . 134 4.7 Graphe flot de données 4.8 Architecture générée sans pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Architecture (a) . . . . . . . . . . . . . . . . . . . . . 128 . . . . . . . . . . . . . . . . . . . 130 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Architecture (b) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 4.9 Graphe flot de données obtenu avec GAUT pour les solutions architecturales (a) et (b) 137 4.10 Les différentes étapes aboutissant au prototypage . . . . . . . . . . . . . . . . . . . . . 144 4.11 La carte de développement NIOS II Development Kit . . . . . . . . . . . . . . . . . . 145 4.12 Les phases de fonctionnement du prototype . . . . . . . . . . . . . . . . . . . . . . . . 146 A.1 Architecture hiérarchique d’un module décrit en langage SystemC . . . . . . . . . . . 155 Liste des tableaux 1.1 Les caractéristiques des différentes techniques de programmation . . . . . . . . . . . . 12 1.2 Comparatif des caractéristiques des processeurs NIOS II et Microblaze . . . . . . . . 21 1.3 Comparatif des caractéristiques des outils de synthèse architecturale . . . . . . . . . . 37 2.1 Récapitulatif des caractéristiques des différents codes produits considérés . . . . . . . 77 2.2 Limite de Shannon et gain asymptotique des différents codes produits considérés . . . 79 3.1 Récapitulatif des implantations existantes de turbo décodeurs flexibles . . . . . . . . . 87 3.2 Complexité en nombre d’opérations de l’algorithme de Berlekamp-Massey . . . . . . . 90 3.3 Opérations effectuées par l’algorithme PGZ . . . . . . . . . . . . . . . . . . . . . . . . 91 3.4 Récapitulatif de la complexité des différentes parties constituant le décodage élémentaire pour des codes BCH/RS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 3.5 Coefficients des polynômes générateurs g(x) des codes traités . . . . . . . . . . . . . . 101 3.6 Les motifs d’erreurs considérés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 4.1 Complexité en nombre de portes logiques du décodeur élémentaire pour différentes longueurs de code N . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 4.2 Caractéristiques de chaque codeur correspondant à chacune des configurations considérées127 4.3 Surface occupée par les blocs de la partie réception du décodeur élémentaire . . . . . . 129 4.4 Surface occupée par les blocs de la partie traitement du décodeur élémentaire . . . . . 129 4.5 Surface occupée par les blocs de la partie émission du décodeur élémentaire . . . . . . 129 4.6 Occupation de la mémoire interne du décodeur élémentaire en nombre d’éléments logiques (LE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 4.7 Résultats de la synthèse logique du processeur NIOS II . . . . . . . . . . . . . . . . . . 131 4.8 Caractéristiques des opérateurs obtenus après synthèse logique sous Quartus II en ciblant un Stratix 1s40 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 4.9 Résultats de la synthèse architecturale pour le bloc de parité avec l’outil GAUT . . . . 136 4.10 Résultats de la synthèse architecturale pour le bloc de parité avec l’outil Agility Compiler136 4.11 Résultats de la synthèse architecturale pour le bloc syndrome avec l’outil GAUT . . . 138 4.12 Résultats de la synthèse architecturale pour le syndrome (sol.(a)) avec l’outil Agility Compiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 4.13 Résultats de la synthèse architecturale pour le syndrome (sol.(b)) avec l’outil Agility Compiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 xii LISTE DES TABLEAUX 4.14 Résultats de la synthèse architecturale pour le bloc des moins fiables avec l’outil Agility Compiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 4.15 Résultats de la synthèse architecturale pour le bloc PGZ avec l’outil GAUT . . . . . . 140 4.16 Résultats de la synthèse architecturale pour le bloc de correction avec l’outil GAUT . 141 4.17 Résultats de synthèse architecturale pour le bloc de calcul de l’information extrinsèque et d’élaboration du mot corrigé avec l’outil GAUT . . . . . . . . . . . . . . . . . . . . 142 4.18 Résultats de synthèse architecturale pour le bloc de calcul de l’information extrinsèque avec l’outil Agility Compiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 A.1 Les caractéristiques des différents processus du langage SystemC . . . . . . . . . . . . 154 A.2 Les caractéristiques des différents types de données du langage SystemC . . . . . . . 155 Introduction Contexte L’électronique est relativement jeune par rapport à d’autres disciplines comme l’astronomie par exemple. En effet, elle est âgée seulement d’un siècle. Un léger retour sur son histoire permet de mieux comprendre l’engouement que suscite aujourd’hui son utilisation dans tous les domaines d’application. A partir du début du XXème siècle, l’électricité fait son apparition dans les habitations urbaines laissant le champ libre au développement de biens utilisant l’électronique. Ainsi, l’invention du premier composant électronique intervient en 1904, il s’agit du tube à diode de Fleming qui permet le redressement du courant alternatif. Il faut toutefois attendre une quarantaine d’années et beaucoup d’innovations techniques pour que les transistors (plus exactement les semi-conducteurs) soient utilisés. Ils sont moins coûteux, plus fiables et plus facile à mettre en oeuvre. Dès lors, l’électronique envahit les appareils de consommation grand public (radio, télévision, ordinateurs personnels). Elle change de nom en devenant la microélectronique, du fait de l’utilisation de technologies microniques. En effet, la miniaturisation et les progrès constants dans l’intégration sur silicium permettent aux systèmes électroniques d’intégrer sur une même puce des applications de plus en plus complexes. Aujourd’hui, par exemple, la console de jeux PS3 de Sony est construite autour d’une puce dédiée (fig. 1) contenant pas moins de 234 millions de transistors pour une surface de 221 mm2 gravé avec une technologie en 90 nm. Il s’agit d’une architecture multiprocesseur intégrant de nombreuses fonctionnalités et favorisant le parallélisme pour les calculs intensifs (fig. 2). Cependant, la mise au point de ces systèmes complexes impose des contraintes à la fois d’ordre techniques mais aussi d’ordre économiques. En effet, le temps s’écoulant entre le début de la conception et la mise sur le marché doit être réduit au maximum (le fameux « time to market »). Réduire le temps de développement d’un projet devient crucial. Ainsi, de nombreuses sociétés envisagent une élévation du niveau d’abstraction lors de la conception et proposent des méthodologies et des outils de conception, de simulation et de validation de plus en plus performants. En parallèle, de nombreuses 2 INTRODUCTION Figure 1 — Le « Cell » de Sony, IBM et Toshiba Figure 2 — Situation des fonctions sur la puce Cell plate-formes de prototypage sont également proposées pour effectuer les validations après implantation avant la longue et coûteuse étape d’intégration sur puce. D’autre part, le monde des télécommunications est en perpétuelle évolution. Au fur et à mesure des avancées technologiques, les besoins en terme de performances sont devenus de plus en plus élevés. Ainsi, les normes (ou les standards en anglais) se multiplient et se déclinent. Elles intègrent des algorithmes de plus en plus complexes tout en conservant des parties de traitement identiques. Par exemple, dans le domaine des communications sans fils, les normes sont classées suivant leur débit et le degré de mobilité des terminaux associés comme le montre la figure 3. Les tendances en terme de normalisation concernent surtout les réseaux de télécommunication 3GPP et les réseaux IP. D’ailleurs, les normes pour chacun de ces réseaux sont en concurrence pour des distances et des débits donnés. Le cas de l’UMTS et du WiMAX en est le parfait exemple. De plus, la tendance est à la mobilité et à l’augmentation des débits de fonctionnement (liaison montante et descendante). De même, les notions d’interactivité et d’inter-communication deviennent primordiales. C’est donc dans cette optique que l’inter-opérabilité des terminaux mobiles prend tout son sens. Concrètement, cette évolution correspond à la capacité d’exécuter des applications utilisant des normes différentes sur un même terminal. En effet, elle devient particulièrement intéressante pour assurer l’échange de données entre différents appareils ou pour adapter la communication en fonction des conditions extérieures. INTRODUCTION 3 distance 10 km W I M GPRS W-CDMA HSDPA A EDGE X UMTS GSM 1 km 100 m DECT Bluetooth WiFi WiFi MIMO WUSB 10 m 10 kbit/s. 500 kbit/s. 2 Mb/s. 100 Mb/s. débit Figure 3 — Les différentes normes en fonction du débit et de la distance de fonctionnement Objectifs La rapide évolution des technologies CMOS vers le submicronique, puis vers le submicronique profond, offre des perspectives d’intégration toujours plus importantes. Il est désormais possible d’intégrer un système complexe dans un circuit intégré SoC (System on Chip) voire même dans un circuit reconfigurable SoPC (System on a Programmable Chip). Parallèlement, la diversité et la complexité des applications de communications numériques, sous contrainte d’exécution temps réel et dédiées à des systèmes embarqués, ne cessent de croı̂tre avec l’évolution du marché des télécommunications. L’évolution constante des caractéristiques de ces applications implique la définition d’architectures systèmes devant s’adapter dynamiquement aux nouvelles fonctionnalités (standards, services...). C’est pourquoi, de nouvelles méthodologies reposant à la fois sur l’élévation du niveau d’abstraction à travers la synthèse d’architecture et le développement de composants virtuels génériques (IPs de niveau comportemental) sont mises en oeuvre. Ainsi, le développement de langages de description système tel que SystemC permettent une transition plus naturelle entre l’étude algorithmique d’un système et la définition de l’architecture associée. En effet, le flot de conception traditionnel est discontinu pour une implémentation matérielle. Cette discontinuité implique la réécriture de l’application validée au niveau algorithmique dans un langage de description matériel (VHDL, Verilog). Actuellement, les fournisseurs de CAO mettent en place des flots de conception reposant sur ces langages de description système. Par exemple, Synopsys a proposé dès 2002 à la fois un environnement de conception système System Studio et un outil de synthèse de haut niveau SystemC Compiler qui utilisent le langage SystemC. La définition de nouveaux algorithmes et la recherche d’architectures originales pour les applications de communications numériques dans les domaines du codage canal (turbocodes) et des traite- 4 INTRODUCTION ments itératifs dans les récepteurs (turbo communications) représentent la plus grande part de l’activité de recherche du département électronique de l’ENST-Bretagne. Ainsi, des architectures originales de circuits spécifiques (ASIC/FPGA) ont été obtenues pour les turbocodes. Cependant, les études ont été menées au niveau RTL (Register Transfer Level) qui est généralement le niveau de modélisation dans la conception de circuit. Or, à ce niveau de description, les possibilités (généricité, souplesse d’utilisation et espace des solutions) sont bien moins importantes qu’au niveau comportemental. Dans ce contexte, l’étude menée dans le cadre de cette thèse consiste à expérimenter l’apport de la modélisation et de la conception de haut niveau pour la définition d’architectures flexibles dédiées au turbo décodage de codes produits. L’objectif principal de cette thèse devient alors le développement d’architectures flexibles originales favorisant l’intégration de systèmes dits turbo sur une même puce. Plan du mémoire Ce manuscrit se compose de quatre chapitres. Le premier chapitre aborde les domaines nécessaires à la bonne compréhension des travaux effectués dans le cadre de cette thèse. Ainsi, il dresse un état de l’art : – de l’espace de conception (les besoins des concepteurs, les solutions d’intégration et les méthodologies de conception associées). – de la synthèse architecturale. – des systèmes dits « reconfigurables ». Puis, un paragraphe récapitulatif situe notre positionnement par rapport à ces trois domaines. Le deuxième chapitre présente le domaine de l’application retenue dans le cadre de ce travail à savoir les codes correcteurs d’erreurs. Dans un premier temps, quelques généralités sur les communications numériques sont données. Dans un deuxième temps, les codes en blocs sont décrits. Cette partie se focalise sur le codage et le décodage des codes BCH et Reed Solomon qui servent de base aux codes produits. Enfin, la construction des codes produits et l’adaptation du décodage pour des processus de type « turbo » sont explicitées. Des courbes de performances sont également données. L’étude et l’implantation d’un turbocode en blocs flexible sont détaillées dans le chapitre trois. Un état de l’art sur les turbo décodeurs reconfigurables est présenté. Puis, le caractère flexible de notre architecture est explicité à travers une étude de complexité et une étude sur les caractéristiques de l’application. Par la suite, l’implémentation d’une structure capable de coder et décoder des turbocodes produits est détaillée. Dans notre cas, les architectures flexibles du codeur et de la structure de turbo décodage permettent de considérer à la fois des codes BCH de longueur n = 32 et des codes RS de longueur n = 31 pour des pouvoirs de correction t = 1 et t = 2. Enfin, le fonctionnement de l’architecture hétérogène du décodeur est donné. Le quatrième chapitre présente le flot de conception expérimenté et les différents résultats de INTRODUCTION 5 synthèse obtenus. Dans un premier temps, une modélisation d’une structure de décodage générique a été réalisée dans l’environnement System Studio. Ensuite, les résultats des synthèses logiques et le placement/routage sur les éléments déjà considérés sont présentés. Puis, une exploration de l’espace de conception a été effectuée grâce à des synthèses architecturales sur différents modules. La description du prototypage est abordée à travers la présentation de la plate-forme (NIOS II Stratix development Kit) et du processus de mise en oeuvre. Enfin, le dernier chapitre conclut le manuscrit en récapitulant les apports et les limites de nos expérimentations. Des perspectives sont également données pour la poursuite de ces travaux de recherche. CHAPITRE 1 Etat de l’Art Depuis la mise sur la marché du premier ASIC, il y a seulement 50 ans, la complexité des circuits intégrés n’a pas cessé de croı̂tre. L’intégration progressive des composants électroniques dans les appareils de consommation grand public a permis le développement de solutions architecturales de plus en plus souples et performantes. Les méthodologies de conception et les outils ont évolué dans le même sens permettant progressivement de s’abstraire de la couche purement physique et d’atteindre des niveaux de développement plus élevés. Ainsi, des structures hétérogènes sont apparues combinant à la fois éléments logiciels et matériels. Parallèlement à ces considérations, les applications de traitement du signal et de l’image (TDSI) mais aussi les systèmes de communication s’appuient sur des algorithmes en perpétuelle évolution. Afin de préserver, la compatibilité descendante et par conséquent la bonne marche des standards de télécommunications (UMTS, GPRS, EDGE ), une faculté d’adaptation de tous les terminaux est impérative. De plus, des contraintes en terme de qualité de service, de consommation et de débit nécessitent désormais un caractère reconfigurable des systèmes. 1.1 Espace de conception L’espace de conception en électronique concerne l’ensemble des architectures qui peuvent être théoriquement construites. Cet espace est défini par les technologies disponibles pour concevoir un circuit et limité par l’imagination des concepteurs. L’espace de conception est, a priori, vaste mais les contraintes techniques et les limites des méthodologies et des outils restreignent le champ d’exploration des concepteurs. Actuellement, les conditions semblent réunies pour favoriser le développement de nouvelles méthodologies et l’élévation du niveau d’abstraction. 1.1.1 Les besoins Sur le plan matériel, le concepteur doit pouvoir estimer les contraintes liées au choix d’un cahier des charges (type de cible, temps de réponse, vitesse, surface, consommation...). Sur le plan logiciel, il doit être à même d’estimer l’impact du développement algorithmique sur son application (E/S, échange de 8 CHAPITRE 1. ETAT DE L’ART données, gestion des ressources). Du fait de la multiplicité et des particularités propres à chacune des solutions architecturales, l’exploration de l’ensemble des architectures hétérogènes devient de plus en plus ardue pour le concepteur. Parallèlement, les contraintes du marché (Time to market) réduisent le temps accordé au concepteur pour la fabrication de nouveaux circuits. En effet, le renouvellement des gammes impose un temps de développement des produits de plus en plus court. De plus, la multiplication des standards impose aux systèmes de supporter l’ensemble des normes déjà existantes (GSM, UMTS, EDGE, ...) d’autant plus que nous entrons dans l’ère du « tout communicant » dans un monde sans fils. L’ensemble de ces facteurs, a priori inconciliables, entraı̂ne la nécessité de développer des méthodologies et des outils associés mêlant aspects logiciels et matériels et fournissant des estimations en terme de performances et de complexité aussi précises que possible. L’intégration de telles solutions hétérogènes implique donc l’utilisation d’outils permettant la conception conjointe logicielle-matérielle que nous appelons aussi codesign. 1.1.2 Les solutions d’intégration Au moment de la conception d’un circuit électronique, un ingénieur de développement doit effectuer des choix sur le ou les types de composants, leurs interactions éventuelles et leur mode de fonctionnement. Parfois, le cahier des charges impose d’emblée la solution à envisager mais le plus souvent une exploration de l’espace de conception permet de situer les goulots d’étranglements des applications. Dans un souci de précision et de cohérence pour la suite, il convient de définir tout d’abord certaines notions qui seront employées dans la suite du document : Architecture « n. f. Art de construire, de disposer et d’orner les édifices. Il désigne aussi la disposition et l’ordonnance d’un bâtiment. »[dic] En se référant à la définition littérale d’une architecture, il est possible de la transposer aisément au domaine de la conception de circuit électronique. Une architecture décrit la disposition des composants sur le circuit de manière topologique. Structure « n. f. Manière dont un édifice est bâti. Il se dit figurément de la disposition des parties d’un tout, constituant une sorte d’architecture, de construction. » Ce terme est souvent employé pour désigner une architecture et intégrera, dans notre cas, la notion d’échange de données. Cible : Par abus de langage, ce terme désigne le(s) type(s) de composant(s) choisi(s) par le concepteur pour implanter son application. Également appelée cible architecturale, elle peut donc être par définition homogène (un seul composant) ou hétérogène (plusieurs composants). La figure 1.1 établit un panorama des cibles se présentant au concepteur. Elles ont toutes des 1.1. ESPACE DE CONCEPTION 9 particularités qu’il convient d’expliciter pour explorer l’espace de conception. Ce document s’attarde néanmoins plus largement sur les composants de types microprocesseurs et les circuits logiques reconfigurables de type FPGA puisqu’ils ont été utilisés pour l’implantation réalisée dans le cadre de cette étude. De haut en bas, la figure donne une dénomination générale des familles pour aller vers les différents composants qui les constituent. De gauche à droite, les solutions vont des approches les plus flexibles aux plus figées. Circuits logiques programmables Microprocesseur DSP Processeurs généralistes RISC ASIC Semi Custom Microcontroleur Custom Circuits pré diffusés Processeurs multimedia VLIW Circuits sur Circuits mesure pré caractérisés FPGA CPLD PAL Figure 1.1 — Les solutions d’intégration 1.1.2.1 Les architectures dédiées Les ASIC (Application Specific Integrated Circuit en anglais) et les circuits logiques programmables (ou FPGA pour Field-Programmable Gate Array) peuvent être regroupés sous le vocable d’architectures dédiées. Par définition, un ASIC est un circuit intégré spécifique à une application. Autrement dit, il s’agit d’une puce conçue sur mesure pour une application spécifique contrairement à un microprocesseur pouvant exécuter tous les types d’applications. Un composant logique programmable désigne, quant à lui, un circuit intégré logique qui peut être programmé après sa fabrication. En raison du coût élevé de la conception d’une solution de type ASIC, les FPGA servaient dans un premier temps à valider les applications conçues pour une telle cible. Le prototypage était donc effectué à moindre frais. Depuis quelques années, les circuits programmables de type FPGA ont fortement évolué et proposent une alternative entre l’ASIC et le microprocesseur. L’utilisation d’un ASIC améliore de façon importante les performances par rapport aux autres types de cible puisque la description des applications ASIC est « câblée » (reliée de manière physique) plutôt que programmée. Historiquement, la complexité est caractérisée par le nombre de transistors 10 CHAPITRE 1. ETAT DE L’ART ou de portes logiques intégrés sur le composant. Classiquement, la porte logique est une porte « non ET » à deux entrées constituée à partir de quatre transistors. Bien entendu, la contre-partie d’une telle efficacité réside dans la conception scrupuleuse du circuit et le passage en fonderie qui sont des étapes longues et coûteuses pour les cibles les plus personnalisées. Les ASIC peuvent être classés en plusieurs catégories en fonction du degré de personnalisation disponible pour le concepteur. Tout d’abord, le concepteur d’un circuit « sur-mesure » « ou ciselé » (full-custom en anglais) décrit le placement de chaque transistor avec un degré de liberté total en regard de la technologie utilisée (tous les masques sont dédiés au client). Le circuit résultant est performant en terme de surface et de vitesse mais pas en temps de développement. De plus, une erreur de conception entraı̂ne une modification pouvant aller dans le pire des cas à la modification de l’intégralité du circuit, ce qui rend la correction longue et coûteuse et les modifications ultérieures impossibles sans la fonte d’une nouvelle puce. La validation nécessitent des simulations analogiques. De plus, il est à noter que l’utilisation de kits de conception récents peut poser problème puisque les modèles dont disposent les fondeurs ne sont pas forcément précis dans certaines régions de fonctionnement. Ainsi, il est parfois nécessaire de fondre plusieurs circuits avant d’avoir le résultat souhaité [PCLSJ06]. Apparus dans les années 80, les ASIC pré-caractérisés (Standard Cell) se présentent comme un intermédiaire, en terme de coût, entre le circuit sur mesure et le pré-diffusé. Le fondeur propose une bibliothèque de modules évolués (CPU, RAM, ...) et optimisés en surface dans laquelle le concepteur va puiser pour réaliser son système et y rajouter les interconnexions. Il s’agit du placement puis du routage des modules. Du fait de l’utilisation de modules optimisés, ce type d’ASIC se rapproche du circuit sur mesure tout en nécessitant un temps de développement moindre. La dénomination « semi-custom » est associée aux circuits pré-diffusés dont seule la partie interconnexions du circuit est personnalisable par le client. Il existe deux types de circuits : – Gate-Array (MPGA) : il s’agit en fait de matrice de portes avec des plots d’ E/S. Des colonnes de portes alternent avec des canaux de routage. Un ou plusieurs niveaux d’interconnexion permettent de dédier le circuit à l’application. – Sea of Gates (Mer de portes) : le circuit est composé de blocs contigus de transistors. Les connexions passent par dessus les blocs. Il est possible d’utiliser des bibliothèques de modules pour ce type de circuit. Les transistors ont une taille fixe et une position donnée. Par conséquent, le routage est déjà plus ou moins contraint. Les circuits pré-diffusés sont destinés aux circuits de faible ou moyenne complexité et aux petites séries. Le temps de développement est moins important que pour l’ASIC sur mesure puisque le circuit pré-diffusé est disponible d’emblée. Actuellement, la tendance est aux ASIC structurés [WT04] qui semblent être une technique prometteuse. Auparavant, pour concevoir un circuit performant, les ingénieurs avaient le choix entre : 1.1. ESPACE DE CONCEPTION 11 – les ASIC pré-caractérisés avec un prix unitaire faible pour de grands volumes mais un développement long et coûteux. – les FPGA (voir section suivante) avec un temps de développement rapide mais des prix unitaires élevés. Toutefois, les coûts induits par l’adaptation de l’usine afin de produire l’ASIC élaboré sont faibles, il s’agit des coûts dits « NRE » (Non-Recurring Engineering). L’idée est de conserver les performances et la réduction des coûts des circuits pré-caractérisés tout en faisant baisser le coût des charges NRE et le temps de développement. Un circuit structuré intègre des modules prédéfinis mais plus élaborés qu’auparavant. Typiquement, on trouve des bascules, des registres, des inverseurs, des DLL... La différence avec une implantation sur FPGA réside dans le fait que le concepteur choisit lui-même les interconnexions à établir dans les couches de métal restantes. Les fabricants de FPGA proposent également leurs propres ASIC structurés qui permettent la validation sur FPGA avant l’envoi du circuit en fonderie[Sem05][eAS05][ele05]. Ainsi, chez Altera, le famille Hardcopy II propose deux couches de métal personnalisable pour une technologie 90 nm et des fréquences de fonctionnement allant jusqu’à 350 Mhz [Alt05]. L’apparition des ASIC structurés est à mettre en relation avec l’évolution importante des circuits logiques programmables. Les FPGA de nouvelle génération proposent en effet de nouveaux modules (arithmétiques, de mémorisation...) qui poussent les concepteurs à utiliser ce type de composant. Dans la classification proposée précédemment (fig. 1.1), la famille des circuits logiques programmables se subdivise en trois sous catégories allant, par ordre de complexité croissante, du PAL au FPGA en passant par le CPLD. Les circuits logiques programmables diffèrent de la technique de type ASIC par plusieurs aspects. En effet, ils sont directement disponibles chez le fournisseur, la programmation et le développement d’application sont rapides et enfin il n’est pas nécessaire de fondre un circuit. Ces composants sont donc idéaux pour le prototypage des applications. Les circuits logiques programmables de type PAL se composent d’un ensemble d’opérateurs « ET » sur lesquels sont connectées les entrées ou leur complément, d’un ensemble d’opérateurs « OU » sur lesquels sont connectées les sorties des opérateurs « ET » et d’éléments de sortie (registre 3 états, inverseurs...). Au total, ce type de composant compte 100 à 200 portes. Les interconnexions entre les différents éléments sont programmables. Les CPLD bénéficient des fortes densité d’intégration. Ainsi, leurs structures intègrent des cellules (« macrocells ») interconnectées entre elles par des ressources de routage. Les E/S sont limitées pour avoir une consommation plus faible. La dénomination des sous-familles peut être fonction de la complexité, mais il est également possible de classer ces cibles selon les techniques de programmation. Le tableau 1.1 illustre les différentes 12 CHAPITRE 1. ETAT DE L’ART caractéristiques de chaque solution : – les cellules à fusible ou antifusible (fonction ET câblée). Des fusibles (technologie bipôlaire) ou antifusibles (technologie CMOS ) permettent de fixer les interconnexions du composant. – les mémoires effaçables électriquement (EEPROM et Flash EPROM). Reprogrammables à volonté, certains FPGA peuvent également être reprogrammés en cours de fonctionnement. – les mémoires SRAM. La configuration des ressources du FPGA est contenu dans des mémoires statiques de type RAM. Ils sont reprogrammables à volonté et en cours de fonctionnement. hhh hhh Technique hhhh de prog. Antifusible EPROM hhhh Caract. h Famille de circuits FPGA PAL CPLD Facilité de programmation faible très élevé Densité d’intégration induite faible élevée Reprogrammable non oui SRAM CPLD FPGA élevé très élevée oui Tableau 1.1 — Les caractéristiques des différentes techniques de programmation Les solutions de type PAL et CPLD deviennent rapidement limitées pour l’implantation d’applications complexes, au contraire des FPGA actuels qui intègrent des dizaines de millions de portes. Conçus pour vérifier le bon comportement des applications destinées à l’intégration sur ASIC, le rôle des FPGA a depuis beaucoup évolué. Ceux basés sur une technologie SRAM deviennent même reprogrammables à volonté. De manière générale, un circuit programmable de type FPGA se compose de blocs logiques reliés entre eux via un réseau d’interconnexion (fig 1.2). Il est dit reconfigurable si les ressources d’interconnexion le sont. Figure 1.2 — Bloc diagramme d’un FPGA 1.1. ESPACE DE CONCEPTION 13 Un FPGA se caractérise par son réseau de routage, la topologie de ce dernier est représentative du type d’architecture employée. Ainsi, l’architecture de type « ı̂lots de calcul » regroupe les différents éléments fonctionnels sous la forme d’une matrice (fig. 1.3). Les éléments configurables contiennent des E/S, des modules logiques (LUT, multiplexeur...), des mémoires (RAM simple ou double port) et depuis peu des modules arithmétiques plus complexes (Multiplieur, additionneur/soustracteur...). Des blocs programmables assurent la connexion entre les éléments configurables tandis que les matrices relient ces blocs entre eux. Cette approche en ı̂lots se retrouve notamment chez les fabricants Atmel et Xilinx. Il existe également une architecture dite hiérarchique (Altera). A chaque niveau de hiérarchie correspond des ressources de routage et des éléments associés (fig. 1.4). Figure 1.3 — Architecture ı̂lots de calcul pour un FPGA Figure 1.4 — Architecture hiérarchique pour un FPGA 14 CHAPITRE 1. ETAT DE L’ART Basée sur une unité logique configurable (fig. 1.5), un FPGA (utilisant la technologie SRAM) est une matrice composée d’un grand nombre d’éléments configurables qui interagissent via des ressources de routage également reconfigurables. Ce bloc élémentaire se compose de LUT (2 à 4), d’une chaı̂ne de propagation de la retenue et de bascules D. Un LUT est en fait une table de scrutation qui décrit la fonction à réaliser, il s’agit d’un arbre de transistor connecté à des points mémoires SRAM et commandé par des entrées binaires. Figure 1.5 — Elément configurable des FPGA La flexibilité des ressources de routage d’un FPGA est la fois son point fort et son point faible. Capable de recevoir toutes les applications, le réseau doit être optimisé pour acheminer les signaux. Un ensemble de lignes de routage de différentes longueurs est disponible. Elles sont disposées verticalement et horizontalement sur la matrice. En ce qui concerne les mémoires, elles peuvent être distribuées sur les LUT du composant. Devant les besoins croissants en terme de mémoire, des éléments de mémorisation dédiés ont rapidement trouvé leur place sur le FPGA. Ces blocs configurables peuvent recevoir des données de différentes largeurs et sont agencés au mieux afin de rendre disponibles les informations aux éléments logiques. Les temps d’accès sont diminués par rapport à un accès à des mémoires externes. Dans tous les systèmes électroniques, les horloges sont capitales pour le bon fonctionnement de l’ensemble. Les FPGAs sont prévus pour recevoir une ou plusieurs horloges. Des entrées sont dédiées à ce type de signaux, ainsi que des ressources de routage adaptées au transport d’horloges sur de longues distances (bufferisation des lignes). Aussi, la synchronisation des horloges sur le circuit est assurée à travers des mécanismes d’asservissement (des PLLs ou des DLLs) qui permettent de créer des horloges à des fréquences multiples de celle de référence. Les ressources d’E/S permettent au FPGA de communiquer avec les autres composants d’un circuit électronique. Différentes normes électriques (LVTTL, LVCMOS, SSTL...) sont supportées pour assurer une compatibilité maximale avec l’environnement. Des E/S de type différentielles permettent 1.1. ESPACE DE CONCEPTION 15 également d’obtenir une bande passante élevée entre deux points de communication (LVDS, Hypertransport...). Depuis le début des années 2000, l’adjonction de fonctions pré-câblées et d’unités arithmétiques rend le FPGA très attractif et le place même comme une alternative sérieuse au processeur de traitement de signal. En effet, en plus des mémoires embarquées, des multiplieurs/accumulateurs câblés (MAC) et des additionneurs/soustracteurs sont répartis entre des rangées de blocs logiques configurable. Des sociétés comme Lattice ou Quicklogic ont choisi cette orientation (avec un nombre raisonnable d’unités dédiées pour conserver une consommation raisonnable) pour leur FPGA. D’autres comme Actel et Atmel privilégient la granularité fine qui permet d’implanter efficacement tous types de circuits et font l’impasse sur de telles unités. Les deux principaux fabriquants de FPGA (à base de technologie SRAM), Xilinx et Altera, se livrent une lutte féroce dans le domaine des circuits logiques reprogrammables en proposant des innovations notables à chaque nouvelle génération de composants [AC05] [Xil05]. Si l’approche générale diffère chez les deux constructeurs, certains choix architecturaux récents les rapprochent et l’émulation qui en résulte est bénéfique au domaine. Xilinx Les composants produits par Xilinx apportent des innovations dans de nombreux domaines au gré des avancées technologiques. Les FPGA sont basés sur une architecture ı̂lot de calcul. L’évolution est illustrée à travers trois familles de composants. Pour la famille Virtex-II, un CLB est constitué de 4 tranches (slice) elles mêmes composées de deux éléments logiques configurables tels que décrits sur la figure 1.5. Les slices sont reliés entre eux via des connexions locales. Compte tenu de la difficulté à placer des fonctionnalités complexes uniquement sur les LUT, des blocs dédiés ont été intégrés pour le traitement de signal (jusqu’à 444 multiplieurs 18x18 bits). Il y a deux types de mémoires : les mémoires distribuées (jusqu’à 1.7Mb en configurant les LUT en mode RAM/ROM double port) et les mémoires embarquées (plus de 10 Mbit dans les Blocks RAM). Les composants les plus complexes intègrent des coeurs de processeurs PowerPC d’IBM (plus de 600 DMIPS), des E/S de type Rocket IO permettant des transmissions entre 600 Mbit/s. et 3 Gbit/s et des mécanismes de gestion d’horloge complexes. La famille Virtex-4 est gravé en 90 nm et possède un coeur alimenté par 1,2 V. L’architecture est basée sur la structure colonne ASMBL qui répartit les ressources à travers le composant. Les CLB sont identiques à ceux des Virtex II. Le choix de composant est grand, les plus complexes intègrent des coeurs de PowerPC (jusqu’à 700 DMIPS), des E/S avec transmission série de 622 Mbit/s jusqu’à 10 Gbit/s, des blocs de traitement de signal dédiés, des mécanismes de gestion d’horloge complexes. L’orientation traitement de signal est également fortement présente grâce à des modules tels que : les 16 CHAPITRE 1. ETAT DE L’ART multiplieurs 18x18 bits, les accumulateurs (48 bits) et les additionneurs/soustracteurs intégrés. Au niveau des ressources mémoires, le Virtex 4 intègre les mêmes types de mémoires que le Virtex II. Le Virtex 5 est le dernier né de chez Xilinx, pour le passage à la technologie 65 nm, des progrès importants sont intervenus. Une nouvelle structure est proposée pour les modules logiques élémentaires (fig 1.6) appelés maintenant ExpressFabric. En effet, la LUT à 4 entrées, disponible sur les familles précédentes, est remplacée par une véritable LUT à 6 entrées. Les CLB se décomposent maintenant en deux slices possédant chacun quatre LUT à 6 entrées et 4 bascules (fig 1.7). Globalement, Xilinx annonce une consommation dynamique en retrait de 35%, une surface en baisse de 45% et des performances en augmentation de 30%. Ce circuit contient plus d’un milliard de transistors. Les ressources de routage ont été repensées pour minimiser le nombre d’interconnexions entre les CLB. Les mémoires distribuées bénéficient également de ce nouvel apport. Les mémoires embarquées (14.5 Mbit) fonctionnent à 550 MHz contre 500 Mhz pour le Virtex 4. De plus, les multiplieurs embarqués 25 × 18 bits qui fournissent des résultats sur 48 bits peuvent être mis en cascade et supportent même des opérations SIMD. Le Virtex 5 intègre également un bloc de gestion des horloges complexe afin de répartir au mieux les signaux sur le composant. Enfin, les E/S sont au nombre de 1200 et bénéficient de mécanismes de synchronisation performants. Elles supportent des débits pouvant aller jusqu’à 1.25 Gbit/s. Figure 1.6 — Bloc diagramme d’un CLB de Virtex 5 Figure 1.7 — Slice d’un Virtex 5 Conscient de l’enjeu que représente l’intégrité de la configuration, ces FPGA sont capable de décrypter le bitstream via un module de décryptage reposant sur l’algorithme AES et l’utilisation d’une clef de 256 bits. Celle-ci est sauvegardée dans une mémoire RAM dédiée, elle est écrite via le port JTAG mais ne peut en aucun cas être lue de l’extérieur. Altera Les cibles d’Altera bénéficient également des avancées technologiques, le Stratix (fig. 1.8) est 1.1. ESPACE DE CONCEPTION 17 comparable au Virtex II tandis que le Stratix II se rapproche plutôt du Virtex 4 (gravé en 90 nm). L’élément logique configurable s’appelle ici LE (resp. ALM) pour le Stratix (resp. Stratix II). Dans les deux cas, il s’agit du module décrit à la figure 1.5. Un ALM peut combiner les LUT entre elles pour remplir au mieux les ressources disponibles (fig. 1.10). Figure 1.8 — Caractéristiques des composants Stratix Un Stratix II comporte jusqu’à 180 000 éléments logiques (LE) (ou 71 760 ALM). Le composant compte jusqu’à 9 Mbits de mémoire embarquée et 96 blocs de type traitement de signal. Ces blocs peuvent être utilisés pour câbler jusqu’à 384 multiplieurs 18x18 bits. Ainsi, la structure comporte 2 niveaux hiérarchiques avec une matrice de LAB (fig. 1.9) constitué eux-même de 8 ALM (fig. 1.10). Le FPGA peut être interfacé avec tous les types de RAM ( DDR, DDR2 SDRAM, QDR II RAM...). Doté d’E/S haut débit (jusqu’à 1 Gbit/s), le Stratix II offre également un mécanisme de gestion d’horloge élaboré (jusqu’à 550 MHz) et plus de 12 PLL. Le FPGA est capable de décrypter le train binaire de configuration via un module de décryptage reposant sur l’algorithme AES et une clef de 128 bits. La consommation d’énergie d’un FPGA, bien plus élevée que celle d’un ASIC, reste cependant plus faible que celle d’un DSP à performance égale. Toutefois, l’avantage non négligeable du DSP demeure son caractère reprogrammable de manière logicielle et le support de nombreuses applications. 1.1.2.2 Les processeurs Avec la densité d’intégration croissante, le processeur peut être intégré sur une puce. Il est appelé microprocesseur car il bénéficie des technologies submicroniques. Cette solution apparaı̂t comme la plus flexible puisque cette cible est capable d’exécuter tout type d’application à condition que celle-ci 18 CHAPITRE 1. ETAT DE L’ART Figure 1.9 — Structure en LAB du Stratix II Figure 1.10 — Bloc diagramme d’un ALM soit décrite dans un langage de programmation. Un outil de compilation se charge de transformer la description en code C (ou autre) en une description en langage machine associé. Puis, le processeur prend en charge les instructions décrites dans un langage machine (assembleur) et les interprète afin d’effectuer une tâche donnée (calcul et/ou transfert de registre...). Cette approche est parfois qualifiée de « logicielle » en référence au langage de programmation haut niveau. Toutefois, il est évident qu’une architecture se cache derrière cette approche. Elle peut être adaptée à des traitements généralistes et/ou spécifiques. Les architectures communément utilisées pour décrire les composants de type microprocesseurs se basent historiquement sur l’architecture Von Neuman (fig. 1.11). Celle-ci est constituée de quatre unités de base : – l’unité de contrôle chargée du séquencemment des opérations, – l’unité de traitement qui réalise les opérations élémentaires (ou UAL), – l’unité responsable des E/S qui gère l’échange de données avec les ports et les mémoires externes, – la zone mémoire qui contient les instructions et les données. Une première évolution de l’architecture Von Neumann est l’architecture Harvard (fig. 1.12). Les mémoires d’instructions et de données sont séparées. L’accès à chacune des deux mémoires se fait via des bus de communication distincts. Cette organisation permet de transférer des instructions et des données simultanément, ce qui améliore les performances. Il est également possible de dupliquer les bus d’adresse et de données pour accélérer le traitement. Dans le modèle d’architecture Von Neumann, il apparaı̂t que l’adressage et/ou le transfert d’instructions prend la majeure partie du temps d’exécution [MP96]. L’idée de l’approche CISC (processeur à jeu d’instructions complexe) est donc d’augmenter le rendement des instructions en créant un jeu 1.1. ESPACE DE CONCEPTION 19 Figure 1.11 — Architecture Von Neumann Figure 1.12 — Architecture Harvard d’instructions plus complexe. Une instruction de type CISC prendra moins de temps d’exécution qu’un équivalent en nombre d’instructions simples. L’approche RISC, quant à elle, consiste à paralléliser à la fois l’exécution des opérations concernant les instructions et celles concernant les données. En plus du parallélisme spatial apporté par l’architecture Harvard, le parallélisme de type temporel est également exploité grâce à la notion de pipeline (figure 1.13). En effet, l’ajout de registres à l’intérieur du contrôleur permet une exécution concurrente à différents étages du pipeline (sur les instructions et/ou sur les adresses). Prenons l’exemple d’une instruction de calcul nécessitant 5 étapes : tout d’abord, il faut charger l’instruction à partir de la mémoire (Li), puis la décoder et sélectionner les opérandes dans des registres internes (Di), ensuite les opérandes doivent être rapatriés de la mémoire vers les 20 CHAPITRE 1. ETAT DE L’ART registres internes (Ld), le calcul est alors réalisé dans l’UAL (Ex) et enfin le résultat est renvoyé en mémoire (E). Chaque étape nécessite un temps de cycle machine. Ainsi, en théorie, une instruction peut être exécutée à chaque temps de cycle (à ne pas confondre avec le temps de cycle de l’horloge) ce qui explique la dénomination processeur à jeu d’instructions réduit (chacune d’elles ayant un format identique). t Ci Di Ld Ex E Ci Di Ld Ex E Ci Di Ld Ex E Ci Di Ld Ex E Ci Di Ld Ex E Instructions Ci: Chargement d’une instruction en mémoire Di: Décodage d’une instruction Ld: Transfert de la mémoire vers les registres internes Ex: Exécution de l’instruction sur l’UAL E: Ecriture d’une donnée en mémoire Figure 1.13 — Pipeline d’instructions d’un processeur RISC sur 5 niveaux Par ailleurs, la complexité relativement faible d’un processeur RISC autorise l’intégration sur la puce de ressources supplémentaires (registre, mémoires tampons...). Ces processeurs sont très présents dans les systèmes embarqués. Aujourd’hui, les fabricants de FPGA vont jusqu’à proposer leurs propres processeurs RISC embarqués. En effet, les deux principaux acteurs du marché, Xilinx et Altera, fournissent des processeurs dits logiciels entièrement paramétrables. L’avantage de telles solutions réside dans un prototypage de cible hétérogène sur un FPGA avant le passage sur une cible de type ASIC. Des sociétés telles que ARC et Tensilica, fournissent des modèles de processeurs plus puissants et plus flexibles mais ces modèles ne sont pas optimisés pour des cibles FPGA. Le tableau 1.2 fournit une comparaison entre les solutions de Xilinx et d’Altera, le microblaze et le NIOS II. Les critères de choix ne sont pas seulement d’ordre économique, en effet la qualité des outils de développement est primordiale. D’un point de vue purement architectural, le microblaze possède une unité de calcul flottant optionnelle et voit son jeu d’instructions étendu pour différentes opérations complexes normalement gourmandes en temps de cycles. Les performances en termes d’opérations par Mhz sont quasi-identiques : 0.92 DMIPS pour le microblaze contre 1.16 pour le NIOS II. En revanche, ce dernier possède un avantage non négligeable qui est la possibilité de personnaliser le jeu d’instructions. Ainsi, le concepteur peut créer des instructions spécifiques à son application. Dans les deux cas, des blocs fonctionnels peuvent être désactivés suivant les besoins. Xilinx propose également des processeurs matériels de type PowerPC directement intégrés sur leur FPGA. Cette approche 1.1. ESPACE DE CONCEPTION ``` ``` Processeur ``` ``` Caract. DMIPS/MHz Long. Instructions Fréq. max Surface Pipeline ALU 21 NIOS II Microblaze 4.00a 1.16 32 bits 185 MHz 1800 LEs 900 ALMs 6 étages Multiplieur (1 cycle) Diviseur (optionel) Barrel Shifter (1 cycle) - 0.92 32 bits 180 Mhz 1,269 LUTs 3 étages Multiplieur (optionel) Diviseur (optionel) Barrel Shifter (optionel) FPU (optionel + 1300LUTs) Tableau 1.2 — Comparatif des caractéristiques des processeurs NIOS II et Microblaze semble, quant à elle, abandonnée par Altera qui proposa en 2001 un FPGA Excalibur basé sur une cible APEX et contenant un processeur ARM. Face à la complexité croissante des applications de traitement de signal, ces architectures ont évolué afin de pouvoir effectuer des calculs intensifs. D’une part, les instructions les plus complexes doivent être réalisées en un seul cycle grâce à l’utilisation d’unités spécialisées et d’autre part, il est nécessaire de paralléliser les traitements en augmentant le nombre d’unités de calculs. Ainsi, les processeurs de type DSP (processeur de traitement de signal) sont, comme leur nom l’indique, orienté pour le traitement de signal au sens large. La majorité des DSP conventionnels sont basés sur la structure Harvard séparant bus d’instructions et bus de données, sur des opérateurs dédiés (par exemple MAC), sur des registres distribués et sur des générateurs d’adresses efficaces (chargement optimal des données en mémoires). Dans un premier temps, le DSP était uniquement utilisé pour réaliser de simples additions et multiplications, programmé grâce à un langage assembleur et destiné à un éventail d’applications réduit. Très rapidement, l’utilisation massive d’applications de traitement de signal ont entraı̂né une mutation de l’architecture interne des DSP. La notion de parallélisme est apparue par l’intermédiaire : – des DSP SWP/SIMD (Sub Word Parallelism/Single Instruction Multiple Data ), le nombre des unités d’exécution augmente, il y a plus d’opérations par cycle mais la difficulté est dans l’alimentation des unités par des données. – des DSP VLIW (Very Long Instruction Word)(fig.1.14) et superscalaire (fig.1.15). Le but des deux approches est de bénéficier du parallélisme au niveau instruction de l’application. Dans le premier cas, les instructions élémentaires sont réorganisées par le compilateur afin de créer une « super instruction ». L’objectif est de remplir au mieux toutes les unités fonctionnelles. Dans le second cas , le principe est identique, toutefois l’ordonnancement des instructions est réalisé de manière dynamique par le DSP grâce aux techniques classiquement utilisées par les processeurs généraux (prédiction de branchement, cache dynamique). Cette parallélisation a cependant un coût non négligeable en terme de bande passante vers la 22 CHAPITRE 1. ETAT DE L’ART mémoire, de consommation, de mise en place du séquencemment, de taille de code et du temps d’exécution difficilement prédictible. Figure 1.14 — Pipeline d’un DSP VLIW à 5 étages Figure 1.15 — Pipeline d’un DSP superscalaire à 5 étages Le besoin de composants performants dans le domaine des applications temps réel est tel que le DSP est présent partout : les asservissements de moteur, les traitements audio et vidéo, les applications médicales...[Ins06][Inc06][Sem06]. 1.1.2.3 Les architectures hétérogènes L’évolution rapide des applications et la nécessité d’intégrer des solutions flexibles, performantes et évolutives ont poussé les concepteurs à développer une nouvelle approche. Dans l’optique de la réduction des coûts de production des systèmes complexes destinés au grand public, les architectures hétérogènes se retrouvent maintenant sur une seule et même puce. Un système sur puce, ou en anglais System-on-Chip (SoC), est le résultat de la juxtaposition de structures hétérogènes matérielles et logicielles afin de concevoir un système complet. Ainsi, un SoC peut comporter à la fois de la mémoire embarquée (RAM et ROM), un micro-processeur, des DSP, des blocs dédiés, des interfaces de périphériques, de la logique d’entrées/sorties, des convertisseurs de données, des bus des communications (voir fig 1.16)... Parallèlement à la construction de la partie matérielle du SoC, il faut développer la couche logicielle nécessaire à l’application (Système d’exploitation, fonctions...). Le but est d’optimiser le système en adaptant les ressources matérielles et logicielles aux besoins spécifiques. Le regroupement de cibles hétérogènes doit permettre d’adresser au mieux les problèmes de rapidité, de surface et de temps de latence. Compte tenu du coût de la réalisation d’un système sur puce, la validation du fonctionnement du système nécessite l’utilisation d’une plate-forme. Cette structure permet le prototypage à moindre frais d’applications complexes avant le passage obligé en fonderie. Elles sont généralement construites 1.1. ESPACE DE CONCEPTION 23 IP RAM E/S CPU ROM microprocesseur CNA/CAN IP DSP Figure 1.16 — SoC : une structure hétérogène autour d’un processeur généraliste. L’exemple de la plate-forme Sundance témoigne de la volonté des fournisseurs de proposer un ensemble de cartes permettant le développement de systèmes modulaires. En effet, cette solution s’intègre au coeur d’un ordinateur grâce à une carte de type PCI. Cette carte mère peut recevoir différents modules, à base de FPGA, DSP, convertisseurs A/N ou N/A , de mémoires embarquées et encore bien d’autres ressources qui bénéficient de liaisons rapides. Il est possible d’envisager de multiples systèmes et de valider un développement simplement. Cette plate-forme a été utilisée dans le cadre du projet PALMYRE pour l’implantation d’une chaı̂ne de communications numériques et une transmission dans un domaine hyperfréquence sur différents types de canaux. Un descriptif du projet est disponible en annexe B. De plus, l’adaptation aux techniques avancées telles que la mise en oeuvre de la modulation MC-CDMA, une transmission MIMO et l’intégration de codes correcteurs d’erreurs ont fait l’objet de nombreuses publications [RDV+ 05][MBG+ 05][RDM+ 06][NM05]. Même si l’approche SoC répond aux besoins en terme de performances et d’intégration, il en reste qu’elle n’est pas adaptée à l’évolutivité des systèmes. De plus, compte tenu des coûts de fabrication, elle ne peut être utilisée que pour des productions en grande série (fig. 1.17). Les étapes de conception et de test sont également longues et coûteuses. Une alternative est apparue autour de 2002 à travers le système sur puce reprogrammable, ou en anglais System on Programmable Chip (SoPC). Cette approche repose sur le principe des FPGA. Le prototypage et le développement sont donc rapides, la reconfiguration est effective en quelques ms et sur demande. En contrepartie, l’intégration est moins dense, la consommation plus élevée et les performances moindres. Ainsi, Xilinx et Altera proposent chacun leur processeur propriétaire qui peut être intégré sur la matrice FPGA (voir section précédente). Les deux solutions intègrent également des librairies de composants virtuels et 24 CHAPITRE 1. ETAT DE L’ART FPGA ASIC Microprocesseur E/S Microprocesseur IP Mémoire DSP Mémoire DSP Mémoire DSP DSP Logique Logique E/S Mémoire IP E/S IP E/S E/S Figure 1.17 — SoC sur une cible ASIC Figure 1.18 — SoPC sur un circuit FPGA de périphériques annexes. Des systèmes complexes reconfigurables s’implantent simplement sur un FPGA (fig. 1.18). Le concepteur peut ajouter des blocs matériels jouant le rôle d’accélérateurs. Cette approche utilisée dans le cadre de ce travail sera détaillée ultérieurement. Les solutions d’intégration SoC et SoPC ne sont pas concurrentes. En effet, dans le cas d’une large diffusion des systèmes, l’approche SoC est la plus appropriée. En revanche, si une plus grande flexibilité est souhaitée et dans le cas d’une petite série, le SoPC semble plus adapté. Ces architectures hétérogènes nécessitent des outils de conception évolués pour gérer la cohabitation de toutes les ressources. 1.1.3 Les méthodologies de conception 1.1.3.1 Les niveaux d’abstraction Les flots de conception se basent historiquement sur le flot de conception d’un ASIC. L’idée est d’élever le niveau d’abstraction lors de la conception afin de permettre la synthèse de systèmes complexes sur des architectures flexibles et performantes. En l’occurence ici, un système complexe est typiquement un SoC intégrant à la fois des parties logicielles et matérielles. L’évolution récente des technologies d’intégration encourage le développement d’approches dites de haut niveau, c’est à dire, une élévation des niveaux d’abstractions. Le flot de conception ASIC Les ASIC peuvent apporter des solutions à contraintes fortes en termes de performances, consommation et de surface. Le flot de conception associé permet également de répondre à ces contraintes. Il est ainsi constitué de plusieurs étapes bien définies permettant de multiples optimisations. 1.1. ESPACE DE CONCEPTION 25 A partir d’une spécification fonctionnelle, des raffinements successifs sont effectués afin de produire une description complète au niveau circuit (fig. 1.19). A chaque étape, des bibliothèques d’éléments associés sont disponibles pour raffiner la conception. Bien évidemment, ce flot est maintenant en grande partie automatisé pour faciliter la conception de circuit. Au niveau fonctionnel, des spécifications sont élaborées sous la forme de bloc diagramme et de cahiers des charges. L’utilisation de l’étape de synthèse architecturale peut permettre de transformer ces spécifications en une description matérielle associée. Elle est abordée plus en détails dans la section suivante 1.2. Au niveau architectural (ou transfert de registre, RTL en anglais ), le concepteur décrit la nature des ressources (RAM, additionneurs...) et les transferts de données dans un langage de description matériel (VHDL ou Verilog). A la suite d’une synthèse logique, la description RTL est transformée en une description d’éléments logiques (netlist) composée d’un réseau de portes logiques. De plus, le raffinement est accompagné d’optimisations en vitesse, en surface et en consommation suivant les technologies visées. Puis, la synthèse physique permet de convertir la description matérielle en description électrique (layout) décrivant l’agencement des transistors élémentaires et leur interconnexion. Enfin, la dernière étape produit les fichiers décrivant l’ensemble des interconnexions nécessaires à la fabrication tout en respectant des contraintes géométriques strictes LIBRAIRIE ASSOCIEE Niveau fonctionnel Synthèse architecturale composants Niveau architectural Synthèse logique portes Niveau logique Synthèse physique transistors Niveau physique Synthèse des masques masques Niveau topologique Figure 1.19 — Flot de conception ASIC Dans le cas de la conception de système complexe tel qu’un SoC, différents éléments décrits au niveau transfert de registre sont considérés. Ainsi la provenance de ces éléments constituant le système est multiple et ceux-ci doivent s’intégrer parfaitement. Cependant, un système ne peut être considéré comme fonctionnel que lorsque l’ensemble a été validé. Environ 90% des pro- 26 CHAPITRE 1. ETAT DE L’ART blèmes potentiels sont identifiés lors de la vérification de chaque bloc. Les 10% restants correspondent : – soit aux erreurs de fonctionnement simultanés des modules, – soit au dysfonctionnement des interactions entre modules, – soit aux erreurs dans la conception architecturale. Bien que moins nombreux, ces problèmes sont les plus difficiles à situer. De plus, la simulation d’un ensemble de composants décrits dans un langage matériel au niveau RTL se révèle souvent longue. Enfin, d’un point de vue économique, les problèmes non identifiés avant la gravure des masques peuvent devenir extrêmement pénalisants. C’est pourquoi, les systèmes disposant de blocs à la fois matériels et logiciels nécessitent l’adaptation des parties matérielles en vue de la co-simulation à un niveau d’abstraction plus élevé. Les différents niveaux à un haut niveau d’abstraction Compte tenu de l’évolution dans le domaine des systèmes embarqués, des coûts et des délais de mise au point, un consensus est apparu pour définir des niveaux d’abstraction plus élevés que le niveau transfert de registre [htta]. Ainsi, les différents niveaux identifiés par Gajski et Cai [CG03] sont les suivants : – UTF (UnTimed Functional) : ce niveau d’abstraction définit l’interface et la fonctionnalité du modèle. Il ne comporte aucune notion de durée d’exécution mais éventuellement un enchaı̂nement des événements. – TF (Time Functional) : ce niveau d’abstraction définit l’interface et la fonctionnalité du modèle. Il comporte des notion de durée (temps d’exécution, latence, temps de propagation...). – BCA (Bus Cycle Accurate) : ce niveau d’abstraction définit l’interface d’un composant et sa réactivité au niveau cycle. La modélisation des transactions sur l’interface est précise, au cycle près. Le temps de développement réclamé est bien plus important, mais ce niveau autorise une vérification par simulation des composants en permettant l’écriture de bancs de test précis. Les erreurs d’architecture de bas-niveau sont détectées à cette étape puisque l’implantation est proche du niveau transfert de registre. – CABA (Cycle Accurate and Bit Accurate) : ce niveau d’abstraction définit la sensibilité complète d’un composant au niveau cycle. La modélisation des transactions sur l’interface est précise au cycle près et décrit au bit près. Des erreurs dues au blocage interne des composants peuvent se détecter uniquement à ce niveau. Ces modèles reflètent la micro architecture niveau transfert de registre du composant implanté. – RTL (Register Transfert Level) : ce niveau d’abstraction définit l’interface et la fonctionnalité d’un modèle matériel. A partir de ce niveau, la suite de l’implantation s’appuie sur le flot 1.1. ESPACE DE CONCEPTION 27 classique de conception d’un ASIC. Afin de respecter les contraintes de développement, les concepteurs souhaitent donc établir des modèles transactionnels simples à mettre en oeuvre et rapides à simuler. Il est nécessaire d’associer les différents modules le plus tôt possible dans le flot de conception. Quelques modèles, décrits au cycle et au bit près, sont disponibles sur le marché, notamment des processeurs (ARM7, MIPS, SPARC), des caches, des contrôleurs mémoires... Ainsi, les descriptions TLM (Transaction Level Modeling) englobent l’ensemble de ces niveaux pour une gestion simplifiée de la complexité. La place centrale des techniques de vérification devient prépondérante compte tenu de l’hétérogénéité des systèmes. C’est pourquoi, un cadre de référence commun pour les parties matérielles et logicielles est indispensable à la modélisation, la vérification et l’implémentation. Les approches actuelles de la conception et validation des architectures matérielles/logicielles des SoC bénéficient de l’élévation des niveaux d’abstraction. Les outils associés doivent aider le concepteur à choisir les meilleurs compromis en termes de performances et de consommation. 1.1.3.2 La conception conjointe logicielle-matérielle L’intégration de structures hétérogènes telles que les systèmes sur puce (SoC) ou les systèmes reconfigurables sur puce (RSoC), l’accroissement de la complexité des applications et le partitionnement des solutions architecturales nécessitent l’utilisation de nouveaux flots de conception. De tels flots doivent favoriser l’exploration des solutions architecturales, à savoir le choix des composants pour l’exécution des différentes applications et le choix des structures pour l’échange de données. Au-delà de la simple mise-au-point de l’architecture matérielle, la disponibilité d’un modèle de haut niveau fonctionnel facilite l’intégration d’applications complexes dans les systèmes hétérogènes. Le développement logiciel de l’application doit nécessairement être conjoint au développement de la plate-forme matérielle. En effet, il est impératif d’exécuter et de vérifier le plus tôt possible dans la chaı̂ne de développement le comportement du logiciel sur une plate-forme matérielle. De plus, la plate-forme matérielle ne peut être validée qu’en prenant en compte le comportement du logiciel qu’elle est censée exécuter. On parle alors de codesign ou conception conjointe logicielle-matérielle. Un flot classique de codesign est illustré sur la figure 1.20. Quatre étapes sont nécessaires avant de procéder à l’implantation proprement dite. Après chaque étape, le concepteur est susceptible de revenir en arrière si les contraintes ne sont pas respectées. La spécification consiste à modéliser le système au niveau fonctionnel. Dans cette optique, les concepteurs disposent de méthodes, de modèles et de langages associés. Les méthodes peuvent s’appuyer sur un ou plusieurs modèles pour expliciter le comportement du système dans son ensemble 28 CHAPITRE 1. ETAT DE L’ART SPECIFICATIONS ESTIMATIONS PARTITIONNEMENT HW/SW SYNTHESE HW SYNTHESE COMMUNICATIONS SYNTHESE SW CIRCUIT Figure 1.20 — Les étapes constituant le flot de codesign (SADT, MCSE [CPIJ94]...). Dans ce cas, les approches peuvent être de deux natures : – « langage », chaque partie constituante est développée, optimisée et validée indépendamment dans son propre langage puis l’ensemble est regroupé en définissant le protocole de communication. – « système », chaque partie est modélisée, optimisée puis l’ensemble est regroupé dans un environnement commun pour validation sans expliciter les processus de communication [LXL01]. Cette seconde voie a le mérite d’être plus souple, notamment en ce qui concerne les optimisations globales et locales et de permettre l’exploration de l’espace de conception. Le principal intérêt des langages systèmes est de rendre possible le développement rapide par des ingénieurs systèmes d’une description hiérarchique et architecturale. Des langages sont également associés à ces modèles et intégrés dans les outils commerciaux. Ainsi chez Cadence [Cad], le C/C++ et ECL sont utilisés dans l’outil VCC. Chez Synopsys [Syn] et CoWare [Cow], le choix de SystemC semble d’autant plus pertinent qu’il vient d’être normalisé IEEE 1666 [Soc05]. Celoxica propose le langage Handel-C [SB], cependant leurs outils supportent également le SystemC. En ce qui concerne les estimations des systèmes en terme de surface, rapidité et consommation, elles demeurent peu précises au niveau algorithmique. Cependant, comme ce type d’approche se place avant le choix d’une plate forme matérielle, l’intérêt réside dans la possibilité de réaliser une exploration de l’espace de conception à un très haut niveau d’abstraction dans le flot de conception. 1.1. ESPACE DE CONCEPTION 29 Ainsi, l’analyse du code de l’application explicite son parallélisme et dévoile son orientation (contrôle, mémoire, traitement). Il est alors possible d’en extraire un modèle architectural abstrait. Par exemple, un outil tel que ATOMIUM [BCM97] permet une optimisation de la mémoire a priori. D’autres outils comme Design Trotter [MDP02] donnent les orientations du code de l’application à l’aide de métriques de caractérisation. Ces premières estimations au niveau système révèlent les points critiques de l’application, il est possible d’adjoindre des résultats d’estimations plus fins en choisissant, par exemple, l’implantation virtuelle sur un type de cible donné. Des méthodes d’estimation de l’exécution d’applications sur des parties logicielles fournissent des temps d’exécution en nombres de cycle et des tailles de code relativement précis [PEG99] [LMW95]. Des outils donnent également une estimation de la consommation au niveau fonctionnel grâce à des modèles pour les processeurs [LJSM04] mais elles doivent également fournir la consommation engendrée par le transfert de données et le stockage en mémoire [BCM97]. L’outil commercial ESL Power technology de Sequence Design fournit également des estimations en consommation de l’ensemble d’un SoC avec 30% de précision par rapport à une estimation au niveau logique. Enfin, les travaux de Gajski [GVN94] permettent d’avoir des estimations en terme de surface et en vitesse pour des cibles FPGA ou ASIC. En résumé, ces méthodes d’estimations sont plus ou moins précises mais elles sont un passage obligé pour le concepteur afin d’évaluer a priori les caractéristiques de son système. L’étape de partitionnement est délicate. Elle consiste à répartir les différentes tâches de l’application sur des parties matérielles ou logicielles suivant leur caractéristique. Elle peut être automatique ou manuelle, fonction des contraintes (en termes de vitesse et/ou surface) et de la granularité des applications. Les types d’architectures pouvant répondre aux demandes du concepteur sont multiples : – Processeur simple avec système d’exploitation temps réel embarqué – Processeur simple avec Coprocesseur et/ou accélérateur – Processeur simple et accélérateur de type dédié – Processeurs multiples Les méthodes de résolution se basent sur des heuristiques d’optimisation connues (Exclusions mutuelles, Glouton, clustering...) et des modèles de représentation multiples de type graphe. Ainsi, des outils tels que POLIS [Ba97], ConvergenSC [Inc] (Spinoff de l’IMEC) , Cosimate [Sof04] ont été proposés ces dernières années. Le processus de synthèse consiste à passer de la description de modèles à l’ensemble de l’architecture globale, il se décompose en trois étapes fondamentales : – la synthèse logicielle. – la synthèse matérielle. – la synthèse des communications. 30 CHAPITRE 1. ETAT DE L’ART La synthèse logicielle nécessite une couche applicative permettant la programmation de haut niveau du processeur contenu dans le SoC. Les tâches les moins critiques de l’application sont décrites dans un langage de développement de type code C/C++. Une compilation permet de répartir le traitement sur les ressources matérielles de la cible « logicielle » choisie par l’utilisateur. En effet, un processeur est décrit à la fois de manière matérielle pour spécifier l’architecture choisie et de manière logicielle pour donner le comportement des périphériques. Dans le même temps, une synthèse logique est réalisée pour la partie matérielle, elle consiste à compiler la description fonctionnelle des blocs à l’aide d’un outil de synthèse et d’une librairie de cellules logiques. Finalement, une « cross-compilation » permet au concepteur d’exécuter son programme sur la cible logicielle. La synthèse matérielle consiste à effectuer une synthèse logique des ressources nécessaires à l’application pour l’implantation sur un circuit dédié de type FPGA ou ASIC. Dans le cas d’un FPGA, cette étape est suivi d’une opération de placement routage sur le composant. Les ressources de communication représentent également le point critique du système. En effet, le bus système est la colonne vertébrale de l’architecture. Pour le décrire de manière optimale, le concepteur bénéficie de librairies de protocoles et des interfaces correspondantes (bus AMBA, FIFO, arbitre de bus...) décrites de manière plus ou moins fine (TLM, RTL, netlist). Il doit alors choisir des modes de transfert adaptés à sa problématique. Une synthèse est réalisée pendant le partitionnement tandis que la synthèse complète intervient après celui-ci [GABP98] [CAE00]. Il est à noter que cette étape devient délicate dans le cas des réseaux sur puce (NoC) puisqu’il faut garantir l’utilisation optimale de la bande passante, de la latence et de la disponibilité des ressources. Cependant, des travaux comme ceux autour de l’outil µSpider [EDH04] ou encore [MM04] permettent la synthèse sous contraintes et la génération d’un code RTL associé. 1.2 La synthèse architecturale Les besoins en terme de productivité ont favorisé l’émergence de méthodologies comme la synthèse d’architecture qui permet d’élever le niveau d’abstraction lors de la conception de circuits numériques. La synthèse architecturale, également appelée synthèse de haut niveau ou synthèse comportementale, consiste à fournir, à partir de spécifications au niveau comportemental, une description matérielle de l’entité qui l’exécute. Un bref historique sur la synthèse architecturale est tout d’abord exposé. Les différentes techniques de synthèse et quelques outils de synthèse employés (universitaires et commerciaux), dont ceux utilisés dans le cadre de l’étude, sont ensuite présentés. Enfin, les tendances actuelles sont évoquées. 1.2. LA SYNTHÈSE ARCHITECTURALE 1.2.1 31 Historique Un retour en arrière permet de mieux comprendre l’évolution du domaine et son état actuel [MJ03]. Il faut remonter à la fin des années 70 pour voir apparaı̂tre la notion de synthèse de micro-architecture [PTS+ 79][Zim79]. Elle consistait à produire un chemin de données et une machine d’états finis, c’est à dire, une unité de traitement effectuant des manipulations de données et d’opérations redondantes dans le temps [MRSC86] et une unité contrôlant le déroulement des tâches. Les bases de la synthèse haut niveau ont ainsi été posées grâce à une représentation interne sous la forme d’un graphe de données et de contrôle (CDFG). Toutes les techniques d’optimisation actuelles (voir 1.2.2) étaient déjà utilisées mais étaient destinées à produire l’architecture d’un processeur à partir de son jeu d’instructions. Puis, les processeurs de traitement de signal de type DSP ont été ciblés. Le principal point faible de la synthèse haut niveau des années 80 résidait dans le langage de description comportementale de l’architecture, car il n’y avait pas de standard. Même si des travaux ont été menés en ce sens [Bar80][Pa82], jusqu’a l’apparition du VHDL en 1987, les concepteurs restaient étrangers à ces spécifications. C’est seulement à partir de 1985 que les activités de recherche débutent sur la synthèse haut niveau telle que l’on entend aujourd’hui. Des travaux prévoient même l’intégration de micro-contrôleur et de blocs dédiés sur des ASIC [JPS85] [LSB85]. Les principaux travaux se concentrent alors sur les techniques d’ordonnancements, d’allocation et d’assignements. Bien sûr, les techniques d’ordonnancement des compilateurs étaient différentes pour chacune des méthodes [Cam91] [La97] et [GVLM92]. Dans le milieu des années 1990, le développement d’outil de synthèse haut niveau est en vogue et suscite beaucoup d’intérêt de la part des concepteurs de systèmes. Les descriptions sont moins complexes ce qui facilite l’exploration architecturale et l’évaluation de solution. Malheureusement, les points d’entrée (description VHDL ou Verilog) de ces outils n’étaient pas conçues pour de telles tâches et les résultats d’implantation ne remplissaient pas les contraintes en terme de vitesse et de surface. Depuis, les travaux dans le domaine ont permis d’affiner les outils. La convergence vers un langage haut niveau commun tel que le langage SystemC (notion d’horloge, exécution concurrente, précision niveau bit, hiérarchie...) laisse présager d’un futur prometteur. 1.2.2 Les techniques de synthèse Le but de la synthèse architecturale est de fournir une description structurelle de l’architecture proposée à partir de la représentation algorithmique établie par le concepteur. L’intérêt d’une telle approche est d’automatiser les tâches permettant d’aboutir au circuit en exploitant les caractéristiques de l’algorithme de l’application (parallélisme, contrôle). L’architecture générée respecte le squelette d’un modèle d’architecture générique. Il se compose classiquement de quatre unités fonctionnelles : une 32 CHAPITRE 1. ETAT DE L’ART unité de traitement, une unité de contrôle, une unité de mémorisation et une unité de communication. Cette modélisation sous forme d’unités permet de spécifier l’utilisation et la structure ainsi que le contrôle propre à chacune. Des bibliothèques de ressources sont de plus disponibles pour évaluer la complexité lors de la synthèse. Description comportementale Contraintes Compilation Sélection Transformation CDFG Allocation Ordonnancement Assignation et Optimisation LIBRAIRIE Description RTL Figure 1.21 — Différentes étapes constituant la synthèse de haut-niveau Les techniques permettant le passage du niveau algorithmique vers l’implantation matérielle sont les suivantes (fig 1.21)[Ga92] : – La compilation : l’analyse de la spécification algorithmique par le compilateur permet d’obtenir une représentation interne plus exploitable. Différentes techniques [Gal05] (déroulage de boucles, propagation des constantes, élimination des invariants de boucles...) vont mener à une description d’un graphe de données (DFG) ou d’un graphe de données et de contrôle (CDFG ) opérationnel. – La sélection et l’allocation des ressources : à partir d’une bibliothèque complète d’opérateurs, un choix tenant compte des contraintes de l’application est réalisé. L’allocation consiste à attribuer à la fois le nombre d’opérateurs nécessaires et à vérifier leur disponibilité dans le domaine temporel. – L’ordonnancement des ressources : des dates d’exécution sont attribuées pour chaque opération. Le déroulement de ces étapes forme le graphe d’états du contrôleur. L’ordonnancement peut se faire sous contraintes : de dépendance de données, temporelles (minimisation du nombre de ressources nécessaires) ou matérielles (minimisation de la latence). Des algorithmes 1.2. LA SYNTHÈSE ARCHITECTURALE 33 permettent de traiter ces problèmes, par exemple, l’ordonnancement au plus tôt ou au plus tard (ASAP/ALAP), à temps contraint (précédent l’allocation) ou à surface donnée (suivant l’allocation). – L’assignation : Cette étape consiste à affecter une opération ordonnancée à chaque opérateur alloué en essayant de minimiser le nombre de ressources et les connexions internes à l’unité de traitement liées à l’échange de données. La principale contrainte réside dans le fait que l’utilisation des ressources (opérateurs, registres, bus) ne peut pas être simultanée. – Affectations des opérations aux opérateurs – Affectations des variables aux ressources – Affectations des transferts de données aux bus Ainsi, les opérateurs arithmétiques sont concernés mais également les registres/file d’attente et enfin les bus. De plus, il est nécessaire d’optimiser les composants d’interconnexion (multiplexeur, démultiplexeur, portes trois états). L’idée générale, pour tous ces composants, est que deux entités peuvent partager la même ressource seulement à des instants différents dans le temps. Des méthodes globales et incrémentales permettent d’adresser ces problèmes. Le résultat de la synthèse architecturale est une description des unités fonctionnelles nécessaires au niveau transfert de registre et ciblant soit un composant de type FPGA ou ASIC. Afin que l’architecture générée par un processus de synthèse haut niveau puisse être intégrée au sein d’un circuit plus complexe, elle doit vérifier un certain nombre de contraintes. Celle-ci sont majoritairement temporelles ou matérielles mais elles peuvent être aussi d’autres natures (par exemple la consommation). Tout d’abord, l’obtention de l’architecture peut se faire sous contraintes temporelles comme dans tout système temps réels. Elle doit respecter des critères de fonctionnement (comme un échantillonnage par exemple) et fournir les données traitées à des débits fixés. Deux critères sont primordiaux : – la latence : il s’agit du délai entre l’entrée des données à traiter et la fin du traitement associé (disponibilité des résultats). – la cadence : il s’agit du temps qui s’écoule entre l’arrivée d’une donnée et l’instant où une autre donnée est présentée à l’entrée. Il faut noter que si la latence imposée est supérieure à la cadence alors l’architecture est pipelinée. Mais le concepteur ne dispose pas d’une surface illimitée sur silicium en raison du coût de la réalisation d’un circuit. La surface et donc les ressources disponibles peuvent être fixées. Ainsi, l’outil de synthèse doit fournir une architecture tenant dans la place impartie. Enfin, la consommation d’énergie peut être réduites grâce à certaines techniques une fois les 34 CHAPITRE 1. ETAT DE L’ART contraintes temporelles et matérielles respectées. Des contraintes au niveau des placements de données en mémoire [Cor05] ou des longueurs d’interconnexions [Jég00] peuvent aussi être envisagées. 1.2.3 Les outils Cette section présente une liste non exhaustive des outils de synthèse architecturale universitaires ou commerciaux. Bien que certains aient disparus, ils ont, semble-t-il, laissé la place à d’autres outils intégrant les dernières innovations dans le domaine. CATHEDRALII [MJJ+ 88] est le premier outil de synthèse architecturale à prendre en considération le traitement intensif de flux de données. Il est d’ailleurs à la base d’outils commerciaux. Par la suite, de nombreux outils universitaires ont été proposés : HERCULE [BCM+ 88], HYPER [CPTR89], AMICAL [POJ93], DEFACTO [BDD+ 99], MMAlpha [Gui03], SPARK [GGDN04]. Behavioral Compiler [Kna96] fut le premier outil commercial suivi de quelques autres encore : MONET [Ell00], Pico [httc]. Les outils les plus récents, dont ceux utilisés, pendant les travaux de thèse sont maintenant présentés. Gaut : GAUT [PMS93] est un environnement de synthèse d’architecture matérielle, dédié aux applications de traitement de signal et de l’image. Il permet d’obtenir une description structurelle VHDL à partir d’une description en langage C ou en langage VHDL comportemental sous contrainte de cadence. La description optimisée en surface résultante au niveau RTL est le point d’entrée des outils de synthèse logique du marché (comme Design Compiler de Synopsys). De plus, il permet de cibler des FPGA de chez Xilinx et Altera. L’architecture cible proposée par GAUT est constituée de 3 parties possédant chacune leur propre unité de contrôle : – Une unité de traitement : il s’agit de la partie combinatoire constituée de cellules élémentaires (opérateurs arithmétiques, registres et opérateurs de connexion)[Cor05][Gal05]. – Une unité de communication : il s’agit de l’ensemble des unités de mémorisation (files d’attente, registres) et du contrôle associés en fonction des lecture/écriture sur les ports d’E/S [Cou03]. Une machine d’états finis est associée à chaque port d’E/S en fonction des protocoles de communication. – Une unité de mémorisation : il s’agit de l’ensemble des bancs mémoires et d’une partie de contrôle, notamment les générateurs d’adresses. Une machine d’états finis globale contrôle l’ensemble des mémoires en fonction de l’ordonnancement [Cor05][Gal05]. L’ensemble est contrôlé par une machine d’états finis résultant de l’ordonnancement pour la synchronisation de ces trois unités [Bom04]. L’architecture cible peut être soumise à différentes contraintes : temporelles, d’E/S, de mémorisation, de surface et de consommation. 1.2. LA SYNTHÈSE ARCHITECTURALE 35 SystemC compiler [Kna96] Il s’agit en fait de la suite logicielle Behavioral compiler d’aide à la conception de circuits intégrés. Grâce à l’outil SystemC compiler de Synopsys, il est possible de passer d’une description en langage SystemC à une description au niveau logique. On peut distinguer 2 flots de conceptions et donc mener deux synthèses selon le point d’entrée choisi : – à partir d’un modèle écrit en SystemC comportemental [Syn01], une synthèse architecturale est possible et suivie d’une synthèse logique classique. – à partir d’un modèle écrit en SystemC [Syn02], il faut raffiner le code de manière à obtenir une description au niveau RTL et effectuer une synthèse logique. Dans le premier cas, l’architecture élaborée se compose d’un chemin de données, d’une mémoire et d’une partie de contrôle supervisant la partie de traitement. Le chemin de données est une succession de multiplexeur/registre/multiplexeur/opérateur dont les sorties sont toutes mémorisées. Une machine d’états commande chaque chemin de données. L’outil élabore la synthèse logique des composants nécessaires à la synthèse d’architecture obtenant ainsi des caractéristiques exactes par rapport à la bibliothèque de ressources. Les estimations de l’outil sont donc d’autant plus fiables mais le temps de synthèse est plus important. Le flot de conception prend pour entrée une description comportementale (SystemC, VHDL) de l’application. L’utilisateur fournit un temps d’horloge et le type d’optimisation qu’il souhaite (surface, vitesse, latence). Les étapes d’ordonnancement des opérations et d’allocations des ressources et des registres, de même que la génération de la partie contrôle, sont menées automatiquement par l’outil. Le point de sortie est un format propriétaire Synopsys qui peut être synthétisé en une netlist de type edif, vhdl ou verilog. Agility Compiler Agility Compiler, de chez Celoxica [httb], est un outil de synthèse haut niveau pour des projets développés à l’aide du langage SystemC. Le point d’entrée du logiciel est donc une description comportementale en SystemC. Le processus de synthèse permet de conserver la hiérarchie décrite dans le SystemC . Le point de sortie de l’outil Agility Compiler peut être : – une description au niveau RTL (VHDL ou Verilog). – une netlist au format EDIF pour les FPGA. – une description structurelle en langage SystemC permettant de vérifier la fonctionnalité du bloc. L’utilisateur peut explorer l’espace de conception et repérer les points critiques en fournissant une approximation de la logique utilisée pour chaque ligne de code. L’outil fournit une estimation en terme de surface, de latence et de chemin critique. La modification des contraintes temporelles est possible sur les signaux d’E/S puisque l’outil peut modifier le nombre de délais (tampons qui permettent de mémoriser des valeurs en vue d’utilisations ultérieures) à certains endroits afin de minimiser le temps de parcours du chemin d’exécution critique. 36 CHAPITRE 1. ETAT DE L’ART Agility Compiler intègre également des librairies permettant de cibler des FPGA. C’est pourquoi il est possible d’implanter la description en utilisant les ALU embarquées de chez Altera, de chez Xilinx (DSP blocks du Stratix et multiplieurs 18-bit du Virtex-II) ou des mémoires RAM de chez Actel, Altera et Xilinx. CatapultC Catapult-C est un outil de synthèse haut niveau mis au point par Mentor Graphics [Gra04]. L’outil synthétise des descriptions en langage C++ ANSI sans notion temporelle et d’extensions propriétaires. Il supporte également le langage SystemC. Le format de sortie est une description au niveau RTL en VHDL ou Verilog, compatible avec les principaux outils de synthèse. Il est possible de prendre pour cible soit un FPGA soit un ASIC. Les protocoles de communication n’ont pas besoin d’être décrits dans le code C++, le logiciel intègre une gestion de la synthèse d’interface, à savoir pour l’envoi de flux de données, RAM simple et double port, échange de donnée via le protocole requête/acquittement (handshake), FIFO, AMBA. Il est également possible d’utiliser son propre protocole via l’outil Catapult Library Builder. Catapult C permet également une exploration de l’espace de conception en proposant des architectures différentes suivant le choix des interfaces de communication. 1.2.4 Conclusion Le tableau 1.3 récapitule les différentes caractéristiques des outils décrits précédemment. Les outils de synthèse architecturale permettent donc de passer d’un langage de description comportementale à une description matérielle complète d’un système. Les différentes étapes lors d’une synthèse bénéficient de techniques éprouvées mais encore perfectibles. Les outils de haut niveau manquent également d’estimateurs très précis en terme de performances (consommation, vitesse et surface), mais les travaux entrepris présagent de futurs résultats intéressants. En effet, même si ces outils n’ont pas encore atteint leur plénitude, la normalisation d’un langage de développement conjoint tel que SystemC mais aussi et surtout l’apparition d’un consensus général pour bénéficier d’un modèle d’abstraction haut niveau comme le TLM laisse augurer d’une montée en puissance de tels outils. SystemC est d’autant plus intéressant que les descriptions de modèles au niveau RTL dans ce langage présentent des résultats post-synthèse identiques aux modèles décrits en VHDL [CHR+ 03]. Enfin, l’apparition d’outils commerciaux performants renforce cette tendance. 1.3. LA RECONFIGURATION Cible Point d’entrée Représentation interne Point de sortie Contraintes Visualisation Techniques Gaut FPGA ASIC C VHDL comp. DFG SystemC compiler FPGA ASIC SystemC VHDL comp. CDFG Agility FPGA ASIC C++ SystemC CDFG Catapult C FPGA ASIC C++ SystemC CDFG VHDL RTL niveau RTL Netlist Surface Cadence Latence aucun niveau RTL Netlist (FPGA) Mapping Mémoire Cadence/Latence uniquement rapport niveau RTL -Déroulage de boucle -Mémoire distribuée -Fusion de ressources oui -Déroulage de boucle -Mapping mémoire -Fusion de ressources oui E/S Cadence Latence Gantt -Déroulage de boucle -Mapping mémoire Largeur variable des chemins de données 37 non Cadence Latence Gantt Graphique X-Y Graphe Bar -Déroulage de boucle -Mapping mémoire -Fusion de ressources oui Tableau 1.3 — Comparatif des caractéristiques des outils de synthèse architecturale 1.3 La reconfiguration L’adjectif « reconfigurable » apparaı̂t en 1985 avec la naissance du FPGA (Field Programmable Gate Array) notamment le FPGA Xilinx XC2000 qui comportait à l’époque près de 1500 portes. Dans un premier temps, il est uniquement utilisé pour la validation à moindre frais des applications visant un ASIC (Application Specified Integrated Circuit). En effet, par son caractère réutilisable, le prototypage sur une cible de type FPGA est plus simple et moins coûteux. Cependant, il est important de définir ce qui est aujourd’hui désigné par le terme d’architecture reconfigurable de même que les différentes cibles matérielles concernées. Les travaux de recherche en cours et les architectures proposées dans le domaine universitaire sont détaillés par la suite. Enfin, après avoir évoqué les domaines d’applications et la granularité requise, les tendances et les différentes orientations actuelles sont présentées. 1.3.1 Définition Grâce à l’amélioration des techniques d’intégration et les multiples travaux de recherche dans le domaine, la notion d’architecture reconfigurable a dépassé le cadre unique des circuits de type FPGA et correspond maintenant à un ensemble de cibles hétérogènes. L’intérêt des architectures reconfigurables est de bénéficier des atouts à la fois des circuits de type FPGA et des processeurs. Ces derniers apportent leur flexibilité en terme de programmation tandis qu’un FPGA ajoute sa flexibilité 38 CHAPITRE 1. ETAT DE L’ART en terme d’utilisation des ressources. Ainsi, il est possible d’optimiser le traitement des tâches tout en conservant une certaine part de flexibilité pour l’ensemble de l’architecture. La notion de reconfigurable se prête à des définitions multiples qui varient d’un article à l’autre. Ainsi, chez [Dav03] les circuits sont dits programmables et leur flexibilité est mesurée par leur potentiel de reconfiguration, c’est à dire la capacité à adapter les ressources à un traitement donné. Chez [Bos04], l’approche est légèrement différente, en effet, la distinction est faite entre architecture reconfigurable et système programmable (processeur, DSP...). La différence réside dans le caractère astable ou multistable de l’architecture. Ainsi, une architecture programmable se configure à chaque cycle d’horloge à la différence d’une architecture reconfigurable qui conserve le circuit plus longtemps dans le domaine temporel avant d’être reconfiguré. Dans le cadre de l’étude, seule la première approche [Dav03] et donc la notion de flexibilité est considérée. Cependant, ce critère seul ne permet pas d’évaluer objectivement les avantages et les inconvénients de telle ou telle architecture. Il faut y ajouter des critères en termes de coût, performances, consommation... (fig 1.22) Flexibilité Processeur DSP ASIP Coûts FPGA ASIC Performances Figure 1.22 — Positionnement des solutions d’intégration les unes par rapport aux autres selon différents critères La reconfiguration concerne à la fois les ressources de traitement de données mais aussi les ressources de communication des architectures. Il est possible de la caractériser selon différents aspects. Le taux de reconfiguration d’une architecture est défini par [Bos04] : γ = Mec /Tec ≤ 1 (1.3.1) 1.3. LA RECONFIGURATION 39 où Mec est le nombre minimum d’éléments configurables à chaque reconfiguration, Tec est le nombre total d’éléments configurables. si γ = 1 alors l’ensemble de l’architecture est reconfiguré à chaque processus de reconfiguration, il s’agit d’une reconfiguration totale. En revanche, plus la valeur de γ est faible, plus l’architecture peut être modifiée partiellement de manière fine. Par exemple, chez Xilinx, seules les colonnes d’éléments sont configurables limitant ainsi la finesse de reconfiguration. Les besoins en terme de reconfiguration dépendent du domaine d’application, cela peut aller d’une simple mise à jour occasionnelle, en passant par des changements plus fréquents pour une application réseau, jusqu’à une nécessité de traitement temps réel pour les applications de télécommunications. Si la modification de l’architecture intervient en dehors de l’exécution de l’application en vue d’une amélioration ou d’une restauration de la configuration alors il s’agit d’une reconfiguration statique. En revanche, si l’architecture doit être modifiée en cours de traitement afin de réaliser des tâches particulières ponctuellement dans le temps, la reconfiguration est qualifiée de dynamique. Le but peut être de déplacer spatialement certaines parties de l’architecture, de réaliser un traitement plus rapidement en utilisant toutes les ressources disponibles ou bien encore de modifier des portions de l’architecture. Dans tous les cas, le procédé vise une forte flexibilité et une optimisation en surface sur la cible. Un moyen est de stocker en mémoire les configurations à effectuer (si elles sont planifiées) sur le composant, ce type de reconfiguration est dite multicontexte. Il faut alors prévoir des mécanismes de gestion [GBA03]. En cas d’autoconfiguration, l’initiation et la gestion du processus peut être conduite par un processeur embarqué fonctionnant avec un système d’exploitation [WB04]. De manière générale, le processus de reconfiguration se déroule en deux étapes. Le chargement de la configuration initiale s’effectue via un composant externe de type EEPROM ou un microcontrôleur. La reconfiguration dynamique partielle s’effectue en interne en modifiant soit des blocs matériels ou logiciels à partir d’un processeur embarqué. Les architectures présentées dans la section 1.1.2.3 abordent le problème en intégrant un processeur externe qui prend en charge le contrôle et la reconfiguration ou au contraire dissémine les parties de contrôles dans les différents niveaux hiérarchiques. A priori, les architectures gros grain (c’est à dire travaillant sur des données arithmétiques) hétérogènes sont avantageuses en termes de consommation de puissance et plus rapides lors d’une reconfiguration dynamique. Elles sont particulièrement adaptées au traitement de tous les standards et normes de télécommunications. Les cibles architecturales existantes possèdent des ressources de calcul et d’interconnexions permettant ces reconfigurations multiples. Il est possible de les répartir en 3 grandes familles : les architectures programmables, les architectures reconfigurables et enfin les architectures hétérogènes. Dans la littérature, le terme « Reconfigurable Computing » [Har01] est employé pour l’ensemble de ces familles. La suite décrit rapidement les particularités, les performances et les nouvelles orientations 40 CHAPITRE 1. ETAT DE L’ART de chacune de ces architectures. La particularité d’une architecture programmable est d’être configurable à chaque cycle car le fait de lire une instruction entraı̂ne un comportement particulier à instant donné. Dans le cadre d’un processeur généraliste de type RISC, la manipulation de données se fait de registre à registre tandis que pour un DSP, le transfert se fera de mémoire à mémoire. L’aiguillage des données est également géré par le programme. La gestion dynamique des unités fonctionnelles permet ainsi d’exécuter des applications différentes bien que l’architecture reste identique. Ce type de cible suit une exécution séquentielle qui pose un problème pour le traitement intensif de données. Malgré tout, les concepteurs cherchent des moyens pour augmenter le taux de parallélisation des architectures via des solutions de type VLIW[ISEF], voire ULIW[Avispa-IM2] ou encore superscalaire. Grâce à des extensions du jeu d’instructions [ISEF], il est possible de définir de nouvelles instructions en utilisant la flexibilité de la logique du processeur. Bien sûr, ce qui fait la force des microprocesseurs fait également leur faiblesse puisque que les lecture/écriture des instructions ajoutées à la gestion de larges bancs mémoire engendrent une consommation d’énergie importante. Les cibles reconfigurables de type FPGA présentent un attrait certain de par leur caractère grain fin. La forte densité d’intégration des dernières générations de composants favorise des traitements massivement parallèles au niveau bit. En théorie, il est possible de reconfigurer dynamiquement les bascules ou les LUTs mais en général les tailles des blocs reconfigurables sont plus conséquentes. Un autre point important est le maintien des ressources de routage qui devient critique dans la gestion des trames de configuration [refXilinxxapp290]. Dans le marché duopole des FPGA, Xilinx propose actuellement des solutions plus abouties que son concurrent Altera. Xilinx [Not04] a été le premier à fournir les outils pour reconfigurer dynamiquement ses composants Virtex 2 de manière totale ou partielle. Dans ce cas, les informations concernant les éléments modifiés sont contenus dans des trames de configuration de la matrice (une par colonne). Des travaux sur ces cibles tels que ceux de [HSKB06] ont permis de définir des blocs modulaires, avec les ressources d’interconnexions associées, qui peuvent être placés sur l’intégralité de la matrice (Virtex II). Un processeur est chargé du contrôle et de la configuration dynamique (via le module matériel ICAP de Xilinx). Aujourd’hui, des composants comme le Virtex 4 de chez Xilinx permettent de définir des modules reconfigurables de forme rectangulaires ainsi que des ports d’E/S permettant d’utiliser des mécanismes de communications avec les blocs élémentaires du FPGA . De plus, il est possible de modifier les parties du programme et de la zone de données d’un processeur logiciel (Microblaze) en utilisant un processeur embarqué (cas typique système multiprocesseur avec un processeur qui joue le rôle de contrôleur). L’intégralité du code de l’application doit tenir dans le cache pour une vitesse d’exécution optimale. 1.3. LA RECONFIGURATION 41 Les architectures hétérogènes reconfigurables sont destinées à un traitement optimum de certains types d’applications ou a contrario peuvent être suffisamment flexibles pour traiter un maximum d’applications. L’intérêt est de conserver le caractère programmable des processeurs tout en ajoutant la modification du chemin de données pour, par exemple, effectuer un traitement intensif. Il faut séparer la partie contrôle de la partie traitement pour entrevoir la possibilité d’une reconfiguration dynamique. L’agencement des ressources se fait autour d’une matrice d’interconnexions intégrant des composants d’interconnexions (« switch box ») et des unités fonctionnelles diverses (ALU, mémoire, générateurs d’adresse). Typiquement, il est possible de classer ces architectures suivant leur hétérogénéité, c’est à dire les architectures processeur-coprocesseur gros grain [BMN+ 01] ou grain fin [HW97][Alt] conçue pour les applications de traitement multimédia d’une part et les architectures dites « tuiles », résultant de l’association de nombreux modules permettant de supporter des applications multigrain [LST00] d’autre part. Un autre moyen de les caractériser, est d’identifier le réseau d’interconnexions qui peut être soit linéaire et favoriser les traitements pipelinés [CFF+ 99] (ressources de calculs voisines communiquent entre elles) ou alors hiérarchique et ainsi permettre des traitements arithmétiques [TAJ00][Dav03][AR96]. Reste que les critères sont multiples et que chaque architecture a ses particularités. Ainsi, tout dépend des besoins en terme de granularité des opérateurs, des réseaux d’interconnexions (topologie, souplesse), du potentiel de reconfiguration et de l’interaction avec un processeur. Dans la suite, nous présentons quelques-unes des nombreuses architectures hétérogènes reconfigurables illustrant ces choix. 1.3.2 Les architectures hétérogènes reconfigurables Cette section vise à présenter une partie non exhaustive des travaux réalisés dans le monde académique sur les architectures hétérogènes reconfigurables. Les approches sont différentes selon le domaine d’application et les choix effectués par les concepteurs (topologie du réseau, répartition du contrôle...). Les architectures présentées sont : – DART : Architecture reconfigurable dynamiquement pour applications de télécommunications mobiles [Dav03]. – MorphoSys : Morphoing System [LSL+ 99]. – Systolic Ring [SCGT01]. DART : Architecture reconfigurable dynamiquement pour applications de télécommunications mobiles [Dav03] L’approche de l’architecture DART (fig 1.23) conçue par l’équipe mixte R2D2 (IRISA à Rennes et ENSSAT à Lannion) consiste à proposer un système flexible tenant compte à la fois des contraintes algorithmiques et de la consommation d’énergie inhérentes aux différentes normes. 42 CHAPITRE 1. ETAT DE L’ART CONTROLEUR DES TACHES Data Path Reconf. CLUSTER 1 CLUSTER 2 CTRL E/S CLUSTER 3 CLUSTER 4 DMA Ctrl MEMOIRE D’INSTRUCT° C O N T R O L E U R MEMOIRE CONFIG. MEMOIRE DE DONNEES Figure 1.23 — L’architecture DART Data Path Reconf. Data Path Reconf. Data Path Reconf. Data Path Reconf. Config. Mem. FPGA Data Path Reconf. C O N T R O L E U R M E M O I R E M E M O I R E D O N N E E S D E Figure 1.24 — Structure d’un cluster de l’architecture DART Au niveau système, DART est composé de 4 clusters limitant ainsi la complexité du contrôleur supervisant la répartition des tâches sur le circuit. En effet, ce contrôleur distribue les différentes tâches sur les clusters dans le temps et selon la disponibilité des ressources. Pour chaque tâche, le contrôle est partagé à la fois entre les clusters qui possèdent leur propre contrôleur interne et l’unité de contrôle globale. De plus, l’architecture DART offre le moyen de répartir les unités de traitement sans être pénalisée grâce à l’utilisation d’un réseau d’interconnexions hiérarchique. Ainsi, les unités bas niveau restent connectées entre elles et ces sous-ensembles communiquent également entre eux. Le principal avantage de cette découpe architecturale est l’exploitation potentielle du parallélisme. Ce choix permet de fragmenter l’application en traitement plus simple et de mettre en évidence les coeurs de boucle. Un cluster se compose : d’un coeur de FPGA et de 6 DPR (DataPath reconfigurable fig. 1.24). Ainsi, deux niveaux de granularité (niveau arithmétique et logique) sont disponibles ce qui est idéal pour les applications de traitement de signal. Le FPGA et les DPR accèdent au même espace mémoire et leur reconfiguration est gérée par le contrôleur interne. Pour le premier, un chargement de la configuration appropriée est effectué via le contrôleur DMA. Pour le second, la reconfiguration est gérée par des instructions. Toutefois, la lecture de la mémoire d’instructions ne se déroule pas à chaque cycle d’horloge mais uniquement à chaque changement de configuration. Ceci entraı̂ne une économie importante de la consommation d’énergie. Les DPR sont donc des structures gros grain organisées autour d’un réseau multi-bus, d’unités fonctionnelles, de registres et de mémoires locales. Le « tout » est bien sûr flexible et reconfigurable suivant le traitement. Les unités fonctionnelles sont des multiplieurs/additionneurs ou des ALU reconfigurables dynamiquement. MorphoSys : Morphoing System [LSL+ 99] Il s’agit d’une architecture hétérogène reconfigurable (fig. 1.25) de traitement visant les applications de calcul intensif et de traitement parallèle de données. Développée au sein de l’université de Californie, cette approche repose sur le concept du modèle hybride se situant entre processeur généraliste et ASIC. Elle se compose d’une structure constituée de cellules reconfigurables, d’un processeur de 1.3. LA RECONFIGURATION 43 contrôle RISC et d’une interface mémoire à large bande passante (fig. 1.25). En ce qui concerne la structure matérielle reconfigurable, il s’agit d’un ensemble d’éléments d’interconnexions et de cellules configurables. Le fonctionnement des éléments et de leurs interconnexions est déterminé par le contexte. Figure 1.25 — L’architecture MorphoSys Figure 1.26 — Structure d’une Reconfigurable Cell TinyRISC est un processeur 32-bit personnalisé afin d’assurer la flexiblité pour MorphoSys. Les cellules reconfigurables (RC pour reconfigurable Cell) (fig. 1.26) constituent en quelque sorte le Data Path d’un processeur généraliste. Elles supportent des applications gros-grains et se composent d’un ALU/multiplieur (MAC en un cycle), d’une file de 4 registres, d’un registre à décalage et de 2 multiplexeurs en entrée. La configuration de chaque RC est stockée dans la mémoire de contexte et détermine l’orientation des données soit vers les bus et/ou vers les registres. Les structures d’interconnexions sont de trois types : connexions entre RC, connexions entre lignes et colonnes, connexions de lignes (express lanes) entre les 4 quadrants. Le tampon de trame est une mémoire interne pour l’ensemble des cellules reconfigurables. Le contrôleur DMA est commandé par le processeur TinyRISC et brasse les échanges de données entre la mémoire de contexte/tampon de trame et la mémoire externe. Les étapes nécessaires à la reconfiguration sont les suivantes : 1. TinyRISC demande le chargement d’une configuration de la mémoire principale vers la mémoire de contexte. 2. Le processeur demande le chargement des données de la mémoire principale vers le tampon de trame. 3. Exécution d’un contexte sur la structure des RC. 4. Calcul et chargement des données futures à traiter. 5. Le processeur contrôle le mode de diffusion des contextes et fournit également des signaux de 44 CHAPITRE 1. ETAT DE L’ART contrôle au contrôleur DMA, à la mémoire de contexte et au tampon de trame. Systolic Ring [SCGT01] Conçue au laboratoire LIRMM de l’université de Montpellier 2, l’architecture du Systolic Ring (fig. 1.27) est clairement orientée pour une reconfiguration à partir d’éléments gros grains en vue de l’implémentation d’applications de traitement de signal. Ainsi, d’un point de vue architectural, le Systolic Ring se compose de : – une couche opérative constituée de noeuds de données (Dnode fig.1.28). Il s’agit d’éléments DataPath composés d’un ALU et de registres et configuré grâce à des micro-instructions. – une couche de configuration basée sur une RAM donnant la description des connexions des Dnodes et des interconnexions de la couche opérative. – un coeur de processeur RISC avec un jeu d’instructions adapté jouant le rôle du contrôleur de configuration. Ainsi, il doit gérer non seulement la reconfiguration dynamique du réseau de routage mais également l’échange des données entre un processeur externe et la partie reconfigurable. Figure 1.27 — L’architecture Systolic Ring Figure 1.28 — Structure d’un Dnode Cette architecture s’intègre sur un SoC et est à considérer comme un coeur d’IP orienté pour le traitement intensif de données multimédia. L’avantage par rapport à un FPGA est une fréquence de fonctionnement plus élevée et la mise à disposition d’opérateurs gros grain. L’architecture favorise les applications traitement de signal et possède des chemins de données adaptés. D’un point de vue fonctionnel, le système d’exploitation du processeur externe charge l’application donnée spécialement conçue pour la co-exécution. Un programme exécutable fonctionne sur ce processeur et un code exécutable est chargée sur le contrôleur de configuration du Systolic Ring. 1.3. LA RECONFIGURATION 45 Le processeur charge d’abord le code destiné à la mémoire du contrôleur de configuration (gestion dynamique de la configuration du réseau d’interconnexions à chaque cycle d’horloge). Puis il envoie les données à la partie opérative et les récupère une fois le traitement accompli. 1.3.3 Les tendances dans le domaine des télécommunications La multiplication des normes de communications (WIFI, WIMAX, téléphonie 3G, 4G, DVB 2...) nécessite d’avoir des plate-formes suffisamment flexibles. En effet, la configuration matérielle doit évoluer à chaque changement de standard et ainsi assurer la compatibilité avec les normes les plus anciennes. Le paradigme de la radio logicielle [Mit] se propose d’associer les fonctions des couches 1 et 2 des protocoles de communication radioélectriques au moyen de développements logiciels en lieu et place de composants classiques. Grâce à ce procédé, les stations de base et les terminaux peuvent dialoguer ensemble à des prix de revient inférieurs de 20 % par rapport aux solutions classiques. Historiquement, le système de la radio-logicielle se compose d’une alimentation, d’une antenne, un convertisseur de radio fréquence multi-bandes et une puce contenant des convertisseurs (A/N et N/A), un processeur généraliste réalisant les fonctions radio et des interfaces associées. L’intérêt de la radio logicielle est de reconfigurer le système de télécommunication tout en conservant les éléments matériels déjà en place. La reconfiguration est dynamique plus ou moins temps réel en fonction des variations des conditions extérieures. Les équipements peuvent plus facilement assurer les fonctions de communication propres à chaque norme (UMTS et cdma2000, par exemple). Les paramètres tels que la bande de fréquence, la technique d’accès multiple, la modulation ou le codage peuvent être modifiés dynamiquement. Ainsi, la manipulation des trains binaires de configuration des cibles FPGA fait l’objet de travaux afin de préserver le fonctionnement et la reconfiguration de certains modules en cours de traitement [DGR04][HSKB06]. Des flots de conception ont également été proposés pour répartir les tâches matérielles et logicielles pour les applications radio sur des plate-formes reconfigurables dynamiquement [BNH06][DPL05]. D’autres travaux [PRR+ 03] sur la reconfiguration proposent la description d’un modem radio flexible en intérieur, adaptatif et reconfigurable (FAR). Un système est dit adaptatif s’il est capable de changer correctement les valeurs numériques d’un jeu de paramètres en fonction de l’application demandée. Il est dit reconfigurable s’il peut être restructuré au niveau structurel et/ou architectural par un changement non quantifiable (c’est à dire qui n’est pas caractérisé par des changements de valeur numérique). Bien sûr, il est possible d’avoir les deux caractéristiques à la fois notamment lors d’un changement de paramètre induisant une réorganisation architecturale. La tendance est donc au développement de terminaux intelligents, autonomes, auto-reconfigurables 46 CHAPITRE 1. ETAT DE L’ART qui s’adaptent aux variations de l’environnement extérieur. Même si les deux approches diffèrent sur la position des structures de contrôle (unités dédiées ou téléchargement logiciels hertziens), les orientations de minimisation de la consommation de puissance, des fonctionnalités de traitement de signal intelligentes pour réduire les coûts et de reconfiguration en temps réels se retrouvent dans les deux cas. Au niveau circuit, les méthodes de conception traditionnelles cherchant le compromis entre consommation/vitesse/surface sont mises à mal pour des terminaux devant supporter des traitements multiples et variés tels que les mobiles de nouvelle génération. Ainsi, les circuits permettant la reconfiguration dynamique de l’architecture en fonction des besoins semblent d’autant plus attractifs. Toutes les architectures décrites précédemment apportent des réponses aux différents problèmes rencontrés. 1.4 Notre positionnement La diversité et la complexité des applications de communications numériques, sous contrainte d’exécution temps réel, dédiées à des systèmes embarqués ne cessent de croı̂tre avec l’évolution du marché des télécommunications. L’évolution constante des caractéristiques de ces applications implique la définition d’architectures systèmes devant s’adapter dynamiquement aux nouvelles fonctionnalités (standards, services...). Notre positionnement tient compte du domaine de l’application choisie à savoir le décodage des codes correcteurs d’erreurs. L’idée est de pouvoir choisir son type de code, la taille et le pouvoir de correction. Il s’agit typiquement d’applications grain fin avec des entrées binaires ou qaires suivant le code. Les chemins de données sont donc dimensionnés en fonction des besoins. Sachant que les traitements utilisent les mêmes implantations d’algorithme selon les codes choisis, l’idée est de disposer d’une unité de contrôle « intelligente » fixant la configuration à utiliser. Nous avons donc décidé d’utiliser les outils et l’approche d’Altera. En effet, au début de ces travaux, la société Altera proposait des solutions plus matures que le concurrent Xilinx (expérience de la plateforme excalibur et processeur logiciel plus évolué), c’est ce qui a principalement motivé notre choix. Ainsi, le système est constitué d’un bloc matériel réalisant le traitement des données tandis que le contrôle est pris en charge par une structure de type processeur gérant à la fois les échanges de données entre blocs et mémoires. Le processeur RISC 32 bits logiciel embarqué est de type NIOS II, il est fourni par la société Altera (tableau 1.2). L’accent est mis sur l’aspect flexibilité plus que sur l’aspect reconfigurable. Ainsi, même si le processeur embarqué peut commander une reconfiguration totale du FPGA (y compris lui même), dans notre cas, il doit seulement produire les signaux de contrôle déterminant le comportement du bloc matériel qui prendra alors l’aspect souhaité. L’astuce repose sur les similitudes dans le traitement des applications. L’unité de contrôle est donc chargée de faire commuter le circuit d’un mode de fonctionnement à l’autre. On peut comparer cette approche à celle de [Kri05] qui après avoir repéré les traitements identiques lors de la réception du WCDMA passe d’un mode à l’autre suivant les contraintes d’utilisation. Le côté flexible et paramétrable a clairement été choisi dans notre approche 1.4. NOTRE POSITIONNEMENT 47 afin de bénéficier de plus de souplesse suivant les contraintes extérieures. Nous détaillons nos choix plus en détail dans le chapitre 3. L’intégration de structures hétérogènes reconfigurables, la forte complexité des applications et le partitionnement des solutions architecturales nécessitent l’utilisation de nouveaux flots de conception. En effet, il est désormais possible d’intégrer un système complexe dans un circuit reconfigurable SoPC (System on a Programmable Chip). L’évolution des caractéristiques de notre application au cours du temps implique la définition d’une architecture système devant s’adapter dynamiquement au décodage approprié. C’est pourquoi, un flot de conception reposant sur l’élévation du niveau d’abstraction à travers l’utilisation d’un langage haut niveau et de la synthèse d’architecture a été expérimenté. Le développement de langage de description système tel que SystemC permet une transition plus naturelle entre l’étude algorithmique d’un système et la définition de l’architecture associée. En effet, le flot de conception traditionnel est discontinu pour une implémentation matérielle. Cette discontinuité implique la réécriture de l’application validée au niveau algorithmique dans un langage de description matériel (VHDL, Verilog). Notre idée consiste donc à utiliser un flot de conception de haut niveau pour valider notre système constitué d’un processeur d’une part et un bloc matériel dédié d’autre part. Ainsi, l’environnement de conception système System Studio de Synopsys a été utilisé. Dans un premier temps, l’outil de synthèse de haut niveau SystemC Compiler, qui utilisait le langage SystemC, a été employé puis dans un second temps les outils Agility Compiler de Celoxica et GAUT du LESTER. Le but est de déterminer les apports d’une conception de haut niveau dans la mise au point d’une architecture flexible de turbo décodage de codes produits. Nous allons, dans le prochain chapitre, expliciter le domaine de l’application retenue c’est à dire le décodage des codes correcteurs d’erreurs. Après un rappel sur les codes correcteurs d’erreurs et leur rôle dans une chaı̂ne de communications numériques, les turbocodes en blocs sont détaillés. Puis, des résultats en terme de performances sont fournis pour les codes produits pouvant être traités par une architecture flexible. CHAPITRE 2 Les codes correcteurs d’erreurs - Turbocodes Ce chapitre vise à expliciter le domaine de l’application considérée dans le cadre de cette thèse. Ainsi, l’étude des turbocodes en blocs et leur implantation sur une puce silicium sont replacées dans le cadre de la théorie du traitement de l’information et plus spécifiquement dans le cadre des codes correcteurs d’erreurs. Dans un premier temps, la place de l’application dans une chaı̂ne de transmission numérique est précisée. Puis, les codes en blocs et plus particulièrement les codes utilisés dans cette étude, c’est à dire les codes BCH binaires et Reed-Solomon q-aires, sont exposés. Les méthodes de codage et de décodage sont décrites dans les deux cas. Enfin, la dernière partie présente les codes produits et le décodage pondéré et itératif employé. Ce décodage constitue le turbo décodage. Les performances liées à la mise en oeuvre des ensembles codeurs/décodeurs considérés sont également données, de même que l’intérêt et l’apport du système résultant. 2.1 Généralités De nos jours, la transmission de l’information d’un émetteur à un destinataire se base principalement sur des techniques de transmission numérique. Il est en effet aisé de manipuler un signal numérique et de lui appliquer les traitements souhaités. Un exemple de modélisation de chaı̂ne de transmission numérique est donné sur la figure 2.1. La source du message émet l’information sous la forme de symboles binaires. 2.1.1 Le codage/décodage de source Le codage de source intervient pour compresser la quantité d’information émise. Les symboles émis par la source sont convertis à partir d’un alphabet de symboles (ordinairement des bits) afin que ceux-ci puissent être récupérés au cours de la réception sans modification à partir des données binaires (codage 50 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES Source Codage de source Codage canal Modulateur Canal de transmission Destinataire Décodage de source Décodage de canal Démodulateur Figure 2.1 — Modélisation d’une chaı̂ne de transmission numérique sans perte) ou alors avec une distorsion (codage avec perte). Le codeur de source réduit la redondance contenue dans le message et minimise ainsi la quantité d’information utile à sa représentation. Le décodage de source réalise l’opération duale, le message d’information est décompressé afin de retrouver son équivalent avant la transmission. 2.1.2 Le codage/décodage de canal Le codage de canal permet de réduire les erreurs liées à la transmission de l’information sur le canal. Le principe consiste à rajouter des symboles de redondance aux symboles (binaires ou q-aires) d’information suivant une loi fixée a priori et connue de la partie de réception. Ainsi, il devient possible de détecter voir de corriger les éventuelles erreurs intervenues au cours de la transmission. Malgré la complexité relative introduite par un tel dispositif, il est aujourd’hui présent dans beaucoup de systèmes de télécommunications. Les codes correcteurs d’erreurs peuvent être repartis en deux familles : les codes en blocs et les codes convolutifs. Pour un code en blocs, la trame d’entrée de k symboles d’information est convertie en une séquence de sortie sur n symboles (avec k < n). Le bloc de sortie sur n symboles dépend uniquement des k symboles de la trame d’entrée. Les paramètres usuels du code sont k, n, R=k/n et la distance minimale dmin. Ils seront explicités par la suite. Pour un code convolutif, le codeur a un effet mémoire et prend pour entrée un symbole de m bits et fournit en sortie un symbole de n bits. Chaque symbole de sortie est déterminé par l’entrée courante et une partie de ν symboles mémorisés. Le rendement de ce code est R=m/n. La notion de linéarité est fondamentale puisque un code linéaire forme un espace vectoriel linéaire. 2.1. GÉNÉRALITÉS 51 Dans ce cas, il est possible d’additionner deux mots de codes pour produire un troisième mot de code. Le mot de code est en fait le mot élaboré à partir du message d’information et du code considéré. Le processus de codage et décodage est simplifié puisqu’il est possible de définir n’importe quel mot de code comme une combinaison linéaire des mots de code de référence (les vecteurs de base). Ainsi, l’analyse des propriétés associées au mot de code « tout zéro » peut être généralisée à l’ensemble des mots de code. C’est pourquoi, caractériser la performance d’un code linéaire revient à considérer les effets de la transmission sur le mot de code tout à zéro. La distance de Hamming (ou poids de Hamming) est alors équivalente au nombre d’éléments non nuls dans le mot. En pratique, la plupart des techniques de codage utilise des codes linéaires. Le décodeur effectue l’opération inverse du codeur. Pour un code en blocs, des méthodes algébriques sont utilisées pour la résolution de système d’équations. Pour un code convolutif, les méthodes de résolutions se basent sur le parcours d’un treillis (par exemple un décodage avec le maximum de vraisemblance pour l’algorithme de Viterbi). 2.1.3 Le modulation/démodulation Le modulateur génère un signal porteur afin de transmettre les données codées. Dans le cas de la modulation numérique, le message codé est transformé à partir d’un alphabet dont l’entrée correspond à une partie du signal à transmettre (i.e. un symbole). Le signal porteur est une sinusoı̈de dont on peut faire varier l’amplitude, la fréquence ou la phase indépendamment (ASK, FSK, PSK...) ou simultanément (QAM) en fonction de l’information à émettre. Le démodulateur joue le rôle dual du modulateur et transforme donc le signal reçu en un train binaire. La probabilité d’obtenir une transmission sans erreurs dépend du rapport signal à bruit, des effets de distorsion et du processus de détection. D’autre part, le démodulateur fournit une fiabilité de détection pour chaque symbole. Dans ces travaux, la modulation considérée est une conversion binaire/q-aire de type BPSK (une modulation de phase binaire), c’est à dire, que les éléments binaires transmis sont soit 1 (phase à 0˚) soit -1 (phase à 180˚). 2.1.4 Le canal de transmission Le canal représente le support de propagation du signal transmis. Le concept peut être élargi au stockage de l’information (CD, DVD, disques durs, ...). Dans le cas d’un canal gaussien, la sortie est le résultat de l’addition entre l’entrée du canal et un bruit blanc gaussien. D’autres perturbations peuvent intervenir comme par exemple des interférences liées à d’autres transmissions, multi-trajets qui nécessitent des modèles de canaux plus adaptés. Le canal est caractérisé par une probabilité de transition P r(Xi /Yi ) avec Xi l’entrée binaire et Yi le symbole reçu. L’étude se limite dans notre cas à un canal binaire symétrique et au canal à Bruit Blanc Additif Gaussien (BBAG). – Le canal BBAG : il s’agit d’un canal à entrée binaire et sortie analogique. La sortie se représente par une variable aléatoire continue y [Proakis89] : 52 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES y=x+b où x est le symbole binaire émis et b est une variable aléatoire gaussienne centrée de variance σ 2 correspondant au bruit du canal. Les densités de probabilité de transition du canal s’écrivent : 1 −(y − xi )2 P (y/x = xi ) = ( √ ) × exp 2σ 2 σ 2π (2.1.1) La variance est fonction du rapport signal à bruit σ2 = 1 Eb −1 ( ) 2 N0 (2.1.2) où Eb est l’énergie moyenne utilisée pour transmettre un symbole binaire et N0 est la densité spectrale de puissance monolatérale du bruit additif. Les échantillons transmis au décodeur de canal sont, en général, numériques, quantifiés sur Q bits. Ils résultent d’une conversion analogique/numérique. – Le canal binaire symétrique : la valeur Q définie précédemment prend deux valeurs dans le cas d’un canal binaire symétrique (CBS) sans mémoire et stationnaire. C’est le modèle le plus simple utilisé dans la théorie des codes correcteurs d’erreurs. Il sert de point de comparaison avec d’autres modèles. La décision en sortie du canal est ferme et non plus pondérée sur les échantillons reçus. Les entrées et les sorties de ce canal discret sont binaires. Les erreurs de transmission sont mutuellement indépendantes et apparaissent sur les entrées avec une probabilité p identique et invariante dans le temps. Les probabilités de transition du CBS sont présentées sur la figure 2.2. Figure 2.2 — Graphe de transition du canal binaire symétrique La prise en considération du CBS est à la base du développement d’algorithme de décodage algébrique basé sur le modèle mathématique des codes en blocs [Ber68][Mas65]. Pour des sorties 2.2. LES CODES EN BLOCS 53 de canal analogique, les algorithmes employés sont de type probabiliste. Ils sont dédiés à des codes convolutifs [Vit67] et à des codes en blocs [Cha72][For66]. 2.1.5 Performances d’un système de transmission : gain de codage La qualité d’une transmission numérique se caractérise par la probabilité d’erreur par élément binaire transmis, elle est notée PEb (ou PEs dans le cas de symboles q-aires). Cette probabilité est fonction du rapport signal à bruit Eb N0 (ou SNR en anglais). Le tracé de la courbe reliant les points de la PEb (à rapport signal/bruit donné) reflète directement la qualité de la transmission. L’obtention de ces points nécessitent des simulations complexes qui permettent de mesurer le PEb à travers le taux d’erreur binaire (TEB ). L’estimation du TEB est obtenue par simulation de la transmission de N symboles binaires et l’évaluation après décodage du rapport ne N où ne est le nombre de symboles erronés après décodage en réception. La pratique a montré que l’obtention d’au moins une centaine d’erreurs est nécessaire pour avoir une estimation correcte de la PEb . En l’absence de codage sur un canal BBAG et pour une modulation BPSK, la probabilité d’erreurs par élément binaire transmis s’écrit : PEb r 1 Eb = erf c[ ] 2 N0 (2.1.3) où erfc(x) est la fonction d’erreur complémentaire définie par : 2 erf c(x) = √ π Z x 2 exp−t (2.1.4) +∞ L’efficacité du code correcteur d’erreur est déterminée en effectuant la comparaison des courbes en sortie du décodeur de canal et en sortie du canal (en l’absence de codage). La distance entre les deux tracés donne le gain de codage G (fig. 2.3), il s’exprime en décibel dB. G représente l’économie d’énergie induite par l’utilisation d’un codage canal. Il est également possible de le voir comme l’amélioration de la qualité de transmission. 2.2 Les codes en blocs Les codes en blocs linéaires (ou codes de groupe) constituent un faible pourcentage de l’ensemble des codes en blocs. Cependant, il s’agit des codes en blocs les plus utilisés en pratique. Une seconde subdivision majeure permet de mettre en évidence les codes à polynôme générateurs et plus particulièrement les codes cycliques (codes BCH, codes Reed Solomon...). Pour certaines valeurs de longueur de code n, un code à polynôme générateur présente une propriété de circularité, c’est-à-dire, qu’une 54 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES Figure 2.3 — Peb en fonction du SNR pour un code Golay (23,12) avec décision ferme pour une modulation de type BPSK permutation circulaire des symboles d’un mot de code génère un autre mot de code. Après la présentation de quelques définitions et propriétés des codes en blocs linéaires, cette partie se focalise sur les codes cycliques et plus particulièrement sur les codes binaires BCH et q-aires Reed-Solomon. 2.2.1 Les codes en blocs linéaires Un mot de code d’un code en blocs linéaire C(n, k) (avec k < n) construit sur un corps de Galois (CG ou GF pour Galois Field en anglais) se compose de : – k symboles composés de la séquence d’information à transmettre répartis dans l’ensemble du message. – n-k symboles calculés à partir d’une combinaison linéaire d’une partie prédéterminée des symboles d’information et eux aussi répartis dans le message. Il s’agit des symboles de parité ou de redondance C(n, k) est un sous espace vectoriel de dimension k de l’espace engendré par (CG)n , n correspond à la longueur du code, k à sa dimension et k/n au rendement du code. Le code est dit systématique si les k symboles représentant le message sont transmis. Les n − k symboles restants sont les symboles de parité (fig. 2.4). 2.2. LES CODES EN BLOCS 55 k symboles d’information C0 C1 C2 C3 n-k symboles de redondance Ck-3 Ck-2 Ck-1 Ck Ck+1 Cn-3 Cn-2 Cn-1 n symboles du mot de code Figure 2.4 — Représentation d’un mot de code pour un code systématique L’addition et la soustraction sont deux opérations identiques puisque le corps CG(2m ) est obtenu à partir du corps CG(2) (={0,1}). Le formalisme matriciel est utilisé pour expliciter la fonction de codage, la matrice génératrice [G] du code C(n, k) se compose de k lignes et de n colonnes telle que [MS78] : C = M. [G] (2.2.1) où M est le message d’information de dimension k et C est le mot de code de longueur n généré. Une matrice de contrôle (ou de parité) H peut également être associée au code telle que : t t [H] . [G] = [G] . [H] = [0] (2.2.2) donc pour tout mot de code de C : t t S(C) = C. [H] = M. [G] . [H] = [0] (2.2.3) Cette dernière équation est importante puisqu’elle pose les bases de la détection et de la correction des erreurs de transmission. Le vecteur S(C) est appelé syndrome de C. Un syndrome nul indique que le mot reçu est un mot de code mais il ne garantit pas qu’il s’agit du mot de code émis. En effet, un mot de code peut très bien se substituer à un autre en fonction du motif d’erreurs (ME ). Par exemple, si R est le mot reçu, E le motif d’erreurs et C le mot de code émis, alors R = C ⊕ E et t t t S(R) = R. [H] = (C ⊕ E). [H] = E. [H] . Le syndrome dépend donc uniquement du motif d’erreurs. 56 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES Une autre caractéristique importante des codes en blocs linéaires est la distance de minimale de Hamming (dmin ) qui désigne le plus petit nombre de bits différents entre deux mots de codes distincts. Ainsi un code en blocs de distance (dmin ) est capable de détecter les motifs de (dmin -1) erreurs dans un bloc de dimension n et de corriger tous les motifs de t erreurs : (dmin ) − 1 t= 2 (2.2.4) où le symbole b c représente la partie entière. t est appelé le pouvoir de correction du code. 2.2.2 Les codes cycliques Les codes cycliques bénéficient de toutes les propriétés des codes en blocs linéaires en plus de la propriété de circularité. Pour rappel, pour tout décalage circulaire d’un mot de code, le mot généré est aussi un mot de code. Si c = (c0 , c1 , . . . , cn−2 , cn−1 ) est un mot de code alors le décalage circulaire de i produit c = (cn−i , cn−i+1 , . . . , c0 , . . . , cn−i−1 ) qui est aussi un mot de code. Chaque mot de code c = (c0 , c1 , . . . , cn−1 ) du code C(n,k) est associé à un polynôme c(x) = c0 + c1 x + . . . + cn−1 xn−1 . Le polynôme générateur d’un code cyclique C est le mot de code de degré le plus bas g(x) = g0 + g1 x + . . . + gr xr . Ce polynôme est unique et son degré est r = n − k. Tout mot de code c(x) peut donc s’écrire sous la forme : c(x) = m(x)g(x) où m(x) = m0 + m1 x + . . . + mk−1 xk−1 est le message d’information à coder. g(x) est également un facteur de xn + 1. Un message m(x) peut être codé sous forme systématique à partir du polynôme générateur g(x) de la manière suivante : – multiplication de xn−k par m(x). – division de xn−k m(x) par g(x) : xn−k m(x) = a(x)g(x) + b(x) avec b(x) reste de la division. – addition de xn−k m(x) et b(x) : c(x) = xn−k m(x) + b(x) (2.2.5) c(x) = xn−k m(x) + xn−k m(x)(mod(g(x)) (2.2.6) ou L’équation 2.2.5 donne le mot de code sous forme systématique et les composantes de b(x) sont 2.2. LES CODES EN BLOCS 57 les symboles de redondance (ou de parité). La matrice G du polynôme générateur peut s’écrire sous la forme : g0 g1 ··· gn−1 0 ··· 0 G= 0 .. . g0 g1 ··· gn−k ··· 0 .. . 0 ··· 0 g0 g1 ··· gn−k Chaque mot de code peut donc s’écrire : c(x) = [m0 m1 · · · mk−1 ]G Cette matrice peut être mise sous une forme systématique en effectuant des opérations linéaires sur les lignes. La matrice de parité h(x) est obtenu à partir de g(x) de la manière suivante : h(x) = xn + 1 g(x) (2.2.7) h(x) est de degré k, elle se présente ainsi : hk hk−1 ··· h0 0 ··· 0 H= 0 .. . hk hk−1 ··· h0 ··· 0 .. . 0 ··· 0 hk hk−1 ··· h0 et nous avons donc c(x)H t = 0, ∀c ∈ C Enfin, dans le cas des codes cycliques, le syndrome S(x) associé à un polynôme R(x) = C(x)+ E(x), de degré inférieur ou égal à n − 1, est le reste de la division de R(x) par g(x). Alors S(x) = R(x) mod(g(x)) = s1 + s2 x + . . . + sn−k xn−k . 2.2.2.1 Les codes BCH binaires Les codes BCH sont des codes cycliques, ils portent les noms de leurs inventeurs Bose, RayChaudhuri et Hocquenghem [BRC60][Hoc59]. Il s’agit de codes relativement performants, simples à mettre en oeuvre et pour lesquels il existe un ensemble d’algorithme de décodage algébrique de faible complexité. L’ensemble codeur/décodeur permet de construire un code cyclique et de corriger un nombre de t erreurs dans un bloc de n symboles codés transmis. Les notions d’algèbre dans le corps de Galois nécessaires à une compréhension plus approfondie des codes BCH ne sont pas présentées dans cette étude. Le lecteur intéressé pourra se référer à [CC81] pour de plus amples informations. Seuls les codes BCH binaires primitifs sont évoqués dans cette section. Leur longueur de codage n peut s’écrire n = 2m − 1 (pour n ≥ 3). 58 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES Pour un code C(n,k) BCH binaire primitif de distance construite δ ≤ dmin , le polynôme générateur g(x) admet δ-1 racines (αj , αj+1 , · · · , αj+δ−2 ) et s’écrit sous la forme : g(x) = P P CM {mj (x), mj+1 (x), · · · , mj+δ−2 (x)} (2.2.8) où PPCM est le plus petit commun multiple. * α est un élément primitif de CG(2m ) donc tous les éléments non nuls de CG(2m ) sont des puissances successives de α (CG(2m )= {0, α0 , α1 , · · · , α2 m −2 }) avec α2 m −2 = α0 = 1 et α racine n-ième de l’unité. * j est un entier. Lorsque j = 1, le code BCH est primitif au sens strict. La distance δ construite du code est impaire et sa distance minimale vérifie dmin ≤ δ = 2t − 1. Le polynôme générateur d’un BCH primitif au sens strict s’écrit : g(x) = P P CM {m1 (x), m2 (x), · · · , m2t−1 (x)} (2.2.9) Les caractéristiques d’un code BCH binaire primitif ayant un pouvoir de correction t sont donc les suivantes : – n = 2m − 1 (m ≥ 3). – k ≥ 2m − 1 − mt et n − k ≤ k. – dmin ≤ 2t + 1. Afin d’obtenir des codes ayant une distance de Hamming plus importante, une méthode classique consiste à ajouter un bit de parité globale (la somme modulo 2 de tous les autres bits). Il s’agit alors d’un code BCH étendu de paramètre (n + 1, k, d + 1 = 2t + 2) obtenu à partir d’un code BCH primitif. La distance du code étendu est augmenté de 1 et devient paire. Le bit de parité généré n’augmente pas le pouvoir de correction du code mais facilite la détection des motifs d’erreurs non corrigibles. Le rendement associé est légèrement inférieur à celui du code primitif mais le comportement à fort rapport signal à bruit est meilleur. Les symboles de redondance permettent le décodage des messages d’information reçus du canal. S est le vecteur associé aux composantes du syndrome : S=(s1 , s2 , . . . , sn−k ) et S(x) est son polynôme. Les valeurs des composantes du syndrome peuvent s’exprimer à partir des symboles du mot reçu R et du corps de Galois considéré : Si = R(αi ) = n−1 X rj (αi )j avec 1 ≤ i ≤ 2t (2.2.10) j=0 La fonction de décodage consiste à détecter et à corriger les erreurs en fonction du code BCH qui a été construit dans la partie émettrice. 2.2. LES CODES EN BLOCS 59 Le principe de décodage le plus simple à imaginer consiste à comparer le mot reçu Y avec les 2k mots de codes possibles. La sélection de la distance de Hamming minimale entre le mot de code et Y fournit alors le mot décodé. Ce critère est le maximum de vraisemblance a posteriori (MAP) et permet de minimiser la probabilité d’erreur par mot de code. Cette approche est toutefois très complexe pour des codes de longueurs importantes et des rendements élevés car le nombre de comparaisons nécessaires devient prohibitif. Il convient alors d’employer des algorithmes plus appropriés. Décodage dur des codes BCH Le décodage dur consiste à exploiter les données binaires issues du canal obtenues par seuillage. Les algorithmes de décodage utilisent les mots reçus du canal et en particulier les symboles binaires de redondance pour estimer le mot émis. Les algorithmes utilisés varient en fonction du pouvoir de correction t du code choisi. En fait, plus le pouvoir de correction augmente plus les algorithmes de décodage correspondants sont complexes. Un décodage ayant une complexité raisonnable est le décodage par syndrome. Il s’agit d’une version simplifiée d’un décodage optimal. En effet, l’exploitation des symboles de redondance permet de réaliser seulement 2n−k comparaisons par rapport aux 2k nécessaires classiquement. Ce type de décodage est particulièrement intéressant pour des codes à rendement élevé. Le syndrome est constitué de n − k composantes non-nulles en présence d’erreurs. Le mot reçu s’écrit : R(x) = C(x) + E(x) (2.2.11) Comme indiqué précédemment (section 2.2.1), le syndrome dépend uniquement du motif d’erreurs. C’est pourquoi il est donc envisageable de concevoir une correspondance entre la valeur du syndrome e Le processus de décodage se fait alors en trois étapes : et l’erreur estimée E. – le calcul du syndrome S du mot reçu R ; e; – la détermination de l’erreur estimée E e – le décodage du mot R à l’aide de l’addition R+ E. Ce processus s’applique à des codes ayant un pouvoir de correction de t=1. Pour des pouvoirs de correction supérieurs à 1 (t>1), des méthodes de décodage dites algébriques ont été proposées [For][Mas][Pet60]. Ces algorithmes ne permettent pas de corriger plus de t erreurs dans un mot, il s’agit de décodage dit à distance bornée. Pour toutes ces méthodes, le processus de décodage vise à résoudre l’équation-clef [Ber68] : S(x)σ(x) = Ω(x)mod(xn−k ) (2.2.12) 60 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES où S(x) est le syndrome sous forme polynomiale, σ(x) est le polynôme localisateur d’erreurs de degré ≤ t et Ω(x) est le polynôme évaluateur d’erreurs. La résolution de cette équation nécessite trois étapes élémentaires : – le calcul des composantes du syndrome S ; – le calcul du polynôme localisateur d’erreurs σ(x) et du polynôme évaluateur d’erreur Ω(x) ; – la détermination des positions des erreurs. Deux types de méthodes existent pour déterminer le polynôme localisateur d’erreurs. La méthode directe utilise l’algorithme de Peterson [Pet60] et peut corriger jusqu’à trois erreurs par mot reçu avec une complexité raisonnable (o(t2 )). Au delà (t > 3), des méthodes itératives plus complexes sont nécessaires. Elles reposent sur l’algorithme de Berlekamp [Ber68]. Dans le cas d’un code BCH binaire, la détermination des coefficients du polynôme évaluateur d’erreurs n’est pas nécessaire. Dans un premier temps, l’algorithme de Berlekamp-Massey est présenté dans le cadre du décodage des codes BCH. Il faut y adjoindre un algorithme de Chien pour déterminer les racines (c’est à dire les positions des erreurs) et une vérification du mot de code élaboré. Dans un second temps, une version modifiée et plus légère de l’algorithme de Peterson [Pet60][GZ61], dite PGZ, est abordée. Il est destiné à des pouvoirs de correction plus faible typiquement t=1 et t=2. Cet algorithme a été étudié avec l’aide de Mr Le Bidan du département Signal et Communication de l’ENST-Bretagne [Bid]. Une étude similaire a également été menée dans [WHW01]. – L’algorithme de Berlekamp-Massey vise à résoudre l’équation clé (2.2.12) à partir des composantes d’un syndrome de manière à identifier les coefficients du polynôme localisateur d’erreurs d’un des vecteurs tests. Dans cette étape, une version sans inversion de matrice [Bur71], moins coûteuse en temps d’exécution et en ressources, est utilisée. ∆(i) correspond aux coefficients du monôme xi dans le produit S(x).σ (i) (x) à la i-ème itération de l’algorithme : ∆(i) = Si + t−1 X (i) Si−k .σk k=0 Une étape préliminaire permet d’initialiser les variables : – σ (−1) (x) = 1 et ∆(−1) = S1 . – les variables internes d(−1) = 0 et β = 1 Pour (i allant de 0 à 2t − 1) – σ (i) (x) = β.σ (i−1) (x) − ∆(i) .e σ (i−1) (x) P (i) t−1 – ∆(i) = Si + k=0 Si−k .σk Si ∆(i) 6= 0 et d(0) ≥ 0 alors σ e(i) (x) = σ (i−1) (x), β = ∆(i) , d(i) = −d(i−1) − 1 Sinon σ e(i) (x) = σ e(i−1) (x), d(i) = d(i−1) + 1 fin si (2.2.13) 2.2. LES CODES EN BLOCS 61 fin pour Les 2t coefficients de σ(x) sont disponibles à la fin du traitement. Dans le cas particulier du code BCH, l’égalité Si2 = S2i implique deux fois moins d’itérations de l’algorithme. Le calcul des racines du polynôme localisateur d’erreurs correspond physiquement à l’évaluation des positions des erreurs dans le bloc des N bits transmis. Ce calcul revient à rechercher les racines de σ(x) parmi les 2m premiers éléments du corps de Galois GF(2m ). Dans ce cas, un algorithme itératif appelé algorithme de Chien est retenu. Il est basé sur l’évaluation d’un polynôme ayant les mêmes racines que le polynôme localisateur d’erreur σ(x). La condition à satisfaire pour que αn−i soit racine du polynôme est : t X σk .αik = σt (2.2.14) k=1 où i ∈ [0 ;t] Lorsqu’une erreur est détectée au cours d’une itération i alors la position de l’erreur est i et l’élément Xk = αn−i est la racine du polynôme localisateur d’erreur. αn−i est utilisé pour le calcul de la valeur de l’erreur. Pour la vérification de la parité, il s’agit simplement d’utiliser un opérateur XOR au fur et à mesure de l’arrivée des symboles. Le mot doit également être un mot de code. – L’algorithme PGZ pour un code binaire BCH vise résoudre le système suivant : S1 S2 ··· Sν S2 .. . S3 .. . ··· .. . Sν+1 .. . Sν Sν+1 ··· S2ν−1 σν σν−1 .. . σ1 Sν+1 Sν+2 = .. . S2ν En prenant : S1 S2 ··· Sν Mν = S2 .. . S3 .. . ··· .. . Sν+1 .. . Sν Sν+1 ··· S2ν−1 Il peut être montré que Mt [Bla03] est une matrice non singulière si et seulement si la dimension ν est égale au nombre d’erreurs ν introduites par le canal. Le décodage s’effectue alors de la manière suivante : – calculs successifs des déterminants de Mt , Mt−1... jusqu’à l’obtention d’un déterminant nul. Ce résultat fournit le nombre d’erreurs ν ; 62 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES – résolution du système linéaire (identité de Newton, pivot de Gauss...) afin de déterminer les coefficients de σ(x) ; – identification des racines de σ(x) et par conséquent des positions d’erreurs. Le décodeur doit également reconnaı̂tre son incapacité à détecter et corriger des erreurs. Malgré tout, il existe des dysfonctionnements de l’algorithme qui annoncent un décodage valide lorsque le mot décodé n’est pas un mot de code. Certaines précautions doivent donc être prises [SS94]. En résumé, les solutions adoptées dans notre étude pour le décodage des codes BCH binaires primitifs de faible pouvoir de correction sont : 1. l’utilisation des composantes du syndrome pour corriger t = 1 erreur. 2. l’algorithme PGZ pour déterminer la position de t = 2 erreurs dans le mot reçu. Le déroulement de l’algorithme est le suivant : Dans la suite, S1 , S2 , S3 , S4 désignent les quatre composantes du syndrome calculé. Le polynôme σ(x) s’écrit simplement sous la forme d’un polynôme de degré 2 : σ(x) = (x + X1 )(x + X2 ) = x2 + σ1 x + σ2 (2.2.15) σ1 et σ2 sont alors les solutions du système : S1 S2 S2 S3 σ2 σ1 = S3 S4 Le déterminant du système est ∆2 = det(M2 ) = S1 S3 + S22 . Plusieurs cas sont possibles : – ∆2 = 0, le décodeur considère qu’une seule erreur est commise comme pour le cas t=1. Le critère 2.2.16 permet de vérifier qu’il ne s’agit pas d’un échec de décodage : σ 1 S3 + S4 = 0 (2.2.16) – ∆2 6= 0, il y a deux erreurs dans le mot reçu, σ1 et σ2 valent : σ1 = S1 S4 + S 2 S3 S2 S4 + S32 , σ2 = ∆2 ∆2 (2.2.17) Si la racine est solution double alors un échec de décodage est déclaré. Il reste à déterminer les racines X1 et X2 de σ(x). La recherche des racines de σ(x) s’effectue généralement en testant chaque élément non nul du corps de Galois, tel que dans l’algorithme de Chien [Chi94]. Cela est très coûteux en nombre de calculs pour des corps de Galois d’ordre élevé. Cependant, Berlekamp [Ber68] et Gill [Gil05] ont décrit une technique simple utilisant une table précalculée à 2m entrées, de taille m.2m bits pour un code défini 2.2. LES CODES EN BLOCS 63 dans CG(2m ). Le but est donc de déterminer les deux solutions distinctes existantes X1 et X2 de l’équation de second degré : σ(x) = x2 + σ1 x + σ2 = 0 (2.2.18) un changement de variable x = σ1 donne alors : σ12 (u2 + u + c) = 0, avec c = σ2 /σ12 (2.2.19) Alors résoudre σ(x) = 0 est équivalent à résoudre u2 + u + c = 0, de plus les solutions sont du type U1 et U2 = U1 + 1 alors : (U1 + 1)2 + (U1 + 1) + c = (U12 + U1 + c) + (1 + 1) = U12 + U1 + c = 0 (2.2.20) Il suffit donc de trouver une seule solution pour avoir les deux racines de σ(x) ce qui donne : X1 = σ1 U et X2 = σ1 (U + 1) = X1 + 1 (2.2.21) Décodage pondéré des codes BCH Le décodage dur des codes BCH présente une faible complexité mais les performances sont sous optimales. En effet, le décodeur n’exploite que les entrées binaires obtenues par un seuillage des données pondérées fournies par le canal de transmission. Cela correspond à un décodage dur. L’idée est donc de conserver l’information pondérée fournie par le canal et de l’exploiter lors du décodage afin d’obtenir de meilleures performances. Ainsi, le décodage MVP permet de sélectionner le mot de code parmi les 2k possibles qui minimise le carré de la distance euclidienne avec le vecteur reçu. Si R = {r0 , r1 , ..., rn−1 } est le mot reçu alors le mot de code recherché C j = {cj0 , cj1 , ..., cjn−1 } doit 2 2 Pn−1 minimiser la quantité R − Cj = k=0 rk − cjk . Les méthodes classiques de décodage algébrique ne peuvent pas exploiter des données pondérées. D’autres algorithmes tentent d’approcher le décodage de type MVP [HR76][Wel71][BM78]. Toutefois, du fait de leur complexité, peu de ces algorithmes ont été utilisés. L’algorithme de Chase [Cha72] demeure à ce jour le plus approprié pour le décodage pondéré des codes BCH. Il est explicité dans la section 2.3.2. 2.2.2.2 Les codes Reed-Solomon Les codes Reed-Solomon (RS ) sont des codes cycliques et plus précisément des codes BCH non binaires, ils portent le nom de leurs inventeurs Irving Reed et Gustave Solomon. Il s’agit de codes 64 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES adaptés à la correction de paquets d’erreurs [RR72]. L’ensemble codeur/décodeur permet de construire un code cyclique et de corriger un nombre de t symboles q-aire erronés, fixé par l’algorithme de décodage, dans un bloc de n symboles q-aire codés transmis. Les codes RS font partie de la famille des codes séparables à distance maximale, ils sont optimaux au sens du critère de la distance minimale (MDS). Les codes RS sont constitués de symboles q-aire (avec q = pm ). Généralement des éléments binaires sont considérés c’est à dire p = 2 et par conséquent q = 2m . Chaque symbole q-aire d’un code RS est représenté par un m-uplet d’éléments binaires. Le code est défini par son polynôme générateur g(x) dont les coefficients sont exprimés dans CG(q) (={0,1,α, α2 , · · · , αq−2 }). Les caractéristiques d’un code Reed-Solomon ayant un pouvoir de correction de t symboles q-aires sont les suivantes : – n= q - 1 (m≥3) est la longueur du code. – k = n -2t est la dimension du code. – δ = 2t + 1 est la distance de Hamming. – δ = n - k + 1. Les codes RS ont une meilleure distance minimale à rendement de codage fixé par rapport à des codes BCH binaires où δ ≤ (n − k + 1). Décodage dur des codes RS Comme pour le décodage des codes BCH binaires, le décodage revient à résoudre l’équation-clef (2.2.12). Dans ce cas, la résolution de cette équation nécessite quatre étapes élémentaires : – le calcul des composantes du syndrome S ; – le calcul du polynôme localisateur d’erreur σ(x) et du polynôme évaluateur d’erreur Ω(x) ; – la détermination des positions des erreurs ; – le calcul des amplitudes de ou des erreurs. La valeur de l’erreur est fournie sur q bits, il s’agit de la correction à apporter au symbole erroné. Classiquement, la correction des codes RS intervient sur un ou plusieurs octets (t = 8 et CG(28 )). Les processus de décodage utilisent des algorithmes complexes tels que celui de Berlekamp pour calculer le polynôme localisateur d’erreurs et de Chien pour déterminer les racines. L’algorithme PGZ est le plus adapté pour ces faibles pouvoirs de correction (un ou deux symboles). Les symboles d’un code Reed-Solomon étant q-aires, la localisation des erreurs n’est pas suffisante comme dans le cas des codes BCH. Il est nécessaire de pouvoir estimer également leurs amplitudes afin d’effectuer les corrections associées. Seul la détermination du polynôme évaluateur d’erreurs et le calcul des valeurs des erreurs sont abordés puisque les autres étapes ont été définies dans la section précédente. 2.2. LES CODES EN BLOCS 65 – Pour l’algorithme de Berlekamp-Massey, le calcul des coefficients du polynôme ω(x) s’effectue de manière itérative comme pour la détermination des coefficients de σ(x). Les deux calculs peuvent être réalisés parallèlement pour diminuer la latence de décodage. L’évaluation des amplitudes de l’erreur Ei nécessite l’utilisation de l’algorithme de Forney. La valeur de chaque erreur est donnée par : Ei = Ω(αN −i )/σ 0 (αN −i ) (2.2.22) avec – σ 0 (x) : dérivée du polynôme localisateur d’erreurs, – Ω(x) : polynôme évaluateur d’erreurs, – αN −i : racine de σ(x). σ(x) est égal à : σ(x) = σ0 + σ1 .x + ... + σt .xt (2.2.23) σ 0 (x) = σ1 + 2.σ2 .x + 3.σ2 .x2 + ... + t.σt .xt−1 (2.2.24) σ 0 (x) = σ1 + σ3 .(αN −i )2 + σ5 .(αN −i )4 + ... + σt−1 .(αN −i )t−2 (2.2.25) soit : donc pour x = αN −i : D’autre part, Ω(αN −i ) est égal à : Ω(αN −i ) = Ω0 + Ω1 .(αN −i ) + Ω2 .(αN −i )2 + ... + Ωt .(αN −i )t (2.2.26) – A la différence du décodage BCH binaire, l’algorithme de décodage RS q-aire PGZ est utilisé à la fois pour corriger t = 1 et t = 2 erreurs. Une étape supplémentaire est nécessaire, elle consiste à résoudre complètement l’équation-clef pour obtenir les coefficients du polynôme évaluateur d’erreurs et obtenir les valeurs de ces erreurs (E1 , E2 , . . . , Eν ). Elles sont solutions du système suivant : X1 X2 ··· Xν E1 S1 2 X1 .. . X1ν X22 .. . ··· .. . Xν2 .. . E2 .. . ··· = S2 .. . X2ν X2ν−1 Eν Sν Les méthodes de décodage pour une erreur et deux erreurs dans un mot reçu sont explicitées dans la suite : 1. Processus de décodage du PGZ pour t=1 66 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES Soit S1 , S2 les deux composantes du syndrome calculé, le polynôme σ(x) s’écrit alors : σ(x) = x + X1 = x + σ1 (2.2.27) alors X1 = σ1 , l’inconnue σ1 est solution du système : [S1 ] [σ1 ] = [S2 ] (2.2.28) Ce système a une solution si et seulement si ∆1 = det(M1 ) = S1 6= 0, alors : X1 = σ(x) = S2 /S1 (2.2.29) Si X1 = 0 et donc S2 = 0, il s’agit d’un échec de décodage. La valeur de l’erreur, notée E1 , est la solution du système : [X1 ] [E1 ] = [S1 ] (2.2.30) E1 = S12 /S2 (2.2.31) E1 a pour valeur : Il faut noter que cette solution n’est valable que si S1 6= 0 et S2 6= 0. 2. Processus de décodage du PGZ pour t=2 La première partie est identique au cas du BCH pour la détermination du polynôme localisateur d’erreurs(voir 2.2.2.1). Les coefficients de σ(x) sont donc de la forme : σ1 = S1 S4 + S2 S3 S2 S4 + S32 , σ2 = ∆2 ∆2 (2.2.32) et les positions des erreurs sont données par : X1 = σ1 U et X2 = σ1 (U + 1) = X1 + 1 (2.2.33) Si la racine est solution double, un échec de décodage est déclaré. Il reste à déterminer les valeurs des erreurs. Elles sont les solutions du système : X1 X2 X12 X22 E2 E1 = S1 S2 soit : E1 = S1 X 1 + S2 S1 X 2 + S 2 et E2 = X1 (X1 + X2 ) X1 (X1 + X2 ) (2.2.34) Ces deux solutions sont exploitables si et seulement si E1 6= 0 et E2 6= 0. De plus, il faut X1 6= S2 /S1 et X2 6= S2 /S1 . 2.3. LES CODES PRODUITS ET LE TURBO DÉCODAGE 67 Décodage pondéré des codes RS Comme pour le décodage dur des codes BCH, le décodage dur des codes RS a une faible complexité pour des performances sous optimales. L’idée est de conserver l’information pondérée fournie par le canal et de l’exploiter lors du décodage afin d’obtenir de meilleures performances. Le décodage MVP permet de sélectionner le mot de code parmi les q k possible qui minimise le carré la distance euclidienne avec le vecteur reçu. Ici, les notations sont R pour le mot reçu et C le mot de code émis (cij = +1 ou −1) tel que : r11 r12 ··· r1n r21 R= .. . rm1 r22 .. . ··· .. . r2n .. . rm2 ··· rmn c11 c12 ··· c1n c21 C= .. . cνm1 c22 .. . ··· .. . c2n .. . cm2 ··· cmn 2 2 Pn Pm Le but est de déterminer le mot de code minimisant la quantité : R − Cj = k=1 l=1 rkl − cjkl . En pratique, l’algorithme de Chase [Cha72] reste, avec l’algorithme de Suda [McE03], un des algorithmes les mieux adaptés au décodage pondéré des codes RS pour une complexité réduite. Il est explicité dans la section 2.3.2. 2.3 Les codes produits et le turbo décodage Après une présentation générale sur les codes produits, les méthodes de décodage sont exposées. Dans un premier temps, le décodage pondéré et notamment l’algorithme de Chase correspondant sont décrits. Puis, l’adaptation pour le décodage à entrées et sorties pondérées et le rebouclage pour un processus itératif sont explicités. 2.3.1 Code produit Inventés par Elias en 1954 [Eli54], les codes produits aussi appelés codes en blocs sont des codes correcteurs d’erreurs performants avec des rendements et des distances minimales élevées. Ils sont construits par concaténation série de deux ou plusieurs codes en blocs linéaires. Soit C1 (n1 , k1 , δ1 ) et C2 (n2 , k2 , δ2 ) deux codes en blocs linéaires systématiques, les bits d’information peuvent être placés dans une matrice de taille (k1 × k2 ). Les lignes sont codées par le code C1 , 68 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES il résulte alors une matrice de dimension (n1 × k2 ) éléments. Les colonnes de cette nouvelle matrice sont alors codées par le code C2 ce qui produit une matrice de dimension (n1 × n2 ). Il s’agit donc d’une concaténation série de deux codes en blocs avec un entrelaceur régulier agissant sur les lignes et les colonnes. La figure 2.5 représente la matrice d’un code produit. Si le code constituant est un code BCH binaire, alors la valeur q est égale à 1. En revanche, si le code est un Reed Solomon, alors q est égal à m. L’intersection d’une ligne avec une colonne de la matrice est un élément binaire (resp. un symbole q-aire). La matrice d’information est constituée de k1 × k2 × q bits de données. q bits Redondance ligne k1 n2 Matrice M k2 des symboles d’information Redondance colonnes Redondance de la redondance n1 Figure 2.5 — Constitution de la matrice associée à un code produit Toutes les lignes de la matrice globale M (n1 ×n2 ) sont des mots de code de C1 et toutes les colonnes sont des mots de code de C2 . Les caractéristiques du code produit C est fonction des caractéristiques des codes C1 et C2 : – n = n1 × n2 , la longueur du code. – k = k1 × k2 , la dimension du code – δ = δ1 × δ2 , la distance associée. Les caractéristiques du code produit sont le produit des caractéristiques des codes composants. Le rendement R de codage du code C résultant est R = R1 × R2 avec Ri = ki /ni . La construction particulière du code rend possible le décodage de toutes les lignes et toutes les colonnes. Au lieu d’envisager un décodage global de l’ensemble du message, il est possible d’utiliser deux décodeurs pour respectivement les codes C1 et C2 . Dans notre étude, les codes composants C1 et C2 constituant le code produit sont identiques. Ce choix permet d’utiliser le même décodeur élémentaire pour décoder les lignes et les colonnes de la matrice considérée. Deux familles de codes cycliques sont utilisées : BCH et Reed-Solomon. Ces deux familles doivent être adaptées à un traitement à entrées pondérées et sorties pondérées (EPSP). Si le codage est relativement simple, le décodage le reste également dans le cas 2.3. LES CODES PRODUITS ET LE TURBO DÉCODAGE 69 d’un décodage ferme. En revanche, une adaptation est nécessaire dans le cas d’un décodage à entrées et sorties souples. 2.3.2 Décodage pondéré des codes produits Le choix en terme d’algorithme de décodage est large (Chase, Viterbi, Hartman et Rudolph), cependant, il convient de respecter un compromis performance/complexité pour bénéficier d’une solution avantageuse. L’algorithme de Chase est un algorithme permettant d’approcher les performances d’un estimateur de type MVP pour une séquence donnée tout en conservant une complexité raisonnable. A l’origine, cet algorithme n’est prévu que pour les codes binaires, il a donc été adapté pour traiter les codes Reed-Solomon s’appliquant à des codes q-aires[Aı̈t98]. Les notations sont les suivantes : C désigne le mot de code émis, R le mot reçu du canal et Y le mot binaire obtenu après seuillage des éléments de R (yj = signe(rj )). Au lieu de vérifier tous les mots de codes possibles lors du décodage en utilisant le critère du MVP, l’algorithme de Chase retient seulement les mots de code les plus probables avant d’appliquer une décision. Ces mots de code candidats se situent à l’intérieur d’une sphère de rayon δ −1 centrée sur Y, elle est notée B(Y, δ −1). Pour atteindre les mots de code C l se trouvant à l’intérieur de B(Y, δ −1), il faut construire des séquences de test à partir de Y tel que Yl = Y ⊕ Tl où les Tl sont les séquences de test dont le poids de Hamming est inférieur ou égal à bδ/2c (fig 2.6). C4 R C1 Y 2(į-1)1/2 2(t)1/2 C2 C3 Figure 2.6 — Illustration du décodage de Chase Chase a proposé trois variantes pour son algorithme [Cha72]. La deuxième version est celle que nous avons considérée comme offrant le meilleur compromis performances/complexité. Pour construire les séquences de test, la procédure consiste à repérer les positions des p (=bδ/2c) composantes les moins 70 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES fiables de Y à partir du message reçu R. La mesure de la fiabilité est donnée par le logarithme du rapport de vraisemblance (LRV) λj = ln P r {cj = +1/rj } P r {cj = −1/rj } (2.3.1) Il a été montré que l’utilisation des LRV permet d’avoir des performances optimales quelque soit le canal et la modulation employée [For66]. Pour un canal gaussien et une modulation MDP-2, le LRV est égal à : λj = 2 rj σ2 (2.3.2) Pour un canal de transmission stationnaire, la valeur absolue du λj normalisé, rj0 donne la mesure de la fiabilité yj : rj0 = σ2 |rj | 2 (2.3.3) Plus la valeur de rj0 est grande, plus la distance par rapport au seuil de décision sur yj et la fiabilité sont grandes. L’algorithme de Chase se déroule de la manière suivante : 1. Localisation des p composantes les moins fiables. 2. Détermination de la première séquence de test Y0 en effectuant une décision ferme à partir de R. Puis la construction des séquences de test est réalisée à partir des combinaisons d’erreurs en fonction des composantes les moins fiables. 3. Décodage algébrique des 2p vecteurs de test Yl donnant le sous-ensemble des mots Cl nécessaires au décodage pondéré. Les variantes de l’algorithme de Chase concernent l’élaboration des motifs de test. 2.3.3 Décodage itératif des codes produits Le principe des turbocodes en blocs repose sur le décodage itératif des codes en blocs concaténés. Le code retenu pour les turbocodes en blocs (TCB ) est le code produit proposé par Elias en 1954, c’est à dire une concaténation série de code en blocs avec un entrelacement uniforme. Il se prête idéalement au décodage itératif consistant à décoder successivement les lignes puis les colonnes. De plus, le décodage pondéré permet un gain de codage asymptotique par rapport à un décodage dur entre 1,5 et 2 dB. Ainsi, l’algorithme de Chase est un bon compromis performance/complexité. Toutefois, une adaptation est nécessaire pour qu’il puisse fournir des sorties pondérées et fonctionner de manière itérative. Cette adaptation porte le nom de l’algorithme de Chase-Pyndiah [PGPJ94]. La suite de cette section explicite la modification de l’algorithme. En sortie du décodeur, chaque symbole dj de la décision D est associé à une fiabilité. Elle peut être obtenue à partir du rapport de vraisemblance (plus exactement son logarithme noté LRV) donnée 2.3. LES CODES PRODUITS ET LE TURBO DÉCODAGE 71 par : λj = ln P r {ej = +1/R} P r {ej = −1/R} (2.3.4) La suite du calcul correspond au cas de la pondération des décisions à la sortie d’un décodeur binaire BCH. Cette propriété est extensible aux décodeurs durs RS [Aı̈t98]. Le code utilisé pour coder les lignes des mots des codes produits est noté C(n, k, δ). C i = i i c0 , c1 , . . . , cin−1 (avec i = 1, 2, ..., 2k ) sont les mots de code de C. En prenant cji ∈ {−1, 1} au lieu de cji ∈ {0, 1} (notation équivalente) pour simplifier les notations, alors le numérateur s’écrit : X P r ej = +1, E = Ci /R (2.3.5) P r ej = +1/E = Ci , R P r E = Ci /R (2.3.6) P r {ej = +1/R} = Ci ∈C D’après la formule de Bayes : P r {ej = +1/R} = X Ci ∈C De plus P r ej = +1/E = Ci , R = P r ej = +1/ej = cij = 1 si cij = +1 0 si cij = −1 alors (2.3.6) s’écrit : X P r {ej = +1/R} = Ci ∈C P r E = Ci /R (2.3.7) cij =+1 En notant S +1(j) l’ensemble des mots de code Ci de C vérifiant cij = +1, alors l’équation (2.3.7) devient : P r {ej = +1/R} = X P r E = Ci /R (2.3.8) Ci ∈S +1(j) et le dénominateur de l’expression 2.3.4 a pour expression : P r {ej = −1/R} = X P r E = Ci /R (2.3.9) Ci ∈S −1(j) En appliquant à nouveau la formule de Bayes : f (R/E = Ci ).P r(E = Ci ) P r E = Ci /R = f (R) (2.3.10) Les mots de code sont équiprobables P r E = Ci = 1/2k et pour un bruit blanc gaussien d’écart 72 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES type σ : f (R/Ci ) = 1 1 √ exp− 2σ2 n (σ 2π) X P r {ej = +1/R} = Ci ∈S +1(j) 1 2k f (R) Pn i 2 l=0 (rl −cl ) (2.3.11) i 2 1 1 √ exp− 2σ2 kR−C k n (σ 2π) (2.3.12) i 2 1 1 √ exp− 2σ2 kR−C k n (σ 2π) (2.3.13) et X P r {ej = −1/R} = Ci ∈S −1(j) 1 2k f (R) alors, le LRV du j-ième élément binaire de D s’écrit : 2 − 2σ12 kR−Ci k P i +1(j) exp λj = ln PC ∈S − 2σ12 kR−Ci k2 Ci ∈S −1(j) exp (2.3.14) Soit C+1(j) le mot de code appartenant à S+1(j) à distance euclidienne minimale de R et C−1(j) le mot de code appartenant à S−1(j) à distance euclidienne minimale de R, il est alors possible de mettre le LRV sous la forme : λj = P 2 2 1 −1(j) +1(j) i Ai P ( − C ) − − C ) + ln( R R 2σ 2 i Bi où Ai = exp( Bi = exp( 2 2 R − C+1(j) − R − Ci 2σ 2 2 2 R − C−1(j) − R − Ci 2σ 2 (2.3.15) ) ≤ 1, avec C i ∈ S +1(j) (2.3.16) ) ≤ 1 , avec C i ∈ S −1(j) (2.3.17) En supposant que les mots de code soient répartis de manière uniforme dans l’espace des mots de P P code, alors il est montré que i Ai = i Bi et donc que le rapport tend vers 1. L’équation (2.3.15) devient : λj = 2 2 1 −1(j) +1(j) ( − C − − C R R ) 2σ 2 (2.3.18) n X 2 +1(j) (r + rl cl pl ) j σ2 (2.3.19) soit : λj = l=0;l6=j avec pl = 0 si cl 1 si cl −1(j) +1(j) = cl +1(j) 6= cl −1(j) Dans le cas d’un canal gaussien et en normalisant par rapport à 2/σ 2 , l’expression (2.3.19) devient : 2.3. LES CODES PRODUITS ET LE TURBO DÉCODAGE 73 σ2 λj = rj + wj 2 rj0 = (2.3.20) avec : wj = n X +1(j) rl cl pl (2.3.21) l=0;l6=j Le terme r0 j correspond à la sortie pondérée du décodeur mais également à la somme de l’entrée pondérée et d’une quantité wj . Cette quantité est l’information extrinsèque qui joue un rôle prépondérant dans le processus de turbo décodage. wj est une combinaison linéaire des données pondérées en entrée et dépend des deux mots de code à distance euclidienne minimale de R avec +1 et -1 en position j. Le terme wj ne dépend pas de rj , il permet de transmettre au décodeur l’information sur le signe du bit ej contenue dans les autres éléments binaires du mot décodé. Bien sûr, la corrélation entre éléments binaires est introduite par le codage. Il s’agit maintenant de mettre en oeuvre le décodeur EPSP à partir de l’algorithme de Chase. Pour cela, un ensemble de mots de code à distance euclidienne minimale du mot reçu R est généré. R représente en fait le vecteur des LRV normalisés pour les éléments binaires du mot de code émis à l’entrée du décodeur. Le vecteur D correspond au mot de code décodé D donné par l’algorithme de Chase. Il faut déterminer la pondération de ses composantes dj à partir des deux mots de code C +1(j) et C −1(j) et de l’expression 2.3.18. D est forcément l’un des deux mots de code. Soit C le mot de code à distance euclidienne minimale de R vérifiant cj 6= dj , il est donc le second mot de code concerné. L’équation en sortie du décodeur peut alors s’écrire : 2 λj = 2 kR − Ck − kR − Dk × dj 4 (2.3.22) Le signe de la sortie pondérée, fournie par l’algorithme de Chase, est donné par dj et l’amplitude 2 2 est égale à la différence entre les deux métriques kR − Ck et kR − Dk . Ainsi, si la différence est nulle alors C et D sont équiprobables, la fiabilité de la décision est nulle. En revanche, si la probabilité de D tend vers un et celle de C est nulle alors la décision dj est de plus en plus fiable et l’amplitude tend vers l’infini. Il n’est pas toujours possible de trouver un mot de code concurrent D puisque la génération d’un grand nombre de mots de code est prohibitive en terme de complexité. Dans ce cas, une solution consiste à générer un nombre raisonnable de séquences de test. Si malgré tout, aucun mot de code concurrent n’existe, alors une relation empirique est appliquée : λj = β × d j (2.3.23) La décision optimale (dj ) est connue contrairement à sa fiabilité qui dépend de C. Si C se trouve à 74 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES l’extérieur de la zone de recherche définie par l’algorithme de Chase et ses séquences de test alors C est relativement éloigné de R (en terme de distance euclidienne). La décision est relativement fiable donc la valeur de β est élevée. Malgré tout, afin de ne pas donner des fiabilités trop fortes aux décisions erronées, la fiabilité est fonction de la probabilité d’erreurs en sortie du décodeur. Le beta se calcule à partir de la relation [Pyn98] : β ∝ ln P r {dj = ej} P r {dj 6= ej} (2.3.24) Le décodage EPSP des codes en blocs proposé par Pyndiah a été explicité, il faut maintenant décrire le principe du décodage itératif des codes produits induit par cet algorithme. Un code produit C est représenté par la matrice d’information [R] décrite sur la figure 2.5. Chaque matrice est donc un mot de code. Le premier décodage des lignes permet de produire une matrice de données [Λ] de laquelle est extraite l’information extrinsèque [W0 ]=[Λ]-[R]. Le processus de décodage se poursuit avec le décodage des colonnes de la matrice : [R1 ] = [R] + α0 [W0 ] (2.3.25) où α0 est une constante destinée à réduire l’impact de l’information extrinsèque dont la variance est supérieure à celle du bruit au cours des premières itérations de décodage. A la suite du décodage des colonnes, une nouvelle information extrinsèque est disponible et sera réinjectée au prochain décodage de lignes. De manière générale, en itérant le processus p fois, le décodage suivant les lignes et les colonnes s’exprime sous la forme d’une [Rp ] : [Rp ] = [R] + αp [Wp ] avec [R0 ] = [R] (2.3.26) où [Wp ] est l’information extrinsèque à l’itération p. Le principe du décodeur élémentaire utilisé pour le décodage itératif des lignes et des colonnes (à l’itération p) est représenté sur la figure 2.7. Figure 2.7 — Principe du décodage de la matrice Rp à la p-ième itération Comme vu précédemment, s’il n’est pas possible de trouver deux mots de code alors les éléments de 2.3. LES CODES PRODUITS ET LE TURBO DÉCODAGE 75 la matrice [Wp ] sont donnés par la relation (2.3.23), où β varie en fonction de l’itération p considérée. Comme la fiabilité du décodage croı̂t au fil des itérations, les coefficients α et β croissent également. Dans notre cas, pour des codes Reed Solomon, la transmission s’effectue à l’aide d’une modulation BPSK. Les bits constituant un symbole du mot de code sont reçus successivement du canal contrairement à l’utilisation d’une constellation d’ordre supérieure (MAQ 16, MAQ 32, PSK...) où plusieurs bits sont groupés en un seul symbole de modulation. Ce choix nécessite une adaptation du principe de décodage. Le processus de décodage s’effectue alors en trois phases : – une phase de réception au cours de laquelle, les bits les moins fiables sont identifiés (position dans le mot et dans le symbole) et les symboles du mot reçu sont reconstitués pour déterminer le syndrome ; – une phase de traitement correspondant au décodage dur de chaque vecteur de test (VT ) élaboré à partir des syndromes, des bits les moins fiables et des symboles du mot ; – une phase d’émission nécessaire à l’adaptation des sorties dures en sorties souples. Ces dernières sont les estimations pondérées des bits reçus et sont exploitées à la demi-itération suivante. 2.3.4 Performances du turbo décodage des codes produits Les performances du processus de turbo décodage en terme de TEB sont présentées dans cette partie. Tout d’abord, les premières courbes données concernent le turbo décodage des codes produits à base de code BCH de longueurs différentes et pour des pouvoirs de correction de t = 1 et t = 2. Ensuite, les résultats similaires sont présentés lorsque des codes RS sont employés comme codes composants. Enfin, les codes retenus dans le cadre de cette étude sont explicités et commentés. Les performances des turbocodes en blocs ont été étudiées par simulation de la transmission par BPSK sur un canal à bruit blanc additif gaussien (à différents rapports signal à bruit). Elles ont été menées avec l’aide de Mr Adde du département électronique. Pour l’algorithme de Chase, la construction des vecteurs de test a été effectuée à l’aide des 5 bits les moins fiables (voir section 3.4.1.2) de chaque mot reçu (ligne ou colonne). Le paramètre α dépend de la demi-itération en cours. Le paramètre β est élaboré à partir des fiabilités des 5 bits les moins fiables. Le nombre d’itérations de décodage utilisé est de 8. Les codes produits construits à partir de codes BCH primitifs binaires étendus (un bit de parité supplémentaire) sont considérés dans un premier temps. Les longueurs de codes n sont égales à 32, 64, 128 et 256 et les distances minimales de Hamming à d=4 et d=6 (pouvoir de correction t=1 et t=2). Les performances sont présentées sur les figures 2.8 et 2.9. Les codes produits construits à partir de codes RS sont considérés dans un second temps. Les longueurs de codes n sont égales à 31 et 63 et les distances minimales de Hamming à d=3 et d=5 76 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES 10-1 10-2 10-3 10-4 10-5 TEB 10-6 10-7 BCH(32,26)² BCH(64,57)² BCH(128,120)² BCH(256,247)² 10-8 10-9 10-10 1 2 3 4 5 Eb/No en dB Figure 2.8 — Performances des TCB-BCH (t=1) pour une modulation BPSK sur un canal BBAG 1.00e-1 1.00e-2 1.00e-3 1.00e-4 TEB 1.00e-5 1.00e-6 BCH(32,21)² BCH(64,51)² BCH(128,113)² BCH(256,239)² 1.00e-7 1.00e-8 1.00e-9 1.0 1.5 2.0 2.5 3.0 3.5 4.0 Eb/No en dB Figure 2.9 — Performances des TCB-BCH (t=2) pour une modulation BPSK sur un canal BBAG (pouvoir de correction t=1 et t=2). Les performances sont présentées sur la figure 2.10. L’effet « turbo » est illustré par la chute de la courbe du TEB en fonction du Eb /N0 . Il est 2.3. LES CODES PRODUITS ET LE TURBO DÉCODAGE 77 1.00e-1 1.00e-2 1.00e-3 1.00e-4 1.00e-5 TEB 1.00e-6 RS(31,29)² RS(31,27)² RS(63,61)² RS(63,59)² 1.00e-7 1.00e-8 1 2 3 4 5 Eb/No Figure 2.10 — Performances des TCB-RS (t=1, t=2) pour une modulation BPSK sur un canal BBAG lié au fait que l’algorithme de décodage utilise l’information extrinsèque, calculée à la demi-itération précédente, à chaque nouvelle demi-itération. De plus, cette pente est d’autant plus forte que le produit de la distance minimale par le rendement est élevé [Jac96]. Le tableau 2.1 récapitule l’ensemble des caractéristiques des codes présentés en terme de rendement et de distance minimale de Hamming. Turbocodes en blocs BCH t=1 (32, 26, 4)2 (64, 57, 4)2 (128, 120, 4)2 (256, 247, 4)2 BCH t=2 (32, 21, 6)2 (64, 51, 6)2 (128, 113, 6)2 (256, 239, 6)2 RS t=1 (31, 29, 3)2 (63, 61, 3)2 RS t=2 (31, 27, 5)2 (63, 59, 5)2 N (bits) 1024 4096 16384 65536 1024 4096 16384 65536 4805 19845 4805 19845 K (bits) 676 3249 14400 61009 441 2601 12769 57121 4205 18605 3645 17405 Rendement R 0.66 0.793 0.879 0.931 0.43 0.635 0.78 0.871 0.875 0.938 0.758 0.877 Distance de Hamming 16 16 16 16 36 36 36 36 9 9 25 25 Tableau 2.1 — Récapitulatif des caractéristiques des différents codes produits considérés Les critères de choix parmi l’ensemble de ces codes sont la faible complexité induite et la possibilité de traiter différents rendements de codes. De plus, il est à rappeler que le décodage de codes BCH 78 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES et RS nécessitent des traitements algorithmiques proches. Les choix effectués sont expliqués dans le chapitre 3. Ainsi, quatre codes ont été retenus pour l’implantation de notre application. Les codes produits sont donc construits à partir : – des codes BCH primitifs étendus de distance de Hamming resp. 4 et 6 et de longueur de code 32. – des codes Reed-Solomon de distance de Hamming resp. 3 et 5 et de longueur de code 31. Si le rendement souhaité est d’environ 0.5, un TCB ayant pour code composant un code BCH au pouvoir de correction de 1 ou 2 représente le meilleur compromis entre performance et complexité. Le principal avantage des TCB à base de codes Reed Solomon ayant des pouvoirs de correction de 1 ou 2 réside dans leur fort rendement. En effet, pour des rendements élevés (0,8-0,9), un TCB-RS nécessite une longueur de mot de code plus faible qu’un équivalent TCB-BCH. Par exemple, l’utilisation des codes TCB-RS(31,29) et (31,27) permet de réduire la longueur du code d’un facteur 3 à 4 par rapport à l’emploi de TCB-BCH (128,120) et (128,113). D’un point de vue architectural, cette caractéristique permet de réduire la complexité de la mémoire RAM et du décodeur élémentaire [PJAJ06b]. Les courbes de performances de ces codes sont données en figure 2.11. 1.00e0 1.00e-1 1.00e-2 1.00e-3 ΔLs corrigée = 0.93 dB 1.00e-4 TEP Limite de Shannon corrigée 1.00e-5 1.00e-6 BCH(32,26)² RS(31,27)² BCH(32,21)² RS(31,29)² 1.00e-7 1.00e-8 1 2 3 4 5 Eb/No Figure 2.11 — Performances du turbo décodage de codes produits La limite de Shannon LS est le rapport signal à bruit minimum au dessous duquel il est impossible de rendre le taux d’erreur binaire nul. Ce critère permet de mesurer l’optimalité de l’ensemble 2.4. CONCLUSION 79 codeur/décodeur. Une comparaison avec la limite de Shannon corrigée peut être effectuée. Cette limite prend en compte la taille des blocs du code correcteur d’erreurs. En effet, l’utilisation d’un outil en ligne (disponible sur http ://www-elec.enst-bretagne.fr/turbo/) permet d’évaluer l’écart entre limite théorique et limite corrigée. Cet écart est donné pour le code BCH(32,21)2 sur la figure 2.11. Les valeurs de LS , LS corrigée et l’écart entre la courbe et LS corrigée pour les autres codes sont données dans le tableau 2.2. Turbo codes en blocs BCH (32, 26, 4)2 (32, 21, 6)2 RS (31, 29, 3)2 (31, 27, 5)2 Ls FER de 10−4 (dB) 1.004 -0.130 2.879 1.691 Ls corrigée 2.239 1.320 3.439 2.279 ∆Ls corrigée 0.95 0.93 0.8 1.5 Tableau 2.2 — Limite de Shannon et gain asymptotique des différents codes produits considérés Dans trois des quatre codes considérés, les courbes de performances se trouvent à moins de 1 dB de la limite de Shannon corrigée ce qui garantit un décodage efficace. 2.4 Conclusion Dans ce chapitre, nous avons introduit le domaine de l’application considérée lors de notre étude. Ainsi, les turbocodes en blocs ont été replacés dans le cadre de la théorie du traitement de l’information et plus spécifiquement dans le domaine des codes correcteurs d’erreurs. Puis, les codes en blocs linéaires et plus particulièrement les codes BCH binaires et Reed-Solomon q-aires ont été exposés. Les méthodes de codage et de décodage ont été données pour les deux types de codes. Enfin, les codes produits et le processus de turbo décodage ont été précisés. Les performances liées à la mise en oeuvre des ensembles codeur/décodeur considérés ont également été données. Les critères que nous avons retenus pour l’ensemble des codes évoqués sont la faible complexité induite et la possibilité de traiter différents rendements de codes. Au final, nous avons conservé quatre configurations d’ensemble codeur/décodeur de codes produits. Les codes composants retenus sont capables de corriger une ou deux erreurs, il s’agit des codes : – BCH primitifs étendus de distance de Hamming respectivement 4 et 6 et de longueur de code 32. – Reed-Solomon de distance de Hamming respectivement 3 et 5 et de longueur de code 31. Ces codes ont des rendements faibles (#0.5) et des rendements élevés (#0.9). Pour des rendements élevés, un TCB-RS nécessite une longueur de mot de code plus petite que celle d’un équivalent TCB-BCH. Cette caractéristique permet alors de réduire la complexité architecturale du décodeur élémentaire et de la mémoire. De plus, pour trois des quatre codes considérés, les courbes de performances se trouvent à moins de 1 dB de la limite de Shannon corrigée ce qui garantit un décodage efficace. 80 CHAPITRE 2. LES CODES CORRECTEURS D’ERREURS - TURBOCODES Le chapitre suivant 3 présente dans un premier temps une étude de complexité des différents algorithmes susceptibles d’être implémentés. Dans un deuxième temps, la description de la solution architecturale pour le codeur flexible et pour le décodeur flexible nécessaires aux turbocodes en blocs est donnée. Enfin, la gestion du processus itératif et les critères de flexibilité sont détaillés. CHAPITRE 3 Étude et implantation d’un turbocode en blocs flexible Ce chapitre est consacré à l’étude du codeur flexible et du décodeur flexible nécessaires aux turbocodes en blocs. Dans un premier temps, un état de l’art rappelle les travaux effectués dans le domaine des turbo décodeurs reconfigurables. Dans notre cas, une analyse de la complexité algorithmique est effectuée pour déterminer les paramètres propres à l’application choisie. Notre approche consiste à faire apparaı̂tre les points de flexibilité exploitables lors de la mise en oeuvre d’une architecture dédiée. Ensuite, l’architecture générique du codeur est présentée. Elle peut supporter l’ensemble des configurations souhaitées à savoir les codes BCH (32,26) et (32,21) et les codes Reed-Solomon (31,29) et (31,27). Puis, l’architecture de l’ensemble du turbo décodeur est explicitée. La structure du décodeur élémentaire se compose de trois parties : réception, traitement et émission. De plus, une unité de contrôle se charge de la configuration de l’ensemble de la partie de décodage. Enfin, la gestion des aspects itératifs est explicitée. Cette fonction est assurée par un processeur logiciel de type NIOS II. Ainsi, l’échange des données avec la mémoire et la configuration du décodeur élémentaire sont entièrement gérés par ce composant. Les solutions architecturales envisagées sont données dans cette dernière partie. 3.1 Etat de l’art sur les turbo décodeurs reconfigurables Actuellement, les technologies reconfigurables sont « pensées » pour répondre à un compromis entre performances, qualité de service (QoS) et consommation d’énergie. Cette approche allie la flexibilité des processeurs avec la puissance de calcul des architectures « matérielles » traditionnelles. De plus, la reconfiguration dynamique, permettant de configurer des parties de l’architecture globale, 82 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE améliore les performances et réduit la consommation. Récemment, des équipes de recherche se sont intéressées aux architectures reconfigurables dédiées au décodage de codes correcteurs d’erreurs [RLP05][CV03][AA04][LTG04]. Bien que concernant les turbocodes convolutifs, tous ces travaux s’appuient sur des approches diverses suscitant notre intérêt. En effet, ils présentent plusieurs aspects importants : – le choix de critères de flexibilité. – le choix d’une cible architecturale. – le type de configuration employé. Dans l’optique de l’implantation de notre architecture, ces trois points sont également à prendre en considération. Tout d’abord, une étude des algorithmes mis en oeuvre dans l’application peut permettre d’isoler les paramètres. La variation de ces paramètres agit directement sur la complexité en terme d’opérations. De plus, une réduction de la consommation et une amélioration des performances sont envisageables. Ensuite, la mise en place d’une architecture adaptée au type de traitement est cruciale. Les solutions présentées sont de plusieurs natures, cela s’étend de l’architecture dédiée sur une cible ASIC à une association processeur/FPGA. Enfin, le type de reconfiguration (statique/dynamique et partielle/totale) doit être en adéquation avec les contraintes de fonctionnement de l’application en terme de qualité de service. La solution architecturale retenue fixe la manière dont elle sera réalisée. Pour toutes ces raisons, dans le cadre du décodage des turbocodes en blocs, les démarches entreprises dans l’ensemble de ces travaux sont à étudier de près puisqu’elles relèvent du même domaine d’application à savoir le décodage des codes correcteurs d’erreurs. Afin de mieux appréhender les algorithmes implantés et de comprendre les mécanismes employés, les différentes approches sont décrites dans la suite. Pour des explications supplémentaires sur le principe de décodage, il est possible de consulter des ouvrages dédiés à ce type de code [BG96]. Il est à retenir que le décodage d’un code convolutif se base sur le parcours du treillis du code choisi et la génération de métriques de branches et de noeuds (fig. 3.1). Plusieurs algorithmes peuvent être utilisés : – le MAP (ou BCJR pour Bahl-Cocke-Jelinek-Raviv)[BCJR74] est optimal au sens du critère du maximum de vraisemblance puisque tous les chemins du treillis sont explorés. Il nécessite deux parcours du treillis, un aller et un retour. Il est toutefois trop complexe pour être implanté dans un système réel. – le Log-MAP [RVH95] est l’adaptation du MAP par un passage à la fonction logarithme. Les performances sont identiques car la modification résulte uniquement d’un changement de base. Sa complexité moyenne autorise son implantation. – le Max Log-MAP est une version simplifiée du Log-MAP. Les pertes en TEB sont de l’ordre de 0.3 à 0.5 dB. Cet algorithme représente un bon compromis pour une implantation raisonnable 3.1. ETAT DE L’ART SUR LES TURBO DÉCODEURS RECONFIGURABLES 83 en terme de complexité. – le SOVA (Soft Output Viterbi Algorithm) [BAAF93] [HH94] est un algorithme plus facilement intégrable que le MAP. Il s’agit d’une adaptation de l’algorithme de Viterbi classique (décodage ferme) afin de prendre en compte l’apport des décisions souples. L’utilisation de l’algorithme SOVA présente une dégradation en performance de l’ordre de 0.2 dB par rapport à l’algorithme Max-Log-MAP. Cependant, sa complexité en nombre d’opérations est pratiquement deux fois plus faible. Métrique α ( xk ) = p ( xk , y − k ) Métrique γ ( xk ) Probabilité de transition sur le canal Métrique β ( xk ) = p ( y +k | xk ) Figure 3.1 — Le treillis et les métriques associées Dans [RLP05], le modèle de programmation logicielle est étendu au flot de conception pour un processeur reconfigurable appelé XiRisc. Ce dernier se compose d’un coeur Risc (orienté traitement de signal) associé à un composant reconfigurable en cours d’exécution (appelé un PiCoGA : une matrice de portes configurable pipeliné) effectuant des calculs spécifiques aux applications considérées. Ce dernier élément joue typiquement le rôle d’accélérateur matériel. Cette approche permet à un ingénieur logiciel d’évaluer le coût et le gain de l’exécution d’une partie de code C au sein d’un bloc logique. Cette architecture est plus exactement reconfigurable par reprogrammation. L’implantation d’un turbo décodeur UMTS a été réalisée. Chaque itération du processus de turbo décodage se compose de plusieurs parties critiques nécessitant des calculs intensifs : – le calcul des métriques de branches γ du treillis ; 84 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE – le calcul des métriques de noeuds α lors du parcours aller du treillis ; – le calcul des métriques de noeuds β lors du parcours retour du treillis ; – le calcul du rapport du maximum de vraisemblance LLR. L’opération dite « papillon » est le coeur de l’algorithme qui détermine les α et les β. Pour chaque section du treillis, les métriques de noeud α (et β) sont calculées de manière récursive, en utilisant les métriques de la section précédente et les métriques de branches γ préalablement calculées. Une itération de calcul nécessite quatre opérations papillon. Du fait des choix architecturaux, il faut deux instructions picoGA pour effectuer l’ensemble. La dernière partie du traitement détermine le rapport des maximums de vraisemblance, c’est à dire la probabilité que le bit transmis soit 1 ou 0. Dans un premier temps, une instruction pGA réalise l’addition de trois opérandes. Puis, une seconde instruction réalise une approximation de la fonction ln(ex + ey ). Pour chaque instruction exécutée par le picoGA, l’architecture limite l’échange à la lecture de quatre registres et l’écriture dans deux registres. Cette limitation impose des contraintes dans la génération du graphe flot de données et de contrôle à partir du code source. En effet, le graphe flot de données et de contrôle (CDFG) sert de point de départ à l’élaboration du bitstream (train binaire) destiné à configurer le pGA. Chaque cellule élémentaire du pGA peut recevoir jusqu’à quatre configurations différentes. Les opérations concurrentes permettent de réduire la latence d’une instruction. Quand l’exécution d’une opération nécessite plusieurs cycles alors une implantation pipeline augmente les performances à condition que l’instruction soit exécutée plusieurs fois sur des données différentes. Dans cette étude, le traitement est accéléré d’un facteur douze par rapport à une implantation conventionnelle tandis que la consommation est réduite d’un facteur quatre. Virturbo [CV03] est une architecture flexible implantée sur un FPGA. Elle est destinée au décodage de codes convolutifs et de turbocodes convolutifs. Pour ce faire, l’algorithme retenu est l’algorithme de Viterbi dans le premier cas et l’algorithme SOVA dans le second. Dans cette approche, la reconfiguration dépend de la longueur de contrainte k et du rendement R requis. Pour un code convolutif avec k donné, il y a 2k−1 états et 2k−2 opérations de type papillon à effectuer. Cette dernière opération est réalisée à l’aide d’une unité ACS (Add Compare and Select) ayant pour entrée les métriques de branches et de noeuds. Elle fournit en sortie les métriques de noeuds survivants, les décisions binaires et la différence entre les métriques de noeuds pour un SOVA. Ces unités ACS sont parallélisées pour K=9 (128 unités). Le fonctionnement global de Viturbo est illustré par l’architecture représentée sur la figure 3.2. En amont, les unités de calcul (MB) des métriques de branches γ alimentent les unités ACS concernées par la configuration. En sortie des ACS, des routeurs configurables de données orientent les métriques de noeuds réinjectées, les bits de décision et éventuellement les différences entre les métriques de noeuds (pour un SOVA). En aval, un module de gestion des métriques survivantes évalue les bits décodés et désactive les éléments non concernés par le calcul en fonction de la configuration. 3.1. ETAT DE L’ART SUR LES TURBO DÉCODEURS RECONFIGURABLES 85 Les débits atteints sont de 60 Mb/s (avec longueur de contrainte de 3 à 9) pour le décodage d’un code convolutif et de 3.54 Mb/s avec un algorithme SOVA avec 4 itérations pour un turbocode convolutif. La configuration s’effectue en un seul cycle d’horloge et ne nécessite pas la reprogrammation complète du FPGA. La flexibilité est obtenue grâce à l’utilisation d’un banc de multiplexeurs. Ces derniers contrôlent le routage des métriques. Cette architecture propose également une gestion automatique de la consommation et de la puissance. En effet, pour chaque configuration de l’application, les ressources non utilisées sont désactivées par l’intermédiaire de l’arbre d’horloge. Viturbo occupe une surface totale de 181560 portes logiques et nécessite 262146 bits pour la mémoire. MBmux(0) ACS(0) MBmux(1) ACS(1) M é m o i r e Entrées Calcul MB MBmux(127) Routeurs de données Sortie Mem1 S M U Mux Mem2 ACS(127) Ȇ-1 Ȇ Seuillage Mémoire décision souple SMU: Unité des métriques survivantes Mux MB: métriques de branches ACS: Unité Additionneur Comparateur et Sélection Figure 3.2 — L’architecture de Virturbo Une autre approche [AA04] propose un turbo décodeur reconfigurable permettant de sélectionner l’algorithme approprié en fonction des contraintes de fonctionnement. En effet, les deux algorithmes typiquement employés pour le turbo décodage convolutif sont l’algorithme SOVA et l’algorithme Log-MAP. Les auteurs proposent une alternative à l’utilisation du Log-MAP conventionnel utilisant conjointement un SOVA ou un Log-MAP faible consommation favorisant ainsi un compromis consommation/surface. Les critères de reconfiguration des deux algorithmes sont multiples. Le taux d’erreurs binaires (TEB) est tout d’abord considéré. Ainsi, pour un faible TEB, le SOVA est utilisé. Les performances du Log-MAP sont équivalentes mais sa complexité est deux fois plus importante. En revanche, à un fort TEB, le Log-MAP fournit de meilleures performances. La complexité du traitement est un autre critère envisagé. Pour un faible débit de données en entrée, l’algorithme Log-MAP est préféré au SOVA et vice et versa. Comme précédemment, les principaux modules constituant le décodeur sont les suivants [CSKPN00] : – Le bloc de calcul des métriques de branches γ : il est utilisé pour tous les décodeurs (à base de 86 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE Log-MAP, SOVA et Log-MAP modifié). Ce module évalue les métriques de branches à l’aide d’un ensemble d’additionneurs reconfigurables. – Le bloc de calcul des métriques de noeuds α et β : il fournit les métriques associées au parcours du treillis de décodage. Le SOVA ne nécessite qu’un parcours aller du treillis tandis le log-MAP (version traditionnelle et modifiée) a besoin d’un aller et d’un retour. Ce module est constitué de deux sous blocs : – Le bloc de calcul des métriques de noeuds : il détermine la métrique de noeuds suivants en additionnant les métriques de branches et les métriques de noeuds précédentes et ceci pour chaque section du treillis. Ces opérations d’additions sont reconfigurables. – Le bloc de calcul des chemins survivants et le bloc FEC : les métriques de noeuds sont comparées et les valeurs absolues des différences sont calculées. Dans le cas du SOVA, le bloc 0 1 FEC n’est pas nécessaire. Il permet d’évaluer l’expression ( e−|SMk −SMk | ) indispensable au calcul du log-MAP. En résumé : – Pour le SOVA, les deux métriques maximales sont conservées : M ax(SMk0 , SMk1 ). 0 1 – Pour le Log-MAP, l’opération est M in(SM 0 , SM 1 ) − ln(1 + e−|SMk −SMk | ). k k – Pour le Log-MAP modifié, il faut calculer M in(SMk0 , SMk1 ) − ln(1 − e−|SMk −SMk | ) 0 1 – Le bloc de calcul des rapports des logarithmes de vraisemblance : il est dédié à l’algorithme Log-MAP et utilise des unités ACS et une mémoire. Les deux versions des turbo décodeurs, c’est à dire l’algorithme original Log-MAP et la version modifiée, ont été implantés sur une cible ASIC à base de technologie UMC 0.18 µm à l’aide des outils de Synopsys. La baisse de consommation dans le second cas est de 35% tandis que le taux d’occupation en surface est réduit de 45%. Enfin, les travaux de [LTG04] concernent un turbo décodeur dynamiquement reconfigurable et optimisé pour la consommation de puissance. L’idée est de reconfigurer l’algorithme de décodage SOVA à la base du turbo décodage (qui devient ici ASOVA pour Adaptative SOVA) en fonction des conditions extérieures. Comme dans les articles précédents, le nombre total de métriques de noeuds est proportionnel à 2k−1 (k longueur de contrainte). L’adaptation du SOVA vise à éliminer les chemins les moins vraisemblables, c’est à dire ceux qui ont le moins de chances de conduire à un mot décodé. Nmax chemins sont conservés. Des simulations ont été menées pour différentes longueurs de contraintes k et différents Nmax en fonction du SNR. Ainsi, les combinaisons de paramètres conduisant à une implantation matérielle la plus simple possible ont été retenues pour satisfaire à un TEB faible. Les performances observées se rapprochent de celles du Log-MAP. Le décodeur est l’élément clef du turbo décodage, son architecture est représentée sur la figure 3.3. Elle se compose de quatre modules : le bloc de calcul de métrique de branches γ (MB), l’unité ACS, une mémoire pour les métriques survivantes (SMU) et le module de contrôle. Ce dernier se compose d’une machine d’états finis et gère l’échange de données entre les trois unités. Le fait de pouvoir réduire la valeur du paramètre Nmax à un k donné 3.1. ETAT DE L’ART SUR LES TURBO DÉCODEURS RECONFIGURABLES 87 entraı̂ne une baisse significative de la consommation, une hausse du débit et une augmentation de la fréquence de fonctionnement. En terme de reconfiguration dynamique, le fait de pouvoir modifier le circuit en fonction du SNR requis présente également une économie de la consommation. Chaque reconfiguration est stockée dans une mémoire SDRAM. En s’appuyant sur le fait que le rapport signal à bruit peut être échantillonné tous les 250 000 bits, le FPGA est périodiquement reconfiguré durant la phase de transmission. Le circuit initie la reconfiguration (le changement des paramètres N max et k) en fonction du SNR observé, on peut parler d’auto-reconfiguration. Machine d’états Contrôle Sorties Entrées MB ACS SMU souples Figure 3.3 — Architecture du décodeur implantant l’ASOVA En conclusion, bien que tous ces travaux concernent les turbo codes convolutifs, les études menées apportent des éléments de réflexion dans le cadre de notre travail. La détermination des particularités algorithmiques de l’application permet d’avoir une certaine marge de manoeuvre pour envisager la reconfiguration. De plus, différentes architectures et mécanismes de reconfiguration sont utilisés dans chacune des approches. Tous les aspects décrits nous offrent ainsi des voies de prospection dans la mise en oeuvre de notre architecture. Le tableau 3.1 récapitule les caractéristiques des différentes solutions. XXX XXXCaract. Architecture XXX Cible X XiRisc [RLP05] RISC + FPGA Algorithme Flexibilité Max-Log-MAP Reconfiguration partielle du FPGA Banc de multiplexeur Unité de contrôle dédiée Reconfiguration totale du FPGA Viturbo [CV03] Atluri [AA04] FPGA ASIC Viterbi + SOVA SOVA+Log-MAP Liang [LTG04] NIOS + FPGA Log-MAP + SOVA Tableau 3.1 — Récapitulatif des implantations existantes de turbo décodeurs flexibles Notre approche concerne le turbo décodage de codes en blocs. A l’instar des études sur les turbo décodeurs convolutifs, il s’agit d’exploiter les similarités algorithmiques du décodage algébrique d’un code BCH et d’un code Reed-Solomon. Ainsi, une étude de complexité peut nous permettre d’appré- 88 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE hender l’aspect flexibilité de notre application avant de décrire une architecture. 3.2 Aspect flexiblité pour le décodeur élémentaire Dans un premier temps, une étude de complexité sur le principe de décodage est menée afin de caractériser les paramètres propres aux algorithmes considérés. Ensuite, différents critères d’arrêt sont mis en oeuvre afin de réduire la durée de traitement de l’application. Le but est de déterminer le critère le plus simple à mettre en oeuvre sans dégrader les performances. Enfin, un récapitulatif expose les paramètres de flexibilité retenus pour l’implantation. 3.2.1 Etude de la complexité algorithmique La flexibilité de l’ensemble codeur/décodeur peut apparaı̂tre à travers une étude algorithmique sur les traitements mis en oeuvre. L’objectif est de caractériser les paramètres et plus exactement leur impact sur la complexité en terme d’opérations. Cette étude dessine les traits d’une première architecture liée uniquement à l’analyse des algorithmes utilisés. Ainsi, il est possible d’isoler les paramètres sur lesquels un contrôleur de configuration pourrait agir pour rendre l’architecture flexible. Les notations employées pour les paramètres sont les suivantes : – N : le nombre de symboles ou de bits d’un mot de code. – M F : le nombre de symboles les moins fiables. – m : la taille du corps de Galois (2m ) correspondant au nombre de bits du symbole q-aire. – Q : le nombre de bits de quantification des données. – L : le nombre de bits de quantification des métriques. – t : le pouvoir de correction du code. – N b v : le nombre de vecteurs de test employés pour le décodage algébrique. – N b M C : le nombre de métriques concurrentes considérées parmi l’ensemble des métriques des N b v vecteurs de test . Dans la suite, tous les algorithmes détaillés dans la section 2.2 sont caractérisés en terme d’opérations en fonction des paramètres. Toutes les opérations effectuées dans le corps de Galois se font sur m bits. En revanche, il s’agit d’opérations sur des entiers signés ou non signés quantifiées sur Q bits. Il faut noter que la modulation considérée est une BPSK, c’est a dire que les symboles reçus correspondent à une information binaire. C’est pourquoi, un mot de code BCH est reçu en m fois moins de temps qu’un mot de code RS. Détermination des bits les moins fiables Cette étape a pour objectif de classer les bits les moins fiables reçus par la partie de décodage. Les 3.2. ASPECT FLEXIBLITÉ POUR LE DÉCODEUR ÉLÉMENTAIRE 89 opérations sont essentiellement des comparaisons entre les quantifications associées au bit transmis issu du canal. En considérant la réception d’un mot de code, le nombre de comparaison sur Q bits est de (M F −1).(N −1) (m.(M F −1).(N −1) pour les codes RS) et 2.(M F −1).(N −1) décalages. Calcul des composantes du syndrome initial (S=(s1 , s2 , . . . , sn−k )) Le syndrome est obtenu par une division polynomiale du mot reçu dans le corps de Galois CG(2m ). Le nombre de composantes utiles est de 2t, où t est le pouvoir de correction du code. Le calcul de chaque composante nécessite le traitement de l’ensemble des N symboles reçus : Pn−1 Si = R(αi ) = j=0 rj (αi )j avec 1 ≤ i ≤ 2t Ce calcul permet de déterminer une composante du syndrome, il faut donc réitérer le calcul pour les t − 1 composantes restantes. En résumé, il faut N.t additions pour un code BCH et un code RS. De plus, N.t multiplications supplémentaires sont nécessaires dans le corps de Galois pour un code RS. Calcul des composantes du syndrome des N b v VT Les vecteurs de test sont élaborés à partir d’une ou de plusieurs inversions des bits les moins fiables dans la séquence reçue. A partir des composantes du syndrome initial, il est possible de retrouver les composantes du vecteur de test. De manière empirique, il a été montré que conserver 16 vecteurs de test permettait d’effectuer un décodage efficace [KAP01]. Cela revient à réaliser 3 inversions parmi 5 bits les moins fiables en conservant les combinaisons les plus probables. – Pour construire les syndromes des vecteurs de test S1 à S5 un seul bit est inversé. Les opérations à réaliser sont : – Si = S + αj1 dans le cas d’un code BCH avec j1 la position inversée. – Si = S + αj1 × rj1 dans le cas d’un code RS avec rj1 le symbole à inverser. Pour chaque composante de chaque syndrome, il faut donc 2t additions et 2t multiplications supplémentaires pour un code RS. – Ensuite, pour les syndromes des vecteurs de test S6 à S9, en procédant de la même manière pour 2 inversions, il faut 4t additions et 4t multiplications. – Enfin, pour les syndromes des vecteurs de test S10 à S15 : Cette fois-ci, 6t additions et 6t multiplications sont nécessaires pour 3 inversions. En résumé, dans le cas d’un code BCH, il faut au total 6 × 6t + 4 × 4t + 5 × 2t = 72t additions. Dans le cas d’un code RS, un symbole est constitué de m bits, 72t opérations de multiplications supplémentaires sont nécessaires pour déterminer les composantes des 16 vecteurs de test choisis. 90 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE Décodage algébrique Un décodage algébrique doit être effectué pour chacun des vecteurs de test construits précédemment. Ce processus consiste à calculer les polynômes localisateur d’erreurs σ(x) et évaluateur d’erreurs ω(x). Il convient donc de multiplier l’ensemble des opérations présentées par un facteur N b v. Dans un premier temps, l’association des algorithmes de Berlekamp-Massey, Chien, Forney et de vérification du mot décrits dans le chapitre 2 est considéré. Dans un second temps, la complexité de l’algorithme du PGZ est donnée. 1. Comme précédemment, l’algorithme de Berlekamp-Massey vise à résoudre une équation clé à partir des composantes d’un syndrome de manière à identifier les coefficients des polynômes localisateur d’erreurs et évaluateur d’erreurs des vecteurs de test. Puis, des algorithmes supplémentaires permettent de déterminer les racines du premier polynôme et de vérifier le mot de code élaboré. Dans ce dernier cas, les syndromes sont recalculés à partir des corrections effectuées. Toutes les opérations sont effectuées dans le corps de Galois. Le tableau 3.2 récapitule l’ensemble des opérations effectuées lors du décodage d’un vecteur de test pour des codes BCH ou RS. Berlekamp-Massey σ(x) Add GF (m bits) BCH Mult GF (m bits) t −1 t −1 i=1 i=1 Ω(x) ∑i+∑(i+1) t t −1 i=1 i=1 Chien Forney (t-1).N Vérif. mots de code t t.N ∑i+2.∑(i+1) MAC GF (m bits) t.N Comp 3t Add t XOR RS t t −1 t −1 i=1 i=1 t −1 t −1 Add GF (m bits) ∑i+∑(i+1) ∑i+∑(i+1) i=1 i=1 Mult GF (m bits) ∑i+2.∑(i+1) ∑i+2.∑(i+1) t t −1 t t −1 i=1 i=1 i=1 i=1 MAC GF Comp 3t 3t Add t t Mem Parité (t-1).N t t.N 3t+3 t.N 3t-1 2m t t.2m Tableau 3.2 — Complexité en nombre d’opérations de l’algorithme de Berlekamp-Massey Une opération de division occupe une place importante lors de l’implantation. En pratique, elle est 3.2. ASPECT FLEXIBLITÉ POUR LE DÉCODEUR ÉLÉMENTAIRE 91 remplacée par une table d’inversion dans le corps de Galois et d’une opération de multiplication. 2. Pour l’algorithme PGZ, les coefficients du polynôme σ(x) sont déterminés à partir des syndromes des 16 vecteurs de test. La complexité varie fortement selon le pouvoir de correction souhaité et le nombre d’erreurs à corriger. Le tableau 3.3 récapitule les opérations à réaliser pour l’algorithme PGZ. t=1 t=2 σ(x) σ1 = S2 /S1 S1 S4 +S2 S3 S1 S3 +S22 S S +S 2 σ2 = S12 S34 +S32 2 σ1 = ω(x) E1 = S12 /S2 E1 = E2 = S1 X2 +S2 X1 (X1 +X2 ) S1 X1 +S2 X1 (X1 +X2 ) Tableau 3.3 — Opérations effectuées par l’algorithme PGZ Pour un pouvoir de correction de t = 1, les opérations lors du calcul des deux polynômes pour un vecteur de test sont les suivantes : – 2 divisions dans le corps de Galois. – 1 multiplication dans le corps de Galois. Pour un pouvoir de correction de t = 2, les opérations nécessaires au calcul des deux polynômes pour un vecteur de test sont les suivantes : – 5 divisions dans le corps de Galois. – 13 multiplications dans le corps de Galois. – 7 additions dans le corps de Galois. De plus, une mémoire de 2m bits est alors nécessaire. Il est à rappeler que dans chacun des cas un coefficient multiplicateur N b v, correspondant au nombre de vecteurs de test, doit être appliqué à l’ensemble des opérations considérées. Calcul du carré de la distance euclidienne Le calcul des métriques se fait par la différence entre le mot reçu du canal et le vecteur de test corrigé au niveau binaire. Autrement dit, l’opération consiste à comparer un à un l’ensemble des bits constituant le mot reçu : n−1 2 n−1 X X R − Cj 2 = rk0 − cjk = rk0 × cjk k=0 (3.2.1) k=0 Bien que relativement simple d’un point de vue algorithmique, la complexité de cet élément est élevée. En effet, il faut procéder à N b v.(N − 1) additions d’entiers non signés et à N b v.N multiplications d’entiers signés pour un code BCH. De plus, pour un code RS, un facteur multiplicateur m doit être appliqué aux opérations additions et multiplications. Sélection du mot décidé et des mots concurrents Les N b M C métriques les plus faibles doivent être déterminées parmi les N b v métriques calculées lors du décodage algébrique des vecteurs de test. Les N b M C métriques les plus faibles sont conservées 92 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE par comparaison successive de chaque élément préalablement mémorisé avec la métrique du vecteur de test en cours. Comme la comparaison des métriques s’effectue deux à deux, N b M C comparaisons sont nécessaires pour classer une métrique. Ainsi, la profondeur de l’arbre d’exploration dépend directement du nombre de métriques concurrentes à conserver. Cette opération doit être répétée pour chaque vecteur de test. La complexité, en nombre de comparaison et pour N b M C < N b v, est égale à N b M C × N b v. Calcul de la nouvelle fiabilité Pour obtenir l’information extrinsèque, il faut calculer les nouvelles fiabilités de chacun des bits composant les symboles. Pour cela, les bits des symboles du mot décidé D (de métrique MD ) et des (N b M C − 1) mots concurrents Ci (de métrique MC(i) ) sont utilisés de la manière suivante : – si bit SymboleD = bit SymboleC(1) = bit SymboleC(2) = ... = bit SymboleC(N b M C−1) alors F=β. – si bit SymboleD = bit SymboleC(1) = ... = bit SymboleC(N b M C−3) = bit SymboleC(N b M C−1) alors F = MC(N b M C−2) − MD . – ... – si bit SymboleD = bit SymboleC(1) = bit SymboleC(3) ... = bit SymboleC(N b M C−1) alors F = MC2 − MD . – si bit SymboleD = bit SymboleC(2) = bit SymboleC(3) ... = bit SymboleC(N b M C−1) alors F = MC1 − MD . – si le mot reçu est un mot de code F = β 0 . où β = |R0 k| + F iabiliteM F 2 + F iabiliteM F 3 + F iabiliteM F 4 − MD et β 0 = β + 2 Le paramètre N b M Futilisés est ajouté, il représente le nombre de moins fiables utilisé pour le calcul de la fiabilité ( N b M Futilisés < M F ). En récapitulant les opérations considérées pour un code BCH, le bilan est le suivant : – Nombre d’additions non-signées : N.[(N b M Futilisés − 1) + 1]. – Nombre de soustractions non-signées : 2N . – Nombre de comparaisons : (N b M C).N . Là encore, la complexité est à multiplier par m dans le cas d’un code RS. Calcul de l’information extrinsèque Il s’agit de la soustraction de la fiabilité (dont le signe dépend du décodage dur) avec le symbole quantifié du mot reçu. W k représente l’information extrinsèque. W k = sgn(Dk)F k − Rk 0 (3.2.2) 3.2. ASPECT FLEXIBLITÉ POUR LE DÉCODEUR ÉLÉMENTAIRE 93 Le nombre de soustractions est égal à N pour un code BCH ou m.N pour un code RS. Addition avec le mot reçu du canal L’information extrinsèque est tout d’abord pondérée en entrée du bloc ce qui implique l’utilisation d’une table de taille N et de profondeur m. Ensuite, une addition avec le symbole initial est effectuée. Rk 0 = Rk + α.W k (3.2.3) L’utilisation d’une mémoire de taille N.m bits et N (resp. N.m) additions sont nécessaires pour un code BCH (resp. RS). Le tableau 3.4 récapitule l’ensemble des opérations nécessaires (S : signés, NS : non signés, CG : Corps de Galois) aux différents algorithmes pour le décodage d’un code BCH/RS. En dehors du décodage algébrique où les opérations relatives aux deux codes ont été explicitées (blocs 4 et 5), il convient de multiplier la complexité des entités 1,8,9 et 10 par m pour obtenir la complexité d’un code RS. L’ensemble des paramètres intervenant lors du décodage élémentaire ont été définis. A présent, nous devons déterminer ceux qui peuvent être modifiés pour apporter de la flexibilité et maintenir une complexité globale raisonnable. Une première analyse permet de constater que les paramètres du code N et t influent directement sur la complexité de l’application. En effet, N est prépondérant puisqu’il détermine à la fois le nombre et la taille des opérations effectuées dans le corps de Galois (N = 2m − 1 ). De plus, l’utilisation de l’algorithme de Chase-Pyndiah impose un traitement binaire. C’est pourquoi, pour un code RS, m opérations supplémentaires sont nécessaires pour les opérations sur les bits issus du canal. Le pouvoir de correction t agit, quant à lui, sur le nombre de composantes du syndrome à calculer et par conséquent sur les algorithmes de décodage associés. Par conséquent, les valeurs de N et de t retenues sont les suivantes : – N : la complexité est proportionnelle à la longueur du mot de code N . Dans cette étude, la longueur de code retenue est de 32 symboles. – t : plus le pouvoir de correction est élevé, plus l’algorithme de décodage associé est complexe. Dans l’optique de l’implantation d’un décodeur élémentaire à faible pouvoir de correction (t = 1 et t = 2), l’algorithme de Peterson modifié (PGZ) a été retenu. Pour un pouvoir de correction t < 3, il est particulièrement approprié comme il est possible de le constater sur le tableau 3.4. En effet, la complexité du PGZ modifié reste raisonnable par rapport à l’utilisation du Berlekamp-Massey et des traitements supplémentaires induits (algorithme de Chien et de Forney). a 9 8 7 6 4.Nb_v 3.Nb_v Nb_v.(N-1) (Nb_MC1).N Tableau 3.4 — Récapitulatif de la complexité des différentes parties constituant le décodage élémentaire pour des codes BCH/RS 4: Détermination du polynôme σ(x) 6: Calcul du carré de la distance euclidienne b. PGZ 3: Construction des vecteurs de test 5: Détermination du polynôme ω(x) N 2.N Nb_MC. Nb_v a. Berlekamp-Massey + Chien + (Forney)… N N[(Nb_MFutilisés -1) + 1] 9.Nb_v Nb_v.N S(Q bits) N.m 2.2m 2m 2t. 2m bits mem 10: Addition avec le mot reçu du canal 9: Calcul de l'information extrinsèque 8: Calcul de la nouvelle fiabilité 7: Sélection du mot D et des mots C 12.Nb_v Voir tableau 3.2 spécifique pour les détails BCH/RS 2: Calcul du syndrome 1: Détermination des bits MF b a b Voir tableau 3.2 spécifique pour les détails BCH/RS 72t CG(m bits) 72.t (L bits) 3 MF.(N-1) (Q bits) Multiplications N.t NS Comparaisons N.t 10 5 4 CG (Q bits) Sous. 2 1 CG(m bits) Additions 94 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE 3.2. ASPECT FLEXIBLITÉ POUR LE DÉCODEUR ÉLÉMENTAIRE 95 Un second constat est que les choix du concepteur sur les paramètres M F , N b v, L, N b M C, N b M Futilisés et Q permettent d’affiner les performances de l’application en terme de TEB. Cependant, ils ne sont pas sans impact sur la complexité. Tous ces paramètres sont tous liés et découlent de l’utilisation de l’algorithme de Chase-Pyndiah pour le décodage. Ainsi, le nombre de bits les moins fiables M F et le nombre de vecteurs de test N b v sont à mettre en relation car les vecteurs de test sont construits à partir d’une combinaison de ces bits. Le nombre de vecteurs de test N b v agit également sur la latence de l’application car l’algorithme de décodage algébrique doit être réitéré. D’autre part, le tri des métriques se fait sur les N b v métriques produites pour en conserver un nombre N b M C qui a une largeur de L bits. Un autre aspect porte sur la quantification des bits reçus, ils sont quantifiés sur Q bits. Toutes les opérations se font donc sur les fiabilités associées. Des simulations ont été effectuées au sein du département électronique de l’ENST-Bretagne afin de quantifier les dégradations en terme de performances introduites lors de la modification de l’ensemble des paramètres. Le but est d’effectuer un décodage efficace tout en conservant une complexité raisonnable. En conséquence, les choix concernant les valeurs des paramètres sont : – M F : le nombre de symboles moins fiables conservés est de 5. Ce paramètre intervient dans la construction des vecteurs de test. – N b v : le nombre de vecteurs de test considérés est de 16. Ils sont construits à partir des symboles MF. Il s’agit d’un bon compromis performance/complexité [KAP01]. – L : la métrique est quantifiée sur 6 bits. – N b M C : la complexité de l’algorithme de tri est fonction du nombre total de métriques N b v, de leur largeur L et du nombre de métriques retenues N b M C. Ce paramètre intervient aussi dans le calcul de la fiabilité. Il est fixé à 4. – N b M Futilises : l’utilisation des fiabilités des trois symboles les moins fiables est suffisante. – Q : ce paramètre a un impact sur la largeur des chemins de données associés à la fiabilité. Les bits issus du canal sont quantifiés sur 4 bits. Les critères de choix de notre application parmi l’ensemble des codes envisageables sont la faible complexité induite et la possibilité de traiter différents rendements de codes. De plus, il est à rappeler que le décodage de codes BCH et RS nécessite des traitements algorithmiques proches. Ainsi, quatre codes ont été retenus pour l’implantation de notre application. Les codes produits sont donc construits à partir : – des codes BCH primitifs étendus de distance de Hamming respective 4 et 6 et de longueur de code 32. – des codes Reed-Solomon de distance de Hamming respective 3 et 5 et de longueur de code 31. Dans notre cas, les deux codes composant le code produit sont identiques. L’extension des codes BCH permet d’augmenter la distance minimale des codes produits au prix d’un faible accroissement de la complexité (ajout d’un bloc de calcul de parité) et d’une légère diminution du rendement. En 96 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE revanche, il n’y a aucun avantage à utiliser les versions étendues des codes constituants RS [Zho05]. Si le rendement souhaité est d’environ 0.5, un TCB ayant pour code composant un code BCH au pouvoir de correction de 1 ou 2 représente le meilleur compromis entre performance et complexité. Le principal avantage des TCB à base de codes Reed Solomon ayant des pouvoirs de correction de 1 ou 2 réside dans leur fort rendement. En effet, pour des rendements élevés (0,8-0,9), un TCBRS nécessite une longueur de mot de code plus faible qu’un équivalent TCB-BCH. Par exemple, l’utilisation des codes TCB-RS(31,29) et (31,27) permettent de réduire la longueur du code d’un facteur 3 à 4 par rapport à l’emploi de TCB-BCH (128,120) et (128,113). D’un point de vue architectural, cette caractéristique permet de réduire la complexité de la mémoire RAM et celle du décodeur élémentaire [PJAJ06b]. BCH (32,26,4) t=1 élément binaire Reed-Solomon (31,29,2) t=1 symbole q-aire Unité de contrôle BCH (32,21,6) t=2 éléments binaires Reed-Solomon (31,27,4) t=2 symboles q-aires Figure 3.4 — Gestion des différentes configurations envisagées La figure 3.4 illustre la structure à mettre en oeuvre pour gérer le passage d’une configuration à l’autre. Une unité de contrôle permet de choisir les caractéristiques souhaitées en fonction des contraintes de l’utilisateur. Ainsi, le pouvoir de correction t et le type de code composant sont modifiables. Le décodeur élémentaire est conservé au cours du temps mais l’architecture interne doit être reconfigurée. La flexibilité est introduite par l’utilisation d’un ensemble de multiplexeurs permettant de passer d’une configuration à l’autre. 3.2.2 Amélioration du traitement lié au processus de turbo décodage Le processus de turbo décodage est itératif. Une itération de décodage s’effectue en deux étapes (deux demi-itérations). Dans un premier temps, les données reçues (sous la forme d’une matrice, voir chapitre 2) sont envoyées au décodeur élémentaire pour un décodage des lignes. La matrice des données décodées est alors reconstruite. Dans un second temps, les colonnes de cette matrice sont soumises à 3.2. ASPECT FLEXIBLITÉ POUR LE DÉCODEUR ÉLÉMENTAIRE 97 un autre décodage. De manière générale, le nombre d’itérations est fixé par l’utilisateur. Le principe itératif est illustré par la figure 3.5. Réception Des données Décodage des lignes 1 demi-itération Réorganisation de la matrice Décodage des colonnes 1 demi-itération Réorganisation de la matrice Décodage des lignes 1 demi-itération Figure 3.5 — Aspect itératif du processus de turbo décodage Le décodeur élémentaire est donc l’élément de base du processus de turbo décodage. D’un point de vue architectural, deux approches sont envisageables : – Soit le même décodeur élémentaire est utilisé pour réaliser séquentiellement les opérations sur toutes les lignes puis sur toutes les colonnes. Une unité de contrôle gère la reconstruction des matrices de données entre chaque étape du processus et l’envoi de chaque mot (ligne ou colonne) au décodeur élémentaire. – Soit le décodeur élémentaire est dupliqué de manière à décoder le maximum de lignes et le maximum de colonnes à chaque demi-itération. Dans ce cas, la gestion des données est plus complexe pour alimenter chaque module car il faut éviter les conflits de mémoire. Nous avons retenu la première approche dans notre étude. Dans les deux cas, il est possible de réduire le temps de traitement des décodeurs. En effet, le critère de performance d’un code correcteur d’erreur est le taux d’erreur binaire (TEB) à la sortie du décodeur pour un rapport signal à bruit donné. Ainsi, un critère déclenchant la reconfiguration d’une architecture peut être le rapport signal à bruit (SNR). Une étude [JD06], en collaboration avec le laboratoire du LESTER, a été menée afin de déterminer un critère d’arrêt au processus de turbo décodage. Ce critère aurait pour objectif de 98 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE stopper les itérations du décodeur élémentaire lorsque le gain en taux d’erreur binaire à rapport signal/bruit donné devient négligeable voire nul. Le but est donc de diminuer la durée du traitement en fonction du rapport signal/bruit et d’éviter des échanges de données superflus. Des simulations de type Monte-Carlo du turbo décodage d’un code BCH(32,26)2 pour des rapports de signal à bruit (Eb /N0 ) variant entre 2 dB et 4dB par pas de 0.5 dB ont été réalisées. Le but est de vérifier la pertinence des différents critères d’arrêts suivant : – Référence : pas d’utilisation de critère d’arrêt, il s’agit de la référence pour les autres propositions. – Critère 1 : un contrôle sur les colonnes après une demi-itération est effectué. Il s’agit de savoir si les colonnes sont des mots de code. Ce critère est utilisé jusqu’à présent dans les simulations en langage C. – Critère 2 : un contrôle sur les deux mots constitués respectivement par la parité des lignes et des colonnes. Le critère d’arrêt consiste uniquement à vérifier que les deux vecteurs de parité sont des mots de code. – Critère 3 : le critère d’arrêt est identique au précédent mais seulement mis en oeuvre à partir de l’itération 4. Cependant, il est extrêmement rare que 4 itérations de décodage soient nécessaires à fort rapport signal/bruit. – Critère 4 : un double critère d’arrêt est appliqué de manière hiérarchique. Ces deux critères sont : 1. un test sur les vecteurs de parité afin de vérifier qu’ils sont tous les deux des mots de code. 2. si le premier test est validé, un second test est effectué. Ce test est appliqué sur toutes les lignes afin de vérifier qu’elles sont toutes des mots de code après le décodage colonne (une itération). Les simulations sont réalisées sur le même ensemble de matrices afin d’effectuer des comparaisons valides. Les taux d’erreurs binaires sont obtenus pour un minimum de 100 paquets erronés et pour 1 et 8 itérations de décodage. Ce travail a permis de vérifier la pertinence du critère 1 utilisé jusqu’à présent (mots de code suivant toutes les colonnes) puisque les courbes de performances atteintes se calquent sur la référence. Les simulations (fig. 3.6) montrent que le critère 2 sur les vecteurs de parité est nécessaire mais pas suffisant. Le critère 3 se révèle suffisant pour des SNR élevés, en revanche les performances restent en retrait à faible SNR. Une variante est proposée : le critère hiérarchique (4). Les simulations avec un critère hiérarchique donnent des résultats similaires à la référence et au critère 1. Nous travaillons dans un contexte où le critère d’arrêt serait effectué par un processeur et non par le décodeur élémentaire. Dans ce cas, l’intérêt du critère hiérarchique est qu’il nécessite moins de calculs que le critère vérifiant que toutes les colonnes sont des mots de code à chaque demi-itération. 3.2. ASPECT FLEXIBLITÉ POUR LE DÉCODEUR ÉLÉMENTAIRE 99 1.00e-2 1.00e-3 1.00e-4 TEB 1.00e-5 Réf. et critère 1: it. 1 Réf. et critère 1: it. 8 critère 2: it. 1 critère 2: it. 8 critère 3: it. 1 critère 3: it. 8 critère 4: it. 1 critère 4: it. 8 1.00e-6 1.00e-7 2.0 2.5 3.0 3.5 4.0 SNR en dB Figure 3.6 — TEB en fonction du rapport signal à bruit pour différentes itérations Nous conserverons donc ce critère d’arrêt dans la suite de l’étude. 3.2.3 Conclusion Une étude de complexité a permis de déterminer les paramètres de l’application et leurs impacts sur la complexité. Deux points de flexibilité ont été conservés : le type de code BCH ou RS et le pouvoir de correction t. De plus, la modification des autres paramètres évoqués autorise une certaine marge de manœuvre sur la complexité totale du décodeur. Il est à noter que l’intégration d’un turbo décodeur dédié à des codes produits à base de code Reed Solomon est une innovation à elle seule. En effet, il s’agit, à notre connaissance, de la première solution architecturale proposée pour le décodage de tels codes [PJA+ 06]. D’autre part, le temps de traitement a été réduit par l’adoption d’un nouveau critère d’arrêt. Cette étude permet d’ajouter un rôle supplémentaire à une unité de contrôle déjà chargée de la configuration du décodeur élémentaire par ailleurs. La suite de ce chapitre s’intéresse aux descriptions architecturales retenues pour les processus de codage et de turbo-décodage. Pour ce dernier, la découpe réalisée s’appuie sur l’étude de complexité présentée. 100 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE 3.3 Conception du codeur flexible La structure du codeur demeure relativement classique au vu des architectures existantes. Toutefois, il a subi des modifications afin de bénéficier de la flexibilité souhaitée. En effet, il supporte l’ensemble des codes traités par la partie de décodage. D’un point de vue architectural, il est constitué de deux codeurs élémentaires, d’une mémoire RAM et d’une unité de contrôle (fig. 3.7). Figure 3.7 — Bloc diagramme du codeur dédié aux codes produits Bien sûr, il aurait été possible de n’utiliser qu’un seul codeur puisque que le parallélisme n’est pas exploité ici. Cependant, il faudrait alors considérer une mémoire double port autorisant à la fois la lecture et l’écriture simultanées des données. Le gain de surface engendré par l’utilisation d’un seul codeur est alors estompé par l’augmentation de l’occupation de la mémoire car la complexité du codeur est faible. Au niveau temporel, deux phases sont nécessaires pour construire la matrice de données Mc du code produit. Tout d’abord, un premier codeur élémentaire traite les lignes de la matrice d’information Mi . L’ensemble des mots de code générés est stocké dans une mémoire RAM lors d’une phase d’écriture. Puis une phase de lecture permet de récupérer les colonnes de Mi qui sont alors traitées par le second codeur élémentaire. Les temps de traitement sont différents pour les deux étapes. Par exemple, dans le cas du code BCH(32,26), la latence du premier codeur est de 26 × 32 temps de cycle, tandis que pour le second, elle est de 32 × 32. Une unité de contrôle se charge à la fois de la configuration, de l’adressage de la mémoire et des signaux de contrôle de l’ensemble du codeur. Classiquement, l’implantation du codeur utilise des registres à décalage à rétroaction linéaire plus communément appelé LFSR (Linear Feedback Shift Register) pour définir la division polynomiale d’un corps fini. Le codeur se compose de n − k parties identiques formées chacunes d’un multiplieur, d’un additionneur et d’un registre (fig. 3.8). Notre codeur élémentaire doit être capable de supporter le processus de codage des 4 configurations retenues. L’idée est donc de prévoir la mise en place de toutes les ressources nécessaires aux configurations les moins favorables, c’est à dire typiquement le code BCH(32,21) pour le 3.3. CONCEPTION DU CODEUR FLEXIBLE 101 nombre de registre à décalage et les codes Reed-Solomon pour la largeur des chemins de données m. De plus, un bit de parité est calculé dans le cas d’un code BCH. Le polynôme générateur du code, g(x) = g0 + g1 x + . . . + gr xr où r est le nombre de symboles redondants, est paramétrable de manière à produire les symboles de redondance associés aux données. Les coefficients gi des polynômes générateurs associés à chaque code peuvent être trouvés dans la littérature [Pet60][CC81]. Ceux concernant notre étude sont donnés dans le tableau 3.5 sous les formes binaire pour le BCH et décimale pour le RS. Dans tous les cas, le mot de code élaboré se présente sous la forme systématique. Code BCH(32,26) BCH(32,21) RS(31,29) RS(31,27) Coefficients binaire ou Q-aire du polynôme générateur 1,0,1,0,0,1 1,1,0,1,0,1,1,0,1,1,0,0 8,6 17,9,6,30 Tableau 3.5 — Coefficients des polynômes générateurs g(x) des codes traités Figure 3.8 — Schéma du codeur élémentaire La mémoire RAM stocke les données codées après un premier codage des lignes. Comme pour le codeur élémentaire, ses dimensions dépendent des configurations les moins favorables caractérisées par : – la largeur m (=5) des données des codes Reed-Solomon (31,27) ou (31,29). – la longueur des codes BCH(32,26) ou (32,21). – la dimension du code Reed-Solomon (31,29). Au total, la taille de la mémoire utilisée est de 5 × 32 × 32 soit 5120 bits. Une structure de contrôle supervise l’ensemble du codeur. La configuration est donnée par deux entrées binaires qui définissent le type de code et le pouvoir de correction choisis. Les polynômes générateurs et les compteurs nécessaires aux codeurs élémentaires sont donc fonction de ces entrées. 102 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE L’unité reçoit les données à coder de manière synchrone. Elle est aussi chargée de la lecture/écriture et de l’adressage mémoire. 3.4 Conception du turbo décodeur flexible Cette section présente l’architecture hétérogène conçue pour le turbo décodage des codes en blocs de type BCH et Reed-Solomon. Elle tient compte de la flexibilité introduite auparavant. Il faut distinguer deux niveaux de hiérarchie dans l’architecture présentée. Le premier niveau concerne le décodeur élémentaire chargé du traitement des lignes et des colonnes de la matrice à décoder. Pour cela, une mémoire interne est nécessaire au stockage des lignes (ou des colonnes) en cours d’utilisation. Sa taille dépend directement de la profondeur du pipeline employé. Le second niveau correspond à la gestion des données reçues pour le processus turbo, c’est à dire à la fois l’injection des données initiales dans le décodeur élémentaire puis la réinjection des données décodées à chaque demi-itération. Les matrices à traiter sont stockées dans des plans mémoires externes adressés par le processeur. Ainsi, un processeur NIOS II est chargé des opérations de contrôle et de gestion de configuration. En résumé, l’architecture se compose d’une unité de contrôle associée à une mémoire externe et d’une unité de traitement (décodeur élémentaire) munie d’une mémoire interne. L’architecture globale est décrite sous la forme d’un schéma bloc (fig. 3.9). 3.4.1 Architecture générale du décodeur élémentaire L’architecture du décodeur élémentaire pour des codes BCH a fait l’objet de nombreux travaux au sein du département électronique de l’ENST Bretagne [Rao97][KAP01][CAKP02]. Ainsi, des architectures innovantes ont été proposées pour permettre le développement d’implémentations les plus performantes possibles. Des études algorithmiques ont parallèlement été menées au sein du département Signal et Communications pour l’adaptation du turbo décodage des codes produits à base de codes Reed-solomon [Aı̈t98][Zho05]. Le but de notre étude est d’implanter les modules nécessaires au décodage de ces derniers en conservant l’architecture de base déjà élaborée. Ce décodeur élémentaire est constitué de 3 parties : réception, traitement et émission. La gestion des quatre configurations nécessite une décomposition temporelle adaptée. Ainsi, chaque étage réalise sa fonction en un temps mot, c’est à dire qu’il faut 32 périodes d’horloge dans le cas d’un code binaire BCH de longueur n = 32 et 31×5 périodes d’horloge dans le cas d’un code q-aire RS de longueur n = 31. La latence est donc de trois temps mot pour l’ensemble d’un mot de code, cependant le délai entre la réception du dernier symbole et la production du premier symbole décodé est seulement de deux temps mot. Les opérations dans les blocs de réception et d’émission se font de manière séquentielle, en revanche la partie de traitement est plus critique. En se donnant un temps mot pour le traitement, la découpe temporelle proposée sur la figure 3.10 implique l’utilisation de deux horloges, l’une Ha 5 Rinit αi 5 6 RAMs 32x5x5 Syndrome Parité Bloc des moins fiables Processeur NIOS II R’ R’init 4x5 Si Métriques 8 ROM Galois 32x5 8 D Bloc d’émission Cp_Md&Mc Mdp Calcul des Par&Cw Mémoire Ri+ βi R’ 5 R’init Information Décodage 5 extrinsèque Tri des mots M_Md&Mc algébrique Lr P concurrents W 8 et Fiabilité 5 5x8 décidés Ci&Ei Lr_p_Md&Mc Correction du 4x5 R’ mot de code Signaux Compteur Type de code Construction 8 des Vecteurs Lr P de test 5x8 1 Mdp Bloc de traitement Par Légende: 4x5 Si 1 Par 5x8 Lr Pi Unité de contrôle Bloc de réception 5 R 3.4. CONCEPTION DU TURBO DÉCODEUR FLEXIBLE 103 Figure 3.9 — Schéma-bloc du décodeur élémentaire RS/BCH est relative aux parties réception et émission, l’autre Ht à la partie de traitement. L’objectif est de respecter un délai de décodage pour l’ensemble des 16 vecteurs de test égal à 32.r.Ha (avec r = 1 pour un code BCH et r = 5 pour un code RS). Ainsi, par exemple, il faut huit périodes d’horloge pour 104 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE effectuer le décodage algébrique d’un vecteur de test dans le cas d’un code BCH ayant un pouvoir de correction t = 2. La fréquence de l’horloge de traitement Ht est alors quatre fois plus élevée que celle de Ha . Pour chaque configuration, ce rapport est différent. Bloc de réception Reception block 32 r Ha Bloc de traitement Processive block 16*2 r Ha Bloc d’émission Emission block 32 r Ha 2 r Ha 16 algébriques 16 décodages algebrai c decoding BCH t=1 Ha=Ht, r=1 22 périodes clock periods d’horloge BCH t=2 Ha=4Ht, r=1 clock periods 88périodes d’horloge RS t=1 RS t=2 Ha=2Ht, r=5 Ha=Ht, r=5 20 clock periods 10 clock periods 10 périodes d’horloge 20 périodes d’horloge Figure 3.10 — Structure temporelle pour le décodage de mot de code de 32 symboles Dans la suite, les blocs associés aux trois parties et le fonctionnement de la mémoire interne sont décrits. Tout d’abord, les modules constituant la partie de réception sont explicités. Ensuite, la partie de traitement réalisant notamment la fonction de décodage algébrique est abordée. Puis la partie émission est donnée. Enfin, la dernière sous-section explique le choix et les modes de fonctionnement pour la mémoire interne. 3.4.1.1 Partie réception Le bloc de réception travaille séquentiellement en fonction de l’arrivée des symboles binaires. L’entrée reçoit la valeur pondérée associée au bit entrant. Chacun des blocs de la partie réception fonctionne de manière indépendante. Ils réalisent le calcul du syndrome (1 à 2t composantes suivant le pouvoir de correction t et le code), le calcul éventuel de la parité (t = 1) et la détermination des bits les moins fiables. Enfin, une ROM contient la table du corps de Galois nécessaire au traitement. Les signaux de contrôle fournissent le type de code et la synchronisation des traitements en fonction de l’arrivée des données. Le calcul du syndrome Ce bloc doit gérer à la fois les symboles binaires et q-aires. Par conséquent, un registre tampon 3.4. CONCEPTION DU TURBO DÉCODEUR FLEXIBLE 105 permet de reconstituer un symbole q-aires pour le calcul des composantes du syndrome pour un code Reed-Solomon tandis que seul le bit de signe est nécessaire pour l’élaboration du syndrome dans le cas d’un code BCH. Le coeur du bloc syndrome (fig. 3.11) est composé de blocs élémentaires (fig. 3.12) permettant de calculer chaque composante du syndrome. L’élément du corps de Galois nécessaire au calcul de chaque composante est stocké dans un registre. Le bloc syndrome est modulable suivant le nombre d’erreurs t à corriger et le type de code. En effet, le nombre de blocs élémentaires utilisés varie entre 1 et 2t en fonction de la configuration requise. Une fois le mot reçu, les composantes du syndrome sont produites en sortie. Figure 3.11 — Bloc de calcul du syndrome Figure 3.12 — Bloc élémentaire du syndrome Le calcul de la parité Ce bloc est uniquement utilisé pour des codes BCH étendus. Il calcule la parité du mot reçu R à partir du signe de tous les symboles. Il mémorise également la fiabilité du symbole de parité qui est utilisée dans le bloc de traitement. La localisation des bits les moins fiables Sur les cinq bits définissant l’échantillon en entrée, le bit de poids fort représente le bit de signe et les quatre autres correspondent à la fiabilité associée. A la réception d’un nouveau symbole du mot reçu, la fiabilité est comparée aux fiabilités des symboles précédents. Si elle est inférieure à l’une des fiabilités conservées alors la position et la valeur de la nouvelle fiabilité sont triées et mémorisées. Pour le code BCH, seulement cinq bits sont nécessaires pour situer le symbole dans le mot. En revanche, dans le cas d’un code RS, il faut à la fois la position du symbole dans le mot et la position du bit dans le symbole. Huit bits sont donc utilisés pour stocker la position d’un bit le moins fiable. Le schéma de ce bloc est représenté sur la figure 3.13. 106 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE Type de code 1 Positions des moins fiables Symbole du mot reçu R 5 Bloc des symboles les moins fiables 8x5 Fiabilités des moins fiables 4x5 8 Position du compteur Figure 3.13 — Schéma du bloc des symboles les moins fiables 3.4.1.2 Partie traitement Le bloc de traitement est la partie critique du décodeur élémentaire qui permet à la fois : – la génération de 16 vecteurs de test et de leur syndrome respectif. – le décodage algébrique de chacun des vecteurs de test. – la production et le tri des métriques associées. La construction des vecteurs de test La construction des vecteurs de test est une étape importante de l’algorithme de Chase [Cha72]. La complexité du circuit et les performances du décodeur dépendent fortement du choix effectué pour leur élaboration. Pour cinq bits moins fiables considérés, il est possible d’élaborer 25 vecteurs de test. Les performances du décodeur sont meilleures avec une sélection de 32 vecteurs de test (VT) que pour 16 ou encore même que 8. Une étude a montré qu’une sélection rigoureuse des vecteurs de test permet de réduire la complexité et l’efficacité du décodage [KAP01]. Un compromis de 16 vecteurs de test permet de conserver des performances acceptables tout en réduisant le temps de traitement pour l’ensemble des séquences. De plus, afin de réduire le temps et la complexité de la construction des vecteurs test, [HHM01] propose de les générer de manière ordonnée. Le calcul des syndromes et des métriques engendrées est alors plus simple. Les blocs de construction des vecteurs de test fonctionnent de paire avec le bloc d’élaboration des métriques. Une autre approche [AM04] propose d’améliorer la démarche en s’affranchissant du ré-ordonnancement des motifs d’erreurs à l’aide d’un code de Gray et en permettant l’adaptation du nombre p de symboles moins fiables en fonction du nombre d’itérations. En considérant uniquement la première approche, si les motifs d’erreurs sont ordonnés de façon à ce qu’un seul bit diffère d’un vecteur de test à l’autre, alors des opérations simples donnent le syndrome et le nouveau motif d’erreurs à partir du précédent. 3.4. CONCEPTION DU TURBO DÉCODEUR FLEXIBLE 107 Les composantes du syndrome initial et les bits les moins fiables ont été calculés dans le bloc de réception. Des tables sont utilisées pour les motifs d’erreurs. Une information sur l’addition ou la soustraction (AS) de la métrique est également nécessaire. Dans le cas de l’utilisation de 16 vecteurs de test, 3 inversions au maximum sont réalisées parmi les 5 bits les moins fiables. Un code de Gray est obtenu avec les vecteurs de test choisis préalablement dans [CAKP02] avec la combinaison choisie (tab. 3.6), cependant l’un d’eux doit être changé parmi ceux pris habituellement. ME0 ME1 ME2 ME3 ME4 ME5 ME6 ME7 ME8 ME9 ME10 ME11 ME12 ME13 ME14 ME15 MF4/MF3/MF2/MF1/MF0 00100 10100 10000 11000 01000 01010 01011 01001 01101 00101 00111 00110 00010 00011 00001 00000 AS 0 0 1 0 1 0 0 1 0 1 0 1 1 0 1 1 Tableau 3.6 — Les motifs d’erreurs considérés Les composantes du vecteur de test en cours (4 au maximum) sont obtenues en effectuant une multiplication et une addition dans le corps de Galois(CG(25 )). Ceci implique que les éléments du corps de Galois soient également disponibles dans une RAM embarquée de taille 4 × 5 × 32 bits. TP Start ValidPos Poids Hamming 3 Positions des MF Syndrome du VT 5x8 4x5 Fiabilités des MF 5x4 Syndrome initial Position du MFmo Construction des vecteurs de test 4x5 8 Fiabilité du MFmod 4 Compteur GF Motif d’erreurs 8 3 Code Figure 3.14 — Schéma du bloc de construction des vecteurs de test 108 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE En plus du signal d’ajout ou retrait de la métrique, la position du bit le moins fiable modifié et un signal de début de traitement sont transmis au bloc de calcul des métriques. Le schéma bloc de ce module est donné sur la figure 3.14. Le décodeur algébrique Le bloc décodage algébrique permet de décoder successivement les 16 vecteurs de test élaborés. Les données sont aiguillées en fonction de la configuration choisie. Un jeu de multiplexeurs gère alors le chemin de donnée. Le schéma bloc est donné sur la figure 3.15. Par Md_p Lr_p BCH t=1 Si autres Algorithme PGZ Parité Xi=Si C(x) LUT des σ(x) Par Xi Xi BCH t=2 RS t=1,2 Calcul de la valeur Ei Xi de l’erreur Vérification du mot de Xi code Si BCH t=1 Ei Xi autres Décodage des vecteurs de test Figure 3.15 — Décodeur algébrique Le bloc de l’algorithme PGZ détermine les coefficients du polynôme localisateur d’erreurs du vecteur de test en cours de traitement. Les valeurs de ces coefficients sont déterminées grâce à l’algorithme décrit aux sections 2.2.2.2 et 2.2.2.1. Dans ce cas, des multiplieurs dans CG(25 ), des diviseurs et des comparateurs sont nécessaires. Cependant, deux étapes successives permettent de remplacer l’opération complexe de division. Concrètement, une table (32 × 5 bits) jouant le rôle de l’inversion et une multiplication par le numérateur se substituent à l’opération de division. Enfin, des signaux supplémentaires indiquent si un échec de décodage est intervenu lors du décodage algébrique ou si le mot corrigé est un mot de code. La détermination des racines du polynôme localisateur d’erreurs σ(x) s’effectue par l’intermédiaire d’une table pré-calculée ayant pour entrées les coefficients σ1 et σ2 . La sortie fournit les racines solutions Xi si elles existent ou indique un échec de décodage dans le cas contraire. 3.4. CONCEPTION DU TURBO DÉCODEUR FLEXIBLE 109 Le bloc de correction constitue la deuxième partie de l’algorithme PGZ. En effet, seul le décodage d’un code Reed-Solomon nécessite la détermination de la valeur des erreurs. Les racines X1 et X2 du polynôme localisateur d’erreurs et les composantes S1 et S2 sont les entrées de ce bloc. Des calculs dans le corps de Galois associé fournissent l’amplitude des erreurs. Une table d’inversion est également employée. Enfin, le bloc de vérification permet de savoir si le mot corrigé est un mot de code et si la correction a été efficace. Ainsi, les composantes du syndrome sont recalculées en fonction de la correction proposée et du syndrome déterminé initialement. Si elles sont nulles alors il s’agit bien d’un mot de code. Une mémoire est utilisée pour les éléments du corps de Galois (α2i ,α3i ,α4i ). Parallèlement à tous ces blocs, un module calcule la parité de chaque vecteur de test. Seul le décodage des codes BCH nécessite l’utilisation de ce bloc. Le calcul des métriques Ce module (figure 3.16) fonctionne de manière conjointe avec le bloc de construction des vecteurs de test. A ce niveau, le traitement repasse au niveau binaire puisque le calcul des métriques s’effectue avec la fiabilité des bits erronés. Le signal d’initialisation start indique qu’un nouveau mot est traité. La métrique et les positions des 3 bits les moins fiables sont remis à zéro. On rappelle qu’il y trois inversions au maximum parmi les 5 bits les moins fiables. Les positions des trois bits les moins fiables sont rangées par comparaison avec celles enregistrées précédemment et identifiées pour savoir si elles sont à prendre en considération. TP ValidPos Start Poids Hamming 3 Positions des MF Métriques 8 4x5 Fiabilités des MF 4 Mot de code Position du MFmo Bloc de calcul des métriques 4x5 3x8 Fiabilité du MFmod 3x4 Valeur des erreurs Erreurs 8 3 Fiabilités des bits corrigés 2x5x4 Code Figure 3.16 — Schéma du bloc de calcul des métriques Dans le cas du décodage d’un code BCH, la correction se fait sur un ou deux bits donc au maximum deux fiabilités sont nécessaires. Une comparaison avec les bits inversés permet de vérifier 110 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE que les fiabilités ne sont pas prises en compte deux fois. Il faut également utiliser la fiabilité de la parité dans le cas d’une parité erronée. Ainsi, la métrique est égale à : M etrique = M Finv1 + M Finv2 + M Finv3 + f iabparite + f iabbitcorrige1 + f iabbitcorrige2 (3.4.1) où M Finvi sont les fiabilités des bits inversés parmi les 5 bits les moins fiables. En revanche, dans le cas du RS, la correction s’effectue sur des symboles. C’est pourquoi, la totalité des fiabilités des bits composant le symbole corrigé est exploitée. La métrique se calcule par la sommation suivante après vérification que la correction ne se fait pas sur des bits inversés : M etrique = M Finv1 + M Finv2 + M Finv3 + f iabsymbolecorrige1 + f iabsymbolecorrige2 (3.4.2) où f iabsymbolecorrige1 est la somme des fiabilités des bits composant le/les symboles corrigés. Le bloc de tri des métriques Ce bloc trie les vecteurs de tests sortant du décodeur binaire suivant leur métrique, en ayant préalablement vérifié qu’il s’agit de mots de code. Le mot décidé Md est celui ayant la métrique la plus faible. Puis, les trois vecteurs de test ayant les plus faibles métriques, après le mot décidé, sont conservés comme mots concurrents (Mc ). Deux vecteurs de test identiques ne sont pas tous les deux retenus. 3.4.1.3 Partie émission Le bloc d’émission récupère les données issues du tri des métriques. La fiabilité est élaborée à partir du mot courant, du mot décidé Md et des mots concurrents Mc . L’information extrinsèque est générée à partir de la fiabilité pondérée d’un coefficient alpha et ajoutée à chaque symbole du mot présenté à l’entrée du décodeur élémentaire. Le calcul de la fiabilité Ce bloc calcule la nouvelle fiabilité de chaque bit à partir du mot décidé et des mots concurrents. La valeur de cette fiabilité est égale à la différence entre le mot décidé et le mot concurrent retenu Mc − Md . S’il n’existe pas de mot concurrent parmi les vecteurs de test alors une valeur β est affectée. Dans notre cas, elle est égale à : β = Rk + M F2 + M F3 + M F4 − Md (3.4.3) où M Fi sont les fiabilités des bits les moins fiables. Si le mot produit lors du décodage algébrique n’est pas un mot de code alors la fiabilité est égale à : f iabilité = β + 2 (3.4.4) 3.4. CONCEPTION DU TURBO DÉCODEUR FLEXIBLE 111 Ce paramètre β croit donc au fur et à mesure des itérations puisque les bits deviennent de plus en plus fiables. Le calcul de l’information extrinsèque Ce bloc (figure 3.17) calcule l’information extrinsèque W qui est la différence entre l’information disponible après le décodage et l’information connue avant le décodage. Elle constitue l’apport du processus de décodage permettant de déterminer l’information émise. Le détail du calcul a été explicité dans la section 2.3.3. IE Fiabilité 6 Inversion signe R’’ Fiabilité 6 Bloc de calcul de l’information extrinsèque Signe IE Décision ferme 5 Figure 3.17 — Schéma du bloc de calcul de l’information extrinsèque Correction du mot de code Ce bloc (figure 3.18) réalise à la fois la pondération de l’information extrinsèque et la sommation avec le mot reçu initialement R. R0 = R + α.IE (3.4.5) Le coefficient de pondération α dépend de l’itération en cours. Ce nombre est d’autant plus élevé que le nombre d’itération croı̂t. En effet, au fur et à mesure du processus de décodage, l’apport du décodeur devient pertinent. L’information extrinsèque pondérée est ensuite sommée. Le signe est important puisqu’il peut s’agir soit d’une soustraction ou d’une addition. 3.4.1.4 Mémoire interne Des mémoires sont nécessaires pour les trois parties précédentes : réception, traitement et émission [CAKP02]. En effet, un mot doit être disponible pour chaque partie du décodeur élémentaire. De plus, 112 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE Į 4 IE R’’suivant Calcul du nouveau R’ 6 6 5 R Fiabilité Figure 3.18 — Schéma du bloc de calcul du nouveau R” il faut mémoriser à la fois le mot à traiter R” et le mot initial reçu R. Au total, il faut donc 6 (2 × 3) mémoires RAM. La taille par défaut de chacune de ces mémoires est de 32x5x5 bits. La configuration la moins favorable est considérée de manière à conserver la même structure quelque soit le code choisi. Une machine d’états finis gère l’ensemble des mémoires afin de fournir les mots corrects aux différents partie du décodeur élémentaire (fig. 3.19). Mémoire R R RAM 1 RAM 2 RAM 3 R’_fiab 5 Adresse R’’ 5 Data 5 R’_metr Machine d’états finis Adr_CG 2x4x5 Adresse 3+5 Data R_fiab Pos_Cor 3+5 RAM 1 RAM 2 RAM 3 5 Mémoire R’’ Figure 3.19 — Schéma bloc de la mémoire Le fonctionnement des mémoires est circulaire, c’est à dire que leur rôle passe successivement d’un mode à l’autre pour reprendre leur état initial. La figure 3.20 illustre l’évolution du rôle des RAM au cours du temps. Lors de la réception, les données sont écrites en mémoire tandis que lors d’un traitement ou de l’émission, elles sont lues. L’ensemble des configuration mémoire est réalisé par une 3.4. CONCEPTION DU TURBO DÉCODEUR FLEXIBLE 113 machine d’états. Elle gère également leur adressage à travers l’utilisation de l’entrée du signal du corps de Galois sur 5 bits pour les phases de réception (écriture) et d’émission (lecture). L’exploitation des données R” et R est différente pour le traitement. En effet, la correction du vecteur de test fournit la position du ou des bits à corriger pour d’abord élaborer la métrique puis récupérer les fiabilités associées. Temps Réception RAM 1 RAM 3 RAM 2 RAM 1 RAM 3 RAM 2 Traitement RAM 2 RAM 1 RAM 3 RAM 2 RAM 1 RAM 3 Réception RAM 3 RAM 2 RAM 1 RAM 3 RAM 2 RAM 1 Modules concernés Figure 3.20 — Fonctionnement des mémoires RAM au cours du temps 3.4.2 L’unité de contrôle Un processeur de type NIOS joue le rôle de l’unité de contrôle dans notre étude. La mise en place d’un processus de communication entre les entités est nécessaire. Ainsi, le bus système Avalon est utilisé dans la solution SoPC d’Altera. L’interface de la partie processeur avec le bus de communication est pré-définie, cependant une interface est à mettre en place pour le décodeur élémentaire. Le processeur doit également gérer le processus itératif de turbo décodage. Ainsi, la manipulation des données stockées en mémoire externe est réalisée par le NIOS. Cette mémoire contient à la fois les données reçues issues du canal de transmission, les données obtenues lors d’un premier traitement suivant les colonnes et enfin les données décodées résultant de la demi-itération courante. Trois plans mémoires de la taille d’une matrice (32*32*5=5120 bits) constituent la mémoire externe. 3.4.2.1 la gestion de la communication entre le processeur et des périphériques : le bus système Avalon Le bus utilisé pour la communication entre le processeur et les différents périphériques est un bus système Avalon. Il s’agit d’un bus développé par la société Altera qui est destiné à être implémenté sur des composants programmables de type FPGA. Ses principaux atouts sont la simplicité de son 114 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE architecture favorisant l’utilisation des ressources matérielles et un support multi-maı̂tre. Un port Avalon est un ensemble de signaux utilisés comme une simple interface. Il peut être configuré en mode maı̂tre ou esclave. Ainsi, un port esclave répond à une requête de transfert de données tandis qu’un port maı̂tre initie ce transfert. Ils ne sont pas connectés directement les uns aux autres. Les ports sont connectés à un bus qui se charge de retranscrire les signaux entre eux. Les modes de fonctionnement des deux types de ports étant différents, il est nécessaire de les distinguer. Un port est disponible au cycle suivant la fin d’un transfert. Un cycle correspond à une période de l’horloge associée avec le port concerné. Dans notre étude, seul le processeur dispose d’un port maı̂tre. Il commande l’échange de données et est prioritaire du fait de son unicité. Les périphériques tels que les mémoires externes ou le décodeur élémentaire utilisent, quant à eux, un port esclave. Les signaux composant l’architecture du bus Avalon sont : – clk : l’horloge synchrone avec toutes les interfaces Avalon (maı̂tre ou esclave) et donc avec tous les signaux du bus. – chipselect : la validation de ce signal (1 bit) permet l’utilisation du bloc logique associé. – address : ce signal sert de compteur pour l’ensemble des symboles de la trame. La largeur de l’adresse est de 5 bits. – read n : ce signal (1 bit) est positionné à zéro lorsque le mot reçu issu du canal est écrit sur le bus de communication. – write n : ce signal (1 bit) indique que des données sont lues sur le bus Avalon. A chaque récupération de la séquence décodée, write n est positionné à zéro. – writedata : il s’agit du bus contenant les données et les signaux de configuration destinés au décodeur élémentaire. Ainsi, la partie haute de ce champ contient les données R et R’ qui sont quantifiées sur 5 bits (1 bit de signe et 4 bits de quantification). Le type de code employé et le pouvoir de correction souhaité sont fournis à l’aide de deux bits. De plus, un bit est utilisé pour signaler le début d’un mot de code. Enfin, le numéro de l’itération en cours est précisé sur 3 bits. – readdata : Ce bus de 5 bits permet d’envoyer les nouveaux symboles du mot décodé au processeur NIOS. Il faut noter que la largeur des champs readdata et writedata sont identiques, c’est à dire sur 32 bits, puisque les deux sont utilisés conjointement. 3.4.2.2 la communication dans notre architecture Le processeur NIOS considéré est de type RISC et possède un chemin de données sur 32 bits. Différentes interfaces peuvent être paramétrée au sein du coeur de processeur. Dans notre cas, ce dernier dispose de l’ensemble des interfaces lui permettant de communiquer avec les plans mémoires 3.4. CONCEPTION DU TURBO DÉCODEUR FLEXIBLE 115 et le décodeur élémentaire. La largeur du bus d’adresse (32 bits) fixe la profondeur de l’espace adressable disponible. De plus, chaque périphérique bénéficie d’une zone d’adressage définie. L’architecture résultante de nos choix est donnée sur la figure 3.21. Processeur NIOS Port maître Avalon Mémoire On Chip Décodeur RAM élémentaire Port esclave Avalon Port esclave Avalon Bus Avalon Port esclave Avalon Port esclave Avalon RAM RAM Mémoire On Chip Mémoire On Chip Tri-State Avalon Mémoire externe de boot FPGA Figure 3.21 — Architecture hétérogène retenue pour l’implantation Ainsi, les différents éléments composant le processeur sont : – le coeur de processeur RISC NIOS. Il s’agit d’un processeur de type Harvard possédant 5 étages de pipeline. Les bus d’instructions et de données sont des bus systèmes propriétaires Avalon de chez Altera, – une interface pour le décodeur élémentaire, – une interface pour chacune des mémoires embarquées (On Chip) qui sont gérées à travers le bus Avalon configuré en esclave. La mémoire est répartie sur des blocs de mémoires RAM dédiées se trouvant sur le FPGA, – une interface pour la mémoire de boot à partir de laquelle la configuration initiale est chargée, – l’interface maı̂tre du bus Avalon. la communication entre le processeur et le décodeur élémentaire Le décodeur élémentaire utilise un port Avalon configuré en esclave. Une interface très simple est mise en place pour s’adapter au bus de communication. Nous nous intéressons ici à l’aspect logiciel. Le langage de développement utilisé est le langage C. Un compilateur se charge de transformer le code C élaboré en langage assembleur puis en un fichier exécutable. En dehors de la définition du processeur souhaité, le fonctionnement interne et la gestion des différentes ressources de la cible via le bus Avalon sont donc quasi-transparentes pour le concepteur. L’algorithme s’exécutant sur le processeur est donné en figure 3.22. En faisant abstraction du processus itératif que nous expliquons ensuite, le passage des 116 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE données dans le décodeur élémentaire correspond à une demi-itération, c’est à dire soit un décodage des lignes ou des colonnes (Boucle 2 ou 4 sur la figure 3.22). A l’intérieur de ces boucles, une phase d’initialisation est nécessaire. Les symboles de chaque mot sont ensuite envoyés séquentiellement et les symboles décodés sont récupérés. Boucle 1 itération début\\ Boucle 2 décodage ligne début\\ init début Envoi des n symboles du 1er mot Envoi des n symboles du 2ème mot Envoi des n symboles du 3ème mot Phase d’initialisation Récupération 1er mot traité init fin\\ Boucle 3 des n lignes de mots restants début Envoi des n symboles des mots restants Récupération mots traités Cœur du traitement des lignes Boucle 3 des n lignes de mots restants fin Boucle 2 décodage ligne fin Boucle 4 décodage colonne début\\ ... Traitement des colonnes Boucle 4 décodage colonne fin\\ Boucle 1 itération fin\\ Figure 3.22 — Algorithme du programme exécuté sur le processeur NIOS la communication entre le processeur et la mémoire Le processeur NIOS possède un bus d’instruction et un bus de données. Dans un premier temps, le bus d’instructions a une largeur de 16 bits. Ce bus, configuré en mode maı̂tre, est seulement utilisé pour aller chercher les instructions en mémoire. Le processeur bénéficie de la technique de prédiction de branchement pour spéculer sur les adresses suivantes. Ainsi, les pénalités sont dues exclusivement aux erreurs de prédiction. Une mémoire cache peut être embarquée pour améliorer la vitesse de récupération des instructions. Dans un second temps, le bus de données du NIOS, configuré en maı̂tre, manipule des données sur 32 bits. Il est utilisé pour trois types d’opérations : 1. lire les données à partir de la mémoire externe. Le processeur exécute une instruction de chargement (LD, LDP, LDS). 2. écrire les données en mémoire externe. Le processeur exécute une instruction de stockage (ST, STP, STS, ST8s, ST8d, ST16s, ST16d, STS8s, STS16s). 3. gérer les interruptions liées à l’utilisation des périphériques. 3.4. CONCEPTION DU TURBO DÉCODEUR FLEXIBLE 117 Les opérations de lecture/écriture sont effectuées en une seule période d’horloge lorsque le bus est connecté à une mémoire disponible. Ceci implique qu’il n’y ait pas de conflit d’arbitrage avec le bus d’instruction. i-ème itération Mem RX Mem RX Décodeur élémentaire Mem lignes Mem RX Décodeur élémentaire Mem colonnes Mem lignes Figure 3.23 — Utilisation des mémoires lors du décodage itératif Pour notre application de turbo décodage de codes produits, trois plans mémoires sont utilisés. Le premier M emRX est utilisé pour stocker la matrice d’information à décoder. Le second M em lignes permet le stockage des données obtenues après une demi-itération, c’est à dire après un passage dans le décodeur élémentaire. Enfin, le dernier M em colonnes contient les données décodées au bout d’une itération soit après un deuxième passage pour le décodage des colonnes. La figure 3.23 illustre l’utilisation des différents plans mémoires au cours du processus. Gestion de l’aspect itératif du turbo décodage L’aspect itératif du turbo décodage est entièrement défini dans le programme exécuté par le processeur NIOS. En effet, en se référant à la figure 3.22, on note que les boucles réalisant les opérations sur les lignes puis sur les colonnes se succèdent. La réitération de ces deux étapes constitue une itération de décodage. Ainsi, l’application logicielle effectue le chargement des données, l’envoi au décodeur élémentaire et la récupération des données décodées pour l’ensemble des demi-itérations. Comme nous l’avons évoqué précédemment, l’adressage des parties mémoires externes est géré par le NIOS. 3.4.2.3 Evolution de la communication dans notre architecture Suite à l’évolution des solutions proposées par le fabricant Altera, le processeur NIOS a été remplacé par un processeur de deuxième génération appelé NIOS II. Ainsi, l’architecture flexible (fig. 3.21) de turbo décodage décrite précédemment, se composant à la fois d’une partie logicielle constituée d’un processeur et d’un bloc matériel dédié réalisant le décodage élémentaire, a été modifiée. La gestion du 118 CHAPITRE 3. ÉTUDE ET IMPLANTATION D’UN TURBOCODE EN BLOCS FLEXIBLE processus itératif propre aux turbocodes est également remplie par le processeur NIOS II. L’échange de données entre les deux éléments réalisé par l’intermédiaire d’un bus système Avalon reliant l’ensemble des ressources est le point critique de l’architecture. En effet, cette solution présente un goulot d’étranglement qui est le bus système de communication entre le processeur NIOS II et le décodeur élémentaire. Ainsi, le simple fait d’instaurer un échange de données entre le NIOS II, les mémoires externes et le décodeur élémentaire implique une baisse critique du débit de l’application. Une solution architecturale est donc proposée sur la figure 3.24. Elle consiste à placer deux éléments de type DMA (Direct Access Memory) en entrée et en sortie du décodeur. Les DMA permettent d’envoyer et de récupérer les données à partir des mémoires sans monopoliser le bus pour des accès mémoires. Un arbitre gère alors la priorité entre le processeur et le DMA lors des échanges de données. Ainsi, un DMA se charge de transférer les données au décodeur élémentaire tandis qu’un second récupère les données décodées pour les écrire en mémoire. Tous les transferts superflus vers le processeur sont alors éliminés. Le gain en vitesse est alors au moins doublé. Processeur NIOS II DMA Décodeur DMA élémentaire Port maître Avalon Bus Avalon Arbitre Arbitre Mémoire de données Mémoire de données FPGA Figure 3.24 — Architecture de l’application intégrant des DMA 3.5 Conclusion Dans un premier temps, un état de l’art a rappelé les travaux effectués dans le domaine des turbo décodeurs reconfigurables. Puis, nous avons proposé une étude sur les différents algorithmes mis en œuvre dans le cadre du turbo décodage de codes produits constitués de codes BCH et RS. A travers une étude de complexité fonctionnelle, les différents paramètres de flexibilité, notamment la longueur de code N et le pouvoir de correction t, ont été caractérisés. Leur impact respectif sur le nombre d’opérations nécessaires a été estimé. Sur la base de ce travail, nous avons retenu un algorithme de 3.5. CONCLUSION 119 décodage pour les codes BCH et RS. Il s’agit de l’algorithme Peterson-Gorensteiner-Zierler (PGZ) qui est particulièrement adapté pour les faibles pouvoirs de correction. La longueur de code retenue est égale à 32 pour les codes BCH et à 31 pour les codes RS. Ces choix nous assurent une complexité raisonnable. Nous avons également bénéficié d’études antérieures pour attribuer une valeur aux autres paramètres pour rendre l’implantation de l’algorithme de Chase-Pyndiah possible. Ainsi, les différentes configurations de code évoquées dans le chapitre 2 ont été retenues pour l’implémentation d’un turbo décodeur flexible dédié aux codes produits. Pour rappel, ce sont les turbocodes produits à base de codes BCH (32,26) et (32,21) et de codes Reed-Solomon (31,29) et (31,27). D’autre part, des critères d’arrêt ont été envisagés pour interrompre une exécution superflue du processus de décodage itératif pour le décodage d’un code BCH ou d’un code RS. Pour cela, un critère d’arrêt hiérarchique a été proposé pour conserver les performances d’un décodage sans critère d’arrêt. Ainsi, nous avons pu ajouter un rôle supplémentaire à l’unité de contrôle chargée par ailleurs de la configuration du décodeur élémentaire . Les solutions architecturales retenues ont ensuite été décrites pour les processus de codage et de turbo-décodage. Pour ce dernier, la découpe réalisée s’appuie sur l’étude de complexité présentée. Une architecture tenant compte de la flexibilité introduite a été développée pour assurer à la fois le décodage des codes BCH et RS pour différents pouvoirs de correction. L’intégration d’un turbo décodeur dédié à des codes produits à base de codes Reed Solomon représente une innovation puisqu’il s’agit, à notre connaissance, de la première solution architecturale proposée pour le décodage de tels codes. L’architecture flexible de notre étude est hétérogène. Elle se compose d’une partie matérielle, le décodeur élémentaire, et d’une partie logicielle, un processeur NIOS II. Ce dernier est chargé de la configuration du décodeur élémentaire et des échanges de données avec la mémoire. Les échanges transitent par un bus système Avalon et concernent soit la mémoire externe soit le décodeur élémentaire. Celui-ci se compose, quant à lui, de trois parties et d’une mémoire interne. Le pouvoir de correction t et le type de code composant sont paramétrables. Le décodeur élémentaire est conservé au cours du temps mais l’architecture interne doit être adaptée. La flexibilité est introduite par l’utilisation d’un ensemble de multiplexeurs permettant de passer d’une configuration à l’autre. De plus, une découpe temporelle du traitement global est adaptée pour chacune des configurations. Nous allons dans le chapitre suivant décrire le flot de conception expérimenté dans le cadre de notre étude. Notre but est de parvenir à proposer une implémentation sur une plate-forme de prototypage à partir d’une description haut niveau de l’application. CHAPITRE 4 De la description algorithmique jusqu’au prototypage Le flot de conception expérimenté au cours de cette thèse est tout d’abord présenté. En effet, le point de départ de ce travail a été l’expérimentation d’un flot de conception innovant, de la conception algorithmique jusqu’à l’implantation. Le but est de parvenir à proposer une implémentation sur une plate-forme de développement à partir d’une description de haut niveau de l’application. Le FPGA Stratix EP1s40 de chez Altera est le circuit ciblé. Puis, une étude sur la synthèse de haut niveau a été menée. Des solutions favorisant l’exploration architecturale pour certaines fonctionnalités de notre application de turbo décodage de codes produits sont ainsi détaillées dans ce chapitre. Enfin, le prototypage est abordée à travers la présentation de la plate-forme et du processus de mise en œuvre. En effet, plusieurs étapes sont nécessaires pour implémenter l’architecture sur le FPGA et lancer l’exécution du programme sur le processeur NIOS II. En conclusion, des pistes de réflexion sont évoquées pour des implantations futures notamment la migration de certaines fonctionnalités vers le processeur. 4.1 Flot de conception expérimenté Cette première section se divise en deux sous parties. Dans un premier temps, le flot de conception expérimenté dans le cadre de cette étude est présenté. Ainsi, le langage de description SystemC et les outils associés pour l’implantation d’applications sur une cible FPGA sont explicités. Dans un deuxième temps, la modélisation d’un décodeur élémentaire générique dans l’environnement System Studio est détaillée. Enfin, la validation du flot considéré est réalisé à partir du modèle établi. 122 CHAPITRE 4. DE LA DESCRIPTION ALGORITHMIQUE JUSQU’AU PROTOTYPAGE 4.1.1 Description du flot de conception expérimenté Ces dernières années, de nombreuses architectures de turbo décodeurs ont été proposées par le département électronique de l’ENST-Bretagne. Dans tous ces travaux, les méthodologies de conception étaient similaires. Le langage C est tout d’abord utilisé lors des simulations fonctionnelles pour évaluer les performances. A l’issu d’une découpe architecturale, les descriptions en VHDL au niveau RTL sont réalisées pour les différents modules constituant l’architecture. Ce flot est utilisé pour des circuits dédiées de type ASIC ou des circuits reprogrammables de type FPGA. Cependant, comme il a été vu dans le chapitre 1, la complexité croissante des applications et les contraintes de « time to market » impliquent l’utilisation de nouvelles méthodologies de conception. Ainsi, nous avons décidé d’envisager la conception au niveau système rendant possible une implémentation matérielle sans discontinuité dans le flot de conception. En effet, l’utilisation du langage SystemC évite la réécriture de l’application validée au niveau algorithmique en un langage de description matérielle. De plus, il s’agit d’un langage d’aide à l’exploration architecturale car il facilite la simulation par rapport au langage de description matérielle classique tel que le VHDL. Il permet d’envisager la conception de systèmes électroniques intégrant à la fois des parties matérielles et logicielles. Il est possible d’implanter une description abstraite sur la cible souhaitée grâce à des raffinements successifs des modèles. Des précisions sont données sur ce langage dans l’annexe A. Nous avons choisi, dans cette étude, l’outil System Studio de Synopsys qui fournit un environnement de développement complet au niveau système. Il est possible ainsi de réaliser à la fois une modélisation fonctionnelle avec l’utilisation du langage C et/ou une modélisation comportementale en SystemC. Ainsi, la première étape a été une modélisation de notre application en C dans cet environnement. Une étape correspondant à la découpe architecturale basée sur le langage SystemC nous a permis de concevoir des modules à différents niveaux d’abstraction et ainsi de modéliser plus simplement les échanges au niveau TLM (Transactional Level Modeling). Le temps de simulation par rapport à un équivalent RTL est alors significativement réduit. Ceci constitue l’un des intérêts majeurs de l’utilisation du langage SystemC. A partir de 2001, un outil complémentaire SystemC compiler permettait d’effectuer une synthèse à partir d’un modèle décrit en SystemC au niveau comportemental ou au niveau RTL. Malheureusement, le travail autour de cet outil et le support associé ont été arrêtés au cours de l’année 2004 par la société Synopsys. Notre choix s’est alors orienté sur d’autres outils de synthèse architecturale : d’une part Agility Compiler de Celoxica sur les conseils de Synopsys et d’autre part l’outil académique GAUT mis au point au sein du laboratoire LESTER que nous avons préalablement utilisé dans le cadre du projet RNRT ALIPTA . En 2002, les fournisseurs de FPGA ont proposé une nouvelle déclinaison des circuits dits « programmables ». Il s’agit des systèmes sur puce programmable (SoPC) qui correspondent à l’implantation de ressources logicielles et matérielles sur un même circuit FPGA. C’est pourquoi, dans le cadre de ce travail, nous avons dès le départ tenté de bénéficier de cette nouvelle génération de circuit. Dans ce 4.1. FLOT DE CONCEPTION EXPÉRIMENTÉ 123 contexte, l’environnement de développement Quartus II de chez Altera a été intégré dans notre flot de conception. Il autorise la conception, la configuration et l’exécution de programme logiciel sur un ou plusieurs processeurs. De plus, les ressources internes d’un processeur sont personnalisables par le concepteur grâce à l’utilisation de l’outil SOPC Builder. De même, des interfaces de communications peuvent être ajoutées pour faciliter la gestion des communications avec les périphériques, les bus, les mémoires... Des bancs de test sont générés automatiquement et simplifient la simulation sous l’outil Modelsim. Enfin, les outils de compilation sont basés sur le format open source GNU. Le flot de conception complet retenu est explicité sur la figure 4.1. Le point d’entrée est une description comportementale en SystemC de l’application. Après les étapes de synthèse, une description netlist (de type EDIF) ou VHDL est obtenue. Le point de sortie est un train binaire (bitstream) permettant de configurer le circuit FPGA. C/C++ Simulation fonctionnelle SystemC 6\VWHP&70 &RFHQWULF 6WXGLR Découpe architecturale Synthèses EDIF Génération NIOSII 623&%XLOGHU Place & Route 1LRV 6'.6KHOO 1LRV ,'( Prototypage Figure 4.1 — Le flot de conception expérimenté Les différentes étapes considérées dans ce flot sont détaillées ci-dessous : – la simulation fonctionnelle : elle est réalisée dans System Studio à partir du code C de l’application. – la découpe architecturale : à l’aide du langage SystemC, l’algorithme de traitement est décomposé en fonctions qui sont, ensuite, réparties dans des modules indépendants. Des ports d’entrées/sorties sont affectés à chacun des blocs. Des listes de sensibilité sont établies. Elles déclenchent les processus et les fonctions associées pour traiter les données entrantes. Dans cette étape, une exploration de l’espace de conception est réalisée pour expérimenter l’affectation des fonctionnalités sur différentes cibles. Des simulations sont menées pour valider le comportement 124 CHAPITRE 4. DE LA DESCRIPTION ALGORITHMIQUE JUSQU’AU PROTOTYPAGE de l’ensemble par rapports au modèle en langage C. – les synthèses des parties matérielles et logicielles s’effectuent en parallèle : – la synthèse de la partie matérielle est appliquée aux modules spécifiques qui seront implantés sur le FPGA. Cette synthèse peut être de deux natures : soit une synthèse à partir d’une description en SystemC au niveau RTL soit une synthèse haut niveau à partir d’une description comportementale en SystemC. – La personnalisation du processeur constitue la première phase du processus de synthèse de la partie logicielle. Une synthèse des ressources matérielles du processeur est ensuite effectuée. Il s’agit de l’étape de génération du processeur logiciel (NIOS II par exemple chez Altera). – L’ensemble processeur/bloc matériel est assemblé dans l’environnement Quartus II. Le placement/routage est effectué pour la structure complète. Les estimations fournies en amont peuvent alors être comparées aux résultats obtenus. – le prototypage : il s’agit de la programmation puis du test du circuit FPGA proprement dit. Une expérimentation de ce flot a été menée sur un algorithme de turbo décodage de codes produits. Nous allons détaillés ce travail dans les sections suivantes. 4.1.2 Modélisation d’un décodeur élémentaire générique pour le turbo décodage de codes produits Dans notre étude, la modélisation a été effectuée dans l’environnement System Studio. Toute la chaı̂ne de communications numériques a été implémentée dans cet environnement (figure 4.2). Figure 4.2 — Modélisation de la chaı̂ne de communications numériques sous System Studio Le passage du langage C au SystemC nous a permis d’effectuer une découpe architecturale de notre décodeur élémentaire. L’architecture du décodeur élémentaire est constituée de blocs qui sont décrits de manière générique avec le langage SystemC (figure 4.3). Ainsi, plusieurs paramètres peuvent être modifiés dans le cadre de la simulation : – la longueur de code N . – la dimension du code K. – le nombre de bits de quantification Q. – la valeur du dernier élément du corps de Galois GF MAX. – le polynôme générateur POLYGEN. – le nombre d’éléments les moins fiables M F . 4.1. FLOT DE CONCEPTION EXPÉRIMENTÉ 125 – le nombre de mots concurrents conservés N b M C. Des informations sur l’ensemble de ces paramètres peuvent être retrouvés dans la section 3.2.1 du chapitre 3. Figure 4.3 — Modélisation du turbo décodeur sous System Studio Concernant l’unité de contrôle à savoir le processeur NIOS II, nous ne disposions pas de modèle en langage SystemC. C’est pourquoi, un module dédié a été conçu pour gérer les échanges de données avec le décodeur élémentaire. De plus, les critères d’arrêt évoqués dans la section 3.2.2 ont été implémentés et testés sur notre modèle. Les autres fonctionnalités de la chaı̂ne de communication tels que la génération de l’information binaire, le codage, le bruitage et la transmission des données sont décrites en langage C. Toutefois, les communications entre ces différents modules sont assurées grâce à l’ajout d’une couche en SystemC. Les performances de ce modèle ont été simulées et validées. Les résultats obtenus sont exactement les mêmes que pour un modèle équivalent décrit uniquement en langage C. 4.1.3 Synthèse logique d’un turbo décodeur BCH à longueur variable Les synthèses logiques des différents modules décrits en langage SystemC ont été réalisées pour le turbo décodage d’un code BCH étendu. Les codes considérés sont capables de corriger un bit erroné dans le mot reçu. Les synthèses ont été menées pour différentes longueurs de code N . Le tableau 4.1 présente les résultats obtenus pour l’implantation du décodeur élémentaire sur notre cible. Dans ce cas, 16 vecteurs de test, une quantification sur 4 bits et 3 mots concurrents ont été considérés. 126 CHAPITRE 4. DE LA DESCRIPTION ALGORITHMIQUE JUSQU’AU PROTOTYPAGE Longueur du code Réception Parité Syndrome Moins fiables Traitement Vecteurs de test Métriques Tri des mots Emission Fiabilité Inf. extrinsèque Correction Totaux Nbre de N = 128 54 138 936 984 225 3009 2528 341 95 8310 portes logiques N = 64 N = 32 54 54 116 94 824 784 827 744 225 225 2602 2188 1376 1244 341 341 95 95 6460 5769 Tableau 4.1 — Complexité en nombre de portes logiques du décodeur élémentaire pour différentes longueurs de code N Nous observons que des blocs occupent la même surface quelque soit la longueur de code considérée. En effet, les complexités des modules de calcul de la parité, de l’information extrinsèque et de correction sont indépendants de N . Compte tenu du fait que les symboles sont traités séquentiellement et que la largeur des données traitées est identique, la même architecture est employée à chaque cycle d’horloge. De même, le bloc de calcul des métriques a une complexité constante puisque le nombre de mots concurrents est identique dans les trois cas. Toutefois, plusieurs blocs voient leur complexité diminuer lorsque la longueur de code diminue. Cette baisse est due à la taille du corps de Galois (2m avec m = 7, 6, 5). En effet, la dimension des opérateurs associés et par conséquent la taille des chemins de données dépendent directement de ce paramètre. L’implantation d’un décodeur de code BCH (32,26) a déjà été effectuée au sein du département électronique de l’ENST-Bretagne [CAKP02]. L’architecture et les algorithmes sont rigoureusement identiques à ceux utilisés dans notre cas. Cependant, les blocs constituants sont décrits au niveau RTL en langage VHDL. Cette étude sert donc de point de comparaison avec le travail effectué pour une longueur de code N = 32. La comparaison s’effectue sur la surface occupée en terme de portes logiques. La technologie utilisée est la technologie ASIC 0,18 µm de ST Microelectronics. Ainsi, dans notre cas, nous avons obtenu une complexité en nombre de portes de 5769 contre 5336, soit un écart d’un peu plus de 5%. Après une comparaison pour chacun des blocs, l’écart s’explique par les résultats de synthèse obtenus pour le bloc de fiabilité qui nécessite beaucoup de contrôle. Il semble que l’interprétation effectuée par le parser VHDL de l’outil de design compiler de Synopsys est meilleure que celle réalisée par le parser SystemC de l’outil SystemC Compiler de Synopsys. Cependant, une évolution programmée de l’outil aurait dû pallier à ce problème avant l’interruption de son support. L’utilisation de ce flot de conception a également fait l’objet d’une publication sur une application de turbo décodage de code produit basé sur un code BCH (128,120) dans une conférence internationale [PJAJ04] et nationale [PJAJ05]. 4.2. SYNTHÈSE LOGIQUE ET PLACEMENT/ROUTAGE DE L’ENSEMBLE CODEUR/TURBO DÉCODEUR FLEXIBLE 4.2 127 Synthèse logique et placement/routage de l’ensemble codeur/turbo décodeur flexible Nous allons nous focaliser sur le développement d’architecture flexible tout en conservant le flot de conception décrit précédemment. Ainsi, les résultats obtenus lors des synthèses logiques et du placement/routage à l’aide de l’outil Quartus II en ciblant un FPGA de type Stratix 1s40F780c5 sont présentés successivement pour le codeur flexible, le décodeur élémentaire flexible et le turbo décodeur flexible. 4.2.1 Synthèse logique et placement/routage des différents blocs du codeur En considérant l’architecture du codeur mise en place (voir figure 3.3), il est possible d’élaborer des mots de codes de type soit BCH étendu soit Reed-Solomon composés jusqu’à dix symboles de redondance. En effet, ce codeur est conçu pour supporter la pire configuration en terme de complexité. Ainsi, il fournit dix symboles de redondance pour un code BCH(32,21) et nécessite un chemin de données de cinq bits pour un code RS de longueur de mot de code 31 bits. Nous avons décrit les codeurs propres à nos quatre configurations en langage VHDL au niveau RTL. Les résultats de synthèse sont données dans le tableau 4.2. Les premières lignes donnent les caractéristiques, en terme de surface (éléments logiques et mémoire) et de fréquence de fonctionnement, pour des codeurs de type BCH et RS. Entre parenthèse apparaı̂t le nombre d’éléments logiques (LE) requis pour l’un des deux codeurs élémentaires constituant. Il faut noter qu’un module supplémentaire élabore la parité dans le cas d’un code BCH. codeur BCH Reed Solomon Codeur flexible BCH/RS 4 configurations (n,k) Logic Elements Fréq. Mem (n,k) LE Fréq. Mem LE Fréq. Mem. t=1 t=2 (32,26) (32,21) 173 (34) 196 (60) 101 MHz 97 MHz 1024 bits 1024 bits (31,29) (31,27) 282 (23) 334 (31) 110 MHz 114 MHz 5120 bits 5120 bits 567 (169) 92 MHz 5120 bits Tableau 4.2 — Caractéristiques de chaque codeur correspondant à chacune des configurations considérées Le codeur flexible occupe 567 LEs. Si l’ensemble des codeurs avait été implanté, il eut fallu 985 LEs au total soit une surface de 57% supérieure. Une alternative (semi-flexible) peut consister à conserver les configurations de codeur les moins favorables, c’est à dire pour un code BCH (32,21) et un code RS (31,27). Elles peuvent alors recevoir les deux autres configurations en modifiant uniquement les 128 CHAPITRE 4. DE LA DESCRIPTION ALGORITHMIQUE JUSQU’AU PROTOTYPAGE coefficients du polynôme générateur. Ainsi, la surface occupée est équivalente. Toutefois, ici encore, la solution flexible offre une économie en terme d’occupation mémoire de l’ordre de 17% par rapport à la solution semi-flexible. Il est à noter que les fréquences de fonctionnement sont à peu près équivalentes bien que celle du codeur flexible soit légèrement inférieure aux configurations simples. 4.2.2 Synthèse logique et placement/routage des différents blocs du décodeur élémentaire flexible L’architecture du décodeur élémentaire se compose de trois parties : réception, traitement et émission. Chacune de ces parties sont elles-mêmes constituées de blocs réalisant différentes fonctions (figure 4.4). Unité de contrôle R 5 Rinit Ri+ Processeur NIOS II Mémoire 5 8 Bloc de réception Bloc des moins fiables Lr Pi Bloc de traitement Par 5x8 Bloc d’émission Par&Cw Cp_Md&Mc Mdp Calcul des 1 Mdp Parité Par 1 Si Syndrome Construction 8 des Vecteurs Lr P de test 5x8 Si 4x5 4x5 Métriques D Information Décodage 5 extrinsèque Tri des mots M_Md&Mc algébrique Lr P concurrents W 8 et Fiabilité 5 5x8 décidés Ci&Ei Lr_p_Md&Mc Correction du 4x5 R’ mot de code 8 R’ 6 RAMs 32x5x5 αi R’ R’init ROM Galois 32x5 βi 5 Légende: 5 R’init Signaux Compteur Type de code Figure 4.4 — Schéma-bloc du décodeur élémentaire RS/BCH Les tableaux (4.3),(4.4),(4.5) et (4.6) récapitulent respectivement les résultats d’implantation pour les blocs réception, traitement, émission et mémorisation. Pour la partie réception (tableau 4.3), le bloc de détermination des éléments les moins fiables est le module le plus coûteux en surface. Ceci est dû aux nombreuses opérations de contrôle réalisées. Le bloc de calcul des syndromes dépend de la surface occupée pour le calcul d’une composante puisque la même unité est dupliquée autant de fois qu’il le faut. Au total, le module occupe 136 LE. Enfin, la 4.2. SYNTHÈSE LOGIQUE ET PLACEMENT/ROUTAGE DE L’ENSEMBLE CODEUR/TURBO DÉCODEUR FLEXIBLE 129 simplicité du bloc de calcul de parité lui permet d’être rapide tout en occupant peu de surface. Bloc Syndrome Parité Moins fiables Surface en LE 136 8 344 Fréquence (MHz) 88 500 170 Tableau 4.3 — Surface occupée par les blocs de la partie réception du décodeur élémentaire Pour la partie traitement (tableau 4.4), les deux modules les plus gourmands en surface sont les blocs de construction des vecteurs de test et l’algorithme de décodage algébrique PGZ qui occupent respectivement 640 et 551 LE. Le premier élabore chaque vecteur de test à partir des symboles les moins fiables, de nombreuses manipulations dans le corps de Galois sont alors nécessaires. Il est à noter que la complexité devient élevée par rapport à une construction de vecteur de test pour un simple code BCH. Pour le deuxième bloc, il s’agit des mêmes contraintes en ajoutant l’utilisation d’une mémoire distribuée simulant l’inversion dans le corps de Galois. D’ailleurs, la même fonctionnalité se retrouve dans le bloc de correction des symboles erronés. Aucun détail d’implantation n’est donné pour la détermination des racines (Chien) puisqu’une table placée sur un BlockRAM est utilisée. Enfin, le bloc de tri occupe 322 LE en partie à cause de nombreuses comparaisons. Bloc Construction des VT PGZ Chien (Table mémoire) Correction Validation mots de code Calcul des métriques tri Surface en LE 640 551 149 41 108 322 Fréquence (MHz) 200 87 107 124 93 88 Tableau 4.4 — Surface occupée par les blocs de la partie traitement du décodeur élémentaire Pour la partie émission (tableau 4.5), les blocs de calcul de l’information extrinsèque et de correction du mot de code sont peu complexes. Les opérations se font sur les quantifications des éléments binaires constituant le symbole. La détermination de la fiabilité nécessite 372 LE en partie du à la présence d’opérations de comparaison entre les symboles des mots concurrents. Bloc Fiabilité Calcul de l’information extrinsèque Correction du mot de code Surface en LE 372 62 28 Fréquence (MHz) 248 137 106 Tableau 4.5 — Surface occupée par les blocs de la partie émission du décodeur élémentaire Au niveau des ressources mémoires (tableau 4.6), elles peuvent soit être implantée sur des blocs mémoires dédiés (BlockRAM) soit distribuée sur les LUT du FPGA. Le corps de Galois est mémorisé 130 CHAPITRE 4. DE LA DESCRIPTION ALGORITHMIQUE JUSQU’AU PROTOTYPAGE pour avoir accès aux éléments à chaque instant du processus de décodage. La mémoire interne reçoit les mots initiaux et décodés pour les trois étages du pipeline. D’autres unités mémoires sont également contenues dans certains modules. Elles sont répartis sur des LUTs et apparaissent par conséquent dans le nombre d’éléments logiques. Bloc Corps de Galois Mémoire interne Nombre de bits 32 × 5 × 2 6 × 32 × 5 × 5 Ressources LUTs BlockRAM Tableau 4.6 — Occupation de la mémoire interne du décodeur élémentaire en nombre d’éléments logiques (LE) En résumé, les surfaces occupées par les parties réception, traitement et émission sont respectivement de 488, 1811 et 462 LE soit au total 2761 LE pour le décodeur élémentaire. Autrement dit, ces parties occupent respectivement 1.2%, 4.4% et 1.1% du FPGA soit au total 6.7% du circuit. De plus, les mémoires doivent stocker 5120 bits. 4.2.3 Synthèse logique et placement/routage du turbo décodeur flexible L’architecture du turbo décodeur flexible est donné sur la figure 4.5, elle se compose du décodeur élémentaire (dont la synthèse a été évoqué précédemment), des plans mémoires et du processeur NIOS II. Les résultats de la synthèse logique du processeur et des mémoires associées sont détaillés dans cette section. B U S Processeur NIOS II A V A L O N Plans mémoires Décodeur élémentaire Figure 4.5 — Schéma de l’architecture du turbo décodeur flexible Le processeur NIOS II joue ici le rôle de l’unité de contrôle. Nous avons tentés d’alléger au maximum la version standard fournie par défaut. Elle permet de gérer l’ensemble des périphériques présent sur la carte de développement. Les résultats de la synthèse logique après placement/routage du coeur 4.3. SYNTHÈSE ARCHITECTURALE 131 de processeur et des interfaces périphériques sont donnés dans le tableau 4.7. Le processeur atteint des performances de 37 DMIPS. Deux éléments mémoires de type M4K sont utilisés et peuvent contenir jusqu’à 4 koctets chacun. A cela, il faut ajouter les caches d’instructions et de données (resp. 4 et 2 Koctets). La communication du processeur avec l’extérieur est assurée via un port JTAG. En effet, il nous est ainsi possible de télécharger notre programme sur le NIOS II et même d’effectuer un debuggage logiciel. ``` ` Caractérist. ``` ``` Module `` Coeur NIOS II Arbitre bus de données maı̂tre Arbitre bus d’instruction maı̂tre JTAG Interface bloc matériel On Chip Mem. Réception On Chip Mem. Lignes On Chip Mem. Colonnes SDRAM Boutons PIOs Surface en LE Mémoire (bits) 2060 369 193 19 2 58 65 62 667 25 857 131 131 131 - k. k. k. k. Tableau 4.7 — Résultats de la synthèse logique du processeur NIOS II Tous les résultats correspondent à une solution matérielle fonctionnant à 50 Mhz. Les surfaces occupés par les différents plans mémoire tiennent compte des arbitres de chacun. Au total, 3540 LE sont nécessaires pour l’ensemble soit 8.6% de notre circuit. Les synthèses logiques des différents éléments constituant notre architecture flexible ont été effectuées. Ainsi, le codeur occupe 567 LE tandis que le turbo décodeur flexible occupe 6245 LE. Cela correspond à un taux d’occupation du FPGA respectivement de 1.4% et de 15.1%. Notre flot de conception nous permet d’incorporer la synthèse architecturale. C’est pourquoi, nous allons tentés de mener des synthèses de haut niveau sur les différentes parties du décodeur élémentaire. 4.3 Synthèse architecturale La synthèse architecturale permet une exploration des différentes solutions architecturales. Dans notre cas, il faut remplacer la synthèse du code décrit en SystemC au niveau RTL par la synthèse haut niveau du code décrit en SystemC comportemental. Cependant, si l’ensemble de l’architecture du décodeur élémentaire est considéré alors elle se révèle trop complexe pour les outils de synthèse architecturale GAUT et Agility Compiler. Ce constat est l’une des conclusions du projet de recherche RNRT ALIPTA [ALI04] au cours duquel nous avons mené une étude sur un décodeur Reed Solomon de complexité équivalente. Afin de limiter notamment les accès mémoires globaux, il est préférable de diminuer la complexité de la description en considérant des blocs de traitement distincts. 132 CHAPITRE 4. DE LA DESCRIPTION ALGORITHMIQUE JUSQU’AU PROTOTYPAGE L’objectif principal de cette section est d’évaluer l’apport de la synthèse de haut niveau lors de la conception d’un turbo code en blocs. Nous nous focalisons sur les configurations BCH ((32,26) et (32,21)) et RS ((31,29) et (31,27)) pour un turbo décodeur en blocs flexible qui est l’application retenue dans ce travail. Toutes les observations effectuées sont extensibles à des codes ayant des longueurs de code plus élevées mais pour le même pouvoir de correction. Les différentes solutions architecturales proposées par les outils retenus peuvent être exploitées, en particulier, pour bénéficier du parallélisme inhérent aux algorithmes considérés. L’outil SystemC compiler a été choisi dans un premier temps, l’arrêt du support officiel nous a obligé à nous orienter vers d’autres outils. Ainsi, l’outil commercial Agility Compiler et l’outil académique GAUT nous ont permis d’effectuer différentes synthèses architecturales. Une des différences entre les deux outils est le langage utilisé comme point d’entrée. Dans le cas d’Agility Compiler, le choix du langage SystemC permet d’appréhender l’aspect matériel de l’application. GAUT prend, quant à lui, une description en langage C ou en VHDL comportemental. Il nous a semblé plus judicieux de retenir le langage C dans notre étude. Les algorithmes en C nécessitent une légère réécriture mais autorise plus de liberté. Pour rappel, les différents aspects relatifs à ces deux outils ont été évoqués dans le chapitre 1. La suite de cette section aborde, dans un premier temps, la spécificité des opérations liées à notre application. Dans un second temps, une expérimentation de la synthèse architecturale est proposée. 4.3.1 Les opérations dans le corps de Galois Dans notre application, une partie des traitements est effectuée dans le corps de Galois. Ainsi, les opérateurs associés doivent être définis pour prendre place dans les descriptions architecturales de chacun des blocs. Les opérations d’addition, de comparaison, de multiplication, de multiplicationaccumulation (MAC) et de division sont nécessaires à notre étude. Une définition de ces opérateurs pour la synthèse architecturale est donc préalablement nécessaire. Comme nous considérons un code de longueur N = 32 symboles, le travail s’effectue dans le corps de Galois (25 ) et la taille des opérateurs est donc m = 5 bits. L’approche diffère selon les outils choisis : Dans GAUT, le type de base est le type entier (int) représenté par le type word défini dans la bibliothèque technologique. Actuellement, GAUT ne travaille que sur des chemins de données de largeur fixe. Il est possible de redéfinir cette bibliothèque pour adapter les opérateurs à la largeur de données nécessaire à l’application. Cependant, les variables internes ne peuvent pas être « taillées » en fonction des besoins et posséderont toujours cette largeur par défaut. Ainsi, il n’est pas possible de déclarer des booléens ou encore d’autres types. Pour notre application, il faut donc générer une nouvelle bibliothèque pour des données de cinq bits en y ajoutant les opérateurs nécessaires. Les synthèses logiques et le placement/routage de ces opérateurs ont été réalisés dans l’outil Quartus II à partir des descriptions en langage VHDL au niveau RTL. 4.3. SYNTHÈSE ARCHITECTURALE 133 Dans Agility Compiler, le langage SystemC permet de dimensionner les entrées/sorties, les registres internes et les chemins de données. La description répond entièrement aux besoins du concepteur en terme de type de données (booléen, entiers, entiers non-signés...). Les opérateurs classiques (tels que l’additionneur, le multiplieur...) sont définis par défaut dans l’outil. En revanche, les opérateurs dans le corps de Galois ont été décrits sous la forme de fonctions en SystemC au niveau RTL. Ainsi, à chaque utilisation de l’un d’eux, la fonction est appelée et un opérateur est implanté. Les descriptions finales sous forme de netlist générées par l’outil ont ensuite été soumises à une synthèse dans Quartus II. Le tableau 4.8 récapitule les résultats de synthèse logique obtenus par les deux outils en ciblant un Stratix 1s40. XXX XXX Outil GAUT Agility Opérateur XXXX Caract. Surface (LE) Temps critique (ns) Surface Temps critique Comparateur 11 3.229 14 2.369 Additionneur 5 2.369 5 2.369 Multiplieur 17 2.533 19 2.772 MAC 20 3.421 22 2.816 Diviseur Utilisation d’une table et d’un multiplieur Tableau 4.8 — Caractéristiques des opérateurs obtenus après synthèse logique sous Quartus II en ciblant un Stratix 1s40 Les résultats d’implémentation à l’aide de l’outil Agility Compiler nous fournissent des solutions moins performantes que ceux obtenus pour GAUT par la synthèse des mêmes descriptions en langage VHDL. Une prise en compte du circuit FPGA est effectué dans Agility Compiler. C’est pourquoi, l’interprétation du langage SystemC par l’outil fournit des solutions plus rapides mais occupant plus de surface. Seul l’opérateur d’addition présente des caractéristiques équivalentes dans les deux cas puisqu’il a été placé sur une seule et même LUT. L’écart est plus particulièrement marqué pour les opérateurs complexes. Ainsi, le choix effectué lors de la conception de GAUT (ie la création de ses propres opérateurs) est sans nul doute plus précise et performante mais elle est, par contre, plus contraignante. 4.3.2 Exploration des solutions architecturales Dans cette section, nous allons considérer l’ensemble des algorithmes évoqués pour le décodeur élémentaire. L’objectif est de proposer des alternatives en terme d’architecture au concepteur en fonction de la disponibilité des données à traiter. La synthèse architecturale est particulièrement adaptée aux traitements massivement parallèles. Dans notre cas, nous n’avons pas utilisé d’outils de synthèse architecturale pouvant travailler sur des modèles de graphes adaptés pour des opérations de contrôle. Ainsi, tous les algorithmes, notamment ceux nécessitant beaucoup de contrôle, n’ont 134 CHAPITRE 4. DE LA DESCRIPTION ALGORITHMIQUE JUSQU’AU PROTOTYPAGE pas pu bénéficier des avantages de la synthèse architecturale. Dans notre cas, les blocs des parties de réception et d’émission du décodeur élémentaire peuvent bénéficier de la synthèse d’architecture. Ainsi, nous proposons les solutions données par les deux outils GAUT et Agility Compiler lorsqu’il nous est possible de le faire comme nous allons le voir. Dans un souci pédagogique et afin de faciliter la compréhension des différents résultats de synthèse obtenus, les processus de synthèse et les solutions architecturales fournis par les deux outils sont préalablement explicités. Nous allons succinctement rappeler les modèles d’architectures ciblés par chaque outil. L’architecture générée par l’outil GAUT se compose d’une unité de traitement, d’une unité de contrôle, d’une unité de mémorisation et d’une unité de communication (fig. 4.6). Les unités de mémoire et de communication possèdent leur propre contrôle. Dans notre cas, différentes cadences Tcad peuvent être appliquées aux algorithmes décrits. Il est à rappeler que la cadence désigne le temps s’écoulant entre l’arrivée des données en entrée et la production des données traitées. Le temps d’exécution de l’algorithme avant implémentation correspond au temps de latence Tlat . Ainsi, si Tcad > Tlat le traitement de l’algorithme est effectué dans le temps imparti. En revanche, si Tcad < Tlat alors l’unité de traitement produite aura un fonctionnement pipeline pour satisfaire les contraintes fixées par le concepteur. Horloge Unité de contrôle Unité de communication Unité de traitement Unité de mémorisation Figure 4.6 — Modèle architectural ciblé par l’outil GAUT Pour l’outil Agility Compiler, le concepteur doit fixer les contraintes d’utilisation lors de la description comportementale en SystemC. Ces contraintes sont deux types : 1. matérielles : le concepteur définit à la fois les entrées et les sorties des modules et les ressources 4.3. SYNTHÈSE ARCHITECTURALE 135 matérielles disponibles. Il n’y a pas d’unité de communication dédié comme pour l’outil GAUT. 2. temporelles : il est possible d’imposer une fréquence d’horloge. Le processus fixe alors la cadence de l’application en fonction de la fréquence d’horloge fixée. L’exploration architecturale repose donc entièrement sur la description en SystemC donnée par le concepteur. L’outil peut paralléliser le traitement en dupliquant les ressources utilisées en respectant la cadence de fonctionnement. Au niveau de l’interprétation du code écrit en SystemC, l’outil assigne des ensembles de multiplexeurs aux expressions conditionnelles. De plus, par défaut les constantes sont définies sur 64 bits. Les outils GAUT et Agility Compiler peuvent tous les deux cibler un composant prédéterminé (ASIC ou FPGA). Des estimations sur l’occupation en terme de ressources sont alors données à l’issue de la synthèse architecturale. Il est à noter que les résultats obtenus lors des synthèses architecturales ne sont pas directement comparables puisque les modèles d’architectures ciblés ne sont pas équivalents. Différentes synthèses architecturales ont été effectuées sur les blocs de réception, traitement et émission. Des blocs ne se prêtant pas à ce type de synthèse ont été délibérément ignorés. Le module de calcul de la parité va, tout d’abord, nous servir d’exemple pour expliciter les processus des deux outils. 4.3.2.1 Les blocs de la partie réception Le bloc de parité Le bloc de parité (nécessaire pour un code BCH) constitue un bon exemple pour comprendre comment vont procéder les outils lors d’une synthèse architecturale. Un exemple de graphe flot de données, obtenu avec GAUT, pour le calcul d’une parité uniquement sur deux symboles est donné sur la figure 4.7. L’ensemble des opérations de l’algorithme apparaissent sur le graphe. Les données entrantes sont représentées par la couleur verte, les opérations en bleu, les variables temporaires en orange et enfin les données sortantes en jaune. L’architecture correspondante (fig. 4.8) est réutilisée à chaque cycle d’horloge si Tcad > Tlat . Le bus d’échange de données se situe sur la partie supérieure de la figure. Les registres, les bascules trois états et l’opérateur (un « Ou Exclusif »ou XOR) utilisés apparaissent dans la partie inférieure. Nous allons maintenant nous placer dans le cas du calcul de la parité pour 32 symboles. Différentes cadences sont imposées aux graphes flot de données. La période de l’horloge de fonctionnement est fixée à 10 ns. Le tableau 4.9 donne les résultats de la synthèse d’architecture en supposant que les données en entrées sont accessibles à chaque instant. Cet exemple montre que le taux de parallélisme engendré dépend de la cadence imposée par le concepteur. De plus, un taux de parallélisme maximum n’est possible que lorsque l’ensemble de la trame est disponible. Le nombre de signaux de contrôle augmente alors de façon linéaire. 136 CHAPITRE 4. DE LA DESCRIPTION ALGORITHMIQUE JUSQU’AU PROTOTYPAGE Figure 4.7 — Graphe flot de données Figure 4.8 — Architecture générée sans pipeline Cadence Non-pipe Pipe. Nombre XOR d’opérateurs Reg. Mux/Demux/Trist. Contrôle nbre états FSM signaux 320 X 1 4 3 32 7 Optimisation 80 X 4 13 9 8 22 10 X 31 63 1 1 64 Tableau 4.9 — Résultats de la synthèse architecturale pour le bloc de parité avec l’outil GAUT De la même manière, nous avons décrit ces fonctionnalités avec Agility Compiler et ciblé un FPGA. Nous avons obtenu une estimation des ressources mises en œuvre et les fréquences de fonctionnement. Ces ressources sont données après optimisation en nombre de portes logiques puis au niveau netlist à l’issu du choix du FPGA. Les deux cas extrêmes, à savoir l’utilisation d’un seul ou de 32 opérateurs « Ou exclusif », et une solution intermédiaire ont été considérés. Les résultats sont donnés dans le tableau 4.10. Opérateurs Apr. optimisation (portes) Mapping (LUT) Horloge (ns) 1 XOR 42 6 2.54 16 XOR 544 51 4.079 32 XOR 864 78 4.087 Tableau 4.10 — Résultats de la synthèse architecturale pour le bloc de parité avec l’outil Agility Compiler Le bloc de calcul des syndromes Cette expérimentation considère la configuration la plus complexe à savoir 32 symboles et 4 composantes pour le syndrome. Ce bloc reçoit en entrée les symboles constituant la trame. Puis les quatre composants sont élaborées, le calcul à effectuer est le suivant : 4.3. SYNTHÈSE ARCHITECTURALE Si = R(αi ) = 137 Pn−1 j=0 rj (αi )j avec 1 ≤ i ≤ 2t Avec l’outil GAUT, nous proposons deux types d’architectures pour le calcul des syndromes. L’une (a) est basée sur un ensemble contrôle et traitement, l’autre (b) considère l’ajout d’une unité mémoire où sont stockés les éléments du corps de Galois. Dans le premier cas, des opérateurs de multiplicationaccumulation sont utilisés pour accumuler les produits ri .αi des quatre (2t) composantes. Dans le second cas, nous considérons un opérateur multiplication, un opérateur addition et un plan mémoire recevant les éléments du corps de Galois. Les graphes flot de données extraits des algorithmes sont représentés sur la figure 4.9. Seul une portion de chaque graphe est donnée. Cependant, le parallélisme de deux algorithmes apparaı̂t clairement. Toutes les ressources sont dupliquées en fonction du nombre d’itérations nécessaires au calcul du syndrome. Architecture (a) Architecture (b) Figure 4.9 — Graphe flot de données obtenu avec GAUT pour les solutions architecturales (a) et (b) Le tableau 4.11 donne les résultats obtenus pour quatre solutions architecturales (4 cadences (i.e. 4 débits différents)). Seul l’ensemble contrôle/traitement produit est donné pour la solution (a) puisqu’une unité mémoire n’est pas nécessaire. Dans le cas de la solution (b), l’ensemble contrôle/traitement/mémoire élaboré par GAUT est fourni en terme d’opérateurs et de ressources mémoires. Différentes optimisations sont envisagées et les opérateurs dans le corps de Galois résultants sont précisés. La complexité de l’unité de contrôle est exprimée à l’aide du nombre d’états de la machine d’états (FSM) et du nombre de signaux utilisés. Pour une cadence de 1280 ns, le débit associé est de 121 Mbit/s et une seule unité MAC est nécessaire pour traiter l’ensemble de la trame dans le temps imparti. Le pipeline n’est pas nécessaire au dessus d’une cadence de 320 ns. En deçà, il faut considérer plusieurs étages de pipeline et les ressources supplémentaires nécessaires. Dans le cas (a), plus la cadence augmente, plus il faut disposer d’opérateurs. Dans le cas (b), on note une explosion des besoins en terme de bancs mémoires. La solution (a) apparaı̂t donc clairement plus intéressante. 138 CHAPITRE 4. DE LA DESCRIPTION ALGORITHMIQUE JUSQU’AU PROTOTYPAGE Cadence Optimisation Non-pipe Pipe. Opérateurs MAC Mult. Add Reg Mux-demux-trist. Contrôle nbre états FSM signaux Mem. Bus Nbre banc 1280 X 1 4 1 5 129 - Archi. (a) 340 320 80 X X X 4 4 16 20 20 68 12 12 36 33 32 8 32 32 104 - 10 X 128 388 4 1 392 - 1280 X 1 1 11 9 - Archi. (b) 350 160 90 X X X 4 8 15 4 8 15 39 76 116 31 56 75 34 16 9 70 200 348 12 32 Pb 16 64 mém. Tableau 4.11 — Résultats de la synthèse architecturale pour le bloc syndrome avec l’outil GAUT Les mêmes descriptions ont été soumises à Agility Compiler afin d’estimer l’implantation sur un Stratix1s40. Cette fois-ci, les accès mémoires ont été entièrement définis afin de se placer dans des conditions identiques. La trame est supposée entièrement connue et accessible avant le début du traitement. Les tableaux 4.12 et 4.13 récapitulent les différentes caractéristiques pour les deux types de solutions architecturales obtenues avec différentes contraintes. Il est à noter que dans le cas (a), dans le cas d’une parallélisation totale (tableau 4.12), l’outil n’a pu nous fournir de résultats que pour le calcul d’une et deux composantes, une estimation est donc fournie pour le calcul des quatre composantes. Dans le cas (b), nous supposons des requêtes vers les bancs mémoires à chaque cycle d’horloge. Nbre de composantes Opérateurs MAC Après compilation (portes) Apr. optimisation (portes) Mapping (LUT) Horloge (ns) 4 4 353706 1173 143 4.659 1 32 2832349 9686 1362 64 2 2x32 5659451 17728 2327 71.69 4 4x32 #11330000 #32000 #4000 #77 Tableau 4.12 — Résultats de la synthèse architecturale pour le syndrome (sol.(a)) avec l’outil Agility Compiler Opérateurs Mémoires Avt optimisation Apr. optimisation Mapping (LUT) Horloge (ns) 4 mult. 4 XOR 4 bancs 4x5x32 bits 82204 4811 706 11.33 8 mult. 8 XOR 8 bancs 8x5x32 bits 128090 6521 904 12.04 16 mult. 16 XOR 16 bancs 16x5x32 bits 2555790 9944 1305 12.46 Tableau 4.13 — Résultats de la synthèse architecturale pour le syndrome (sol.(b)) avec l’outil Agility Compiler Les résultats obtenus dans la première colonne considèrent l’utilisation de quatre MAC et un 4.3. SYNTHÈSE ARCHITECTURALE 139 traitement séquentiel de chaque symbole reçue. Ainsi, le syndrome n’est fourni qu’après le passage du mot. La fréquence de fonctionnement diminue en fonction du nombre d’unité MAC utilisées dans les différentes solutions. En parcourant le tableau 4.12 de la gauche vers la droite, chaque solution nécessite respectivement 32, 16 et 8 passages pour fournir les syndromes calculés, soit des latences respectives de 351, 256 et 99 ns. Ces résultats moyens associés à l’occupation en surface relativement élevée (en incluant les mémoires) rendent cette solution inappropriée. Le bloc de récupération des bits les moins fiables La récupération des bits les moins fiables consiste à réaliser un tri par insertion. Les ressources nécessaires en terme de contrôle rendent difficile la synthèse architecturale de l’algorithme via l’outil GAUT. C’est pourquoi, nous avons uniquement utilisé Agility Compiler dans ce cas. Les résultats obtenus après la synthèse architecturale dans le tableau 4.14 permettent de vérifier l’impact du nombre de bits les moins fiables considérés sur la complexité matérielle et les performances. Dans notre cas, un symbole est reçu à chaque cycle d’horloge. Nbre de MF Après compilations (portes) Apr. optimisation (portes) Mapping (LUT) Horloge (ns) 3 7433 2338 392 13.38 4 10830 3174 545 14.3 5 14779 4070 718 15.32 6 17685 4536 827 16.17 Tableau 4.14 — Résultats de la synthèse architecturale pour le bloc des moins fiables avec l’outil Agility Compiler Les solutions fournies par l’outil sont relativement complexes en nombre de LUT occupées à cause des nombreuses opérations de comparaisons générées par le tri. La complexité est une fonction linéaire du nombre de bits les moins fiables. 4.3.2.2 Les blocs de la partie de traitement L’intérêt de l’exploration menée est d’exploiter le parallélisme dans les traitements. On rappelle que le décodage algébrique est appliqué sur un ensemble de vecteurs de test. Leur génération n’est pas abordée puisqu’il s’agit de la manipulation de données nécessitant de nombreux opérateurs de comparaison (donc de contrôle). En revanche, le traitement en parallèle de chacun des vecteurs de test semble intéressant pour une accélération du processus. Pour cela, en se référant à la figure 3.15, il est possible d’envisager la duplication de l’ensemble PGZ/Chien/Correction en fonction du nombre de vecteurs de test. Ainsi, nous proposons les résultats de synthèse architecturale pour 1, 8 et 16 vecteurs de test. L’algorithme PGZ L’algorithme PGZ nécessite des opérations de division dans le corps de Galois. Celles-ci sont réalisées 140 CHAPITRE 4. DE LA DESCRIPTION ALGORITHMIQUE JUSQU’AU PROTOTYPAGE par une mémoire et une opération de multiplication. Même si le principe est identique dans les deux outils, la manipulation ne s’effectue pas de la même manière. Dans GAUT, un nouvel opérateur est créé, il masque l’utilisation d’une RAM au niveau comportemental. Au contraire dans Agility, cette transformation apparaı̂t dans le code SystemC élaboré par la présence d’un composant mémoire en dehors du bloc PGZ. Dans ce cas, les contraintes de temps d’accès à la mémoire sont à prendre en compte dans l’écriture du module. Cadence Optimisation Opérateurs Contrôle Pipe. Mult. Add/Sous. XOR Ou Inv. Reg. Mux/Demux/Trist. nbre états FSM signaux Mem. 160 X 1 1 1 1 1 51 47 16 97 1 1 VT 80 40 X X 2 5 1 1 1 3 1 1 1 1 62 92 58 83 8 4 118 171 1 1 160 X 8 1 4 2 2 376 372 16 739 2 8 VT 80 40 X X 17 37 2 4 8 17 3 6 3 6 558 700 533 572 8 4 1065 1217 3 6 160 X 17 2 8 3 3 738 728 16 1446 3 16 VT 80 40 X X 32 74 4 8 14 34 6 12 6 12 1049 1377 976 1111 8 4 1969 2380 6 12 Tableau 4.15 — Résultats de la synthèse architecturale pour le bloc PGZ avec l’outil GAUT Toutes les solutions proposées (tableau 4.15) sont des architectures pipelines. La complexité est fonction du nombre de vecteurs de test et de la cadence fixée par le concepteur. Le principal point bloquant de la parallélisation massive est l’accès aux données stockées en mémoires (notamment pour les opérations de division). En effet, ces dernières occupent une surface trop importante pour une implantation raisonnable dans le cas de l’utilisation de 16 vecteurs de test pour une cadence de 20 ns. L’outil Agility Compiler ne nous a pas permis de proposer différentes solutions architecturales puisque au delà d’un bloc PGZ, la synthèse architecturale fournie une solution incomplète et le graphe flot de données et de contrôle généré présente des erreurs. Cela montre les limites actuelles de cet outil. Correction du mot de code Le processus de correction est assez semblable à celui de l’algorithme PGZ. Toutes les opérations sont réalisées dans le corps de Galois (addition, multiplication, division). Des opérations de contrôle sont également indispensables pour fournir les erreurs et les échecs de décodage suivant la correction requise t = 1 ou t = 2. Les résultats de synthèse figurent dans le tableau 4.16. Les impacts liés aux choix de la cadence et du nombre de vecteurs de test sont semblables à ceux observés dans le cas de l’algorithme PGZ. Une solution entièrement parallèle n’est clairement pas envisageable pour une implantation raisonnable. Un compromis avec l’utilisation conjointe de plusieurs blocs capable de décoder 8 vecteurs de test semble plus adaptée. 4.3. SYNTHÈSE ARCHITECTURALE Cadence Optimisation Pipe. Nombre Mult. d’opérateurs Ou X Et Inv. Reg. Mux/Demux/Tri. Contrôle nbre états FSM signaux Mem. 141 70 X 1 1 1 1 16 14 7 27 1 1 VT 40 X 2 1 1 1 22 16 4 37 1 20 X 3 2 1 1 24 17 2 37 1 70 X 8 4 2 3 113 108 7 216 3 8 VT 40 20 X X 15 24 6 12 2 4 4 8 132 169 126 136 4 2 238 287 4 8 70 X 17 7 3 5 212 200 7 402 5 16 VT 40 X 30 12 4 8 259 226 4 467 8 20 X 48 24 8 16 330 258 2 554 16 Tableau 4.16 — Résultats de la synthèse architecturale pour le bloc de correction avec l’outil GAUT Calcul des métriques et tri Ce bloc est déjà complexe dans le cas d’une synthèse logique à partir d’une description au niveau RTL. En effet, il contient beaucoup d’opérations de contrôle. C’est pourquoi, nous n’avons pas jugé utile de le considérer ici puisque les outils de synthèse d’architecture envisagés ne sont pas appropriés. 4.3.2.3 Les blocs de la partie émission Les blocs concernés par cette partie sont respectivement les blocs de calcul de la fiabilité, l’élaboration de l’information extrinsèque et la production des données décodées. Le bloc de calcul de la fiabilité n’a pas été soumis à la synthèse architecturale. En effet, il ne se prête pas à ce type de processus et nécessiterait sa réécriture complète pour l’adapter aux compilateurs. En revanche, nous avons considérés les blocs de calcul de l’information extrinsèque et de calcul des données décodées. De la même manière que dans la partie de réception, les traitements dépendent de la disponibilité des données entrantes. Nous retrouvons donc des résultats similaires en terme de parallélisme à ceux obtenus pour un simple calcul de parité par exemple. Cependant, les ressources matérielles utilisées sont différentes. Les tableaux (4.17) et (4.18) précisent les résultats de synthèse obtenus. Le calcul de l’information extrinsèque consiste à soustraire l’information sur chaque symbole avant décodage à l’information obtenu après décodage (i.e. la fiabilité). L’élaboration du mot de code consiste à pondérer l’information extrinsèque puis à l’ajouter au mot reçu. Dans Agility Compiler, contrairement aux synthèses précédentes, les données entrantes ne sont plus stockées avant le traitement. La description des modules intègre autant de ports d’entrées/sorties que de données à traiter. Les surfaces occupées et les fréquences de fonctionnement figurent dans le tableau 4.18. Les ressources de calcul sont bien dupliquées puisque les fréquences de fonctionnement sont les mêmes pour toutes les architectures des deux blocs. Le principal problème d’une telle description réside dans la description en SystemC qui devient fastidieuse (notamment pour les entrées/sorties). 142 CHAPITRE 4. DE LA DESCRIPTION ALGORITHMIQUE JUSQU’AU PROTOTYPAGE Cadence Optimisation Non-pipe Pipe. Nombre mult. d’opérateurs Add/Sous reg. Mux/Demux/Tris. Contrôle nbre états FSM signaux Info. extrins. 350 80 10 X X X 1 4 32 1 4 32 1 20 160 1 4 32 34 10 1 6 24 192 350 X 1 1 1 1 34 6 Correction 110 80 X X 4 4 4 4 20 20 4 4 10 8 24 24 10 X 32 32 160 32 1 192 Tableau 4.17 — Résultats de synthèse architecturale pour le bloc de calcul de l’information extrinsèque et d’élaboration du mot corrigé avec l’outil GAUT Nbre d’unité Apr. optimisation (portes) Mapping (LUT) Horloge (ns) Info. extrins. 1 2 4 224 414 1300 24 41 73 9.17 9.17 9.17 Correction 1 2 4 116 208 388 11 16 24 7.71 7.71 7.71 Tableau 4.18 — Résultats de synthèse architecturale pour le bloc de calcul de l’information extrinsèque avec l’outil Agility Compiler De plus, l’utilisation du parallélisme repose alors sur le concepteur ce qui n’est pas le but d’un tel outil. 4.3.3 Conclusion L’expérimentation conjointe des deux outils Agility Compiler et GAUT nous a permis de proposer différentes solutions architecturales pour les blocs retenus. Un parallélisme total peut être obtenu à condition de disposer des données nécessaires au calcul. Ainsi, l’augmentation de la cadence implique, dans le cas d’un fonctionnement pipeline, une multiplication des bancs de mémoires pour alimenter les opérateurs. L’objectif dans le cadre de notre application est donc de pouvoir utiliser et de mettre en œuvre le parallélisme. Le point de départ de ce travail est l’architecture élaborée au chapitre 3 et rappelée sur la figure 4.4. L’exploration a été menée sur cette base. Tout d’abord, en considérant la partie réception, il n’est pas possible, dans son organisation actuelle, de disposer du mot complet à décoder. Cependant, la parité et les syndromes pourrait être calculés plus rapidement si le mot entier était disponible. La partie de traitement des vecteurs de test se prête, quant à elle, à ce type de synthèse. Au lieu de manipuler chacun des vecteurs de test séquentiellement, nous pouvons envisager un décodage parallèle de l’ensemble des vecteurs de test. Les outils nous fournissent ainsi une première estimation en terme de surface pour 4,8,16 ou 32 vecteurs de test. La découpe temporelle réalisée préalablement (fig.3.10) s’en trouve tout de même modifiée. Ainsi, la cadence de fonctionnement est augmentée et la latence de l’application est réduite d’environ un temps mot. Enfin, la partie émission peut également bénéficier de la duplication des ressources de calcul. De manière analogue à la partie 4.4. PROTOTYPAGE DU TURBO DÉCODEUR FLEXIBLE 143 réception, cela repose sur la disponibilité des données en sortie du bloc de traitement. En effet, les opérations s’effectuent sur les bits lors de l’utilisation de l’algorithme de Chase-Pyndiah. Pour un code RS, une adaptation algorithmique est à prévoir pour passer du niveau bit au niveau symbole et profiter du parallélisme ainsi généré. Au niveau des outils, plusieurs remarques peuvent être formulées pour suggérer des pistes de développement. En effet, les choix effectués lors de leur élaboration leur confèrent de facto certains avantages et certains défauts. GAUT se situe à un niveau d’abstraction plus élevé qu’Agility Compiler. De nombreux opérateurs sont présents dans la bibliothèque de composant dans le cas contraire, ils peuvent être définis. Ce choix présente des avantages puisque les possibilités d’exploration pour le concepteur sont vastes. Il faudra toutefois veiller à optimiser ces opérateurs lors de la synthèse logique. Malgré tout, il subsiste des inconvénients liés principalement aux algorithmes d’exploration des graphes. L’orientation pour des applications de traitements massivement parallèle est clairement affichée. Cependant, d’autres aspects comme la largeur des chemins de données fixes peuvent empêcher l’indexation d’une mémoire. De plus, la valeur d’un index ou d’un registre doit être connue tout au long du déroulement d’un algorithme sinon l’outil ne peut pas proposer d’architectures. La mise en mémoire systématique des constantes dans la version en langage C est également pénalisante. Agility Compiler a été conçu pour proposer des solutions d’implantation aux concepteurs. Il nécessite une description initiale des algorithmes en langage SystemC. A la différence de GAUT, les opérateurs complexes peuvent être définis sous la forme de fonctions et sont dupliqués si nécessaire. Ce positionnement un peu plus « bas niveau » aboutit à une implémentation relativement efficace. Toutefois, le compilateur de l’outil est assez directif et impose des réécritures du code pour proposer des solutions architecturales. Il en résulte que l’outil est assez restrictif dans l’exploration de l’espace de conception. D’autre part, le mapping mémoire n’est pas automatique et reste à la charge du concepteur. Il est à noter que cette phase est laborieuse manuellement. Enfin, la principale limitation de l’outil est la mauvaise gestion des indices de boucles. En effet, ils ne doivent pas être trop élevés en cas de déroulage des boucles. Dans le cas contraire, la description ne peut pas être exploitée par l’outil. 4.4 Prototypage du turbo décodeur flexible L’architecture considérée a été évoquée dans le chapitre précédent et le flot de conception employé a été décrit dans la première partie de ce chapitre. Nous allons dans cette section décrire la plate-forme et le processus de mise en œuvre de notre application de turbo décodage de codes produits. Puis, les caractéristiques du prototype sont données. 144 CHAPITRE 4. DE LA DESCRIPTION ALGORITHMIQUE JUSQU’AU PROTOTYPAGE Instance Pµ 1 Logiciel 1 S1.asm E1.asm Com1.asm Timer.asm … Pµ .h Programme externe Architecture piloté par le Pµ Architecture Fichiers fonctionnels .HDL (SystemC ou VHDL) S1.hdl E1.hdl Com1.hdl Timer.hdl … Pµ .hdl 3 Environnement Synthèse logique Platine virtuel Synthèse logique Rx Pµ Archi Tx 4 2 Cross-compilation 6 Compilation placement/routage Platine physique Prog. architecture Prog. exécutable 5 Prog. de boot 7 Fichier bit Prog. de la platine … Copie en mémoire et exécution Figure 4.10 — Les différentes étapes aboutissant au prototypage 4.4.1 Les différentes étapes aboutissant au prototypage Plusieurs étapes sont nécessaires pour mettre en place l’architecture sur le FPGA et lancer l’exécution du programme sur le processeur NIOS II. Le processus de prototypage se déroule en 7 étapes, elles apparaissant sur la figure 4.10 et sont numérotées de manière chronologique : 1. la description du processeur : les ressources retenues sont spécifiées. Une partie matérielle correspond à l’implantation des interfaces des périphériques. Une partie logicielle contient les routines nécessaires au pilotage des périphériques. 2. la synthèse logique du processeur : seules les ressources matérielles sont synthétisées. 3. la description de l’architecture pilotée par le processeur : il s’agit de la description de notre décodeur élémentaire flexible en langage SystemC. 4. la synthèse logique du décodeur élémentaire. 5. le transfert sur la plate-forme de prototypage : après une opération de placement/routage avec l’outil Quartus II, un fichier binaire est généré pour configurer le FPGA. 6. la compilation croisée entre le programme s’exécutant sur la cible logicielle et les ressources matérielles utilisées : cette opération lie les aspects matériels/logiciels des ressources. 7. le téléchargement du programme en code machine sur la plate-forme : elle s’effectue via le connecteur JTAG et le module dédié sur le processeur. Toutes ces étapes aboutissant au prototypage nécessitent l’utilisation d’une plate-forme de validation qui est détaillée dans la suite. 4.4. PROTOTYPAGE DU TURBO DÉCODEUR FLEXIBLE 4.4.2 145 La plate-forme de validation La plate-forme de validation Nios II Development Kit a été retenue dans le cadre de cette étude pour le prototypage (figure 4.11). Elle permet d’implanter des systèmes électroniques embarqués relativement complexes. Elle se compose principalement d’un FPGA Stratix Ep1s40f780 et de plusieurs périphériques : des afficheurs LED, des mémoires (SRAM, flash, CompactFlash...), des boutons poussoirs et des ports d’entrées/sorties divers (ethernet, série, JTAG...). Comme vu précédemment, la Figure 4.11 — La carte de développement NIOS II Development Kit configuration s’effectue en deux phases (matérielle/logicielle). Dans un premier temps, le fichier de configuration binaire est téléchargé du PC vers la plate-forme avec l’outil Quartus II. Dans un second temps, le programme est envoyé vers le processeur implanté sur le FPGA. La procédure à suivre pour la configuration de la plate-forme a évoluée au cours de l’année 2006 puisque les outils mis à disposition par Altera sont devenus plus mature. Auparavant, le développement logiciel était dissocié du processus de communication avec la cible. En effet, la communication entre le processeur NIOS et les périphériques se faisait via une invite de commande. Dorénavant, un environnement de conception logiciel IDE est fourni pour développer les aspects logiciels. Il est désormais possible d’effectuer dans le même flot de conception l’ensemble des étapes allant de la description de l’algorithme en C jusqu’au debuggage par émulation ou directement sur la cible. Dans ce cas, le processeur NIOS II doit contenir un module spécifique dédié à cette tâche. De plus, une couche d’abstraction a été ajoutée pour masquer les ressources matérielles au concepteur logiciel. 146 CHAPITRE 4. DE LA DESCRIPTION ALGORITHMIQUE JUSQU’AU PROTOTYPAGE 4.4.3 Les caractéristiques du prototype Notre but est de valider le fonctionnement de notre architecture flexible sur la plate-forme. Dans cette optique, l’objectif est de réaliser le décodage itératif d’un bloc via un programme s’exécutant sur le processeur NIOS II. Ce dernier n’exploite pas toutes ses possibilités en terme de calcul notamment. Il remplit seulement le rôle d’une unité de contrôle. En revanche, cette solution présente des avantages puisqu’elle va permettre d’envisager une évolution future en terme de fonctionnalité. Trois phases successives sont nécessaires pour vérifier le bon fonctionnement de notre application (figure 4.12) : – un bloc d’information à décoder (codé et bruité) est chargé dans l’une des mémoires embarquées sur le Stratix via le processeur NIOS II. – le programme de décodage gérant à la fois le décodeur élémentaire et les périphériques mémoires est ensuite envoyé sur le processeur. L’appui sur un bouton poussoir lance alors le processus de turbo décodage. – le bloc décodé est récupéré via une procédure de lecture en zone mémoire. Mem. R Mem. R’ Mem. R’’ 1 2 Processeur NIOS II 3 Décodeur Élémentaire BCH/RS Stratix 1s40 Boutons poussoirs Nios Development Kit Figure 4.12 — Les phases de fonctionnement du prototype La comparaison des blocs avant et après décodage nous permet donc d’évaluer le nombre de symboles corrigés. La validation est effectuée par comparaison avec les résultats obtenus lors des simulations fonctionnelles. Dans notre cas, le processeur NIOS II a une fréquence de fonctionnement de 50 MHz. Le bus système Avalon fonctionne également à la fréquence de 50 MHz car son horloge provient du processeur NIOS II. Le décodeur élémentaire,quant à lui, peut également fonctionner à une fréquence de 50 MHz. Les transmissions de données s’effectuent vecteur par vecteur. A chaque début de vecteur, un signal de synchronisation indique au décodeur qu’un nouveau vecteur est disponible et initialise les blocs. A 4.5. CONCLUSION 147 chaque fois qu’une écriture sur le bus a lieu, elle est suivie d’une lecture pour récupérer les données décodées. C’est pourquoi, dans cette solution architecturale, le décodeur élémentaire ne fonctionne qu’à 25 MHz. Seul, le décodeur élémentaire peut a priori fonctionner à plus de 50 MHz. Même si le critère d’arrêt évoqué précédemment a été implanté, huit itérations ont été effectuées pour le turbo décodage ce qui signifie que le décodeur élémentaire atteint un débit fixe de 1,5 MSymbole/s. En fait, le goulot d’étranglement est la fréquence de fonctionnement du processeur. En effet, il restreint les échanges. Deux solutions peuvent être envisagées pour améliorer les performances de notre prototype. La solution architecturale évoquée dans le chapitre 3 suggère l’utilisation de DMA pour accélérer le traitement. Une autre piste pourrait être de déplacer des fonctionnalités du décodeur élémentaire vers le processeur. Ainsi, le processeur ne jouerait plus simplement le rôle d’unité de contrôle mais élaborerait également des calculs tels que les syndromes ou la parité. L’ensemble des travaux évoqués a fait l’objet d’une publication à ReCoSoC en 2006 [PJAJ06a]. Cela concerne à la fois la conception, l’implémentation et le prototypage de notre architecture flexible de turbo décodage de codes produits. 4.5 Conclusion Nous avons expérimenté dans ce chapitre un flot de conception original permettant à partir d’une description algorithmique d’aller jusqu’à l’implantation sur un circuit ASIC ou FPGA. Un environnement de développement haut niveau et le langage de description système SystemC nous ont permis de modéliser notre application. Ainsi, nous avons pu valider très tôt le fonctionnement des applications considérées dans la chaı̂ne de développement. Des synthèses soit d’une description SystemC au niveau RTL soit d’une description SystemC au niveau comportemental ont pu être réalisées. Tout d’abord, nous avons expérimenté ce flot de conception à travers l’implantation du décodeur élémentaire BCH d’un turbo décodeur de codes produits de pouvoir de correction t = 1, pour différentes longueurs de code. L’implantation de descriptions en SystemC au niveau RTL s’est révélée aussi efficace que pour une description en VHDL au niveau RTL sur une cible ASIC. Puis, les synthèses logiques de chaque bloc constituant l’ensemble codeur/turbo décodeur flexible ont été effectuées à partir des descriptions au niveau RTL pour l’implantation sur un circuit FPGA ep1s40. Les architectures flexibles évoquées dans le chapitre 3 ont été considérées. Le codeur flexible occupe une surface de 567 LE. Le décodeur élémentaire, quant à lui, occupe 2761 LE tandis que le processeur NIOS II occupe 3540 LE. La surface occupée par ce dernier peut paraı̂tre importante mais il s’agit d’une version standard du processeur intégrant les interfaces nécessaires au debuggage. De plus, il pourra intégrer d’autres fonctionnalités dans le futur. Au total, le turbo décodeur flexible occupe 15.3% du circuit FPGA. A la suite de ce travail, nous avons décidé d’insérer des outils de synthèse architecturale dans 148 CHAPITRE 4. DE LA DESCRIPTION ALGORITHMIQUE JUSQU’AU PROTOTYPAGE le flot de conception. Les différents résultats obtenus nous ont notamment permis d’envisager une exploitation du parallélisme dans la partie traitement du décodeur élémentaire. En effet, la duplication de l’ensemble PGZ/Chien/Correction permet de traiter 16 vecteurs de test en parallèle et de réduire la latence. D’autre part, en imaginant que les parties réception et émission ne travaillent plus au niveau symbole, comme actuellement, mais au niveau vecteur il serait également possible d’exploiter le parallélisme. Enfin, nos expérimentation des outils GAUT et Agility Compiler aboutissent au fait que des évolutions sont encore nécessaires. Enfin, le prototypage a été réalisé sur une plate-forme NIOS II development kit. Au cours de notre phase de développement, nous sommes passés d’un processeur NIOS à un processeur NIOS II. Dans le même temps, les outils ont également évolué. Nous avons pu aboutir à une solution nous fournissant un débit de 1,5 Mb/s. Des pistes ont été données afin d’augmenter ce débit. C’est dans cette optique que l’utilisation de DMA est suggérée. CHAPITRE 5 Conclusion et perspectives Conclusion La rapide évolution des technologies CMOS offre aujourd’hui des perspectives d’intégration importante. Désormais, des systèmes complexes peuvent être intégrés sur un même circuit SoC ou SoPC. D’autre part, les applications de communications numériques sous contrainte d’exécution temps réel présentent des complexités de plus en plus élevées. C’est pourquoi, les architectures implémentant ces applications doivent être capables de supporter plusieurs fonctionnalités et de les mettre en œuvre dynamiquement. Dans ce contexte, les méthodologies de conception doivent évoluer pour faciliter le développement, la validation et le prototypage de ces systèmes complexes. L’élévation du niveau d’abstraction, l’utilisation de langage de description système tel que SystemC et la mise à disposition d’outils de synthèses adaptés favorisent cette évolution. Notre étude tient compte du domaine de l’application choisie à savoir les codes correcteurs d’erreurs et en particulier le turbo décodage des codes produits de type BCH ou Reed-Solomon. En effet, la définition de nouveaux algorithmes et la recherche d’architectures originales pour les applications de communications numériques dans les domaines du codage canal (turbocodes) et des traitements itératifs dans les récepteurs (turbo communications) représentent la plus grande part de l’activité de recherche du département électronique de l’ENST-Bretagne. L’objectif général a alors consisté au développement d’architectures originales favorisant l’intégration de systèmes turbo sur une même puce à l’aide d’un flot de conception innovant. Ainsi, l’originalité de notre démarche réside autant dans l’utilisation d’un flot de conception de haut niveau et l’exploration architecturale des solutions possibles que dans la mise au point d’une architecture flexible dédiée au turbo décodage de codes produits. Nous avons tout d’abord proposé une étude sur les différents algorithmes mis en œuvre dans le cadre du décodage des codes en blocs BCH et RS utilisés pour le turbo décodage des codes produits. A travers une étude de complexité fonctionnelle, les différents paramètres de flexibilité, notamment 150 CHAPITRE 5. CONCLUSION ET PERSPECTIVES la longueur de code N et le pouvoir de correction t, ont été caractérisés. Leur impact respectif sur le nombre d’opérations nécessaires a été estimé afin de leur attribuer une valeur pour rendre l’implantation possible. Ainsi, différentes configurations de code ont été retenues pour l’implémentation d’un turbo décodeur flexible dédié aux codes produits : les codes BCH (32,26) et (32,21) et les codes Reed-Solomon (31,29) et (31,27). D’autre part, des critères d’arrêt ont été envisagés pour interrompre une exécution superflue du processus de décodage itératif pour le décodage d’un code BCH ou d’un code RS. Pour cela, un critère d’arrêt hiérarchique a été proposé pour conserver les performances d’un décodage sans critère d’arrêt. Une architecture tenant compte de la flexibilité introduite a été développée pour assurer à la fois le décodage des codes BCH et RS pour différents pouvoirs de correction. Il est à noter que l’intégration d’un turbo décodeur dédié à des codes produits à base de codes Reed Solomon est une innovation à elle seule. En effet, il s’agit, à notre connaissance, de la première solution architecturale proposée pour le décodage de tels codes. L’architecture flexible se compose, quant à elle, d’une partie matérielle, le décodeur élémentaire, et d’une partie logicielle, un processeur NIOS II. La première possède une structure en trois parties et une mémoire interne. La seconde joue le rôle de l’unité de contrôle et de gestion des données entrantes et sortantes via des plans mémoires externes. Lors de cette étude, une découpe temporelle a été détaillée pour chacune des configurations envisagées. Parallèlement, nous avons expérimenté un flot de conception original permettant à partir d’une description algorithmique d’aller jusqu’à l’implantation sur un circuit ASIC ou FPGA. Un environnement de développement haut niveau et l’utilisation du langage de description système SystemC ont ainsi facilité la modélisation de notre application. L’avantage de ce choix est de pouvoir valider très tôt dans la chaı̂ne de développement le fonctionnement des applications considérées et de bénéficier de temps de simulation réduits. De plus, l’exploration d’architecture est simplifiée. Puis, il est possible d’effectuer les synthèses soit d’une description SystemC au niveau RTL soit d’une description SystemC au niveau comportemental. Tout d’abord, le flot a été expérimenté à travers l’implantation d’un code produit BCH(32,26)2 décrit en SystemC au niveau RTL. Les résultats d’implantations sont équivalents à ceux obtenus dans le cas d’une description en VHDL au niveau RTL sur une cible ASIC. Ce travail nous a permis d’acquérir des nouvelles connaissances à la fois au niveau langage et au niveau environnement de modélisation. Puis, les synthèses logiques de chaque bloc constituant l’ensemble codeur/turbo décodeur flexible ont été faites à partir des descriptions au niveau RTL pour l’implantation sur un circuit FPGA ep1s40. Le codeur flexible occupe une surface de 587 LE soit 1.4% de la surface totale du FPGA. Les trois parties du décodeur élémentaire (réception, traitement, émission) occupent respectivement 488, 1811, 462 soit au total 2761 LE soit 6.7% du circuit. Le processeur NIOS II occupe 3540 LE soit 8.6% de la surface totale du FPGA. L’insertion de la synthèse architecturale dans le flot de conception nous a ensuite permis d’explorer différentes solutions architecturales. L’objectif dans le cadre de notre application était de pouvoir utiliser et de mettre en évidence le parallélisme inhérent aux algorithmes. Ainsi, plusieurs explorations architecturales ont été effectuées à 151 l’aide des outils GAUT et Agility Compiler. Une phase préliminaire de familiarisation avec les outils et les méthodologies associées s’est avérée nécessaire. Le dernier aspect de notre travail a consisté à réaliser un prototype. Il est à souligner que ce travail a été mené dans un environnement de conception en constante évolution. C’est pourquoi, nous avons dû tenir compte des changements dans le flot de conception et des améliorations technologiques. L’étape de prototypage, longue et fastidieuse, a permis de valider le fonctionnement de notre solution architecturale. La plate-forme NIOS II Development Kit construite autour d’un circuit FPGA Altera ep1s40 a été retenue. L’ensemble de l’architecture de turbo décodage de codes produits a été implanté sur le circuit. Un programme a ensuite été téléchargé sur le processeur de manière à gérer à la fois les mémoires et le décodeur élémentaire. Le « monitoring » et la récupération des données décodées sont effectués via l’interface JTAG. Huit itérations de décodage sont réalisées par l’application. Le décodeur élémentaire atteint alors un débit de 1,5 MSymbole/s. Le goulot d’étranglement est le bus système Avalon utilisé entre le décodeur élémentaire et le processeur NIOS II. Perspectives Cette étude a été effectuée selon des axes de recherche qui sont en constante évolution. Ainsi, il est possible d’évoquer des perspectives sous forme d’améliorations et de modifications de la démarche effectuée. Elles portent sur deux aspects : – les flots de conception et les outils. – les applications de communications numériques susceptibles de bénéficier de cette approche. Tout d’abord, nous avons voulu vérifier qu’il était possible d’utiliser un flot de conception continu à partir d’une description algorithmique jusqu’à l’implantation matérielle. Il se révèle que la synthèse architecturale d’une description en SystemC au niveau comportemental avec les deux outils considérés est appropriée lorsqu’elle est appliquée sur un module dominé par un traitement intensif de données. Il aurait été intéressant d’envisager d’autres outils pour les applications dominées par des opérations de contrôle. Dans notre cas, seule la synthèse logique d’une description SystemC au niveau RTL fournit un résultat d’implantation exploitable. La prise en compte des avantages des deux outils considérés (GAUT et Agility Compiler) pourrait faciliter le passage d’un niveau d’abstraction à l’autre notamment en ce qui concerne les aspects mémoires. En effet, d’une part, une description sous la forme d’un algorithme dans GAUT est pour l’instant trop abstraite pour envisager une gestion efficace des plans mémoires. D’autre part, une description en SystemC, dans Agility Compiler, fige les entrées/sorties d’un module mais rend l’indexation de plan mémoire possible. Un compromis entre les deux approches permettrait à la fois d’envisager un « mapping » mémoire performant et une exploration d’architecture plus grande. De plus, les deux outils ont des modèles d’architectures cibles figés qui ne sont pas appropriés pour tous les types d’application. L’idéal serait d’introduire un peu de flexibilité au niveau de l’architecture cible de manière à ce que le concepteur ait la main mise sur la description 152 CHAPITRE 5. CONCLUSION ET PERSPECTIVES au niveau RTL obtenue. Par exemple, cette amélioration serait particulièrement bénéfique au niveau de la gestion des communications. Un autre point important peut être l’introduction dans les outils de développement de la gestion de la reconfiguration. En effet, une analyse croisée des algorithmes employés pourrait permettre de repérer les traitements communs. Ainsi, une répartition temporelle des ressources favoriserait la réutilisation des mêmes fonctionnalités. Notre application concerne uniquement le turbo décodage des codes produits à base de codes BCH et RS. Nous avons constaté que le débit proposé par notre solution architecturale était limité. Cependant, il est envisageable d’améliorer facilement ce dernier en implémentant des DMA pouvant accéder aux mémoires de données sans interrompre l’exécution du programme sur le processeur NIOS II. Dans la même optique, il est également possible de déporter des fonctionnalités de calcul sur la cible logicielle ce qui permettrait de limiter les échanges sur le bus système. Plus largement, l’architecture mise en oeuvre peut également bénéficier à toutes les applications de turbo communications et/ou turbo réception. En effet, nous considérons dans tous les cas que le processeur est chargé de la gestion de l’aspect « turbo » et de l’échange des données avec la ou les parties matérielles. Prenons l’exemple de l’implantation d’un récepteur itératif pour une transmission de type ST-BICM (MIMO), dans ce cas la phase de détection nécessite par exemple l’utilisation d’un détecteur MMSE. Ce détecteur reçoit à la fois les données modulées issues du canal et les données issues du décodage de canal. Le processeur NIOS II pourrait tout à fait remplir ce rôle tandis qu’une partie matérielle réaliserait le décodage de canal. Le dernier point concerne la reconfiguration dynamique qui très intéressante dans le cadre d’applications itératives. L’architecture est alors modifiée en cours de traitement afin de réaliser des tâches particulières ponctuellement dans le temps. Ainsi, l’intégration de critères d’arrêts en fonction du rapport signal à bruit sur le processeur permettrait de configurer l’architecture élaborée en fonction des besoins en termes de performances. Dans ce cas, il est alors possible de parler d’autoreconfiguration qui serait initiée par le NIOS II pour une reconfiguration partielle ou totale du circuit. Cependant, ceci implique l’implantation d’un estimateur de canal sur le circuit FPGA. ANNEXE A c Le langage SystemC L’utilisation d’un langage de conception au niveau système devient indispensable pour plusieurs raisons : – Les systèmes sont une combinaison de blocs matériel(s) et logiciel(s). Cependant, les langages de conception sont dédiés à la partie matérielle uniquement. – Les systèmes comprennent des blocs IPs provenant de sources différentes. Ces blocs d’origines diverses doivent avoir un langage de description système commun pour modéliser l’ensemble de l’application. – La simulation au niveau RTL devient trop complexe. Une simulation a un haut niveau d’abstraction pour des systèmes complexes permet un gain de temps important. – La modélisation au niveau système doit être exploitable lors des phases de synthèses logicielles et matérielles. Ainsi, un prototype virtuel de la partie matérielle doit être disponible pour le développement de la partie logicielle. SystemC est un sous-ensemble du langage ANSI-C++ combiné à un ensemble de librairies favorisant la spécification, la simulation et la synthèse de systèmes numériques complexes. Initialement, le langage SystemC était dédié à la simulation au niveau architectural mais ce langage s’enrichit de bibliothèques pour pouvoir répondre à toutes les caractéristiques d’un langage système. En 1989, Synopsys transmet son outil commercial Scenic au domaine du libre. La version 0.9 de SystemC est proposée. La société Frontier Design produit la version 1.0 tandis que CoWare aboutit en 2000 à la version 1.1. Il s’agit de la première version officielle de SystemC. L’OSCI (Open SystemC Initiative) est alors créé, rassemblant de nombreuses sociétés et laboratoires de recherche. Cette organisation est en charge de diffuser, de promouvoir et de rédiger les spécifications du langage SystemC. En 2001, SystemC permet la modélisation de systèmes abstraits (avant partitionnement matériel/logiciel), aboutissant à la version 2.0. En décembre 2005, le langage SystemC est normalisé IEEE [Soc05] et la version 2.2 est disponible depuis juin 2006. La structure du langage SystemC repose sur différents éléments : – le module : un modèle SystemC est construit à partir d’une hiérarchie de modules qui peuvent c ANNEXE A. LE LANGAGE SYSTEMC 154 eux-mêmes contenir des modules et des processus (similaire au langage VHDL et Verilog). Les modules et les processus communiquent à travers des signaux par l’intermédiaire de ports (entrée, sorties, E/S) associés aux modules. – le processus : il en existe trois types : 1. SC METHOD : il s’exécute directement (pas d’attente ou de boucle infinie). Il est appelé par le scheduler à chaque notification d’événements dans une liste de sensibilité. Il est considéré comme une fonction. 2. SC THREAD : ce processus est exécuté une seule fois de manière séquentielle grâce à l’instruction Wait (ex : FSM). Il est activé à chaque notification d’une liste de sensibilité. 3. SC CTHREAD : il s’agit d’un cas particulier du précédent, une horloge est associée a ce type de processus. Les signaux de sortie sont alors disponibles sur des fronts de l’horloge. Ce dernier processus a été abandonné lors de la normalisation mais est disponible dans les librairies pour la compatibilité des versions. Les caractéristiques de chacun de ces processus sont rappelées dans le tableau A.1. – la synchronisation : – l’attente (« waiting ») : fin du cycle ou événement – l’observation (« watching ») : globale ou locale – le canal :ensemble de variables et de fonctions définissant le protocole de communication – l’interface : ensemble de fonctions de communication spécifiées au sein du canal. La figure A.1 illustre l’utilisation des différents éléments décrit précédemment. Il s’agit de l’architecture d’un module décrit en SystemC. Un autre point atout du langage est le type des données correspondant aux variables et aux signaux (voir fig A.2). De plus, il est possible de définir ses propres structures de données. Déclenchement Arrêt d’exécution Fonction d’arrêt Constructeur et sensibilité Exemple de modélisation (matériel) SC METHOD notification d’événements non - SC THREAD notification d’événements oui wait() SC METHOD(p) SC THREAD(p) sensitive(s) sensitive pos(s) sensitive neg(s) Logique combinatoire sensitive(s) sensitive pos(s) sensitive neg(s) Logique séquentiel au niveau RTL SC CTHREAD horloge oui wait() wait until() SC CTHREAD (p,clock.pos()) SC CTHREAD (p,clock.neg()) Logique séquentiel à un niveau de conception élevé Tableau A.1 — Les caractéristiques des différents processus du langage SystemC 155 Canal Module Processus Canal Processus Canal Module Module hiérarchique interface signaux port Figure A.1 — Architecture hiérarchique d’un module décrit en langage SystemC ``` ``` Description ``` ``` Type sc bit sc logic sc int sc uint sc bigint sc biguint sc sc sc sc sc bv lv fixed ufixed fix sc ufix SystemC bit à 2 valeurs ’0’ et ’1’ bit à 4 valeurs ’0’,’1’,’X’ et ’Z’ entier signé 1 à 64 bit entier non signé 1 à 64 bit entier signé largeur variable à l’exécution entier non signé largeur variable à l’exécution vecteurs de bit à 2 valeurs vecteurs de bit à 4 valeurs Nombre en virgule fixe signé Nombre en virgule fixe non signé Nombre en virgule fixe signé largeur variable à l’exécution Nombre en virgule fixe non signé largeur variable à l’exécution Tableau A.2 — Les caractéristiques des différents types de données du langage SystemC ANNEXE B La plate-forme Palmyre Le projet CPER (Contrat de Plan Etat Région) PALMYRE vise à réaliser une plate-forme de développement et d’évaluation de systèmes radioélectriques. Il s’agit d’une plate-forme d’intégration composée de sous-ensembles matériels et logiciels. L’exploitation du canal de transmission radioélectrique constitue le principal domaine d’application du projet. Celui-ci doit être étendu car l’ambition de la plate-forme est d’être ouverte à un grand nombre d’applications. Le projet regroupe quatre partenaires académiques bretons (Université de Bretagne Sud, ENSTBretagne, INSA, Université de Rennes 1). Il constitue un groupe d’environ 40 chercheurs et doctorants, répartis sur quatre laboratoires CNRS : MO-LEST et TAMCIC (ENST Bretagne), IETR (Université de Rennes 1 et l’INSA de Rennes) et LESTER (Université de Bretagne Sud). D’autre part, des partenaires privés sont évidemment concernés, il s’agit, en particulier, des sociétés : Thomson, France Telecom, Elektrobit, CNES, Turbo-concept, COMSIS, SACET, WOLT, Rubisoft, Siradel et bien sûr Sundance. Le projet est structuré en 6 sous-projets correspondant chacun à l’un des aspects de la plate-forme : 1. Fonctions et algorithmes en bande de base. 2. Fonctions et sous-ensembles analogiques. 3. Caractérisation et modélisation du canal de propagation. 4. Nouvelles techniques en radiocommunications. 5. Optimisation d’architectures et spécifications algorithmiques. 6. Analyse et développement de techniques MIMO. Le premier sous-projet dépend du département électronique de l’ENST-Bretagne. L’objectif est de développer un système de transmission numérique ”robuste” pour valider les fonctions radiofréquences, conversion analogique/numérique et traitement numérique en bande de base de la plate-forme. Actuellement, un système de transmission numérique SISO (Single Input Single Output) est opérationnel. Il fonctionne à une fréquence porteuse de 5,1 GHz avec une modulation QPSK. Le débit brut obtenu est de 18 Mbit/s. Les résultats obtenus sont de plusieurs natures : 158 ANNEXE B. LA PLATE-FORME PALMYRE – Validation des concepts de prototypage rapide proposés dans le sous-projet 5 (Émetteur et récepteur implantés sur un FPGA). – Modulation tout numérique, algorithme de récupération de rythme et de porteuse de type aveugle. – Validation par transmission en conditions LOS. – Valorisation pédagogique de la chaı̂ne (projets d’élèves). Les perspectives sont nombreuses. Dans un premier temps, il faudrait gagner en robustesse pour aborder le contexte des transmissions mobiles (codage de canal pour traiter les trajets multiples, améliorer l’algorithme de récupération rythme aux faibles S/B). Dans un second temps, un gain en flexibilité pourrait être obtenu en décomposant l’architecture en blocs élémentaires réutilisables et en assurant l’interopérabilité avec les développements des autres sous-projets. La vocation du projet PALMYRE est de développer une compétence forte dans le grand Ouest sur les nouvelles techniques de transmissions numériques et sur la conception de chaı̂nes de traitement du signal sur des plates-formes matérielles hétérogènes. Des projets d’accompagnement de cette plateforme sont en cours depuis 3 ans (EPAR3D, RITMO, MC-CDMA). L’objectif est d’ouvrir le plus largement possible la plate-forme à des partenaires académiques ou industriels. Ces derniers devront jouer un rôle essentiel dans la valorisation de cette plate-forme. Son utilisation sera donc, à terme, proposée à des tiers appartenant ou non à la région Bretagne. Glossaire A/N Analogique/Numérique, 19 AES Advanced Encryption Standard, 12 ALM Adaptive Logic Module, 12 ASIC Application Specific Integrated Circuit, 4 ASK Amplitude Shift Keying, 51 ASMBL Advanced Silicon Modular BLock, 11 BCJR Bahl-Cocke-Jelinek-Raviv, 85 BPSK Binary Phase Shift Keying, 51 CDFG Control Data Flow Graph, 30 CISC Complexe Instruction Set Computer, 14 CLB Configurable Logic Block, 8 CMOS Complementary Metal Oxide Semi-conductor, 7 CPLD Complex Programmable Logic Device, 6 CPU Central Process Unit, 5 DDR Double Data Rate, 12 DLL Delay-Locked Loop, 6 DMIPS Dhrystone MIPS, 11 DSP Digital Signal Processor, 13 E/S Entrée/Sortie, 1 EDGE Enhanced Data Rates for Global Evolution, 1 FPGA Field-Programmable Gate Array, 3 FSK Frequency Shift Keying, 51 160 Glossaire GPRS General Packet Radio Service, 1 GSM Global System for Mobile communications, 1 LAB Logic Array Block, 12 LE Logic Element, 12 LFSR Linear Feedback Shift Register, 104 LUT Look-Up-Table, 8 MAC Multiply And Accumulate, 10 MAP Maximum A-Posteriori, 60 ME Motifs d’Erreurs, 57 MIP Millions of Instructions Per Second, 11 MPGA Matrix-Programmable Gate Array, 5 N/A Numérique/Analogique, 19 NRE Non-Recurring Engineering, 5 PAL Programmable Array Logic, 6 PCI Peripheral Component Interconnect, 19 PLD Programmable Logic Device, 6 PLL Phase-Locked Loop, 9 PSK Phase Shift Keying, 51 QAM Quadrature Amplitude Modulation, 51 QDR Quad Data Rate, 12 RISC Reduced Instruction Set Computer, 14 RS Reed-Solomon, 66 RTL Register Transfer Level, 21 SDRAM Synchronous Dynamic Random Access Memory, 12 SIMD Single Instruction on Multiple Data, 18 SNR Signal to Noise Ratio, 54 SoC System on Chip, 19 Glossaire 161 SOPC System On Programmable Chip, 20 SOVA Soft Ouput Viterbi Algorithm, 85 SRAM Static Random Access Memory, 7 SWP Sub Word Parallelism, 18 TCB TurboCodes en Blocs, 74 TDSI Traitement Du Signal et de l’Image, 1 TEB Taux d’Erreurs binaires, 54 TTL Transistor-Transistor Logic, 10 UAL Unité Arithmétique et Logique, 14 UMTS Universal Mobile Telecommunications System, 1 VLIW Very Long Instruction Word, 18 VT Vecteur de Test, 79, 92 WCDMA Wideband-Code Division Multiple Access, 47 Bibliographie [AA04] I. Atluri and T. Arslan. Reconfigurability-power trade-offs in turbo decoder design and implementation. In IEEE ISVLSI’04, fevrier 2004. [AC05] White Paper Altera Corporation. Fpgas for high-performance dsp applications. Technical report, 2005. [ALI04] Rapport d’avancement 2.4 synthèse du développement des blocs ip. Technical report, RNRT ALIPTA, 2004. [Alt] Altera. http ://www.altera.com/products/devices/excalibur/exc-index.html. Technical report. [Alt05] Altera. Hardcopy series handbook, volume 1. Technical report, 2005. [AM04] C. Argon and S.W. McLaughlin. An efficient chase decoder for turbo product codes. IEEE Trans. Comm., 52(6), June 2004. [AR96] A. Abnous and J. Rabaey. Ultra low-power specific multimedia processors. In VLSI Signal Processing IX, 1996. [Aı̈t98] O. Aı̈tSab. Turbo codes et codage conjoint source-canal : apllication à la transmission d’images. PhD thesis, ENST Bretagne, Université de Bretagne Occidentale, 1998. [Ba97] F. Balarin and al. Hardware-Software Co-Design for embedded systems - The POLIS approach. Kluwer Academic, 1997. [BAAF93] C. Berrou, P. Adde, E. Angui, and S. Faudeil. A low complexity soft-output viterbi decoder architecture. In Communications, 1993. ICC 93. Geneva. Technical Program, Conference Record, IEEE International Conference on, volume 2, pages 737–740vol.2, 23-26 May 1993. [Bar80] M.R. Barbacci. The symbolic manipulation of computer descriptions : an introduction to isps. Technical report, Dpt of Computer Science, Carnegie-Mellon University, Pittsburgh, March 1980. [BCJR74] L. Bahl, J. Cocke, F. Jelinek, and J. Raviv. Optimal decoding of linear codes for minimizing symbol error rate (corresp.). Information Theory, IEEE Transactions on, 20(2) :284– 287, Mar 1974. 164 BIBLIOGRAPHIE [BCM+ 88] R.K. Brayton, R. Camposano, G.D. Micheli, R. Otten, and J. Van Eijndhoven. The Yorktown Silicon Compiler System. Number pp. 204–310. 1988. [BCM97] F. Balasa, F. Catthoor, and H. De Man. Practical solutions for counting scalars and dependences in atomium - a memory management system for multi-dimensional signal processing. In Computer Aided Design, février 1997. [BDD+ 99] K. Bondalapati, P.C. Diniz, P. Duncan, J. Granacki, M.W. Hall, R. Jain, and H. Ziegler. Defacto : A design environment for adaptive computing technology. In IPPS/SPDP, 1999. [Ber68] E. R. Berlekamp. Algebraic Coding Theorie. Aegean Park Press, 1968. [BG96] C. Berrou and A. Glavieux. Near optimum error correcting coding and decoding : turbocodes. IEEE Trans., 44 :1261 – 1271, 1996. [Bid] R. Le Bidan. Décodage ferme des codes reed-solomon par l’algorithme peterson- gorenstein-zierler. Juillet 2005. [Bla03] R.E. Blahut. Algebraic Codes for data transmission. Cambridge university press, 2003. [BM78] L.D. Baumert and R.J. MacEliece. Soft decision decoding of block codes. Technical report, JetPropulsion Laboratory, California Institute of Technology, Juillet-Aout 1978. [BMN+ 01] V. Baumgarte, F. May, A. Nükel, M. Vorback, and M. Weinhardt. Pact xpp - a selfreconfigurable data processing architecture. In ERSA, 2001. [BNH06] F. Berthelot, F. Nouvel, and D. Houzet. Partial and dynamic reconfiguration of fpgas : a top down design methodology for an automatic implementation. In IPDPS, 2006. [Bom04] P. Bomel. Plate-forme de prototypage rapide fondée sur la synthèse de haut niveau pour applications de radiocommunications numériques. PhD thesis, Université de Bretagne Sud, Décembre 2004. [Bos04] L. Bossuet. Exploration de l’espace de conception des architectures reconfigurables. PhD thesis, Université de Bretagne Sud, Décembre 2004. [BRC60] R.C. Bose and D.K. Ray-Chaudhuri. On a class of error correcting binary group codes. Inf. and Control, 3 :68–79, Mars 1960. [Bur71] H. Burton. Inversionless decoding of binary bch codes. Information Theory, IEEE Transactions on, 17(4) :464–466, Jul 1971. [Cad] Cadence. Vcc user guide. Technical report. [CAE00] F. Cuesta, M. Auguin, and E.Gresset. System level communication synthesis for embedded signal processing application. ICSPAT, 2000. [CAKP02] J. Cuevas, P. Adde, S. Kerouédan, and R. Pyndiah. New architecture for high data rate turbo decoding of product codes. In GLOBECOM, pages 139–143, Novembre 2002. BIBLIOGRAPHIE [Cam91] 165 R. Camposano. Path-based scheduling for synthesis. In IEEE Trans. Computer-Aided Design, volume Vol. 10, pages pp..85–93, janvier 1991. [CC81] G.C Clark and J.B Cain. Error-Correction Coding for Digital Communications. Plenum Press, 1981. [CFF+ 99] D.C. Cronquist, C. Fisher, M. Figueroa, P. Franklin, and C. Ebeling. Architecture design of reconfigurable pipelined datapath. In Advanced research in VLSI, 1999. [CG03] L. Cai and D. Gajski. Transaction level modeling : An overview. In CODES+ISSS’03, 2003. [Cha72] D. Chase. A class of algorithms for decoding block codes with channel measurement information. IEEE Trans. Inform. Theory, IT-18 :170–182, janvier 1972. [Chi94] R.T. Chien. Cyclic decoding procedures for bose-chaudhuri-hocquenghem codes. IEEE Trans. Inform. Theory, 10 :357–363, Oct. 1994. [CHR+ 03] N. Calazans, E. Moreno F. Hessel, V. Rosa, F. Moraes, and E. Carara. From vhdl register transfer level to systemc transaction level modeling : a comparative case study. SBCCI, 2003. [Cor05] G. Corre. Gestion des unités de mémorisation pour la synthèse d’architecture. PhD thesis, Université de Bretagne Sud, Juin 2005. [Cou03] P. Coussy. Synthèse d’interface de communication pour les composants virtuels. PhD thesis, Université de Bretagne Sud, 2003. [Cow] Coware. User guide. Technical report. [CPIJ94] J.P. Calvez, 0. Pasquier, D. Isidoro, and D. Jeuland. Codesign with the mcse methodology. In EUROMICRO System Architecture and Integration, 1994. [CPTR89] C.M. Chu, M. Potkonjak, M. Thaler, and J. Rabaey. Hyper : an interactive synthesis environment for real time application. In International Conference on Computer Design, pages 432–435, 1989. [CSKPN00] C. Chaikalis, M. Salimi-Khaligh, N. Panayotopoulos, and J.M. Noras. Reconfiguration between soft output viterbi and log maximum a posteriori decoding algorithms. 3G Mobile Communication Technologies, 2000. [CV03] J. R. Cavallaro and M. Vaya. Viturbo : A reconfigurable architecture for viterbi and turbo decoding. In IEEE ICASSP2003, pages 497–500, avril 2003. [Dav03] R. David. Architecture reconfigurable dynamiquement pour applications mobiles. PhD thesis, Université de Rennes 1, 2003. [DGR04] J.P. Delahaye, G. Gogniat, and C. Roland. Software radio and dynamic reconfiguration on a dsp/fpga platform. Frequenz, Journal of Telecommunications, pages 152–159, 2004. [dic] Dictionnaire de l’Académie française. 9ème édition. 166 [DPL05] BIBLIOGRAPHIE J.P. Delahaye, J. Palicot, and P. Leray. A hierarchical modeling approach in software defined radio system design. In SIPS, 2005. [eAS05] eASIC. Configurable programmable asic. Technical report, 2005. [EDH04] S. Evain, J.P. Diguet, and D. Houzet. A generic cad tool for efficient noc design. ISPACS, 2004. [ele05] NEC electronic. Structured asic, easy, fast, low-cost. Technical report, 2005. [Eli54] P. Elias. Error-free coding. IRE Trans. Inform. Theory, IT-4 :29–37, septembre 1954. [Ell00] J.P. Elliott. Understanding High-Level Synthesis. A practical Guide to High-Level Design. Kluwer Academic Publishers, 2000. [For] Forney. [For66] G.D. Forney. Concatenated codes. Cambridge M.A., 1966. [Ga92] D. Gajski and al. High-Level Synthesis : Introduction to Chip and System Design. Kluwer Academic Publishers, 1992. [GABP98] G. Gogniat, M. Auguin, L. Bianco, and A. Pegatoquet. Communication synthesis and hw/sw integration for embedded system design. Hardware/Software Codesign (CODES/CASHE ), 1998. [Gal05] B. Le Gal. Contribution à la prise en compte des contraintes des applications TDSI. PhD thesis, Université de Bretagne Sud, LESTER, 2005. [GBA03] F. Ghaffari, M. Benjemaa, and M. Auguin. Algorithms for the partitioning of applications containing variable duration tasks on reconfigurable architectures. Computer Systems and Application, 2003. [GGDN04] S. Gupta, R. Gupta, N. Dutt, and A. Nicolau. SPARK : a parallelizing approach to the hgh-level synthesis of digital circuits. 2004. [Gil05] J. Gill. Error-correcting codes. Technical report, Stanford University, 2004-2005. [Gra04] Mentor Graphics. Catapult C Synthesis User’s Manual and Reference Manual, 2004. [Gui03] A.C. Guillou. Synthèse architecturale basée sur le modèle polyèdrique : validation et extensions de la méthodologie MMAlpha. PhD thesis, Université de Rennnes I, 2003. [GVLM92] G. Goosens, P. Vanbekbergen, B. Lin, and H. De Man. A generalized state assignment theory for transformation on signal transition graphs. In ICCAD, pages pp. 112–117, novembre 1992. [GVN94] D. Gajski, F. Vahid, and S. Narayan. A system-design methodology : executable specifcation refinement. In EUROCAD, 1994. [GZ61] D. Gorenstein and N. Zierler. A class of error correcting codes in pm symbols. JSIAM, 9 :207–214, 1961. BIBLIOGRAPHIE [Har01] 167 R. Hartenstein. A decade of reconfigurable computing : a visionnary retrospective. DATE, 2001. [HH94] J. Hagenauer and P. Hoeher. A viterbi algorithm with soft-decision outputs and its applications. GLOBECOM, pages 1680–1686, 1994. [HHM01] S.A. Hirst, B. Honary, and G. Markarian. Fast chase algorithm with an application in turbo decoding. IEEE Trans. Comm., 49 :1693–1699, Oct. 2001. [Hoc59] A. Hocquengehm. Codes correcteurs d’erreurs. 2 :147–156, 1959. [HR76] C.R.P. Hartman and L.D. Rudolph. An optimum symbol-by-symbol decoding rule for linear codes. IEEE Trans. Inform. Theory, 22 :514–517, Sept. 1976. [HSKB06] M. Hübner, C. Schuck, M. Kühnle, and J. Becker. New 2-dimensional partial dynamic reconfiguration techniques for real-time adaptive microelectonics circuits. In ISVLSI, Mars 2006. [htta] http ://public.itrs.net/. International technology roadmap for semiconductors. [httb] http ://www.celoxica.com/. [httc] http ://www.synfora.com. Synfora. [HW97] J.R. Hauser and J. Wawrzynek. Garp : a mips processor with a reconfigurable coprocessor. In FCCM, 1997. [Inc] CoWare Inc. http ://www.coware.com/. [Inc06] Renesas Inc. Mpu and mcu general catalog. Technical report, 2006. [Ins06] Texas Instruments. Dsp selection guide. Technical report, 2006. [Jac96] S. Jacq. Décodage itératif des codes produits : turbocodes en blocs, et évaluations de leurs performances pour des modulations MDP et MAQ sur canal de Gauss et de Rayleigh. PhD thesis, Université de Limoges, 1996. [JD06] C. Jégo and J.P. Diguet. Architectures autoconfigurables pour le contrôle dynamique du compromis qos/snr/débit de turbo décodeurs de code produit. Journées scientifiques du CNFRS : Vers des radiocommunications reconfigurables et cognitives, mars 2006. [Jég00] C. Jégo. Synthèse architecturale d’applications de traitement du signal sous contraintes temps réel, dédiée aux technologies submicroniques. PhD thesis, Université de Rennes 1, 2000. [JPS85] B.W. Jinks, D.L. Pulfrey, and W.S. Snyder. Automated generation of microcontrollers. In ICCAD, page pp.335, 1985. [KAP01] S. Kerouedan, P. Adde, and R. Pyndiah. How we implemented block turbo codes. In Annals of Telecommunication, volume Vol. 56, pages 447–454. Juillet-Août 2001. [Kna96] D.W. Knapp. Behavioral Synthesis. Digital Systems using the Synopsys Behavioral Compiler. Prenctice Hall, 1996. 168 [Kri05] BIBLIOGRAPHIE I. Krikidis. Approche multicouches pour la reconfigurabilité de systèmes de communications de 3ème génération. PhD thesis, Télécom Paris, 2005. [La97] G. Lakshminarayana and al. Wavesched : A novel scheduling technique for control-flow intensive behavioral descriptions. In ICCAD, pages pp.245–251, novembre 1997. [LJSM04] J. Laurent, N. Julien, E. Senn, and E. Martin. Softexplorer functional level power analysis : an efficient approach for modeling the power consumption of complex processors. In Design, Automation and Test in Europe Conference and Exhibition, volume 1, pages 666 – 667, Fevrier 2004. [LMW95] Y. S. Li, S. Malik, and A. Wolfe. Performance estimation of embedded software with instruction cache modeling. ICCAD, pages 380–387, 1995. [LSB85] L. Loeffler, R. Schmid, and U.G. Baitinger. Processor control part synthesis yields short turnaround times by higl level description. In ICCAD, page pp. 266, 1985. [LSL+ 99] G. Lu, H. Singh, M.H. Lee, N. Bagherzadeh, F. Kurdahi, and E. Filho. Tne morphosys parallel reconfigurable system. In European Conference on Parallel Processing, 1999. [LST00] J. Liang, S. Swaminathan, and R. Tessier. Asoc : a scalable single chip communications architecture. In PACT, 2000. [LTG04] J. Liang, R. Tessier, and D. Goeckel. A dynamically reconfigurable, power-efficient turbo decoder. In IEEE Symposium on Field-Programmable Custom Computing Machines, avril 2004. [LXL01] X. Liu, Y. Xiong, and E.A. Lee. The ptolemy ii framework for visual languages. In Human-Centric Computing Languages and Environments, pages 50–51, Sept. 2001. [Mas] Massey. [Mas65] J.L. Massey. Step-by-step decoding of the decoding bch codes. IEEE Trans. Inform Theory, IT-11 :580–585, Oct. 1965. [MBG+ 05] J. MENARD, D. BOURREAU, G. GRATON, C. LANGLAIS, E. DANIEL Emmanuel, and Y. LE ROUX. Palmyre serial transmission system for radio channels. 51ème Conférence Européenne Propagation et Systèmes, 2005. [McE03] R. McEliece. The guruswami-sudan decoding algorithm for reed-solomon codes. 2003. [MDP02] Y. Le Moullec, J.P. Diguet, and J.L. Philippe. Design trotter : a multimedia embedded systems design space exploration tool. In IEEE Workshop on Multimedia Signal Processing, 2002. [Mit] J. Mitola. The software radio architecture. IEEE Comms. Mag, 41 :1995. [MJ03] H.De Man and J.Rabaey. The Best of ICCAD, 20 Years of Excellence in Computer-Aided Design, chapter System Design and Analysis Overview, pages 93–106. Kluwer Academic, 2003. BIBLIOGRAPHIE [MJJ+ 88] H.De Man, J.Rabaey, J.Vanhoof, G.Goossens, P.Six, and L.Claesen. 169 Cathedral-ii-a computer-aided synthesis system for digital signal processing vlsi systems. ComputerAided Engineering Journal, 5 :55–66, 1988. [MM04] S. Murali and G. De Micheli. Sunmap : a tool for automatic topology selection and generation for nocs. DAC, 2004. [MP96] E. Martin and J.L. Philippe. Ingénierie des systèmes à microprocesseurs : Application au traitement de signal. Masson, 1996. [MRSC86] H. De Man, J. Rabaey, P. Six, and L. Claesen. Cathedral-ii : A silicon compiler for digital signal processing. In Design and Test, decembre 1986. [MS78] F.J. MacWilliams and N.J.A. Sloane. The Theory of error correcting codes. North Holland Publishing Company, 1978. [NM05] F. Nouvel and A. Massiany. Conception de modems mono-porteuse et mccdma à 5,4ghz sur une plate-forme unique de prototypage numérique et analogique. TAISA, 2005. [Not04] Application Note. Two flows for partial reconfiguration : Module based or difference based. Technical report, Xilinx, 2004. [Pa82] R. Piloty and al. The conlan project : Status and future plans. In Design Automation Conference, page pp. 202, June 1982. [PCLSJ06] J. Perez-Chamorro, C. Lahuec, F. Seguin, and M. Jézéquel. Designing subthreshold mosfet analog decoders. In Analog decoding Workshop, June 2006. [PEG99] A. Pegatoquet and M. Auguin et L. Bianco E. Gresset. Rapid development of optimized dsp code from a high level description through software estimations. In Design Automation Conference, pages pp. 823–826, June 1999. [Pet60] W. W. Peterson. Encoding and error correcting procedures for the bose-chaudhuri codes. IRE Transf. Theory, IT-6 :459–470, septembre 1960. [PGPJ94] R. Pyndiah, A. Glavieux, A. Picart, and S. Jacq. Near optimum decoding of product codes. In GLOBECOM94, novembre 1994. [PJA+ 06] E. Piriou, C. Jego, P. Adde, R. Le Bidan, and M. Jezequel. Efficient architecture for reed solomon block turbo code. ISCAS, pages 3682–3685, Mai 2006. [PJAJ04] E. Piriou, C. Jego, P. Adde, and M. Jezequel. System level design using systemc : a case study of block turbo decoder. DCIS, 2004. [PJAJ05] E. Piriou, C. Jego, P. Adde, and M. Jezequel. Utilisation d’un environnement de conception reposant sur le langage systemc pour l’intégration d’un turbo décodeur de code produit. JFAAA05, Journées francophones sur l’adéquation Algorithme Architecture, 2005. 170 [PJAJ06a] BIBLIOGRAPHIE E. Piriou, C. Jego, P. Adde, and M. Jezequel. Design, implementation and prototyping of a flexible architecture dedicated to block turbo decoding. Reconfigurable Communicationcentric SoCs, 2006. [PJAJ06b] E. Piriou, C. Jego, P. Adde, and M. Jezequel. A flexible architecture for block turbo decoders using bch or reed-solomon components codes. ISVLSI, Mars 2006. [PMS93] J.L. Philippe, E. Martin, and O. Sentieys. Gaut, an architecture synthesis tool for dedicated signal processors. In IEEE European Design Automation Conference, 1993. [POJ93] I. Park, K. O’Brien, and A.A. Jerraya. Amical : architectural synthesis based on vhdl. In IFIP - Transactions on computer science and technology, 1993. [PRR+ 03] A. Polydoros, J. Rautio, G. Razzano, H. Bogucka, D. Ragazzi, P.I. Dallas, A. Mämmelä, M. Benedix, M. Lobeira, and L. Aragossi. Wind-flex : Developing a novel testbed for exploring flexible radio concepts in an indoor environment. IEEE Comms. Mag, 2003. [PTS+ 79] A.C. Parker, D.E. Thomas, D.P. Siewiorek, M. Barbacci, L. Hafer, G. Leive, and J. Kim. The cmu design automation system : An example of automated data path design. In Design Automation Conference, June 1979. [Pyn98] R. Pyndiah. Near optimum decoding of product codes : Block turbo codes. IEEE Trans. Inform. Theory, 46 :1003–1010, 1998. [Rao97] O. Raoul. Conception et performances d’un circuit intégré turbo décodeur de codes produits. PhD thesis, ENST Bretagne, Université de Bretagne Occidentale, 1997. [RDM+ 06] Y. LE ROUX, P. LASSUDRIE DUCHESNE, J. MENARD, D. BOURREAU, E. DANIEL Emmanuel, and G. LANDRAC. Palmyre : a mimo reconfigurable transmission platform for its applications. 6th International Conference on ITS Telecommunications, 2006. [RDV+ 05] Y. LE ROUX, P. LASSUDRIE DUCHESNE, R. VAUZELLE, Y. CHARTOIS, G. EL ZEIN, and C. BROUSSEAU. Propagation and system modeling for the palmyre mimo platform. 51ème Conférence Européenne Propagation et Systèmes, 2005. [RLP05] A. La Rosa, L. Lavagno, and C. Passerone. Implementation of a umts turbo decoder on a dynamically reconfigurable platform. In Computer-Aided Design of Integrated Circuits and Systems, volume 24. IEEE Transactions on, janvier 2005. [RR72] S.M. Reddy and J.P. Robinson. Random error and burst correction by iterated codes. IEEE Trans. Inform. Theory, 18 :182–185, 1972. [RVH95] P. Robertson, E. Villebrun, and P. Hoeher. A comparison of optimal and sub-optimal map decoding algorithms operating in the log domain. ICC, pages 1009–1013, 1995. [SB] T. Stöcklein and J. Bäsig. Handel-c : An effective method for designing fpgas (and asics). Technical report. [SCGT01] G. Sassatelli, G. Cambon, J.J. Galy, and L. Torres. A dynamically reconfigurable architecture for embedded systems. In Rapid System Prototyping, 2001. BIBLIOGRAPHIE 171 [Sem05] AMI Semiconductor. Xpressarray-ii 0.15mm structured asic. Technical report, 2005. [Sem06] Freescale Semiconductor. Digital signal processors and controllers. Technical report, 2006. [Soc05] R Language Reference Manual. 1666IEEE Computer Society. IEEE Standard SystemC 2005.pdf, 2005. [Sof04] TNI Software. Cosimate product overview : Cosimate, an innovative software solution for mechatronics network co-simulations. Technical report, 2004. [SS94] M. Srinivasan and D.V. Sarwate. Malfunction in the peterson-gorenstein-zierler decoder. IEEE Trans. Inform .Theory, 40 :1649–1653, Sept. 1994. [Syn] Synopsys. Systemc - early hardware/software integration using systemc 2.0. Technical report. [Syn01] Synopsys. Describing Synthesizable Behavioral SystemC, Aout 2001. [Syn02] Synopsys. Describing Synthetizable RTL in SystemC, novembre 2002. version 1.2. [TAJ00] X. Tang, M. Aalsma, and R. Jou. A compiler directed approach to hiding configuration latency in chamaleon processors. In FPL, 2000. [Vit67] A.J. Viterbi. Error bounds for convolutionnal codes and an asymptotically optimum decoding algorithm. IEEE Trans. Inform. Theory, 13 :260–269, 1967. [WB04] J. Williams and N. Bergmann. Embedded linux as a platform for dynamically selfreconfiguring systems-on-chip. ERSA, 2004. [Wel71] E.J. Weldon. Decoding binary blocks codes on q-ary output channels. IEEE Trans. Inform. Theory, 17 :713–718, Nov. 1971. [WHW01] S.F. Wang, H.Hsu, and A. Wu. A very low-cost multi-mode reed solomon decoder based on peterson-gorenstein-ziekler algorithm. Signal Processing Systems, pages 37–48, Sept. 2001. [WT04] K.C. Wu and Y.W. Tsai. Structured asic, evolution or revolution ? In ISPD, April 2004. [Xil05] Hitesh Patel Xilinx. Synthesis and implementation strategies to accelerate design performance. Technical report, 2005. [Zho05] R. Zhou. Etude des turbo codes en blocs Reed-Solomon et leurs applications. PhD thesis, ENST Bretagne, Université de Rennes 1, 2005. [Zim79] G. Zimmermann. The mimola design system : A computer aided digital processor design method. In Design Automation Conference, pages pp. 53–58, 1979. Apport de la modélisation et de la synthèse haut niveau dans la conception d’architecture flexible dédiée aux turbocodes en blocs Cette thèse s’inscrit dans la continuité des travaux menés au sein du département électronique de l’ENST-Bretagne sur l’implantation des turbo-décodeurs de codes produits. Le premier axe de recherche de l’étude concerne l’implantation d’une architecture flexible d’un turbo-décodeur. Le second axe s’intéresse à l’évolution des flots de conception, des langages de description et de leurs applications. L’ensemble est validé par la mise en oeuvre d’un prototype. L’architecture que nous proposons se compose à la fois d’une partie matérielle réalisant la fonction de décodage et d’une partie logicielle remplissant le rôle de contrôleur. Une étude de complexité en amont a permis de caractériser les paramètres de l’application. L’innovation de notre architecture repose sur le caractère flexible permettant de choisir le code composant (BCH ou Reed Solomon) et le pouvoir de correction pour des longueurs de code variables. Il est à noter qu’il s’agit de la première intégration d’un turbo-décodeur à base de code Reed Solomon. Ce travail a en particulier bénéficié de l’expertise algorithmique de l’ENST Bretagne sur les turbocodes. Dans le cadre de cette thèse, un flot de conception dit de haut niveau a été expérimenté. Dans un premier temps, le développement de la chaı̂ne de transmission numérique a été effectué à l’aide du langage système de description SystemC sous l’environnement System Studio de Synopsys. Puis, les synthèses logiques avec l’outil SystemC Compiler de Synopsys ont permis d’obtenir des descriptions au niveau netlist. De plus, des synthèses de haut niveau ont ensuite été effectuées à travers l’utilisation d’outils tels que GAUT et Agility Compiler. Elles ont été menées sur les différents éléments de l’architecture afin d’évaluer les apports de cette approche. Le prototypage de l’architecture novatrice a été effectué sur un FPGA Altera Stratix sur une carte de développement NIOS II. En effet, au début de ces travaux, en 2003, la société Altera proposait des solutions matures par rapport à celles du concurrent Xilinx pour les processeurs soft embarqués, c’est ce qui a principalement motivé notre choix. Ce travail s’inscrit donc dans une forte évolution des cibles matérielles et des outils durant ces trois dernières années. Sur notre plate-forme, un processeur logiciel NIOS II sert de structure de contrôle et est relié à la partie matérielle de décodage via un bus système dédié de type Avalon. Le processus de turbo décodage met en oeuvre des codes BCH(32,26) (resp. (32,21)) et des codes Reed Solomon (31,29) (resp. (31,27)) d’un pouvoir de correction t=1 (resp. t=2). Les applications potentielles, pouvant bénéficier de cette architecture flexible, sont nombreuses notamment dans le domaine des télécommunications mobiles, des transmissions optiques, du stockage en masse ou du xDSL. Contribution of high level design and synthesis to develop a flexible architecture dedicated to block turbo codes This thesis’ work continues previous research undertaken at the electronics department of the ENST-Bretagne on the implementation of a turbo decoding architecture for product codes. The first research area studies the implementation of a flexible turbo decoding architecture. The second concerns the evolution of design flow, description languages and their applications. The results are validated by prototyping a platform. The proposed architecture includes two main design blocks. The first is a hardware module performing the decoding process. The second is a software based control unit. A study of system complexity was carried out to identify the various parameters of the application. The innovative aspect of our architecture is the flexibility in the choice of a component code (BCH or Reed Solomon) and its error correcting power. This is the first architecture known to date implementing Reed-Solomon block turbo codes. This work benefited from the knowledge of ENST Bretagne on turbocodes. Within the context of this thesis, a high level design flow was used, and the method was divided into two steps. First, a digital communication chain was developped with the help of the SystemC description language and System Studio design tool. Then, netlist descriptions were obtained by performing logic synthesis with SystemC compiler tool from Synopsys. The usage of a high level synthesis on sub-modules of the architecture allows us to quantify the benefits of this approach. The architecture was mapped to an Altera Stratix FPGA on a NIOS II development board. In fact, our choice of solutions from Altera was motivated by the fact that at the beginning of this work, Altera offered the best solution concerning software processors when compared to Xilinx. In our design, the control task is achieved by the NIOS II embedded processor. An avalon system bus binds the hardware decoding part and the processor. The turbo decoding process concerns BCH(32,26) (resp. (32,21)) and Reed Solomon (31,29) (resp. (31,27)) codes with t=1 (resp. t=2) as error correcting power. Many potential applications such as mobile communications, optical transmission, data storage and xDSL can benefit from flexible architectures dedicated to block turbo codes.