Copyright
© 2000-2015 LHERBAUDIERE


10 pages à l'impression
Hit-Parade version initiale 2002
AVERTISSEMENT dernière mise à jour
28 janvier 2015
cliquez sur le mot avertissement ou information ci-dessus pour connaitre une info essentielle avant de lire ce module et n'hésitez pas à cliquer en bas de page sur l'icone sommaire du site ça vous ouvrira d'autres perspectives

Capteurs et Traitement avancé du signal

(3/3) un exemple de réalisation : analyseur de pollution atmosphérique

le synoptique général pourquoi et comment un FPGA
réalisation d'un neurone les différents opérateurs
réalisation d'une couche des RAMs et des ROMs
réalisation du réseau la reconfiguration dynamique
  une collection d'icônes pour visiter tout le site

Généralités

Nous allons examiner le problème de l'analyse de la pollution atmosphérique, pour lequel nous avons par ailleurs longuement explicité les microcapteurs utilisables. L'implémentation d'un réseau de neurones a été imaginée sous forme matérielle par le biais d'un circuit FPGA dans l'objectif de réaliser un système nomade.


Le cahier des charges précise que le choix des capteurs chimiques n'est pas figé ( en effet la liste des paramètres à mesurer va vraisemblablement évoluer au cours du temps, certains polluants ne présentant plus d'intérêt tandis que d'autres non évalués actuellement seront jugés prioritaires) et par conséquence immédiate qu'il est impératif de développer une architecture aisément modifiable (paramétrable) permettant l'interchangeabilité des capteurs. Notre objectif est d'utiliser l'exploitation de la reconfiguration des circuits FPGA à structure SRAM pour l'implantation de l'électronique associée au conditionnement des capteurs en mode séquentiel synchrone et de l'acquisition du résultat de la mesure. La figure ci-dessous montre le synoptique de l'architecture réalisée


Fig. système ambulatoire de suivi de la pollution atmosphérique

Les fonctions réalisées dans le module FPGA sont les suivantes:



Nous ne présenterons ici que le module traitement des données qui comporte les éléments suivants : Pour la mise en œuvre et l'implantation des réseaux de neurones, plusieurs solutions ont été envisagées : la mise en parallèle de processeurs programmables, l'emploi d'architectures SIMD massivement parallèles [ARN97] ou l'emploi de circuits numériques spécifiques [CLA97] .

Une analyse détaillée du traitement par perceptron multicouche a été effectuée afin de décomposer celui-ci en blocs fonctionnels et d'évaluer la complexité calculatoire de chacun de ces blocs. L'utilisation des FPGAs permet d'envisager sa réalisation d'une façon purement matérielle et de limiter la puissance de l'architecture aux besoins de l'application afin d'éviter un encombrement et une complexité supérieurs aux besoins. Par ailleurs, le câblage du traitement sur des circuits FPGA permet de réaliser les opérations en temps réel. L'augmentation de rapidité des phases de configuration dans la nouvelle technologie de fabrication des FPGAs de chez Xilinx permet d'envisager l'exécution séquentielle de plusieurs étapes du traitement sur le même circuit afin de réduire l'encombrement du système.

La représentation des nombres

Pour l'unité de traitement, nous avons choisi la représentation des nombres réels en virgule fixe. La position de la virgule est définie arbitrairement selon l'ordre de grandeur des valeurs manipulées. Nous avons opté pour ce choix puisque les mesures issues des capteurs possèdent le même ordre de grandeur et peuvent en plus être normalisées afin de les ramener dans un intervalle donné. La normalisation de ces données peut en plus favoriser la convergence lors de l'apprentissage. Par conséquent la représentation en virgule fixe est donc bien adaptée pour répondre aux exigences du traitement, en outre les opérations arithmétiques en virgule fixe sont réalisées par des opérateurs entiers moins gourmands en silicium que les opérateurs à virgule flottante.

Adéquation algorithme/architecture

Il faut remettre en cause l'organisation des calculs, redéfinir les précisions de calcul et de codage des coefficients Wi trouvés lors de la phase d'apprentissage en utilisant des critères liés à la qualité souhaitée du résultat. Cette optimisation conduit à une réduction de la complexité tant au niveau algorithmique qu'architectural, en effet il faut toujours se préoccuper des performances en vitesse et de la réduction de la surface occupée lors d'une réalisation matérielle. Le problème de l'adéquation algorithme/architecture est reporté au niveau de la programmation des circuits dans un langage de haut niveau tel que le VHDL.

Utilisation du langage VHDL

La conception des opérateurs arithmétiques synthétisés sur FPGA, s'est concrétisée par l'utilisation du langage VHDL [ARM93]. L'écriture de ces opérateurs en VHDL, nous permet en phase de mise au point de nous abstraire du circuit final et nous donne toute la souplesse pour modifier ou améliorer ces circuits afin d'assurer leur évolution ultérieure. La programmation en VHDL permet aussi à partir des spécifications de " haut niveau " de rester indépendant de la technologie de placement et de la librairie de cellules logiques spécifique d'une famille de FPGA. Ceci constitue un réel avantage car l'évolution de la technologie est très rapide.
Précision de calcul
L'étude des algorithmes nous fournit le type et la taille des données manipulées afin de définir les caractéristiques de notre architecture finale. Les données peuvent êtres codées sur 4, 8 ou 16 bits selon la précision souhaitée et l'ordre de grandeur des données qui peuvent varier d'une étape de traitement à la suivante. Il est important d'adapter l'architecture des opérateurs arithmétiques en fonction des besoins et d'être capable de l'adapter temporairement en fonction de la précision du calcul souhaité. Ainsi en fixant la taille des représentations au plus juste nous pouvons réduire le temps de propagation, la surface et la consommation du circuit.


Réalisation du neurone

La description structurelle du neurone en VHDL permet lors de la compilation de spécifier certaines caractéristiques telles que le nombre d'entrées et l'étendue des données en bits de façon générique, et de changer éventuellement le type des opérateurs arithmétiques : l'additionneur et le multiplieur. Le neurone effectue d'abord le produit des données en entrée, mémorisées dans une RAM avec les poids synaptiques correspondants lesquels sont dans une EEPROM puis il les additionne. Le résultat de ces opérations est soumis à une unité qui approxime une fonction d'activation par segment.


Fig. architecture d'un neurone

Un découpage de l'architecture du neurone est fait en synthétisant séparément chaque circuit de base qui le constitue. Une mise bout à bout de ces circuits permet le pipeline des calculs.

Opérateurs arithmétiques

Codage des nombres en complément à 2
Il existe différents codages des nombres selon les besoins et les contraintes des calculs arithmétiques. Nous avons choisi le codage des nombres en complément à 2 puisqu'il permet d'exécuter des opérations de calcul arithmétiques sur des opérandes positifs ou négatifs sans avoir à se soucier du signe. Le résultat du traitement est aussi représenté dans le code du complément à 2, nous ne chercherons pas à retrouver le module du résultat d'une opération si le nombre doit être traité par la suite. Par contre, nous le faisons à la fin du traitement complet. La souplesse du codage des nombres en complément à 2 nous permet de considérer le bit du signe comme un bit ordinaire dans les opérations de calcul.

Dans le code du complément à 2, il est possible de représenter nombres différents, dont les valeurs sont comprises entre et avec h correspondant au nombre de chiffres que représente le nombre. La valeur d'un nombre codé en complément à 2 est donnée par l'équation avec représentant le nombre en complément à 2. Le choix d'une représentation des nombres en virgule fixe et d'une précision maximale limitée à 16 bits nous paraît à priori suffisante, ce qui permet d'atteindre un bon compromis temps/surface pour les opérateurs arithmétiques.

Opérateurs d'addition
Il existe différentes architectures [AUM96] pour les opérateurs d'addition, selon les contraintes et les performances souhaitées.

Opérateur d'addition à propagation de retenue séquentielle
Cette opérateur est construit à base d'une série d'additionneurs élémentaires à 1 bit, la retenue se propage séquentiellement à travers les additionneurs de base, du bit de poids faible vers le bit de poids fort. Cette opérateur présente l'avantage de pouvoir s'implanter dans une petite surface mais il possède une performances temporelle médiocre à cause de la propagation de la retenue séquentielle. Dans le cas où les délais temporels sont critiques, une autre architecture s'impose.

Si = Ai Å Bi Å Ci ...et... Ci+1 = Ai Bi + Ci (Ai Å Bi )


Figure : Additionneur à retenue séquentielle

Opérateur d'addition accélérée
Pour accélérer l'addition, il suffit d'éliminer la propagation de retenue (en les conservant de façon à ne pas perdre la valeur du résultat) en effectuant l'addition de manière complètement parallèle sur les seules variables connues avant l'addition. Ces opérateurs permettent la diminution des temps de calculs, toutefois leurs architectures sont nettement plus complexes et nécessitent beaucoup plus de surface.


Figure : Résultat de simulation d'un additionneur 8 bits

Opérateurs de multiplication
L'algorithme que nous avons retenu pour l'opérateur de multiplication est l'algorithme de booth [AUM96] car il permet de réaliser des multiplications signées, exprimées en complément à 2. Le principe de cette multiplication est de calculer toutes les sommes (MCi, MPi) en parallèles puis de les additionner. Il est constitué essentiellement d'un réseau de portes ET et d'un arbre d'additionneurs à propagation de retenue.

Fonction d'activation
Dans l'implantation des réseaux de neurones en circuits intégrés analogiques, la non linéarité est habituellement implicite dans une des autres opérations mises en œuvre dans le neurone, comme la multiplication ou l'addition analogique où l'amplificateur introduit la notion de saturation, par conséquent la nature de la fonction non linéaire est plutôt incontrôlée. Pour l'implantation des réseaux de neurones dans des circuits intégrés numériques en logique reconfigurable ou en VLSI, nous avons besoin d'implanter une fonction de transfert non linéaire spécifiée avec une précision arbitraire à la sortie de chaque neurone. Elle peut avoir plusieurs formes, mais nous nous sommes particulièrement intéressés à la fonction d'activation sigmoïde.

Plusieurs possibilités existent pour expliciter la fonction sigmoïde [CLA97]. Elle pourrait être exprimée par son développement limité tronqué avec une précision arbitraire qui est cher en temps de calcul et en surface de silicium, ou par une table de valeurs implantée dans une RAM ou dans une ROM dans laquelle à chaque valeur de X correspond une valeur de Y. Les valeurs de X étant utilisées pour adresser cette mémoire. Si X est un nombre sur 16 bits et Y est un nombre sur 8 bits, alors il faudrait 64 Koctets de cases mémoires par neurone ce qui requiert une surface de silicium importante. L'alternative est d'utiliser une approximation judicieuse linéaire par morceaux de la fonction, comme dans [MYE89] où il a été procédé à une segmentation linéaire de la fonction avec mémorisation des points critiques (extrêmes de chaque segment de droite). Dans ce cas, il s'agit donc d'une table de valeurs combinée avec une approximation linéaire. Dans notre cas, nous avons utilisé une approximation linéaire par morceaux proposée par [AMI97], où la fonction sigmoïde est divisée en 8 segments, avec X compris dans l'intervalle [-15, 15] et Y dans l'intervalle [0, 1].


Figure : La fonction sigmoïde et son approximation

La fonction sigmoïde et son approximation sont symétriques par rapport à [Y = 0.5, X = 0], ce qui implique que la fonction ne requiert que le calcul pour des valeurs positives de X afin de déterminer la valeur de la sortie Y, pour toutes valeurs de X. Pour les valeurs de X positives, la sortie Y se calcule directement. Pour les valeurs de X négatives, la sortie Y associée se déduit de l'équation suivante : Y* = 1 - Y où Y est la valeur calculée pour X > 0.

Nous donnons ci-après l'approximation de la fonction sigmoïde :



Les pentes des différentes droites ci-dessus sont choisies de telle manière que la multiplication puisse être remplacée par des opérations de décalage. Pour ne pas avoir à mémoriser les points extrêmes de chaque segment de droite, une implantation d'un comparateur d'amplitudes en logique combinatoire permet de sélectionner le segment de droite correspondant à Y en fonction de la valeur de X.



Ainsi dans le tableau, à partir de l'expression de X en binaire on déduit la logique du comparateur associé à la table de vérité correspondant au choix du segment de droite.



D'après les 2 tableaux précédents, l'implantation du comparateur d'amplitude est déduite :


Fig. comparateur d'amplitude

L'entrée X étant comprise dans l'intervalle [- 15, 15] est codée en virgule fixe sur 16 bits avec 1 bit pour le signe, 4 bits pour la partie entière et 11 bits pour la partie décimale. Alors que la sortie Y étant comprise entre [0, 1] est codé en virgule fixe sur 8 bits avec 1 bit pour le signe, 1 bit pour la partie entière et 6 bits pour la partie décimale. La précision peut être aisément étendue sur ces entrées/sorties avec un nombre de bits plus important, si besoin est.

Le schéma bloc de la fonction sigmoïde est présenté sur la figure ci-dessous


Fig. implantation de la fonction sigmoïde

Le bit de signe de X commande les deux multiplexeurs à l'entrée et à la sortie du schéma, ainsi que le bloc complément à 2. Si X est positif, le bloc complément à 2 est mis hors circuit et la valeur de X commande directement le bloc comparateur d'amplitudes via le multiplexeur. Si X est négatif, il est d'abord complémenté. Suivant la sortie (A1 - A4) du bloc comparateur d'amplitudes, le bloc de décalages et d'addition sélectionne les opérations correspondantes ( par exemple : si X est égal à 2, alors X est décalé vers la droite 3 fois puisque 0,12510 est égale à 0,0012 puis additionné à 0,62510 qui équivaut à 0.1012) afin de calculer la valeur de Y et 1-Y. Le signe de X permet de sélectionner parmi ces 2 valeurs, la sortie correspondante suivant que X est positif ou négatif.


Réalisation d'une couche

La description structurelle de la couche en VHDL permet lors de la compilation de spécifier le nombre de neurones sur la couche, cela nous donne la possibilité de synthétiser des couches à un nombre de neurones varié.


Figure : Architecture d'une couche

Adressage des RAMs et EEPROM
L'architecture comprend deux mémoires RAM distinctes qui fonctionnent alternativement en lecture puis en écriture. Cette sélection s'effectue avec un signal généré par le premier FPGA chargé entre autre de l'adressage des mémoires soit en écriture soit en lecture. Les données sont stockées dans une RAM adressée en écriture pendant que l'autre est adressée en lecture. Le bus de données étant commun, des buffers à 3 états commandés en même temps que l'adressage en écriture ou en lecture permet d'éviter tout conflit. En plus, un décodeur primaire permet de sélectionner une partie de l'EEPROM afin d'identifier des zones mémoires contenant les poids synaptiques correspondants à chacune des couches. Un décodeur secondaire permettant quand à lui de sélectionner des parties de zone correspondant à chaque neurone de la couche. La forme des décodeurs dépend de la structure du réseau de neurones choisi après la phase d'optimisation.


Réalisation du réseau

L'exploitation de la reconfiguration dynamique des circuits FPGA nous conduit à disposer de 2 RAM (RAM1 et RAM2) afin que les résultats issus du traitement de la couche de neurones (i - 1) soient traités par la couche de neurones suivante (i).

Exploitation de la reconfiguration dynamique
Jusqu'à présent, les systèmes à base de circuits FPGA utilisaient un mode de configuration statique dans lequel la reconfiguration était souvent exploitée afin de tester et valider une architecture. Par la suite, on configure le circuit FPGA une fois pour toutes, afin d'imiter la solution ASIC pour une application spécifique donnée [HUB96] parce que les durées de reconfiguration étaient de l'ordre de 100 ms ; avec une horloge à 10Mhz un composant XC4085x est reconfiguré en 192 ms [XIL97]. Les progrès technologiques récents ont conduit à une réduction des temps de reconfiguration à moins de 1 ms particulièrement pour la famille 6200 et au delà de Xilinx. Il est alors possible d'exploiter une procédure de reconfiguration dynamique, c'est-à-dire de reconfigurer le système ou une partie du système plusieurs fois durant l'exécution de la même application qui est alors décomposée en plusieurs étapes successives .


Figure : synoptique du principe de la reconfiguration dynamique

Principe
Ici l'architecture que nous proposons permet effectivement d'exploiter la reconfiguration dynamique. En effet, il s'agit d'implanter trois couches de neurones d'un perceptron multicouche qui s'exécutent successivement. Dans un premier temps, le système est configuré pour exécuter la première couche. Les résultats obtenus sont stockés dans une mémoire RAM2. La deuxième étape consiste à reprogrammer le même circuit pour l'exécution de la deuxième couche sur les données stockées précédemment. Les résultats de cette étape sont stockés dans une mémoire RAM1. Durant la dernière étape, nous reprogrammons le même circuit afin d'implanter la dernière couche et de l'exécuter sur les données précédentes, les résultats seront stockées dans la mémoire RAM2 et dirigés éventuellement vers l'extérieur.


Couplage mémoire/FPGA
L'architecture peut être composée autour de deux circuits FPGA, le premier étant dédié à la gestion des capteurs, à la gestion des mémoires et à la communication entre les différents modules ainsi que qu'au contrôle du deuxième circuit FPGA utilisé pour l'unité de traitement à reconfiguration dynamique. Une PROM (1) série (XC17128) contient le fichier correspondant au premier circuit FPGA, et 3 autres PROM (2, 3, 4) de même type, le fichier correspondant à chacune des 3 couches respectivement.

Le premier circuit FPGA est configuré en mode maître tandis que le deuxième est configuré en mode esclave, ce dernier mode permet la plus grande fréquence de transfert des fichiers binaires entre PROM et circuit FPGA (~10 Mhz).

A la mise sous tension le premier circuit assure l'initialisation en envoyant un reset aux 3 PROMs et au deuxième circuit afin de permettre le chargement de la configuration de la première couche. Le transfert du fichier de la PROM (2) vers le deuxième circuit permet d'implanter la première couche, son exécution se fait sur les données de la RAM1. Le résultat de la première couche est stocké dans la RAM2. Dès la fin de l'exécution, le circuit de contrôle reinitialise l'unité de traitement afin de la reconfigurer par l'implantation de la deuxième couche via la PROM (3). La même procédure est réalisée par la suite pour la dernière couche.


Figure : schéma du couplage mémoire/FPGA

Cet exemple ne constitue qu'une vue très partielle des possibilités offertes par un circuit FPGA qui dans l'ensemble du projet [TAR99] dont est extrait ce module réseau de neurones artificiels, gère le conditionnement des capteurs, l'acquisition des données et tous les processus de transmission internes et externes.

Conclusion
Les quelques pages qui précèdent ne sont qu'un très petit aperçu de quelques techniques utilisables en traitement du signal dans le but d'extraire une information pertinente d'un dispositif dont les capteurs sont très imparfaits.
Ce qu'il est important de noter c'est qu'on dispose dorénavant de très nombreuses possibilités d'exploiter des principes de mesure qui, a priori, sont inadaptés, dès lors qu'on a une bonne idée de ce qu'on veut obtenir et de ce que fournit réellement le capteur.
Mais, si l'on n'a aucune connaissance sur les défauts du capteur, il n'y aura pas de miracle, le traitement du signal aussi sophistiqué soit-il ne pourra vous venir en aide correctement


[AMA95] J.L. Amat, G. Yahiaoui, techniques avancées pour le traitement de l'information, Cépaduès, Toulouse, 1995.

[AMI97] H. Amin & al., Piecewise linear approximation applied to non linear function of neural network, IEE Proc- Circuits Devices Syst., vol 144(6), pp 313-317, 1997.

[ARM93] J.R. Armstrong and FG. Gray, Structured logic design with VHDL, Prentice Hall, New Jersey, 1993.

[ARN97] M.G. Arnold & al., On the cost effectiveness of logarithmic arithmetic for backpropagation training on SIMD processors, ICNN'97 Proc., Vol2, pp 933-936.

AUG99] F. Auger, introduction à la théorie du signal et de l'information, Technip, Paris, 1999.

[AUM96] M Aumiaux, Logique arithmétique et techniques synchrones : arithmétique binaire et décimale, conception synchrone des ASICs et des FPGAs, Masson, Paris, 1996.

[BAH96] M. Bahoura, M.Hassani and M.Hubin. Real Time Wavelet Transform Implementation for ECG Waves Forms Detection and Heart Rate Analysis. Med. Biol. Eng. Comp., Vol. 34, Sup. 1, Part 1, pp. 387-388, 1996.

[BAH97] M. Bahoura, M. Hassani, S.G. Lee et M. Hubin, Modification de la méthode de Widrow pour l'élimination de l'interférence 50 Hz du signal ECG. Innov. Tech. Biol. Med., 18, 2, pp. 119-127, 1997.

[BAR91] M. Barrat, O. Lepetit. Calcul rapide de la transformée en ondelettes. Traitement du Signal, Vol. 8, No. 1, pp. 43-49, 1991.

[BEL93] M. Bellanger. Traitement Numérique du Signal. Masson, Paris, 1993.

[CLA93] P.M Clarkson, Optimal and adaptative signal processing, CRC Press, NY, 1993.

[CLA97] PJC. Clare & al., Design and tuning of FPGA implementations of neural networks, SPIE Proc., vol 3069, pp 129-136, 1997.

[COH90] A. Cohen. Ondelettes, Analyses Multirésolutions et Traitement Numérique du Signal. Thèse Univ. de Paris IX-Dauphine, 1990.

[DAU88] I. Daubechies. Orthonormal Bases of Compactly Supported Wavelets. Comm. on Pure and Applied Math., Vol. XLI, pp. 909-996, 1988.

[DUV91] P. Duvaud, traitement du signal, concepts et applications, Hermès, Paris, 1991.

[FAC94] I. Fachrudin, M. Hassani, M. Hubin. Pattern recognation waves forms using wavelet transform: experimental results in the sudden infant death syndrome monitoring. Proceedings of the International Conference on Medical Physics & Biomedical Engineering Nicosia (Cyprus), Vol. 1, pp. 212-216, 1994.

[FLA93] P. Flandrin. Temps-fréquence. Hermes, Paris, 1993.

[HOR95] G. Horner, Technisches Messen, (4) 1995, pp 166-172

[HUB96] M. Hubin et Y.Taright, Nouveau concept de télésurveillance médicale en vue de l'application aux malaises du nourrisson, Congrès GELFMSN, 13-14 déc 96., St Malo, pp. 112, 1996.

[KUN91] M. Kunt. Tech. Modernes de Traitement Numérique des Signaux. PPUR, Neuchatel, 1991.

[LUCA94] B. Lucazeau., H. Trézéguet.. ASIC : Circuits intégrés pour application spécifique. Techniques de l'Ingénieur, vol. E2-418, pp. 1-16, 1994..

[MAL89] S.G. Mallat. A Theory for Multiresolution Signal Decomposition: The Wavelet Representation. IEEE Trans. on Pattern Analysis and Machine Intelligence, Vol. 11, No. 7, pp. 674-693, July 1989.

[MEY87] Y. Meyer, S. Jaffard, O. Rioul. L'analyse par Ondelettes. Pour la Science, pp. 28-37, Septembre 1987.

[MEY92] Y. Meyer. Les ondelettes, algorithmes et applications. Armand Collin, Paris, 1992.

[PAR97] S. Park & al., Digital implementation of discrete-time cellular neural networks with distributed arithmetic, IEEE-ICNN'97 Proc., Vol 2, pp 959-963, 1997.

[RIO91] O. Rioul, M. Vetterli. Wavelets and Signal Processing. IEEE SP Magazine, pp. 14-36, Oktober 91.

[SEN93a] L. Senhadji. Approche Multirésolution pour l'Analyse des Signaux Non Stationnaires. Thèse Univ. de Rennes 1, 1993.

[TAR98] L. Tarassenko, A guide to neural computing applications, Arnold, London, 1998.

[TAR99] Y. Taright, Contribution à l'analyse de la pollution atmosphérique chronique ou accidentelle : concept de nez électronique ambulatoire, Thèse de doctorat, Rouen, 1999.

[TUT88] F.B. Tuteur. Wavelet Transformations in Signal detection. Wavelets, pp. 132-138, Springer-Verlag, Berlin, 1988.

[WID75] B.Widrow and al. Adaptive noise cancelling: principles and applications. Proceedings IEEE, vol. 63, no.12, pp. 1692-1716,1975.

[VIE94] Viewlogic. . VHDL reference manual. 1994.

[XIL94] Xilinx. . The programmable logic, data book. Xilinx Inc, USA. 1994.

[XIL97] Xilinx.. XC4000E and XC4000X Series, data book. Xilinx Inc, USA.1997.

[XIL98] Xilinx. . Synthesis and simulation design guide. Xilinx Inc, USA. 1998.


Hit-Parade