Projet de master Laboratoire de Systèmes Microélectroniques (LSM), EPFL 23.02.07



Documents pareils
INTRODUCTION A L ELECTRONIQUE NUMERIQUE ECHANTILLONNAGE ET QUANTIFICATION I. ARCHITECTURE DE L ELECRONIQUE NUMERIQUE

Étude des Corrélations entre Paramètres Statiques et Dynamiques des Convertisseurs Analogique-Numérique en vue d optimiser leur Flot de Test

V- Manipulations de nombres en binaire

Transmission de données. A) Principaux éléments intervenant dans la transmission

Transmission d informations sur le réseau électrique

La conversion de données : Convertisseur Analogique Numérique (CAN) Convertisseur Numérique Analogique (CNA)

Chap17 - CORRECTİON DES EXERCİCES

Chapitre 18 : Transmettre et stocker de l information

Numérisation du signal

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

Chaine de transmission

EMETTEUR ULB. Architectures & circuits. Ecole ULB GDRO ESISAR - Valence 23-27/10/2006. David MARCHALAND STMicroelectronics 26/10/2006

TP Modulation Démodulation BPSK

Systèmes de transmission

VIII- Circuits séquentiels. Mémoires

Chapitre 13 Numérisation de l information

Représentation des Nombres

UE 503 L3 MIAGE. Initiation Réseau et Programmation Web La couche physique. A. Belaïd

J AUVRAY Systèmes Electroniques TRANSMISSION DES SIGNAUX NUMERIQUES : SIGNAUX EN BANDE DE BASE

Chapitre 2 : communications numériques.

ELP 304 : Électronique Numérique. Cours 1 Introduction

Logique binaire. Aujourd'hui, l'algèbre de Boole trouve de nombreuses applications en informatique et dans la conception des circuits électroniques.

Régler les paramètres de mesure en choisissant un intervalle de mesure 10µs et 200 mesures.

Etudier l influence de différents paramètres sur un phénomène physique Communiquer et argumenter en utilisant un vocabulaire scientifique adapté

Cours 9. Régimes du transistor MOS

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

ISO/CEI NORME INTERNATIONALE

Cours d électricité. Circuits électriques en courant constant. Mathieu Bardoux. 1 re année

Université de La Rochelle. Réseaux TD n 6

CAPTEURS - CHAINES DE MESURES

LES CARACTERISTIQUES DES SUPPORTS DE TRANSMISSION

QUESTION 1 {2 points}

I- Définitions des signaux.

Filtres passe-bas. On utilise les filtres passe-bas pour réduire l amplitude des composantes de fréquences supérieures à la celle de la coupure.

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

P1PY7204 Acquisition de données Cours

LES DIFFÉRENTS FORMATS AUDIO NUMÉRIQUES

Les portes logiques. Voici les symboles des trois fonctions de base. Portes AND. Portes OR. Porte NOT

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Partie Agir : Défis du XXI ème siècle CHAP 20-ACT EXP Convertisseur Analogique Numérique (CAN)

Projet audio. Analyse des Signaux ELE2700

GPA770 Microélectronique appliquée Exercices série A

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Les techniques de multiplexage

LÕenregistrement Enregistrement analogique et enregistrement numžrique

1 Architecture du cœur ARM Cortex M3. Le cœur ARM Cortex M3 sera présenté en classe à partir des éléments suivants :

Electron S.R.L. - MERLINO - MILAN ITALIE Tel ( ) Fax Web electron@electron.it

Equipement. électronique

Systèmes de communications numériques 2

Fonctions de plusieurs variables

Informatique Générale

Conversion d un entier. Méthode par soustraction

Représentation d un entier en base b

Sujet proposé par Yves M. LEROY. Cet examen se compose d un exercice et de deux problèmes. Ces trois parties sont indépendantes.

Expérience 3 Formats de signalisation binaire

DimNet Gradateurs Numériques Evolués Compulite. CompuDim 2000

- Instrumentation numérique -

Eléments constitutifs et synthèse des convertisseurs statiques. Convertisseur statique CVS. K à séquences convenables. Source d'entrée S1

SUIVI CINETIQUE PAR SPECTROPHOTOMETRIE (CORRECTION)

ÉVALUATION FORMATIVE. On considère le circuit électrique RC représenté ci-dessous où R et C sont des constantes strictement positives.

CHAPITRE V. Théorie de l échantillonnage et de la quantification

ECTS INFORMATIQUE ET RESEAUX POUR L INDUSTRIE ET LES SERVICES TECHNIQUES

TP 7 : oscillateur de torsion

PlantVisorPRO. Supervision d installations. Manuel rapide. Integrated Control Solutions & Energy Savings

0 20mV; 0 40mV; 0 80mV; 0 160mV; 0 320mV; 0 640mV; 0 1,28V; 0 2,56V 0 5V; 0 10V

Nombres, mesures et incertitudes en sciences physiques et chimiques. Groupe des Sciences physiques et chimiques de l IGEN

I. TRANSMISSION DE DONNEES

TS 35 Numériser. Activité introductive - Exercice et démarche expérimentale en fin d activité Notions et contenus du programme de Terminale S

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Technique de codage des formes d'ondes

ASR1 TD7 : Un microprocesseur RISC 16 bits

G.P. DNS02 Septembre Réfraction...1 I.Préliminaires...1 II.Première partie...1 III.Deuxième partie...3. Réfraction

Chapitre 22 : (Cours) Numérisation, transmission, et stockage de l information

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Convertisseurs statiques d'énergie électrique

LA COUCHE PHYSIQUE EST LA COUCHE par laquelle l information est effectivemnt transmise.

Fiche technique CPU 314SC/DPM (314-6CG13)

Continuité et dérivabilité d une fonction

Contribution à la conception par la simulation en électronique de puissance : application à l onduleur basse tension

Réseau Global MIDI Note applicative

Conception des systèmes répartis

Information. BASES LITTERAIRES Etre capable de répondre à une question du type «la valeur trouvée respecte t-elle le cahier des charges?

Théorie et Codage de l Information (IF01) exercices Paul Honeine Université de technologie de Troyes France

! analyse du fonctionnement

SOCLE COMMUN - La Compétence 3 Les principaux éléments de mathématiques et la culture scientifique et technologique

ANALYSE TRAMEs LIAISON SERIE

EP A1 (19) (11) EP A1 (12) DEMANDE DE BREVET EUROPEEN. (43) Date de publication: Bulletin 2011/26

Extrait des Exploitations Pédagogiques

Intérêt du découpage en sous-bandes pour l analyse spectrale

TD : Codage des images

Les indices à surplus constant

Electron S.R.L. SERIE B46 - SYSTEMES DIDACTIQUES DE TELEPHONIE

document proposé sur le site «Sciences Physiques en BTS» : BTS AVA 2015

SYSTEME DE PALPAGE A TRANSMISSION RADIO ETUDE DU RECEPTEUR (MI16) DOSSIER DE PRESENTATION. Contenu du dossier :

Projet de synthèse de l'électronique analogique : réalisation d'une balance à jauges de contrainte

MEMOIRES MAGNETIQUES A DISQUES RIGIDES

Atelier C TIA Portal CTIA04 : Programmation des automates S7-300 Opérations numériques

TD1 Signaux, énergie et puissance, signaux aléatoires

Transcription:

Projet de master Laboratoire de Systèmes Microélectroniques (LSM), EPFL 23.02.07 Etudiant : François EMERY Superviseur : Alain VACHOUX Professeur : Yusuf LEBLEBICI

Table des matières 1. Introduction...3 2. Convertisseurs...4 2.1. Types de conversion A/D...7 2.1.1. Conversion A/D temporelle...7 2.1.2. Conversion A/D de Fourier...8 2.1.3. Conversion A/D de Walsh-Hadamard...10 3. Générateur d Hadamard...11 3.1. Matrices d Hadamard...12 3.2. Fonctions d Hadamard...14 3.2.1. Simulation du générateur d Hadamard numérique...14 3.2.2. Synthèse du générateur d Hadamard numérique en portes logiques...14 3.2.3. Placement et routage du générateur d Hadamard numérique...17 4. Bloc de modulation...19 4.1. Structure d intégration...20 4.2. Génération des signaux de commande...23 4.3. Gain et retard du bloc de modulation...25 4.4. Adaptation à un système différentiel...27 5. Bloc ADC...28 5.1. Etage pipeline...29 5.2. Décodeur...31 5.2.1. Banc de registres...31 5.2.2. Additionneur à redondance...32 5.3. Imperfections modélisées...33 5.4. Adaptation à un système différentiel...34 5.5. Résultats ADC...35 5.5.1. Correction d erreurs...35 5.5.2. Résultats de simulations...36 6. Démodulateur de Walsh-Hadamard...37 6.1. Principe de démodulation...38 6.1.1. Démodulateur à 2 canaux...38 6.1.2. Démodulateur à 4 canaux...39 6.2. Structure du démodulateur développé...41 6.3. Simulation du démodulateur...43 6.3.1. Synthèse du démodulateur de Walsh-Hadamard en portes logiques...44 6.3.2. Placement et routage du générateur d Hadamard numérique...45 7. Système complet...47 7.1. Générateur de fonctions d Hadamard...47 7.2. Modulateur...48 7.3. Convertisseurs ADC pipelines...50 7.4. Démodulateur...52 1/106

7.5. Convertisseur de Walsh-Hadamard complet...54 7.6. Résultats de simulation...55 7.6.1. Cas à 2 canaux...55 7.6.2. Cas à 4 canaux...57 8. Conclusion...59 9. Remerciements...60 10. Bibliographie...60 11. Annexes techniques...61 11.1. Algorithme : Générateur d Hadamard...61 11.1.1. Fonctions de Walsh...61 11.1.2. Construction du générateur d Hadamard...67 11.2. Algorithme démodulateur...71 11.2.1. 1 ère Etape : Conversion std_logic_vector / unsigned...72 11.2.2. 2 ème Etape : Opérations arithmétiques...73 11.2.3. 3 ème Etape : Système de switches de sortie...77 12. Annexes code...79 12.1. Code VHDL du Package...79 12.2. Code VHDL du générateur de fonctions de Walsh-Hadamard...80 12.3. Code VHDL du démodulateur générique de Walsh-Hadamard...81 12.4. Code VHDL / VHDL- AMS du modulateur...84 12.5. Code VHDL / VHDL-AMS du Convertisseur pipeline...89 12.6. Code du système complet...102 2/106

1. Introduction Le but de ce projet consiste à développer un modèle comportemental, en utilisant les langages VHDL et VHDL-AMS, des différentes parties d un convertisseur parallèle imaginé par G. Ding utilisant, pour la modulation, les fonctions de Walsh-Hadamard. La contribution au design d un tel convertisseur proviendra essentiellement du développement d algorithmes génériques chargés de modéliser les deux principaux blocs digitaux de ce circuit, à savoir le générateur d Hadamard, fournissant les fonctions utilisées pour la modulation ainsi que pour la création de tous les signaux de commande utiles au fonctionnement du système complet, et le démodulateur, chargé de recombiner les signaux modulés afin de restituer correctement le mot de sortie du système. Les codes de ces deux blocs génériques seront alors synthétisés pour aboutir à des layout importables sur Cadence qui seront utilisés par G. Ding pour la réalisation d un prototype de convertisseur de Walsh-Hadamard complet intégré réalisé dans la technologie umc 0.18μ. Pour pouvoir simuler le système complet, deux autres blocs analogiques ont été modélisés en utilisant une démarche montante qui consiste à partir de blocs déjà réalisés au niveau transistor pour aboutir à une modélisation comportementale de ces derniers ayant un certain niveau d abstraction. Les modèles devront posséder une structure identique à l implémentation physique c'est-à-dire avoir les mêmes entrées et sorties et devront être capables de simuler le comportement global du circuit sans pour autant modéliser toutes les imperfections liées à l implémentation physique réelle. Pour ce faire, le langage que nous avons utilisé est le langage VHDL-AMS qui offre une grande flexibilité d utilisation et la possibilité d ajout d imperfections. Ce langage présente l avantage d être beaucoup plus rapide à simuler qu un modèle au niveau purement transistor et infiniment plus flexible dans le cas où l on veut pouvoir tester le comportement approximatif du circuit au changement d un paramètre comme le nombre de canaux utilisés. Le langage VHDL-AMS représente donc un bon compromis entre flexibilité et réalisme de la modélisation répondant ainsi pleinement aux objectifs de ce projet. Le chapitre 2 explicitera l utilité et les avantages d un convertisseur parallèle utilisant les fonctions de Walsh-Hadamard par rapport à un convertisseur usuel. Les chapitres 3 à 6 décriront les blocs élémentaires développés dans le cadre de ce projet qui constitueront les éléments de base du convertisseur complet de Walsh-Hadamard. Le chapitre 7 présentera la structure du convertisseur de Walsh-Hadamard complet générique que nous avons réalisé et simulé en utilisant à la fois ADVance MS et l environnement Cadence. Le chapitre 8 reprendra les points importants de ce projet. Les chapitres suivants sont les annexes et contiennent notamment les codes ainsi que les explications des algorithmes développés pour les blocs digitaux. 3/106

2. Convertisseurs Les convertisseurs analogique-numérique (convertisseurs A/D) ont pour but de convertir un signal analogique en un signal numérique (digital) composé de mots numériques codés en binaires. Cette transformation, appelée numérisation, comporte deux activités distinctes : l échantillonnage, consistant à prélever périodiquement des échantillons du signal analogique, et la quantification qui a pour but d attribuer une valeur numérique à chaque échantillon prélevé. La qualité du signal numérique récupéré à la sortie du convertisseur dépendra donc de deux facteurs : 1) La fréquence d échantillonnage : Plus celle-ci est grande, plus le nombre d échantillons prélevés est important et donc plus le signal de sortie sera fidèle à l original 2) La résolution : Plus la résolution est fine, plus le nombre de valeurs que peut prendre la sortie dans l intervalle spécifié sera grand et donc meilleure sera la qualité du signal de sortie Pour ne pas perdre d information lors de la conversion d un signal, la fréquence d échantillonnage doit respecter le théorème de l échantillonnage de Shannon. Ce dernier nous donne l inéquation suivante entre la fréquence théorique d échantillonnage minimum f e et la fréquence maximum du signal d entrée f max : f e > 2*f max Si la fréquence d échantillonnage se situe en dessous de cette limite théorique, il y a alors forcément perte d information lors de la conversion A/D et il n est plus possible de reconstituer correctement le signal à partir de la sortie numérique du convertisseur D/A. Un exemple de non-respect du théorème d échantillonnage de Shannon est montré à la figure 2-1. Un sinus de fréquence f 1 à numériser est appliqué à l entrée d un convertisseur A/D ayant une fréquence d échantillonnage inférieure à 2* f 1. Le signal de sortie de ce convertisseur est alors envoyé dans un convertisseur D/A chargé de reconstituer le sinus. Dans cet exemple, T e = 1.1*T Figure 2-1 : Non-respect du théorème d échantillonnage de Shannon 4/106

Nous pouvons voir que le signal apparent de sortie ne correspond pas au signal d entrée. Le convertisseur A/D doit donc avoir une fréquence d échantillonnage respectant le théorème de Shannon pour fonctionner correctement. En pratique, la condition sur la fréquence d échantillonnage est beaucoup plus sévère que celle théorique imposée par le théorème de Shannon et ce pour assurer une conversion suffisamment fidèle du signal d entrée. Une fréquence minimum d échantillonnage de 20 fois la fréquence maximale du signal à convertir sera en principe utilisée (loi empirique). f e > 20*f max Les convertisseurs standards actuels (comme les convertisseurs A/D flash par exemple) fonctionnent à des fréquences d échantillonnage suffisamment élevées pour la plupart des applications, mais dans certains cas où le signal d entrée à convertir est à très haute fréquence, un taux d échantillonnage plus élevé peut être requis. Ceci peut notamment être le cas dans les applications radars ainsi que pour certains systèmes de communication. Dans ce cas, une solution possible consiste à utiliser plusieurs canaux, possédant chacun un convertisseur, en parallèle. Dans le cas d un système à N canaux (donc N convertisseurs), la fréquence de travail de chaque convertisseur peut alors être N fois inférieure à la fréquence d échantillonnage requise. Il est donc possible d utiliser N convertisseurs en parallèle travaillant à une fréquence valant f e /N à la place d un simple convertisseur à la fréquence f e. Les configurations de la figure 2-2 et 2-3 sont donc fonctionnellement identiques. Figure 2-2 : Convertisseur simple canal : fréquence f e Figure 2-3 : Convertisseur à N=4 canaux : fréquence f e /N= f e /4 5/106

Si l on considère que les convertisseurs travaillent à la même fréquence dans les deux cas, la configuration à N canaux permettra de convertir correctement (c'est-à-dire en respectant la condition empirique sur la fréquence d échantillonnage donnée plus haut) des signaux d entrée ayant une fréquence N fois supérieure à celle pouvant être convertie en utilisant un seul convertisseur. Le prix à payer pour ce faire est une augmentation de la complexité du circuit de part l utilisation de N modulateurs et d un démodulateur. Quelque soit le type de convertisseur parallèle utilisé, il contiendra toujours N modulateurs, N convertisseurs et un bloc de démodulation. Les modulateurs servent à diviser le signal d entrée en N signaux orthogonaux, ce qui sera réalisé en multipliant l entrée par les fonctions U j d une base. Les convertisseurs traduisent la valeur d entrée analogique en un mot de sortie digital. Le bloc de démodulation est chargé de reconstituer le signal de sortie à partir des signaux partiels délivrés par chaque canal. Il convient de relever que la base [U 1,, U N ] utilisée par les modulateurs doit impérativement être orthogonale pour que les signaux convertis puissent être reconstruits univoquement par le démodulateur. Les fonctions U j correspondent aux lignes des matrices utilisées comme base répétées périodiquement. 6/106

2.1. Types de conversion A/D Dans cette partie, nous allons brièvement présenter les deux principaux moyens de conversion analogique-numérique (conversion A/D temporelle et conversion A/D de Fourier) usuellement utilisés et les comparer à la conversion A/D de Walsh-Hadamard utilisée par le circuit qui nous intéresse. 2.1.1. Conversion A/D temporelle La base orthogonale pour ce type de conversion est la matrice identité : 1 0 0 0 0 1 0 0 Figure 2-4 : Matrice pour conversion A/D temporelle (cas N=4 : 4 canaux). Le principe de fonctionnement de cette conversion temporelle réside dans le fait que chaque canal prend en charge seulement 1 échantillon toutes les N périodes d échantillonnage. En d autres termes, pour un système à quatre canaux, le convertisseur du canal 1 s occupe des échantillons 1, 5, 9,, celui du canal 2 des échantillons 2, 6, 10,, celui du canal 3 : 3,7,11, et finalement celui du canal 4 : 4, 8, 12,.... Ce principe de fonctionnement est illustré à la figure 2-6. Chaque convertisseur dispose donc de quatre fois (N fois dans le cas à N canaux) plus de temps pour effectuer la conversion et peut donc travailler avec une fréquence d échantillonnage 4 (N) fois plus petite que si un seul convertisseur était utilisé. 0 0 1 0 0 0 0 1 Figure 2-5 : Schéma de principe de la conversion A/D temporelle (cas N=4 : 4 canaux) 7/106

sample_1 sample_1 canal 1 sample_2 hold_1 hold_1 sample_2 t canal 2 sample_3 hold_2 t canal 3 sample_4 hold_3 t canal 4 hold_4 t Figure 2-6 : Principe de fonctionnement des Sample & Hold Un point restreint cependant fortement l utilisation de ce type de conversion pour des applications à très haute fréquence. Il s agit de sa forte sensibilité à tout problème de synchronisation entre les divers canaux qui limite sérieusement la fréquence maximale du signal d entrée. Les résultats de cette sensibilité sont particulièrement visibles pour des signaux ayant des composantes très hautes fréquences car ils peuvent varier fortement entre deux prises d échantillons et il faut donc assurer un synchronisme parfait entre les divers canaux. 2.1.2. Conversion A/D de Fourier La base orthogonale pour ce type de conversion est la matrice de Fourier donnée ci-dessous : 1 1 1 1 e e e 1 π j 2 jπ 3π j 2 e e e Figure 2-7 : Matrice pour conversion A/D de Fourier (cas N=4 : 4 canaux) Dans cette approche, les canaux ne sont pas utilisés successivement comme dans le cas de la conversion temporelle mais le sont continuellement. Chaque canal ne prend en revanche en charge qu une partie f max / N du spectre fréquentiel du signal d entrée (f max = fréquence maximum du signal d entrée) ce qui réduit la fréquence du signal entrant dans chaque convertisseur à f max / N et leur permet ainsi de travailler avec une fréquence d échantillonnage N fois plus petite que dans le cas où un seul convertisseur est utilisé, tout en respectant la contrainte liant la fréquence d échantillonnage à la fréquence maximale du signal d entrée du convertisseur. 1 jπ j2π j3π e e e 1 3π j 2 j3π 9π j 2 8/106

Le principe de fonctionnement de ce type de convertisseur est donné à la figure 2-8. Il nécessite l utilisation d un élément intégrateur (filtre passe-bas) placé juste après la multiplication du signal d entrée par les fonctions tirées de la matrice de Fourier et sert à limiter le spectre fréquentielle pris en charge par chaque canal à une fréquence f max / N. Figure 2-8 : Schéma de principe de la conversion A/D de Fourier (cas N=4 : 4 canaux) Ce type de système offre l énorme avantage d être beaucoup moins sensible à d éventuels problèmes de synchronisation que ne l est la conversion A/D temporelle. Cela est dû au fait que tous les canaux sont pilotés par les mêmes signaux d horloge et ne sont pas utilisés successivement. Cette conversion présente cependant deux désavantages majeurs qui résident premièrement dans le fait que le signal d entrée doit théoriquement être périodique pour que ce circuit fonctionne parfaitement et deuxièmement dans la forte complexité du circuit avec notamment l introduction de parties réelles et imaginaires qui nécessitent un dédoublement de chaque canal pour pouvoir traiter chaque partie séparément. Le démodulateur, chargé d effectuer la transformée de Fourier inverse, est également très lourd à implémenter. La conversion A/D de Fourier est donc physiquement (implémentation sur circuit imprimé) très lourde à réaliser de part son niveau extrêmement élevé de complexité (surtout pour la démodulation). 9/106

2.1.3. Conversion A/D de Walsh-Hadamard La base orthogonale utilisée pour ce type de conversion est la matrice d Hadamard : + 1 + 1 + 1 + 1 + 1 1 + 1 1 + 1 + 1 1 1 + 1 1 1 + 1 Figure 2-9 : Matrice pour conversion A/D de Walsh-Hadamard (cas N=4 : 4 canaux) La conversion A/D réalisée à l aide de la base d Hadamard possède l avantage d être peu sensible aux problèmes de synchronisation comme la conversion de Fourier, mais est beaucoup plus simple à implémenter physiquement. De plus, l utilisation des fonctions de Walsh-Hadamard permet d obtenir un convertisseur plus général que celui utilisant les fonctions de Fourier en étant beaucoup moins exigeant sur la périodicité du signal d entrée. Figure 2-10 : Schéma de principe de la conversion A/D de Walsh-Hadamard (cas N=4 : 4 canaux) Ce type de conversion n est cependant applicable qu à des systèmes ayant un nombre limité de canaux (4, voir au maximum 8), les fonctions de Walsh-Hadamard ayant des composantes haute fréquence difficilement gérables si l on élève ce nombre. La suite de ce rapport sera dédiée exclusivement à ce type de convertisseur. Les chapitres qui suivent ont pour but de présenter les différents blocs d un tel convertisseur représenté à la figure 2-10, à savoir le générateur de fonctions d Hadamard (chargé de fournir les signaux contenus dans les matrices d Hadamard utilisés pour la modulation et la génération de tous les signaux de contrôle du convertisseur), le bloc de modulation, les convertisseurs A/D ainsi que le bloc de démodulation. 10/106

3. Générateur d Hadamard La base que nous allons utiliser pour moduler le signal d entrée est la base d Hadamard qui, pour des raisons de reconstruction univoque du signal d entrée, est orthogonale (le produit scalaire entre deux fonctions appartenant à cette base est nul). Outre l utilisation des fonctions tirées de cette base pour la modulation du signal d entrée, elles serviront également à la construction de tous les signaux de commande utiles aussi bien au fonctionnement des blocs de modulation, aux convertisseurs de chaque canal ainsi qu au démodulateur. Pour garantir la plus grande souplesse d utilisation, nous avons développé un générateur générique (à l aide du langage VHDL) capable de fournir les N_hadamard premières fonctions d Hadamard numériques ainsi que leurs complémentaires et ceci à partir d un simple signal d horloge en entrée. Ces fonctions seront utilisées par la suite pour le contrôle du circuit complet. Il est à noter que la valeur N_hadamard devra être une puissance de 2 compte tenu de la nature des fonctions d Hadamard et de la méthode générique utilisée pour implémenter ce bloc. La suite de ce chapitre sera consacrée exclusivement à l explication de ce que sont les fonctions d Hadamard ainsi qu à l analyse des résultats provenant des diverses simulations du code développé pour ce générateur, réalisées à différents niveaux d abstraction (avant synthèse, synthétisé au niveau portes logiques et après placement-routage); l explication de la méthodologie utilisée pour aboutir à ce code figurant dans les annexes techniques du chapitre 11. La vue symbolique d un générateur d Hadamard à 8 fonctions est donnée ci-dessous : Figure 3-1 : Générateur des 8 premières fonctions d Hadamard 11/106

3.1. Matrices d Hadamard La base d Hadamard est composée des vecteurs contenus dans les matrices d Hadamard. Ces dernières sont des matrices carrées dont les coefficients valent soit +1, soit -1 et dont les lignes sont orthogonales entre elles. Elles peuvent être construites simplement de manière récursive en utilisant la propriété suivante dite propriété de Sylvestre : avec Où n = nombre de lignes et de colonnes de la matrice d Hadamard En appliquant cette méthode de manière récursive, il est aisé de construire les matrices d ordre 2 k pour tout entier naturel k. Ces dernières sont symétriques et présentent la particularité d avoir leur 1 ère ligne et leur 1 ère colonne remplis uniquement d éléments positifs, le reste de la matrice étant composé à part égal d éléments négatifs et positifs. Les matrices d Hadamard d ordre 2, 4 et 8 construites à l aide de la propriété ci-dessus sont les suivantes : Figure 3-2 : Matrices d Hadamard 12/106

Ce que nous appellerons, par abus de langage, les fonctions d Hadamard logiques sont les signaux binaires tirés des lignes des matrices d Hadamard, le +1 correspondant à un 1 logique et le -1 à un 0, répétées périodiquement. La fonction d Hadamard d ordre i est déduite de la ligne i+1 de n importe quelle matrice d Hadamard. La fonction d Hadamard d indice 0 (HAD0) équivaudra à la 1 ère ligne de n importe quelle matrice d Hadamard répétée périodiquement et sera donc constante à la valeur 1. La fonction d indice 1 (HAD1) obtenue à l aide de la seconde ligne des matrices d Hadamard alternera les valeurs 1 et 0 et ainsi de suite. Les huit premières fonctions d Hadamard logiques sont représentées à la figure 3-3, l horloge d entrée du générateur correspondant au signal d horloge du convertisseur de Walsh- Hadamard : Figure 3-3 : Représentation des 8 premières fonctions d Hadamard 13/106

3.2. Fonctions d Hadamard La méthode complète utilisée pour obtenir les N_hadamard premières fonctions d Hadamard et leurs complémentaires à partir d un unique signal d horloge comme entrée est décrite en détail dans l annexe technique (chapitre 11.1) et ne sera pas détaillée dans cette partie. Pour information, elle est basée sur un système de divisions fréquentiels du signal d entrée dont les signaux résultants, combinés entre eux, permettent de fournir toutes les fonctions d Hadamard. Par exemple, toutes les fonctions d Hadamard de la figure 3-3 peuvent être optenues en combinant les fonctions résultants de divisions fréquentiels par 2, 4 et 8 comme représenté dans la figure suivante : Figure 3-4 : Signaux résultant de divisions fréquentiels 3.2.1. Simulation du générateur d Hadamard numérique Le résultat de la simulation sur Modelsim du code générique du générateur d Hadamard numérique pour N_hadamard = 8 est représenté à la figure 3-5. Figure 3-5 : 8 premières fonctions d Hadamard numériques Les fonctions d Hadamard logiques ainsi que leurs inverses correspondent bien aux résultats escomptés, représentés à la figure 3-3. 3.2.2. Synthèse du générateur d Hadamard numérique en portes logiques Le code VHDL du générateur d Hadamard numérique générique a été synthétisé au niveau porte logique à l aide du programme Synopsys Design Vision. 14/106

Le circuit réel nécessitera les 8 premières fonctions d Hadamard et devra pouvoir fonctionner jusqu à une fréquence maximum de 400 Mhz. A cette étape, nous avons synthétisé en portes logiques le générateur d Hadamard générique que nous avons développé avec une contrainte sur l horloge d entrée de 400 Mhz et ce pour un générateur capable de fournir les 4, 8 et 16 premières fonctions d Hadamard. Pour ce faire nous avons employé la technologie umc 0.18μ, fonctionnant avec une tension d alimentation de VDD = 1,8V, qui est celle utilisée par le circuit réel. Pour garantir le respect de la contrainte imposée sur le timing dans des conditions normales, le circuit a été testé avec des conditions ayant un effet particulièrement défavorable sur sa vitesse. Celles-ci correspondent à une température de 85 degrés Celsius et un voltage 10% inférieur à celui requis (c'est-à-dire égal à 1,62V). Ainsi, si la contrainte sur le chemin critique est respectée avec de telles conditions, une marge de sécurité est ajoutée lors du fonctionnement normal. Le schéma en blocs logiques élémentaires obtenu en synthétisant un générateur d Hadamard fournissant les 8 premières fonctions en technologie umc 0.18μ est donné à la figure suivante (les signaux rouges et oranges représentent respectivement les 8 fonctions d Hadamard et leurs complémentaires, le signal jaune : l horloge, le signal en noir foncé : le signal de reset barre et le signal violet : le chemin critique). Figure 3-6 : Générateur des 8 premières fonctions d Hadamard en blocs logiques élémentaires Dans le tableau suivant, nous avons regroupé les résultats concernant la surface, le timing, ainsi que la consommation de puissance pour un générateur fournissant les 4, les 8 et les 16 premières fonctions d Hadamard. 15/106

La surface est séparée en 3 parties : celle utilisée par la logique combinatoire, celle pour la logique non combinatoire ainsi qu une estimation de la surface des interconnections. Le timing est défini par le slack qui représente la marge entre le temps que met le signal le plus lent pour se propager de l entrée à la sortie (chemin critique) et le temps à disposition correspondant à une période du signal d horloge (2,5 ns dans notre cas, car l horloge fonctionne à 400 Mhz). Un slack positif signifie que la contrainte sur le timing est respectée. La puissance est subdivisée en 2 : celle servant au fonctionnement propre des blocs logiques élémentaires et celle utilisée pour le changement d état des lignes. Générateur Hadamard 4 8 16 Surface Combinatoire (μm 2 ) 53 196 436 Non Combinatoire (μm 2 ) 439 832 1477 Interconnections (μm 2 ) 2707 6347 11667 Total (μm 2 ) 3199 7375 13580 Timing (période = 2.5ns) Slack (ns) 0,92 0,15 0,04 Consommation Puissance interne (μw) 265 548 911 Switch des lignes (μw) 99 231 373 Total (μw) 364 779 1284 Figure 3-7 : Tableau comparatif pour diverses configurations du générateur d Hadamard Les simulations réalisées sur les générateurs d Hadamard synthétisés à 4, 8 et 16 fonctions fournissent des résultats semblables à ceux attendus. Lors de la synthèse, des délais estimés, représentant le temps de transition lors d un changement d état de la sortie et ce pour chaque porte logique et bascule, sont ajoutés par le simulateur provoquant ainsi un retard sur les signaux de sortie du générateur. La logique servant au calcul des fonctions d Hadamard étant différente pour chacune d entre elles, le temps de réponse sera donc différent pour chaque fonction, conduisant à l apparition de glitches durant la phase de transition des fonctions d Hadamard. Si l on excepte ce phénomène limité et purement transitoire, propre à tout circuit électronique, la forme des fonctions d Hadamard est en adéquation avec le résultat attendu. La figure 3-8 contient les résultats de simulation après synthèse du générateur d Hadamard à 8 fonctions. Figure 3-8 : 8 premières fonctions d Hadamard après synthèse en portes logiques 16/106

3.2.3. Placement et routage du générateur d Hadamard numérique La dernière étape à effectuer consiste à convertir le code du générateur d Hadamard numérique en un circuit final au niveau transistor importable dans l environnement Cadence et directement utilisable pour la réalisation d une puce électronique. Les librairies nécessaires à cette étape n étant pas encore disponibles pour le placementroutage en technologie umc 0.18μ, nous l avons réalisé en ams 0.35μ. Le principe demeure rigoureusement le même si l on excepte le fait que le circuit final sera vraisemblablement un peu moins rapide et un peu plus grand que celui dans le cas où la technologie umc 0.18μ aurait été utilisée. Pour cette étape, réalisée pour des générateurs d Hadamard à 4, 8 et 16 fonctions, nous avons utilisé le programme Cadence Encounter qui nous permet d obtenir le schéma final au niveau transistor d un générateur d Hadamard sur Cadence IC tout en nous fournissant des netlists utilisables pour effectuer des simulations sur Modelsim. Le layout pour un générateur fournissant les 8 premières fonctions d Hadamard et leurs complémentaires est le suivant : Sorties = Fonctions d Hadamard et leurs complémentaires VDD GND reset_barre clk_system Figure 3-9 : Layout générateur des 8 premières fonctions d Hadamard 17/106

Les données sur la taille et la consommation du circuit au niveau transistor ne nous sont pas réellement utiles, car la technologie utilisée est plus grande que celle du circuit réel. De plus, la technologie ams 0 35μ fonctionne avec une tension d alimentation de 3,3 V, alors que l umc 0.18μ est alimenté en 1,8 V. Les estimations de timing, de taille ainsi que de consommation de puissance réalisées dans le cas de la synthèse en portes logiques du point 3.2.2 seront plus proches des valeurs réelles du générateur d Hadamard qui sera intégré dans le prototype du convertisseur complet de Walsh- Hadamard que les estimations pouvant être fournies dans cette partie (car la synthèse au niveau porte logique a été réalisée en technologie umc 0.18μ, ce qui n a pas été possible de faire pour le placement et routage). Le circuit au niveau transistor a été simulé sur Modelsim et produit des résultats identiques à ceux escomptés (phénomène transitoire durant la phase de transition résultant en des glitches dû aux temps de réponse différents des éléments fournissant les fonctions d Hadamard). Figure 3-10 : Fonctions d Hadamard après placement et routage 18/106

4. Bloc de modulation Cette partie a pour but d expliquer le principe de fonctionnement du bloc de modulation d un convertisseur A/D de Walsh-Hadamard à N canaux. Le modulateur possédera N canaux composés chacun des éléments suivants : Un mélangeur chargé de multiplier le signal d entrée par la fonction d Hadamard correspondant au numéro du canal-1. Un intégrateur prenant en entrée la sortie du mélangeur et devant être vidé périodiquement à chaque cycle (si chaque canal doit travailler à une fréquence de 100 Mhz, il faudra vider l intégrateur toutes les 10 ns). La sortie de l intégrateur sera ensuite envoyée dans le convertisseur A/D du canal correspondant pour y être échantillonnée et numérisée comme représenté à la figure 4-1. MODULATEUR Canal 1 du modulateur Canal 2 du modulateur Canal 3 du modulateur Canal 4 du modulateur Figure 4-1 : Schéma de principe d un convertisseur idéal de Walsh-Hadamard à 4 canaux Le modulateur, qui est un bloc analogique, a été réalisé au niveau transistor par G. Ding (pas encore tout à fait terminé). La modélisation VHDL-AMS se devra donc de posséder une structure identique à l implémentation physique, c'est-à-dire de disposer des mêmes entrées et sorties et devra être capable de simuler le comportement global sans pour autant modéliser toutes les imperfections liées à l implémentation physique réelle. Le convertisseur complet de Walsh-Hadamard pourra ainsi être simulé soit avec le bloc de modulation modélisé présenté dans cette partie, soit avec le modulateur réel au niveau transistor de G. Ding. La suite de ce chapitre est dédiée à l explication du principe de fonctionnement d un tel modulateur. 19/106

4.1. Structure d intégration L intégrateur de chaque canal est censé fonctionner continuellement et doit être vidé à chaque période du signal de contrôle des canaux. Physiquement, cela ne peut cependant pas être réalisé instantanément. Une solution consiste alors à remplacer l intégrateur par un système comprenant deux intégrateurs fonctionnant chacun à tour de rôle, suivi d un Sample&Hold à 2 entrées, chargé de sélectionner et de maintenir la valeur à appliquer à la sortie. Le schéma de principe de cette structure d intégration est donné ci-dessous : Sous-canal A Sous-canal B Figure 4-2 : Structure remplaçant l intégrateur Le principe de fonctionnement de cette structure est relativement simple et est représenté graphiquement à la figure 4-3. Cette dernière possède deux sous-canaux, pourvu tout deux d un intégrateur (sous-canal A et sous-canal B), qui sont utilisés alternativement, chacun durant la moitié de la période du signal d horloge pilotant le bloc de modulation. L entrée de la structure d intégration, nommée An_in, est relié à la sortie du mélangeur et correspond donc à la multiplication du signal d entrée du convertisseur de Walsh-Hadamard par une fonction d Hadamard dont l indice dépend du canal en question (fonction d Hadamard d indice i-1 pour le canal i). Cette valeur est appliquée alternativement (la moitié du temps) et périodiquement à l entrée de l intégrateur du sous-canal A, puis à celle du sous-canal B grâce aux signaux complémentaires de commande Int_A et Int_B. Lorsque An_in est appliquée à l entrée de l intégrateur A, l entrée de l intégrateur B est mise à zéro (et inversement) ce qui a pour effet de bloquer la valeur de sortie de cet intégrateur (par définition, lorsque l entrée d un intégrateur est nulle, sa sortie demeure constante). Dans notre système, lorsque le signal Int_A vaut 1, l entrée An_in multipliée par VDD (1,8 V) est appliquée à l entrée de l intégrateur du sous-canal A et l on dira que l intégrateur A est utilisé. Lorsque ce signal vaut 0, l entrée de l intégrateur A sera nulle de part la multiplication par 0 (VSS) et l intégrateur A ne sera alors plus utilisé (idem pour le canal B, excepté qu il répond au signal complémentaire Int_B). Durant la phase où l intégrateur d un sous-canal n est plus utilisé, la valeur de sortie de ce dernier pourra être appliquée à la sortie de la structure à l aide du Sample&Hold, puis l intégrateur de ce sous-canal pourra être vidé (remis à 0). 20/106

Pour garantir une intégration continuelle du signal d entrée de la structure, les signaux Int_A et Int_B se doivent d être complémentaires. De cette manière, l un des 2 intégrateurs sera en phase d intégration pendant que l autre pourra être échantillonné puis vidé. Les signaux smpl_a et smpl_b sont chargés de commander le Sample&Hold de sortie. A chaque flanc montant de smpl_a (respectivement smpl_b), la sortie de l intégrateur du souscanal A (B) sera appliquée à la sortie du bloc de modulation. Les signaux rst_a et rst_b, actifs au flanc montant, vident les intégrateurs des sous-canaux A, respectivement B. Chaque sous-canal de la structure d intégration pourra donc se trouver dans l une des 3 phases énumérées ci-dessous : 1. Phase d intégration : intégration du signal d entrée (lorsque Int_A (respectivement Int_B) vaut 1 ) 2. Phase d échantillonnage : échantillonnage et maintien de la valeur de sortie de l intégrateur sur la sortie du modulateur (lorsque smpl_a (smpl_b) = 1 ) 3. Phase de reset : remise à 0 de la valeur de sortie de l intégrateur (lorsque rst_a (rst_b) = 1 ). La figure 4-3 met en lumière les différentes phases et la forme des signaux de commande utilisés ainsi que les entrées et sorties de la structure d intégration et des 2 intégrateurs. Période d un cycle de l horloge des canaux Intégration A S&H A Rst A Intégration A S&H B Rst B Intégration B S&H B Rst B 0 0 0 0 0 0.Figure 4-3 : Phases de la structure d intégration 21/106

Comme nous l avons fait remarquer dans la 1 ère partie de ce rapport, l utilisation de N canaux en parallèle nous permet de travailler, pour chaque canal, avec une fréquence N fois inférieure à celle du système global. La structure d intégration aura donc à une fréquence de travail valant f système /N. Etant donné que cette dernière est composée de 2 sous-canaux en parallèle (sous-canal A et sous-canal B), la fréquence de chaque sous-canal pourra donc être 2 fois plus faible que celle de la structure d intégration complète et vaudra par conséquent f système /(2*N). En introduisant la valeur Nbr_bitstocodechannels représentant le nombre de bits nécessaires à la différenciation des divers canaux (1 pour 2 canaux, 2 pour 3 et 4 canaux, 3 pour 5 à 8 canaux, ), la fréquence de travail de chaque sous-canal de la structure d intégration sera la suivante (remplacement de N par 2 Nbr_bitstocodechannels ) : f système /(2*2 Nbr_bitstocodechannels ) = f système /(2 Nbr_bitstocodechannels+1 ). Ainsi, le signal Int_A est un signal carré de fréquence f système /(2 Nbr_bitstocodechannels+1 ) et le signal Int_B, son complémentaire. Le signal smpl_a a une fréquence semblable mais n est actif que durant ⅛ de la période, le signal rst_a possédant la même forme mais décalé temporellement d ⅛ de période. Les signaux smpl_b et rst_b ont une forme semblable à smpl_a et rst_a, mais décalés temporellement d une demi période. La prochaine étape, décrite au point suivant, consiste à créer ces signaux de commande à partir des fonctions d Hadamard fournit par le générateur d Hadamard. 22/106

4.2. Génération des signaux de commande La vue symbolique Cadence du générateur des signaux de commande du bloc de modulation (phase _generator) dans le cas où Nbr_bitstocodechannels = 2 (3 ou 4 canaux) est donnée cidessous :.Figure 4-4 : Générateur des signaux de commande pour le cas Nbr_bitstocodechannels = 2 (3 ou 4 canaux) L horloge d entrée du générateur d Hadamard correspondra à l horloge du système oscillant à une fréquence f système. Comme expliqué dans la partie des annexes techniques (chapitre 11) consacrée au générateur d Hadamard, les fonctions d Hadamard d indice 2 i sont simplement des signaux carrés oscillant à une fréquence f système /2 i+1 (cf. figure 3-3). En utilisant cette propriété, il est aisé d obtenir la correspondance entre les fonctions d Hadamard et les signaux Int_A et Int_B qui sont simplement égaux à la fonction d Hadamard, respectivement sa fonction complémentaire, d indice 2 Nbr_bitstocodechannels. Les signaux de reset des intégrateurs ainsi que ceux pilotant le Sample&Hold de sortie ont la même fréquence, mais sont actifs seulement durant ⅛ de période comme représenté à la figure 4-3. Pour construire ces fonctions, il nous faut utiliser 3 fonctions carrées : la première identique à celle du signal Int A (fréquence = f système /(2 Nbr_bitstocodechannels+1 ), la seconde aillant une fréquence double et la dernière, une fréquence quatre fois plus élevée. 23/106

Ces fonctions correspondent, pour un système à plus de deux canaux, aux fonctions d Hadamard d ordre 2 Nbr_bitstocodechannels, 2 Nbr_bitstocodechannels-1 et 2 Nbr_bitstocodechannels-2. Pour le cas à deux canaux (Nbr_bitstocodechannels = 1), la fonction d Hadamard d indice 2 Nbr_bitstocodechannels-2 n existe pas. La fonction carrée oscillant à une fréquence quatre fois supérieure à f système /(2 Nbr_bitstocodechannels+1 ) est simplement le signal d horloge du système (4*f système /(2 Nbr_bitstocodechannels+1 ) = f système ) appliqué à l entrée du générateur d Hadamard. Tous les signaux de commande du bloc de modulation peuvent donc être construits en combinant les fonctions f 1, f 2 et f 3 selon les formules données dans le tableau ci-dessous (où f 1 = fonction d Hadamard d indice 2 Nbr_bitstocodechannels, f 2 = fonction d Hadamard d indice 2 Nbr_bitstocodechannels-1 et f 3 = fonction d Hadamard d indice 2 Nbr_bitstocodechannels-2 ou horloge du système pour le cas à 2 canaux). Int _ A = Smpl _ A = f f 1 1 and f 2 and f 3 // // Int _ B = Smpl _ B = f f 1 1 and f 2 and f 3 Rst _ A = f 1 and f 2 and f 3 // Rst _ B = f 1 and f 2 and f 3 Les signaux construits en utilisant les formules ci-dessus sont représentés graphiquement dans la figure 4-5 et peuvent être comparés avec ceux de la figure 4-3.Figure 4-5 : Construction des signaux de contrôle du bloc de modulation 24/106

4.3. Gain et retard du bloc de modulation Le bloc de modulation induit une importante différence d amplitude entre les signaux d entrée et ceux de sortie. Cette atténuation est due au fait que les intégrateurs ne fonctionnent que durant un temps relativement court (correspondant à une demi période des signaux Int pulsant à 2 Nbr_bitstocodechannels+1 /f système ) avant d être vidés. En conséquence, un signal d amplitude élevé à l entrée n entraîne qu une faible variation à la sortie. Un gain, interne à la structure, va être ajouté dans le bloc de modulation pour compenser cette différence et coïncider ainsi avec les caractéristiques du circuit réel. Pour pouvoir calculer la valeur de ce dernier, il va falloir avant tout déterminer mathématiquement le gain du modulateur. Pour ce faire, nous allons calculer la valeur obtenue à la sortie du bloc de modulation en y appliquant, à l entrée, une constante IN. Cette valeur est multipliée par VDD durant un temps égal à période_canal/2, puis par VSS (= 0V dans notre cas) durant la deuxième moitié de période_canal. Elle est ensuite intégrée et appliquée à la sortie. Mathématiquement, cela peut être traduit par l équation suivante : OUT = = période_ canal / 2 t= 0 période_ canal / 2 t= 0 IN * VDD* dt IN * VDD* dt + période_ canal IN * VSS * dt t= période_ canal / 2 période_ canal = IN * VDD* 2 Le gain du système, défini comme le rapport entre l amplitude de sortie et celle d entrée, vaut alors : OUT VDD * période _ canal GAIN = = IN 2 Comme nous l avons mentionné au point 4.1, la fréquence de travail de chaque canal vaut f système /2 Nbr_bitstocodechannels+1 ce qui signifie que la période de chaque canal est de 2 Nbr_bitstocodechannels+1 /f système secondes. En remplaçant cette valeur dans l équation précédente, il vient : GAIN = VDD Nbr_bitsto * 2 f système codechanne ls Le modulateur réel a été dimensionné de manière à obtenir un gain valant 1,5 pour un système à 2 canaux travaillant à une fréquence de 200 Mhz avec une tension d alimentation de 1,8V. 25/106

En introduisant ces valeurs dans l équation précédente, un gain de 1,8*10-8 est obtenu. Un gain interne au modulateur modélisé doit donc être ajouté pour que ses caractéristiques correspondent à celles du modulateur réel. Ce gain interne vaut 8,34*10 7 (1,5/1,8*10-8 ). Ainsi, pour un système à 2 canaux, à une fréquence de 200 Mhz et avec une tension de 1,8V, le modèle du modulateur aura un gain de 1,5 ce qui coïncide avec le cas réel. En tenant compte de ce gain interne, le gain total du modulateur pourra être obtenu grâce à la formule suivante : GAIN mod ulateur VDD * 2 = 83,4 * Nbr_bitstocodechannels f système où f clk est en Mhz Le bloc de modulation provoque également un décalage temporel entre le signal d entrée et le signal de sortie qui équivaut à une période de l horloge commandant les canaux. Cette horloge oscillant à f système /2 Nbr_bitstocodechannels, la latence engendrée par le bloc de modulation vaudra donc : Décalage temporel _ mod ulateur 2 = Nbr_bitstocodechannels f système μs où f clk est en Mhz En conséquence, plus la fréquence de l horloge du système augmente, plus le gain et la latence du bloc de modulation diminuent. En revanche, augmenter le nombre de canaux équivaut à augmenter ces deux valeurs. Ce phénomène peut être observé dans les résultats de simulation du système complet donnés aux figures 7-9 et 7-11. 26/106

4.4. Adaptation à un système différentiel Le modulateur analogique développé par G. Ding est un bloc possédant des entrées et des sorties différentielles. Le modèle VHDL-AMS se devra donc de travailler avec des entrées et des sorties différentielles. Pour ce faire, nous avons tout simplement ajouté un bloc d entrée chargé de convertir les deux entrées différentielles en un seul signal non différentiel (signal nondiff = entrée + - entrée - ). Ce faisant, la tension de mode commun est supprimée et l amplitude du signal double par rapport à celle de l une des entrées différentielles comme représenté à la figure 4-6 dans le cas d entrées différentielles de forme triangulaire. Figure 4-6 : Conversion des entrées différentielles en entrée non différentielle L entrée en mode non différentiel aura donc la même forme que l entrée différentielle positive, mais avec une amplitude double. La modulation sera alors réalisée sur cette entrée, fournissant ainsi une sortie non différentielle. La sortie différentielle positive est reconstituée en additionnant la moitié de cette valeur à la tension de mode commun, tandis que la sortie différentielle négative résulte de la soustraction de la moitié de cette valeur à la tension de mode commun. Il convient de relever que le système réel impose une limitation sur la plage de fonctionnement de sortie des intégrateurs qui va être limitée à une valeur de sortie en non différentielle comprise entre -750 mv et +750 mv. L amplitude pour chaque sortie différentielle se situera donc dans une plage de 375 mv autour de la tension de mode commun Vcm valant 900 mv dans le cas du système réel (525 mv valeurs de sortie différentielle du modulateur 1,275 V). 27/106

5. Bloc ADC Dans ce travail, le convertisseur de chaque canal a été modélisé par un pipeline non idéal, écrit en VHDL-AMS, développé par le professeur A.Vachoux et adapté à notre système. Ce convertisseur travaillera sur 10 bits et présentera la possibilité d inclure des effets non idéaux standards sur les convertisseurs flash de chaque étage (en ajoutant soit un offset sur la tension threshold de référence, soit une hystérèse) ainsi que sur les Sample&Hold (en filtrant les échantillons grâce à un filtre passe-bas du second ordre). Il sera également pourvu d un système de redondance digital permettant de limiter l influence d une erreur sur un étage du pipeline. La conversion A/D pipeline réside sur le principe de séparation du circuit en plusieurs étages, chacun réalisant une partie de la conversion globale. Le schéma de principe est donné à la figure suivante, chaque étage fournissant une valeur au suivant ainsi que des bits qui donneront, après décodage, le mot de sortie : Figure 5-1 : Schéma de principe d un ADC pipeline Les principaux avantages d une telle configuration sont les suivants : 1) Le pipeline nous permet d atteindre de hautes résolutions pour le système global (10 bits dans notre cas, mais peut être facilement supérieur à 15 bits) tout en utilisant des systèmes de conversion relativement simples et travaillant sur un faible nombre de bits pour chaque étage (1,5 bits dans notre cas). 2) Les différents étages effectuent les opérations de façon concurrente résultant en un taux de sortie supérieur à celui obtenu en utilisant un convertisseur devant effectuer toutes les opérations en même temps (typiquement 100 Msamples/s pour une résolution sur 10 bits). Le principal inconvénient de ce type de convertisseur réside dans la latence engendrée par les registres séparant les divers étages. Dans la suite de ce chapitre, nous allons décrire les principaux blocs constituant cet élément. 28/106

5.1. Etage pipeline Chaque étage du pipeline génère 2 bits de sortie D n, D n-1 qui, après recombinaison avec ceux provenant des autres étages par le décodeur, fournissent le mot de sortie de l ADC. Parallèlement, l étage produit une valeur résidu Vout qui sera envoyée à l étage suivant pour réaliser la suite de la conversion globale. Le schéma de principe d un étage du pipeline est donné ci-dessous : Figure 5-2 : Etage pipeline Le convertisseur A/D 2 bits de chaque étage pipeline est un convertisseur flash composé de 2 comparateurs dont les tensions de basculement valent : V th1,2 = ± V ref /4 (en admettant que l ADC pipeline ait une dynamique comprise entre ± V ref ). L entrée Vin pouvant être comprise entre ± V ref, la sortie de cet élément pourra donc prendre 3 valeurs distinctes : - 00 si Vin < -V ref /4-01 si -V ref /4 < Vin < V ref /4-11 si V ref /4 < Vin Ces 3 valeurs correspondent à un code thermométrique (le LSB vaut forcément 1 si le MSB est égal à 1 ) qu il convient de convertir en code binaire 00, 01 et 10, en utilisant le bloc nommé th2bin, pour obtenir les 2 bits de sortie de l étage pipeline. Etant donné que seul trois des quatre valeurs binaires pouvant être codés sur 2 bits peuvent être effectivement obtenues à la sortie, les étages pipelines seront appelés étages 1,5 bits. Le code binaire de sortie vaudra donc : - D n D n-1 = 00 si Vin < -V ref /4 - D n D n-1 = 01 si -V ref /4 < Vin < V ref /4 - D n D n-1 = 10 si V ref /4 < Vin Pour obtenir la valeur résidue, qui sera envoyée à l étage suivant, le code thermométrique est reconverti en analogique à travers un convertisseur D/A à trois niveaux (sortie = -V ref si le code thermométrique vaut 00, 0 s il vaut 01 et V ref s il est égal à 11 ). Cette valeur est ensuite divisée par 2 puis soustraite au signal d entrée avant d être multipliée par 2 et d être échantillonnée par un Sample&Hold comme représenté à la figure 5-2. 29/106

La relation liant la valeur de résidu Vout à la valeur d entrée ainsi qu aux 2 bits de sortie D n et D n-1 pour un étage donné est la suivante : - Vout = 2*Vin + V ref si D n D n-1 = 00 - Vout = 2*Vin si D n D n-1 = 01 - Vout = 2*Vin - V ref si D n D n-1 = 10 Ces trois cas peuvent être remplacés de façon équivalente par une seule formule : Vout = * V 2 * Vin + Dn * Dn 1 * Vref Dn * Dn 1 ref Les valeurs de sorties (les 2 bits et le résidu) peuvent être déduits directement de cette formule en sachant que les seuils pour les comparateurs sont fixés à ± V ref /4 comme représenté graphiquement à la figure 5-3. Figure 5-3 : Bits de sortie et valeur résidu d un étage donné en fonction de sa tension d entrée 30/106

5.2. Décodeur Chaque étage du pipeline nous fournit 2 bits devant être recombinés entre eux afin d obtenir le mot de sortie de l ADC. Le décodage se fera en 2 étapes. Premièrement, vu que chaque étage est synchrone, il faudra introduire un banc de registres de manière à ce que les bits de sortie de tous les étages correspondent au même mot d entrée de l ADC. Deuxièmement, comme l ADC dispose d un système de correction d erreur reposant sur le concept de redondance, il faudra recombiner les bits de manière à obtenir le mot de sortie. 5.2.1. Banc de registres Le résidu de chaque étage étant fournit comme entrée à l étage suivant à chaque flanc montant de l horloge, un mot donné à l entrée du système ne parviendra à l étage i qu après un nombre i-1 de coup d horloge. Il faudra donc retarder chaque étage de manière inversement proportionnelle (les étages d indice élevés devront être moins retardés que ceux ayant un indice faible) de façon à ce que tous les bits de sortie fournis par les étages correspondent au même mot d entrée. Le schéma de principe du banc de registres pour le cas d un convertisseur ADC à 9 étages (10 bits) est donné à la figure 5-4 et sera toujours en forme de triangle rectangle, quelque soit le nombre d étages considérés. Figure 5-4 : Banc de registres Ainsi les bits sortant du banc de registres correspondent tous au même mot d entrée, le nombre de coup d horloge entre entrée et sortie étant, pour chaque étage, égal au nombre d étage + 1. 31/106

5.2.2. Additionneur à redondance Comme nous l avons mentionné précédemment, les différents étages fournissent des bits redondants servant à la correction d une éventuelle erreur pouvant se produire notamment sur l un des seuils des convertisseurs flash. Le deuxième bloc sert donc à recombiner les bits de sortie redondants du banc de registre afin de reconstituer le mot de sortie du convertisseur. Il sera composé d additionneurs 2 bits à retenue dont la table de vérité est explicitée ci-dessous. Figure 5-5 : Additionneur 2 bits à retenue Le MSB fournit par chaque étage (sauf le premier) est combiné avec le LSB de l étage suivant au moyen d un additionneur de ce type, la retenue se propageant d additionneurs en additionneurs. En utilisant ce système, illustré à la figure 5-6 pour le cas à 9 étages (donc 18 bits à la sortie du banc de registres), la sortie équivaudra à un mot d une longueur égale au nombre d étages pipelines + 1, donc 10 dans ce cas de figure. Figure 5-6 : Schéma de principe du décodeur 32/106

5.3. Imperfections modélisées Deux types d imperfections relativement simples à modéliser ont été implémentées dans ce convertisseur. Premièrement, les comparateurs des convertisseurs flash peuvent être biaisés de part l ajout d un offset ou d une hystérèse afin de rendre leur comportement plus conforme avec la réalité. L offset modifie la valeur du seuil de détection tandis que l hystérèse change la symétrie lorsque le comparateur veut passer d un état haut à un état bas ou inversement. Figure 5-7 : Imperfections modélisées sur les comparateurs La seconde imperfection modélisée pour ce convertisseur concerne les Sample&Hold chargés d échantillonner les valeurs des résidus de sortie pour chaque étage pipeline. Pour accroître le réalisme de la modélisation de ces blocs, la sortie est filtrée, durant l échantillonnage, à travers un filtre passe-bas du second ordre dont la fonction de transfert est la suivante : H ( p) = p 2 1 TAU 1 + QF * TAU 1 p + TAU Dans cette équation, p vaut jω et les constantes TAU et QF sont les paramètres du filtre où TAU représente la constante de temps et QF le facteur de qualité. 33/106

5.4. Adaptation à un système différentiel Le modulateur analogique développé par G. Ding fournissant des sorties en mode différentiel, le convertisseur, prenant ces valeurs en entrée, devra donc travailler avec des entrées différentielles. Afin de garder une structure identique à celle présentée aux points précédents, nous avons tout simplement ajouté un bloc d entrée chargé de convertir les deux entrées différentielles en une entrée non différentielle. Comme nous l avons expliqué au paragraphe 4-4, ce faisant la tension de mode commun est supprimée et le signal obtenu a une forme identique à celle de l entrée différentielle positive mais avec une amplitude double. La tension de référence Vref du convertisseur vaudra donc le double de la valeur maximum d un des signaux différentiels d entrée. Dans le cas du circuit réel, étant donné que les entrées des convertisseurs sont reliés aux sorties du bloc de modulation qui sont limités à une plage de ± 375 mv autour de la tension de mode commun, l amplitude maximum pour une entrée différentielle du convertisseur vaut alors 375 mv. La tension de référence du convertisseur est donc égale à 750 mv ce qui signifie que le convertisseur fonctionne pour une entrée non différentielle allant de -750 à +750 mv. 34/106

5.5. Résultats ADC 5.5.1. Correction d erreurs Pour illustrer nos dires quand à la faculté du convertisseur à corriger une erreur sur la tension de référence des comparateurs constituant les convertisseurs 2 bits flash de chaque étage, nous allons prendre, comme exemple, le cas d un convertisseur 10 bits (donc possédant 9 étages) ayant une tension de référence de 750 mv (Vref = 750 mv, cf. figure 5-3). Ces paramètres correspondent au convertisseur que nous avons utilisé pour le convertisseur de Walsh-Hadamard complet. Supposons que l on veuille obtenir la valeur de sortie correspondant à une entrée non différentielle de 400 mv mais que l étage 4 possède une erreur sur sa valeur de threshold 2 qui, au lieu de valoir 750/4 = 187,5 mv, vaut 210 mv. Les graphiques ci-dessous résument le cas idéal ainsi que le cas présenté ci-dessus. D D D V n n n D D D résidu n 1 n 1 n 1 = 00 si Vin < 187,5mV = 01 si 187,5mV < Vin < + 187,5 mv = 10 si Vin > + 187,5mV = 2 * Vin + D n * D n 1 * V ref D n * D n 1 * V ref Cas idéal sans erreur Etage 1 2 3 4 5 6 7 8 9 Vin [mv] 400 50 100 200-350 50 100 200 350 Dn Dn-1 "10" "01" "01" "10" "00" "01" "01" "10 "00" Vrésidu [mv] 50 100 200-350 50 100 200-350 Dn Dn-1 1 0 0 1 0 1 1 0 0 0 0 1 0 1 1 0 0 0 Mot sortie 1 1 0 0 0 1 0 0 0 0 Cas avec erreur sur le threshold 2 de l'étage 4 (210mV au lieu de 187,5mV) : Etage 1 2 3 4 5 6 7 8 9 Vin [mv] 400 50 100 200 400 50 100 200 350 Dn Dn-1 "10" "01" "01" "01" "10" "01" "01" "10 "00" Vrésidu [mv] 50 100 200 400 50 100 200-350 Dn Dn-1 1 0 0 1 0 1 0 1 1 0 0 1 0 1 1 0 0 0 Mot sortie 1 1 0 0 0 1 0 0 0 0 Figure 5-8 : Exemple de correction d erreur L erreur sur la tension de seuil de l étage 4 change donc la valeur du code de sortie de cet étage («01» au lieu de «10»), mais modifie également la valeur de résidu envoyée à l étage 5. Ce faisant, les codes de sortie des étages suivants vont également changer, ayant pour 35/106

résultat d obtenir, à la sortie du système d additionneurs à redondance, la bonne valeur pour le mot de sortie de l ADC («1100010000»), Une erreur sur une tension de référence d un étage implique donc une réaction sur les étages suivants corrigeant ainsi cette dernière afin de fournir le mot attendu en sortie. 5.5.2. Résultats de simulations Des simulations ont été réalisées pour un convertisseur à 10 bits (9 étages) en faisant varier les entrées différentielles d 1/2 LSB à chaque coup d horloge, ce qui revient à incrémenter l entrée non différentielle correspondante d un LSB à chaque période. La figure suivante montre les résultats obtenus en zoomant à la moitié de la plage du convertisseur (correspondant à la valeur 0), provenant de la simulation du code VHDL-AMS dans l environnement Cadence. Retard CLK 1 2 3 4 5 6 7 8 9 10 Figure 5-9 : Simulation ADC Nous pouvons constater qu il faut effectivement 10 (= nombre d étages + 1) cycles d horloge pour que le signal se propage de l entrée à la sortie. Pour le voir, nous avons compté le nombre de cycles séparant le moment où les deux signaux différentiels sont égaux (à ce point, ils sont égaux à la tension de mode commun) et le moment où la sortie affiche la valeur 512 qui se trouve à la mi-échelle (MSB à 1 et tous les autres bits à 0 ) de l ADC et qui correspond à la valeur 0. 36/106

6. Démodulateur de Walsh-Hadamard Le bloc de démodulation a pour fonction de recombiner les signaux de sortie modulés, provenant des convertisseurs A/D de chaque canal, afin de restituer correctement le mot de sortie du système complet. Le démodulateur exposé ci-dessous présente les caractéristiques suivantes : Utilisable par un convertisseur de Walsh-Hadamard parallèle Adaptable à un nombre quelconque de canaux Adaptable au nombre de bits de sortie des convertisseurs A/D Ce modèle se veut donc entièrement générique afin de répondre à n importe quelle configuration du convertisseur de Walsh-Hadamard indépendamment du nombre de canaux ou du type de convertisseurs A/D utilisés. La suite de ce chapitre est consacrée exclusivement à la description du principe de fonctionnement du bloc de démodulation ainsi qu à l analyse des résultats pour différents niveaux d abstraction (avant synthèse, synthétisé au niveau portes logiques et après placement-routage); la méthode de construction générique utilisée étant décrite dans l annexe technique du chapitre 11. 37/106

6.1. Principe de démodulation La méthode employée, pour démoduler les signaux provenant des divers canaux du convertisseur de Walsh-Hadamard, réside sur une série d opérations arithmétiques (additions et soustractions), définies par les fonctions d Hadamard, à effectuer sur les différents canaux du système. Les opérations arithmétiques peuvent être déduites des matrices d Hadamard en considérant, dans l ordre, chaque colonne de la matrice comme un canal (colonne 1 => canal 1 et ainsi de suite) puis en effectuant l opération arithmétique correspondant à chaque valeur de la colonne (+1 correspondant à une addition et -1 à une soustraction) et ce pour chaque ligne. Cette méthode nous fournira donc un mot résultant de la combinaison des divers canaux pour chaque ligne de la matrice d Hadamard. Le nombre de lignes étant identique au nombre de colonnes dans une matrice d Hadamard, un système à N canaux (où N est une puissance de 2) fournira donc N mots résultants de combinaisons différentes des canaux d entrée. Ces mots seront alors appliqués à tour sur la sortie grâce à un système de switches sélectionnant un mot à chaque coup d horloge du système global (à 200 Mhz dans le cas du circuit développé par G. Ding). Pour expliciter cette méthode, nous allons développer deux cas : celui du démodulateur à 2 canaux et celui d un système à 4 canaux. 6.1.1. Démodulateur à 2 canaux Pour une configuration à 2 canaux, la figure 6-1 représente formellement la méthode décrite ci-dessus. Canal_1 Canal_2 H 2 = + 1 + 1 + 1 1 Mot 1 = Canal_1 + Canal_2 Mot 2 = Canal_1 - Canal_2 Figure 6-1 : Opérations arithmétiques à effectuer, cas à 2 canaux Le schéma de principe pour effectuer ce type d opérations est donné à la figure 6-2 pour un démodulateur adapté à un convertisseur de Walsh-Hadamard à 2 canaux, dont la fréquence des signaux d entrée (provenant des ADC) est 2 fois inférieure à celle du système globale. Le switch de sortie est chargé d appliquer le résultat de l addition ou de la soustraction des mots de ces 2 canaux sur la sortie et ceci à une fréquence correspondant à celle du système global. 38/106

SWITCH_CLK (FCLK/2) CHANNEL_1 (FCLK/2) CHANNEL_2 FCLK SOUT SWITCH Figure 6-2 : Schéma de principe du démodulateur, cas à 2 canaux Pour une compréhension optimale des divers signaux de ce circuit, un exemple dans le cas idéal (en négligeant le délai pour tous les éléments) est donné ci-dessous : Figure 6-3 : Principaux signaux du démodulateur, cas à 2 canaux Les valeurs internes de sortie de l additionneur et du soustracteur ont été ajoutées dans la figure. Le signal de commande switch_clk sélectionne à chaque période de l horloge du système le mot, résultant des opérations arithmétiques réalisées sur les deux canaux, à appliquer à la sortie qui atteint ainsi la fréquence désirée en sortie correspondant à celle du système. 6.1.2. Démodulateur à 4 canaux Le cas à 4 canaux s effectue de manière similaire à celui à 2 canaux et est décrit ci-dessous. Canal_1 Canal_2 Canal_3 Canal_4 H 4 = + 1 + 1 + 1 + 1 + 1 1 + 1 1 + 1 + 1 1 1 + 1 1 1 + 1 Mot 1 = Canal_1 + Canal_2 + Canal_3 + Canal_4 Mot 2 = Canal_1 - Canal_2 + Canal_3 - Canal_4 Mot 3 = Canal_1 + Canal_2 - Canal_3 - Canal_4 Mot 4 = Canal_1 - Canal_2 - Canal_3 + Canal_4 Figure 6-4 : Opérations arithmétiques à effectuer, cas à 4 canaux 39/106

Le schéma de principe est un peu plus compliqué que dans le cas à 2 canaux et nécessite un plus grand nombre d opérations. Le système de switches pour la sortie comprend, dans cette configuration, 3 switches commandés par deux signaux de commande de fréquence respectivement f clk /2 et f clk /4 permettant de sélectionner tour à tour l un des 4 mots résultant des opérations arithmétiques. Figure 6-5 : Schéma de principe du démodulateur, cas à 4 canaux La figure 6-6, réalisée dans le cas idéal sans délais, permet d expliciter le principe de fonctionnement de ce schéma. Figure 6-6 : Principaux signaux du démodulateur, cas à 4 canaux Les deux signaux de contrôle des switches ont une fréquence respectivement deux et quatre fois inférieure à celle du signal d horloge ce qui permet de sélectionner le résultat de l une des quatre opérations arithmétiques et d obtenir ainsi un signal de sortie à une fréquence identique à celle de l horloge du système global. 40/106

6.2. Structure du démodulateur développé Le principe de fonctionnement de la démodulation pour un convertisseur parallèle de Walsh- Hadamard ayant été décrit au point précédent, nous allons à présent présenter la structure du démodulateur réel tel que développé dans le cadre de ce projet. Cette dernière présente la particularité de pipeliner les opérations arithmétiques. L idée du pipeline pour les opérations arithmétiques consiste à diviser les opérations d addition et de soustraction, à effectuer pour chaque canal afin d obtenir les mots de sortie, en sous opérations constituées uniquement d une addition ou d une soustraction de 2 mots et ce à chaque coup de l horloge de commande pulsant à une fréquence de f clk /N où N = nombre de canaux du convertisseur parallèle; les différents étages du pipeline étant isolés par des bancs de registres commandés par l horloge de commande. Le système de switches de sortie permet, quand à lui, de sélectionner alternativement l un des mots provenant du dernier étage et de l appliquer sur la sortie à une fréquence f clk. La méthode générique implémentée pour réaliser ce démodulateur est expliquée en détail dans l annexe technique 11.2. L exemple d un convertisseur à 4 canaux utilisant notre démodulateur pipeliné est représenté schématiquement à la figure 6-7 et peut être comparé avec le démodulateur non pipeliné de la figure 6-5. Figure 6-7 : Schéma de principe du démodulateur pipeline, cas à 4 canaux Les additions et soustractions des 4 canaux simultanément ont été, dans ce cas, remplacées par un système d additions et de soustractions à deux entrées suivis de bancs de registres ayant une horloge d une fréquence f clk /4. Le système de switches pour la sortie reste quand à lui le même. 41/106

La version pipelinée a été choisie pour les raisons suivantes : La généricité de l algorithme repose sur le pipeline des opérations arithmétiques Les divers étages effectuent les opérations de manière concurrentes permettant ainsi aux additionneurs et soustracteurs de bénéficier d un temps plus élevé pour le calcul La logique nécessaire pour les additionneurs est réduite en tenant compte de la structure répétitive des fonctions de Walsh-Hadamard Chaque opération arithmétique est isolée des autres permettant de garantir une utilisation partagée des opérations provenant des étages précédents L utilisation d une méthode pipelinée nécessite cependant l ajout de bancs de registres entre chaque étage du pipeline, augmentant la taille du circuit et engendrant une latence propre au démodulateur proportionnel aux nombres d étages nécessaires pour effectuer les opérations arithmétiques. Ce nombre d étage est égal au logarithme en base 2 du nombre de canaux (1 pour le cas à 2 canaux, 2 pour celui à 3 et 4 canaux, 3 pour 5 à 8 canaux, ). Le retard de ce démodulateur équivaut au nombre d étages multiplié par la période du signal de contrôle des registres séparant ces derniers auquel s ajoute une période d horloge du système global pour les registres de sortie (après le système de switch). 42/106

6.3. Simulation du démodulateur Le démodulateur générique de Walsh-Hadamard a été simulé pour différent nombre de canaux. La figure 6-8 représente le cas à 4 canaux avec des entrées valant respectivement, en unsigned, 670 pour le canal 1, 547 pour le 2, 597 pour le 3 et 496 pour le 4. La sortie doit fournir successivement les valeurs 774 (1+2+3+4), 736 (1-2+3-4), 636 (1+2-3- 4) et 534 (1-2-3+4). Une telle configuration du démodulateur possède 2 étages et provoque donc un retard égal à la somme de 2 périodes du signal d horloge clk_add du banc de registres séparant les étages et d une de l horloge du système comme cela peut être vu sur la figure 6-8. Figure 6-8 : Résultats de simulation du démodulateur pipeline, cas à 4 canaux Les valeurs de sortie, sont celles attendues (774, 736, 636 et 534). La latence est elle bien égal à deux périodes de l horloge clk_add auquel s ajoute une du système global. Pour voir cela, il suffit de regarder le nombre de cycles séparant le moment où le signal de reset barre passe à 1 (et donc où le système est activé) et le moment où un signal différent de 512 apparaît sur la sortie. Le cas à 8 canaux est donné à la figure 6-9 pour bien expliciter le rapport entre le nombre d étages et la latence engendrée par ce bloc qui équivaut dans ce cas à 3 périodes du signal d horloge clk_add (3 étages) auquel il faut rajouter une période de l horloge du système. Comme pour le cas précédent, cela peut être visionné en comptant le nombre de cycle séparant l activation du système (le reset barre passe à 1 ) du moment où la sortie se met à bouger. Figure 6-9 : Résultats de simulation du démodulateur pipeline, cas à 8 canaux 43/106

6.3.1. Synthèse du démodulateur de Walsh-Hadamard en portes logiques Comme pour le générateur de fonctions d Hadamard, le code générique VHDL du démodulateur a été synthétisé au niveau porte logique à l aide du programme Synopsys Design Vision. Dans le circuit réel, nous intégrerons un démodulateur de Walsh-Hadamard à 4 canaux fonctionnant à une fréquence de 200 Mhz. Ce démodulateur générique a été synthétisé, au niveau porte logique avec une technologie umc 0.18μ, puis testé pour les cas à 2, 4 et 8 canaux avec une contrainte sur l horloge du système de 200 Mhz. Le schéma en blocs logiques élémentaires obtenu en synthétisant un démodulateur de Walsh- Hadamard à 4 canaux est donné à la figure suivante (le signal rouge correspond à la sortie, le jaune à l horloge du système, l orange à l horloge des banc de registres (clk_add) et le violet au signal de reset barré). Figure 6-10 : Démodulateur pour le cas à 4 canaux en blocs logiques élémentaires 44/106

Comme pour le générateur d Hadamard, nous avons regroupés les résultats en terme de surface, de timing et de puissance pour un démodulateur à 2, 4 et 8 canaux dans le tableau suivant : Démodulateur WH 2 4 8 Surface Combinatoire (μm 2 ) 1823 6696 19839 Non Combinatoire (μm 2 ) 2086 6510 17414 Interconnections (μm 2 ) 21000 62814 176494 Total (μm 2 ) 24909 76020 213747 Timing (période = 5ns) Slack (ns) 3,48 1,01 0,34 Consommation Puissance interne (μw) 820 1413 2581 Switch des lignes (μw) 317 743 1287 Total (μw) 1137 2156 3868 Figure 6-11 : Tableau comparatif pour un démodulateur à 2, 4 et 8 canaux Les résultats de simulations pour ces diverses configurations nous donnent des résultats semblables à ceux avant synthèse si l on excepte les glitches provenant de la modélisation des délais des portes logiques utilisée pour le circuit synthétisé. Le cas à 4 canaux, identique à celui développé en début du chapitre 6.3, est donné ci-dessous : Figure 6-12 : Résultats de simulation du démodulateur pipeline synthétisé en portes logiques, cas à 4 canaux 6.3.2. Placement et routage du générateur d Hadamard numérique Le placement-routage d un démodulateur à 2, 4 et 8 canaux a été réalisé avec une approche similaire à celle décrite au paragraphe 3.2.3. La technologie utilisée pour cette partie sera à nouveau l ams 0.35μ. Le layout résultant de notre code pour le cas d un démodulateur à 4 canaux est le suivant : 45/106

clk_add switch_clk clk_system rst_b 4*10 bits d entrées venant des ADC Mot de 10 bits de sortie du démodulateur GND Figure 6-13 : Layout du démodulateur à 4 canaux VDD Les résultats d une simulation de la netlist au niveau transistor dans Modelsim sont visibles à la figure 6-14 et correspondent aux valeurs attendues. Figure 6-14 : Résultats de simulation du démodulateur pipeline après placement et routage, cas à 4 canaux 46/106

7. Système complet Les différents blocs constituant le convertisseur A/D de Walsh-Hadamard ayant été décrits en détail aux points précédents, il convient à présent de présenter le système complet générique que nous avons développé et testé à l aide d ADVance MS, puis que nous avons schématisé, importé puis resimulé sur Cadence IC. Le convertisseur complet étant générique, il pourra servir aisément comme aide au design (par exemple pour tester le bloc de modulation au niveau transistor développé par G. Ding) pour un système possédant un nombre quelconque de canaux. Dans la suite de ce chapitre, nous allons décrire les signaux à utiliser et ce pour chaque bloc du système générique avant de présenter des résultats de simulations pour le système complet. 7.1. Générateur de fonctions d Hadamard Cette entité sert à fournir toutes les fonctions utiles à la modulation du signal d entrée ainsi qu à la génération des divers signaux de commande des autres blocs. Elle prendra en entrée le signal d horloge du système qui est un signal carré de fréquence f système. Le bloc de modulation nécessite les N_channels premières fonctions d Hadamard pour la modulation à proprement parlé du signal d entrée, mais en utilisera un plus grand nombre pour la génération des signaux de commande du modulateur. La fonction d Hadamard la plus élevée qui devra être fournit est celle d ordre 2 Nbr_bitstocodechannels. Le générateur devra donc être capable de générer les 2 Nbr_bitstocodechannels+1 premières fonctions d Hadamard. Un système à 2 canaux nécessitera donc la création des 4 premières fonctions d Hadamard. Pour un système à 4 canaux, il faudra les 8 premières fonctions et dans le cas à 8 canaux, les 16 premières. Le tableau de la figure 7-1 explicite, sous forme résumée, toutes les entrées-sorties ainsi que les paramètres de ce bloc en fonction du nombre de canaux du système. paramètre Nbr_bitstocodehadamard in rst_b clk Générateur de fonctions d'hadamard valeur description Nbr_bitstocodechannels + 1 Génère 2 Nbr_bitstocodeHadamard fonctions out description Signal de reset barre du générateur Signal d'horloge du système @ f système H_logic< 2 Nbr_bitstocodeHadamard -1 : 0 > H_logic_barre< 2 Nbr_bitstocodeHadamard -1 : 0> Fonctions d'hadamard Fonctions d'hadamard barre Figure 7-1 : Résumé des paramètres du générateur d Hadamard 47/106

7.2. Modulateur Le bloc de modulation comprendra N_channels en parallèle travaillant chacun à une fréquence égal à f système /2 Nbr_bitstocodechannels. Comme nous l avons expliqué au chapitre 4, la structure d intégration de chaque canal étant composée de 2 sous-canaux, ces dernières travailleront à une fréquence valant f système /2 Nbr_bitstocodechannels+1. Le modulateur prendra en entrée les 2 Nbr_bitstocodechannels+1 fonctions d Hadamard provenant du générateur d Hadamard, les entrées différentielles du système ainsi que différents signaux de référence. Les fonctions d Hadamard seront utilisées pour générer les différents signaux de contrôle Int_A/B, rst_a/b et smpl_a/b (phase_generator) du bloc de modulation à proprement parlé (channel) ainsi que pour moduler le signal d entrée pour chaque canal. La vue Cadence montrant la décomposition du bloc de modulation est donné ci-dessous pour le cas à 2 canaux : Figure 7-2 : Vue Cadence de la structure du modulateur, cas à 2 canaux Pour un système à 2 canaux, ces derniers fonctionneront à une fréquence égal à f système /2 et chaque sous-canal des structures d intégration à la fréquence f système /4. Pour le cas à 4 canaux, les fréquences de travail seront respectivement de f système /4 et f système /8, tandis qu elles seront de f système /8 et f système /16 pour le cas à 8 canaux. Les paramètres INT_max et INT_min représentent les limites inférieures et supérieures de saturation de la sortie des intégrateurs en mode non différentiel. Ils ont été choisis de manière à obtenir une dynamique de sortie en mode différentiel allant de -375 mv à + 375 mv comme cela a été expliqué au chapitre 4.4. Le choix de la valeur du paramètre GAIN a, quand à lui, été développé en détail au chapitre 4.3. 48/106

Nbr_channels INT_max INT_min GAIN paramètres VDD VSS in H_logic< 2 Nbr_bitstocodeHadamard -1 : 0 > H_logic_barre< 2 Nbr_bitstocodeHadamard -1 : 0 > INP INN CM_ref IREF_channel CHANNEL_enable Modulateur valeur description N_channels Nombre de canaux du modulateur 750 mv Limite supérieure de saturation des intégrateurs (non diff.) -750 mv Limite inférieure de saturation des intégrateurs (non diff.) 8,34*10 7 Gain interne du modulateur 1.8 V Tension d'alimentation positive 0.0 V Tension d'alimentation négative out description Fonction d'hadamard Fonction d'hadamard complémentaires Entrée différentielle positive du système Entrée différentielle négative du système Tension de référence du mode commun (900 mv) Courant de référence (100 μa) Enable des canaux du modulateur (fonctionne au niveau haut) OUTP<N_channel:1> Sortie différentielle positive du modulateur (une par canal) OUTN<N_channel:1> Sortie différentielle négative du modulateur (une par canal) Figure 7-3 : Paramètres du modulateur Compte tenu de la tension de mode commun du système valant 900 mv ainsi que des bornes de saturation des intégrateurs, les signaux différentiels de sortie du bloc de modulation appartiendront nécessairement à l intervalle allant de 525 mv à 1,275 V (900 ± 375 mv). 49/106

7.3. Convertisseurs ADC pipelines Les sorties analogiques différentielles de chaque canal du modulateur doivent être converties en mots binaires à l aide des convertisseurs pipelines présentés au chapitre 5. Ces derniers sont des convertisseurs différentiels 10 bits possédant 9 étages. Les signaux d entrées proviennent des sorties des divers canaux du modulateur possédant une amplitude limitée à ± 375 mv autour de la tension de mode commun. La plage de fonctionnement du convertisseur en mode non différentiel sera donc de ± 750 mv. Grâce au parallélisme du système, chaque convertisseur pourra travailler à une fréquence 2 Nbr_bitstocodechannels fois inférieure à celle du système global. Le signal d horloge des convertisseurs correspond ainsi tout simplement à la fonction d Hadamard d indice 2 Nbr_bitstocodechannels-1. La vue Cadence pour un système à 2 canaux est la suivante : Figure 7-4 : Vue Cadence des convertisseurs pour un système à 2 canaux Pour un système à 2 canaux, la fréquence de l horloge des convertisseurs sera tout simplement deux fois inférieure à celle du système global et équivaudra à la première fonction d Hadamard. Dans le cas à 4 canaux, la fréquence sera 4 fois moins élevée que celle du système global et sera représentée par la seconde fonction d Hadamard. Pour 8 canaux, la fréquence sera divisée par 8 et les convertisseurs seront pilotés par la 4 ème fonction d Hadamard. 50/106

paramètres Nbr_bits_ADC NSTAGES NBITPST Ymax Ymin VDD VSS in clk nenable dac_vref_plus dac_vcm dac_vref_minus tinp tinn Convertisseur ADC pipeliné valeur description 10 Nombre de bits de sortie de l'adc 9 Nombre d'étages pipelinés de l'adc 2 Nombre de bits de sortie par étage 375 mv Borne d'entrée sup. (en différentiel en dessus de Vcm) -375 mv Borne d'entrée inf. (en différentiel en dessous de Vcm) 1.8 V Tension d'alimentation positive 0.0 V Tension d'alimentation négative out description Horloge = Hadamard< 2 (Nbr_bitstocodechannels-1) > Enable barre ( Convertisseur activ au niveau bas) Tension valant 1.275 V Tension valant 0.9 V Tension valant 0.525 V Entrée analogique différentielle positive du convertisseur Entrée analogique différentielle négative du convertisseur dout < 9:0 > Sortie binaire du convertisseur Figure 7-5 : Paramètres des convertisseurs 51/106

7.4. Démodulateur Le démodulateur reçoit, en entrée, les N_channels mots de 10 bits de sortie des convertisseurs. Il dispose de trois horloges. La première, clk_add, pilote les bancs de registres séparant les différents étages de notre modèle pipeline. Elle est identique à celle appliquée aux convertisseurs et possède donc une fréquence égale à f système /2 Nbr_bitstocodechannels, pouvant être représentée par la fonction d Hadamard d indice 2 Nbr_bitstocodechannels-1. La seconde, clk_system, commande les registres de sortie du démodulateur situés après le système de switches. Elle correspond simplement à l horloge du système global. Enfin, la troisième, switch_clk, est composée de Nbr_bitstocodechannels horloges et est utilisée comme un compteur ayant pour but d appliquer la bonne valeur sur la sortie. Ce compteur devant changer d état toute les périodes du système global, les horloges le composant devront donc avoir une fréquence 2 fois, puis 4 fois, 8 fois, et ainsi de suite inférieure à celle du système global. Ces signaux correspondent aux fonctions d Hadamard d indice 1, puis 2, puis 4, (2 i ). Figure 7-6 : Vue Cadence du démodulateur pour un système à 4 canaux 52/106

Pour le cas d un système à 2 canaux, clk_add et switch_clk équivalent à la fonction d Hadamard 1 tandis que clk_system correspond au signal d horloge du système. Pour le cas à 4 canaux, clk_add et switch_clk<1> sont égales à la fonction d Hadamard 2, switch_clk<0> à celle d indice 1 et clk_system au signal d horloge global. Pour 8 canaux, clk_add et switch_clk<2> seront connectées à la fonction d Hadamard 4, switch_clk<1> à la 2, switch_clk<0> à la une et finalement clk_system sera toujours relié au signal d horloge d entrée du système. Les paramètres du démodulateur sont donnés ci-dessous : Démodulateur paramètres Valeur description Nbr_bits_ADC 10 Nombre de bits de sortie de l'adc Nbr_channels N_channels Nombre de canaux du système complet in out description rst_b Signal de reset barre du démodulateur clk_system Horloge du système global clk_add Horloge des canaux = Hadamard< 2 (Nbr_bitstocodechannels-1) > switch_clk< Nbr_bitstocodechannels-1:0 > Horloge pilotant le système de switches de sortie s_array_in< Nbr_channels:1 > Nbr_channels mots de 10 bits venant des ADC s_out< 9:0 > Signal de sortie du système complet Figure 7-7 : Paramètres du démodulateur 53/106

7.5. Convertisseur de Walsh-Hadamard complet En reliant ensemble tous les éléments présentés ci-dessous, l on obtient le convertisseur de Walsh-Hadamard complet. Le schéma Cadence pour le cas à 2 canaux est donné ci-dessous : Figure 7-8 : Schéma bloc Cadence du convertisseur de Walsh-Hadamard à 2 canaux Il convient de relever que les différents blocs du système global provoquent des latences et/ou des gains sur le signal de sortie du système. Le gain et la latence total du circuit peuvent être obtenus très simplement en sommant les différents effets de chaque bloc séparant l entrée de la sortie. Le bloc de modulation provoque une latence égale à une période du signal d horloge des canaux (fréquence : f système /2 Nbr_bitstocodechannels ). En remplaçant VDD par 1,8V dans la formule du gain du modulateur développé au chapitre 4.3, l on obtient un rapport des amplitudes de sortie sur celles d entrée valant 150*2 Nbr_bitstocodechannels /f système en Mhz. Le convertisseur induit, quand à lui, uniquement une latence égale à 10 périodes du signal d horloge des canaux. Enfin, le démodulateur ajoute une latence correspondant à la somme de Nbr_bitstocodechannels périodes de l horloge des canaux et d une période de l horloge du système. En sommant toutes ces contributions, nous arrivons aux formules suivantes valables pour le système global : GAIN système LATENCE système 150 * 2 = f Nbr _ bitstocodechannels systeme en MHz 1+ (11 + Nbr _ bitstocodechannels) * 2 = f systeme en Hz Nbr _ bitstocodechannels Pour un système fonctionnant à 200 Mhz, dans le cas à 2 canaux, le gain vaut 1,5 et la latence 125 ns. Pour un système à 4 canaux, le gain vaut 3 et la latence 265 ns et pour le cas à 8 canaux, le gain sera de 6 et la latence de 565 ns. 54/106

7.6. Résultats de simulation Le système complet pour les cas à 2, 4 et 8 canaux a été simulé dans l environnement ADVance MS ainsi que sur Cadence. Les résultats obtenus sont semblables et correspondent à ceux attendus. Ils sont donnés, dans le cas des 2 premières configurations, dans les sous-chapitres qui suivent. 7.6.1. Cas à 2 canaux Le convertisseur complet simulé dans cette partie est un convertisseur de Walsh-Hadamard à 2 canaux travaillant à une fréquence de 200 Mhz. Les signaux d entrées utilisés sont des signaux différentiels sinusoïdaux de fréquence 500 khz et d amplitude 115 mv avec une tension de mode commun valant 900 mv (signal jaune INP et vert INN de la figure 7-9). Sur les graphes qui suivent, la sortie OUTPUT_DESIRED (signal orange) correspond à la sortie théorique du système en analogique. Elle a été calculée en prenant le signal d entrée non différentiel (INP-INN), puis en lui ajoutant un gain et une latence selon les formules données au point 7.5. La sortie du système étant représentée par un mot binaire, nous l avons reconvertit en analogique pour vérifier que ce mot corresponde bien à la valeur attendue. Ces mots binaires de sortie, convertis en analogique, sont représentés graphiquement par la courbe rose. Il est aisé de constater que les résultats obtenus et désirés coïncident. Le signal de sortie est donc égal à celui d entrée non différentiel auquel un gain de 1,5 et une latence de 125 ns ont été ajoutés. Figure 7-9 : Simulation Convertisseur de Walsh-Hadamard complet, 2 canaux 55/106

Un zoom a été réalisé sur le signal de sortie converti en analogique et le signal désiré. Globalement le signal obtenu est très proche du signal théorique et les résultats peuvent être jugés très satisfaisants. Il est intéressant de remarquer que, dans cette configuration, le signal d horloge des canaux est 2 fois plus lent que celui du système. Les ADC travaillent donc à une fréquence 2 fois inférieure à celle de sortie du système. Figure 7-10 : Zoom Convertisseur de Walsh-Hadamard complet, 2 canaux 56/106

7.6.2. Cas à 4 canaux En appliquant exactement la même entrée à un convertisseur de Walsh-Hadamard à 4 canaux, l on obtient les résultats suivants : Figure 7-11 : Simulation Convertisseur de Walsh-Hadamard complet, 4 canaux Figure 7-12 : Zoom Convertisseur de Walsh-Hadamard complet, 4 canaux 57/106

Deux points méritent d être soulignés. Premièrement, par rapport à la simulation du système à 2 canaux, nous pouvons remarquer que le gain et la latence augmentent dans le cas à 4 canaux. Le gain double, passant de 1,5 à 3 tandis que la latence augmente de 140 ns (125 ns pour le cas à 2 canaux contre 265 pour le cas à 4 canaux). Deuxièmement, la fréquence de l horloge de travail des canaux diminue pour devenir 4 fois plus faible que celle du système total. Ces résultats sont en parfaite adéquation avec les commentaires qui ont été faits précédemment. Un modèle de convertisseur de Walsh-Hadamard générique a donc pu être implémenté et testé avec succès. 58/106

8. Conclusion Ce projet a eu pour but de réaliser et de tester un convertisseur de Walsh-Hadamard complet générique possédant un bloc de modulation ayant une structure rigoureusement identique à celle que G. Ding est entrain de finaliser. Un tel modèle trouve toute son utilité lors du design d un convertisseur en offrant la possibilité de modifier rapidement et aisément par exemple le nombre de canaux utilisés et de voir l effet de ces modifications sur le comportement global du circuit. Ce convertisseur fonctionne parfaitement et le schéma Cadence ayant servi pour tester le circuit complet pourra également être utilisé en remplaçant le modèle de notre modulateur par le bloc réel au niveau transistor fournit par G. Ding. Les deux blocs digitaux ont pu être synthétisés au niveau transistor tout en répondant aux contraintes sur le timing qui leur étaient imposées (400 Mhz pour le générateur d Hadamard et 200 Mhz pour le démodulateur). Les layout, importés sur Cadence, ne pourront cependant pas être utilisés tel quel dans le prototype du convertisseur de Walsh-Hadamard étant donné que ceux-ci ont été réalisés dans une technologie ams 0.35μ qui ne correspond pas à celle (umc 0.18μ) avec laquelle travaille G. Ding. Cette adaptation ne devrait cependant pas poser de problèmes et va être réalisée dès que les librairies seront mises à jour afin de pouvoir lui fournir ces blocs en vu d une implémentation sur le prototype. Les modèles développés dans le cadre de ce projet répondent ainsi parfaitement aux spécifications qui leur étaient imposées. La puce électronique (prototype) qui va être réalisée contiendra le générateur d Hadamard à 8 fonctions synthétisé au niveau transistor développé dans le cadre de ce projet, deux blocs de modulations (l un à 2 et l autre à 4 canaux) permettant, en fonction de la valeur d un signal d entrée, de travailler soit avec un convertisseur 2 canaux, soit avec un système à 4 canaux ainsi que le bloc de démodulation pour un système à 4 canaux développé de ce rapport. Si le système à 2 canaux est sélectionné, les entrées 3 et 4 du bloc de démodulation vont simplement être mise à zéro. Les convertisseurs, par contre, ne seront pas intégrés au prototype mais consisteront en des convertisseurs pipeline commerciaux externes. Lausanne, le 23.02.2007 François Emery 59/106

9. Remerciements Je tiens à présenter toute ma gratitude au personnel du laboratoire de système microélectronique (LSM) et plus particulièrement au professeur Alain Vachoux ainsi qu au doctorant Guillaume Ding pour l aide précieuse qu ils m ont apportée durant ce projet ainsi que pour la disponibilité dont ils ont fait preuve à mon égard. 10. Bibliographie - «Frequency-interleaving technique for high-speed A/D conversion», G.Ding / C.Dehollain / M.Declercq / K.Azadet, ISCAS 2003 - «Hardware Realization of Walsh Functions and their applications using VHDL and reconfigurable logic», A.Bin Ateeq / S.Abbasi / A.Alamoud / K.Azadet, King Saud University - «Les fonctions binaires orthogonales Walsh-Hadamard-Paley», J.Auvray : article tiré du site suivant daté du 20.02.2007 : http://perso.orange.fr/avrj.cours/cours/tds_2.pdf - «Analog and Mixed-Signal Systems Modeling, Practical lab, Pipelined A/D converter», Alain Vachoux, LSM, EPFL, 2004 60/106

11. Annexes techniques 11.1. Algorithme : Générateur d Hadamard Dans cette annexe, nous allons décrire l algorithme mathématique que nous avons développé afin de générer les N_hadamard premières fonctions d Hadamard logiques à partir d un unique signal d horloge en entrée. Rappelons que, compte tenu de la méthode de construction des matrices d Hadamard, N_hadamard devra forcément être une puissance de 2. Les fonctions d Hadamard logiques, tel que nous les avons définies au chapitre 3, ne sont qu une représentation périodique des lignes tirées des matrices d Hadamard et ne peuvent donc pas être considérées comme de vraies fonctions au sens mathématique du terme. Pour réaliser notre générateur d Hadamard il a donc fallu introduire un nouveau type de fonctions que sont les fonctions de Walsh possédant de multiples propriétés mathématiques. L utilité d introduire ces dernières réside dans le fait qu elles vont pouvoir être crées, comme expliqué au point 11.1.2, à partir d un simple signal d horloge. Le sous-chapitre suivant est consacré à une description des fonctions de Walsh ainsi qu à une méthode permettant d obtenir les fonctions d Hadamard à partir des fonctions de Walsh. 11.1.1. Fonctions de Walsh Les fonctions de Walsh sont des fonctions réelles ne pouvant prendre que 2 états +1 et -1, étant tout comme ce que nous avons appelé les fonctions d Hadamard, matérialisées par les lignes des matrices d Hadamard. Elles présentent néanmoins l avantage d être des fonctions au sens mathématique du terme dont la définition stricte est donnée par la formule ci dessous. De plus, une méthode reposant sur un système de diviseurs fréquentiels permet d obtenir facilement ces fonctions et est expliquée au point suivant. Elles diffèrent des fonctions d Hadamard par leur intervalle de définition ainsi que par leurs indices. En effet, conceptuellement elles ne sont définies que dans la plage [-1/2,1/2]. Néanmoins, dans ce chapitre, nous les considérerons sous forme périodique en répétant les valeurs de cette plage à l infini. Concernant leurs indices, nous avions vu au chapitre 3 que la fonction d Hadamard d indice i correspond toujours à la ligne i+1 d une matrice quelconque d Hadamard. Pour les fonctions de Walsh, cette méthode ne peut être appliquée, l indice correspondant à une ligne diffère selon l ordre de la matrice d Hadamard que l on utilise. Pour illustrer cela, nous allons développer un exemple après avoir donné la formule mathématique définissant les fonctions de Walsh périodiques. avec k = indice de la fonction de Walsh, ki = i ème r = PartieRéelle(Log2(k) + 1). bit du nombre k écrit en binaire et 61/106

Les 8 premières fonctions de Walsh (d indice 0 à 7) peuvent être obtenues en multipliant entre elles les fonctions Sign(cos(πt)), Sign(cos(2πt)) et Sign(cos(4πt)) selon la formule cidessus. Etant donné que le cosinus est périodique de période 2π, nous avons simplement représenté ces dernières sur une seule période c'est-à-dire pour une valeur de t allant de 0 à 2 Figure 11-1 : Formule et représentation graphique des 8 premières fonctions de Walsh En comparant les fonctions de Walsh des graphes ci-dessus aux lignes des différentes matrices d Hadamard de la figure 3-2, il est aisé de constater qu une fonction de Walsh d indice i correspond à une ligne différente selon l ordre de la matrice d Hadamard choisie. Par exemple, la fonction de Walsh d indice 1 est représentée par la 2 ème ligne de la matrice d Hadamard 2 (+1/-1), mais par la 3 ème de celle d ordre 4 (+1/+1/-1/-1) et par la 5 ème de celle d ordre 8 (+1/+1/+1/+1/-1/-1/-1/-1). A contrario, la 1 ère fonction d Hadamard sera toujours égale à la 2 ème ligne de n importe quelle matrice d Hadamard (+1/-1/+1/-1/ ). La différence entre les fonctions de Walsh et celles d Hadamard réside donc dans leurs indices respectifs. Il convient à présent de trouver un moyen de relier les indices des fonctions de Walsh avec ceux des fonctions d Hadamard. 62/106

11.1.1.1. Relation entre les indices des fonctions de Walsh et ceux d Hadamard Il existe une méthode relativement simple pour passer des indices des fonctions d Hadamard à ceux de Walsh. Les étapes à suivre sont les suivantes : 1) Convertir l indice de la fonction d Hadamard en nombre binaire de longueur Nbr_bitstocodeHadamard = Log 2 (N_hadamard) où N_hadamard = ordre de la matrice d Hadamard considérée = nombre de fonctions d Hadamard pouvant être générées 2) Inverser l ordre des bits du nombre obtenu 3) Lire le nombre décimal correspondant à l aide du code de Gray Les tableaux suivants illustrent cette méthode dans le cas où N_hadamard = 4 (Conversion de l indice en mot de Nbr_bitstocodeHadamard = log(4) = 2 bits) et où Nbr_bitstocodeHadamard = 8 (Conversion de l indice en mot de B = log(8) = 3 bits). Indice fonctions Binaire inversé Indice fonctions d'hadamard a1 a0 b1 b0 de Walsh 0 0 0 0 0 0 Soit H(0) = Walsh(0) 1 0 1 1 0 3 Soit H(1) = Walsh(3) 2 1 0 0 1 1 Soit H(2) = Walsh(1) 3 1 1 1 1 2 Soit H(3) = Walsh(2) d'hadamard a2 a1 a0 b2 b1 b0 de Walsh 0 0 0 0 0 0 0 0 Soit H(0) = Walsh(0) 1 0 0 1 1 0 0 7 Soit H(1) = Walsh(7) 2 0 1 0 0 1 0 3 Soit H(2) = Walsh(3) 3 0 1 1 1 1 0 4 Soit H(3) = Walsh(4) 4 1 0 0 0 0 1 1 Soit H(4) = Walsh(1) 5 1 0 1 1 0 1 6 Soit H(5) = Walsh(6) 6 1 1 0 0 1 1 2 Soit H(6) = Walsh(2) 7 1 1 1 1 1 1 5 Soit H(7) = Walsh(5) Code de Gray Nombre décimal Code Gray b2 b1 b0 0 0 0 0 1 0 0 1 2 0 1 1 3 0 1 0 4 1 1 0 5 1 1 1 6 1 0 1 7 1 0 0 Figure 11-2 : Relation entre les indices des fonctions d Hadamard et ceux de Walsh Pour passer du nombre binaire de Gray b Nbr_bitstocodeHadamard-1 b 1 b 0 au nombre binaire correspondant, il est possible d utiliser la propriété suivante (par définition du code de Gray) : Résultat = Nbr_bitstocodeHadamard 1 XOR binaire b i i= 0 i+ 1 { * (2 1) } Pour expliciter cette méthode, prenons le cas d un générateur d Hadamard capable de fournir les 8 premières fonctions d Hadamard ainsi que leurs inverses. Conformément à ce qui a été dit précédemment, Nbr_bitstocodeHadamard vaudra donc 3 (log2(8) = 3). Appliquons la méthode décrite ci-dessus pour obtenir l indice de la fonction de Walsh correspondant à la fonction d Hadamard d indice 5. 63/106

En binaire codé sur Nbr_bitstocodeHadamard bits (3 dans ce cas), 5 s écrit 101. Le nombre inversé correspondant au code de Gray vaut donc 101, ce qui signifie en utilisant la notation développée ci-dessus : b2 = 1 / b1 = 0 et b0 = 1. Il ne nous reste plus qu à utiliser la formule pour le code de Gray. L équation binaire à résoudre est donc 1*1 xor 0*3 xor 1*7 = 001 xor 000 xor 111 = 110 ce qui équivaut à 6. La 3 ème fonction d Hadamard, pour un générateur chargé d en fournir les 8 premières, sera donc égale à la fonction de Walsh d indice 6. 11.1.1.2. Hadamard comme multiplication de fonctions de Walsh Au point précédent, nous avons décrit une méthodologie donnant la correspondance entre les indices des fonctions d Hadamard et ceux des fonctions de Walsh pour un générateur de taille donné. Dans cette partie, nous allons pousser le raisonnement plus loin en égalant les fonctions d Hadamard à des produits de fonctions de Walsh d indice 2 j -1 ; de telles fonctions pouvant être aisément obtenues à l aide d un simple signal d horloge comme expliqué au point 11.1.2. Pour se faire, nous allons utiliser la propriété des fonctions de Walsh suivante : Walsh(k)*Walsh(l) = Walsh(k xor l) N importe quelle fonction de Walsh peut ainsi être décomposée en un produit de fonctions de Walsh d'indice 2 j -1 étant donné que n importe quel nombre binaire peut être obtenu à l aide de nombres binaires de la forme 2 j -1 combinés entre eux à l aide de fonctions xor. Pour effectuer cette décomposition, il faut convertir l'indice de la fonction de Walsh considérée en binaire puis l'égaler à l'aide de fonctions xor (ou-exclusif) à des nombres du type 2 j -1 écrits en binaire. L'exemple ci-dessous décrit la méthodologie. Exemple : Construisons Walsh(9) à partir des fonctions de Walsh d indices 2 j -1. 1) En binaire, 9 = 1001 2) 1001 = 1111 xor 0111 xor 0001 9 = 15 xor 7 xor 1 (symboliquement) Walsh(9) = Walsh(15)*Walsh(7)*Walsh(1) Mathématiquement, décomposer une fonction de Walsh en un produit de fonctions de Walsh d indice 2 j -1 revient à trouver les coefficients b Nbr_bitstocodeHadamard-1 b 1 b 0 répondant à l équation suivante : Résultat = Nbr_bitstocodeHadamard 1 XOR binaire b i i= 0 i+ 1 { * (2 1) } 64/106

puis à multiplier les fonctions Walsh d indice (b j *(2 j+1-1)) entre elles : Walsh ( Indice) = Nbr_bitstocodeHadamard-1 j= 0 j { + 1 Walsh[( * (2 1)) } b j Dans cette 2 ème formule, les coefficients b j (obtenus grâce à la 1 ère formule) valant 0 conduisent à effectuer une multiplication par la fonction de Walsh d indice 0 qui est une constante valant +1 représentant l élément nul pour la multiplication. Les coefficients valant 0 peuvent donc être purement et simplement négligés. Il est donc possible d'exprimer n'importe quelle fonction de Walsh uniquement en multipliant des fonctions d'indices 2 j -1. Pour ce faire, il suffit de calculer les valeurs b j, puis de multiplier entre elles les fonctions Walsh(2 j+1-1) telles que b j = 1. L étape suivante consiste à exprimer les fonctions d Hadamard sous forme de produits de telles fonctions. Il faut alors combiner les méthodologies présentées ci-dessus et celle du point précédent. Ce faisant, l on constate que la dernière étape du point précédent consistant à traduire l indice grâce au code de Gray et la première étape de celui-ci s annulent (formules identiques, mais dans le premier cas il faut trouver la valeur de l indice à l aide des coefficients et dans le 2 ème, retrouver les coefficients à l aide de l indice) La méthodologie complète pour relier les fonctions d'hadamard à un produit de fonction de Walsh d indice 2 j -1 est donc composée des 2 premières étapes du point précédent ainsi que de la 2 ème de celui-ci et est résumée ci-dessous : 1) Convertir l'indice k de la fonction d'hadamard considérée en nombre binaire de longueur Nbr_bitstocodeHadamard = Log2(N_hadamard) a Nbr_bitstocodeHadamard-1 a 1 a 0 2) Inverser l ordre des bits du nombre obtenu b Nbr_bitstocodeHadamard-1 b 1 b 0 = a 0 a 1 a Nbr_bitstocodeHadamard-1 3) Ne considérer que les j tels que b j = '1' (j = 0,, Nbr_bitstocodeHadamard-1) Hadamard(k) = (Walsh(2 j+1-1)) Il est à remarquer que pour la fonction d Hadamard d indice 0, tous les b j seront égaux à 0. Or la méthode exposée ci-dessus ne prend pas en compte les coefficients valant 0 et donc la solution ne sera pas déterminée pour cette fonction. Pour résoudre ce problème, en sachant que cette fonction d Hadamard doit être constante à la valeur +1, il suffit alors de multiplier deux fonctions identiques de Walsh entre elles (c'est-à-dire d élever au carré les valeurs d une fonction de Walsh quelconque). Comme les fonctions de Walsh peuvent prendre uniquement les valeurs +1 ou -1, en multipliant deux fonctions identiques entre elles, l on obtient bien une fonction constante à la valeur +1 ( (+1)*(+1) = +1 et (-1)*(-1) = +1 ). Dans le programme que nous avons développé, nous avons défini la fonction d Hadamard d indice 0 comme étant la multiplication entre elles des deux fonctions de Walsh d indice le plus élevé, c'est-à-dire des fonctions de Walsh d indice 2 Nbr_bitstocodeHadamard -1. 65/106

Hadamard(0) = Walsh(2 Nbr_bitstocodeHadamard -1)* Walsh(2 Nbr_bitstocodeHadamard -1) Pour une meilleure compréhension de la méthodologie figurant ci-dessus, prenons, comme exemple, le cas d un générateur fournissant les 8 premières fonctions d Hadamard. Dans ce cas de figure, Nbr_bitstocodeHadamard sera égal à 3 (log2(8) = 3). Si l on désire obtenir la correspondance pour la matrice d Hadamard 5, il faudra donc faire : 1) En binaire, 5 = 101 (Nbr_bitstocodeHadamard = 3 bits) 2) Inversion des bits : 101 b 2 = 1 / b 1 = 0 / b 0 = 1 3) On ne considère que les j valant 0 et 2 (b j valant 1 ) Hadamard(3) = (Walsh(2 j+1-1)) = Walsh(2 2+1-1) * Walsh(2 0+1-1) = Walsh(7) * Walsh(1) Pour ce générateur, la fonction Hadamard 5 sera donc égale au produit des fonctions de Walsh d indices 1 et 7. La figure 11-3 résume tous les cas possibles pour un générateur fournissant les 8 premières fonctions d Hadamard (Nbr_bitstocodeHadamard = 3) : Walsh(2 j+1-1) = Walsh(2 2+1-1) = Walsh(7) Walsh(2 j+1-1) = Walsh(2 1+1-1) = Walsh(3) Walsh(2 j+1-1) = Walsh(2 0+1-1) = Walsh(1) Figure 11-3 : Relation entre fonctions d Hadamard et fonctions de Walsh d indice 2 i -1 66/106

11.1.2. Construction du générateur d Hadamard Jusqu à maintenant, nous avons donné une méthode permettant de construire n'importe quelle fonction d'hadamard d'indice inférieur ou égal à 2 Nbr_bitstocodeHadamard -1 à partir d un produit de fonctions de Walsh d'indices 2 j -1 avec j = 1,, Nbr_bitstocodeHadamard. Il nous reste maintenant à construire de telles fonctions à partir d un unique signal d horloge comme entrée. Pour simplifier les indices utilisés dans notre code, nous avons décidé d introduire les fonctions de Rademacher périodiques qui sont identiques aux fonctions de Walsh d indices 2 j -1 La relation qui relie ces deux types de fonctions est la suivante : Rademacher(0) = Walsh(1) Rademacher(1) = Walsh (3) Rademacher(n) = Walsh (2 n+1-1) Figure 11-4 : Fonctions de Rademacher Le fait d utiliser ces fonctions ne change rien à la méthodologie ou au concept utilisé, mais permet simplement d implémenter dans notre code des fonctions ayant des indices plus compréhensibles (de 0 à N et non pas de 1 à 2 N+1-1). 11.1.2.1. Construction des fonctions de Rademacher logiques Le but étant de générer les fonctions d'hadamard logiques à l'aide d'une horloge d'entrée numérique, nous allons à présent présenter un moyen matériel de les construire. Les fonctions de Rademacher logiques sont tout simplement des fonctions carrées oscillant à des fréquences différentes de celle de l horloge et peuvent être obtenues à la sortie d un diviseur fréquentiel comme illustré à la figure suivante : 67/106

Figure 11-5 : Construction des fonctions de Rademacher La fonction de Rademacher d indice le plus élevé (Nbr_bitstocodeHadamard-1), correspondant à la fonction de Walsh d indice 2 Nbr_bitstocodeHadamard -1, sera donc forcément un signal carré de fréquence moitié inférieure à celle de l horloge d entrée, celle d indice Nbr_bitstocodeHadamard-2 aura une fréquence valant 1/4 de celle de l horloge et ainsi de suite (1/8 puis 1/16, ). Pour la réalisation de ce diviseur fréquentiel, nous avons utilisé un simple compteur binaire nous permettant d obtenir les fonctions de Rademacher. Le code VHDL utilisé pour réaliser cela est donné ci-dessous : begin -- Lorsque rst_b = '0' : phase d'initialisation if rst_b = '0'then compteur := (others=>'0'); elsif rst_b = '1' then if clk'event and clk = '1' then -- Fonctions de Rademacher = sortie d'un compteur binaire Rademacher := not (std_logic_vector(compteur)); compteur := compteur + 1; Les résultats de simulation pour les quatre premières fonctions de Rademacher sont bien semblables aux résultats attendus exprimés à la figure 11-4 (excepté le fait qu il s agissent de signaux logiques 0 et 1 et non de signaux analogiques binaires -1 et +1). Figure 11-6 : Fonctions de Rademacher logiques 68/106

11.1.2.2. Construction des fonctions d'hadamard logiques Les fonctions d'hadamard analogiques ne peuvent prendre que deux niveaux ±1 et sont obtenues en multipliant entre elles les fonctions de Rademacher analogiques (correspondant aux fonctions de Walsh d indice 2 j -1) comme expliqué au point 11.1.1.2. Or, ce que nous cherchons est d obtenir les fonctions d Hadamard logiques à partir de fonctions de Rademacher logiques. Pour ce faire, en considérant les tables de la multiplication et celle de la fonction not xor (inverse du ou exclusif), nous pouvons constater que le '0' logique joue le rôle du -1 et le '1' logique celui du +1. Faire le produit de fonctions ±1 est donc identique à combiner les fonctions binaires 0, 1 correspondantes à l aide de fonctions not(xor). Figure 11-7 : Tables de multiplication et de la fonction not xor La méthode décrite à la fin de la partie 11.1.1.2 peut donc être réutilisée en remplaçant les multiplications par des fonctions not(xor) et en se rappelant que Walsh(2 j -1) = Rademacher(j-1). Les fonctions d'hadamard d'indices k peuvent donc être obtenues en suivant les étapes suivantes : 1) Convertir l'indice k de la fonction d'hadamard considérée en nombre binaire de longueur Nbr_bitstocodeHadamard = Log2(N_hadamard) a Nbr_bitstocodeHadamard-1 a 1 a 0 2) Inverser l ordre des bits du nombre obtenu b Nbr_bitstocodeHadamard-1 b 1 b 0 = a 0 a 1 a Nbr_bitstocodeHadamard-1 3) Ne considérer que les j tels que b j = '1' (j = 0,, Nbr_bitstocodeHadamard-1) Hadamard ( k) = NOT ( XOR){ Rademacher ( j)} Le code VHDL utilisé pour obtenir les 2 Nbr_bitstocodeHadamard premières fonctions d'hadamard logiques à partir des Nbr_bitstocodeHadamard premières fonctions de Rademacher correspondra exactement à la méthodologie décrite ci-dessus. 69/106

begin -- Le calcul des fonctions d'hadamard se fait entre 2 flancs montants -- Lorsque rst_b = '0' : phase d'initialisation if rst_b = '0'then compteur := (others=>'0'); elsif clk'event and clk = '1' then -- Fonctions de Rademacher = sortie d'un compteur binaire Rademacher := not(std_logic_vector(compteur)); compteur := compteur + 1; -- génère les fonctions d'hadamard logiques '0'-'1' à partir des fonctions de Rademacher logiques Hadamard(0) := not(rademacher(nbr_bitstocodehadamard-1) xor Rademacher(Nbr_bitstocodehadamard -1)); for k in 1 to 2** Nbr_bitstocodehadamard -1 loop -- Indice k de la fonction d'hadamard en binaire dont l'ordre des bits a été inversé reg := std_logic_vector(to_unsigned(k,reg'length)); -- On initialise Hadamard à '1' car c'est l'élément neutre de la fonction not xor Hadamard(k) := '1'; for m in 0 to Nbr_bitstocodehadamard-1 loop if reg(m) = '1' then Hadamard(k) := not(rademacher(nbr_bitstocodehadamard-1-m) xor Hadamard(k)); end if; end loop; end loop; end if; end if; H_logic <= Hadamard; H_logic_barre <= not(hadamard); end process; 70/106

11.2. Algorithme démodulateur La méthode conceptuelle de fonctionnement du démodulateur a été explicitée au chapitre 6 et se base sur une série d additions ou de soustractions effectuées sur les divers canaux conformément aux valeurs contenues dans les lignes des matrices d Hadamard, suivi d un système de switches sélectionnant le mot à appliquer à la sortie. Cette annexe a pour but d expliquer la manière dont nous avons réalisé ce démodulateur générique et les spécificités exigées par le système auquel il a été adapté, puis de décrire étape par étape le code VHDL utilisé pour réaliser cette fonctionnalité. L algorithme développé s appuie sur la propriété fondamentale de construction des matrices d Hadamard répétée ci-dessous : avec Cette propriété étant valable pour des matrices d ordres 2n, le démodulateur générique sera donc adapté à des systèmes possédant 2 i canaux où i est supérieur ou égal à 1. Un démodulateur spécifique sera alors crée pour chaque configuration à 2, respectivement 4, 8, 16, canaux. Dans le cas d un convertisseur parallèle possédant un nombre de canaux différents de 2 i, il est possible de travailler avec le démodulateur adapté à un système à 2 i canaux où la valeur de i est choisi de manière à ce que 2 i soit la valeur supérieure la plus proche du nombre de canaux de la configuration choisie; les entrées des canaux surnuméraires étant alors mis à 0 (par exemple, pour une configuration à 6 canaux, il suffit de prendre le démodulateur 8 canaux et de mettre les entrées correspondants aux canaux 7 et 8 à la valeur 0). Une remarque importante découlant du paragraphe précédent réside dans le fait que, pour obtenir un modèle générique, nous avons dû contraindre le design, ce dernier n étant alors pas optimisé pour une configuration différente de 2 i canaux. En effet, dans ce cas, des registres et de la logique inutiles au fonctionnement du circuit sont insérés pour les canaux surnuméraires, engendrant une augmentation de la taille du circuit. Néanmoins, en tenant compte du fait que le nombre de canaux d un convertisseur de ce type doit rester relativement faible ( 8 car sinon problèmes dus aux composantes hautes fréquences des fonctions de Walsh-Hadamard difficilement gérables) et que le bloc numérique de démodulation risque d être d une taille sensiblement inférieure aux parties analogiques (modulateurs et convertisseurs), l approche générique pourra être appliquée sans grande répercussion à des systèmes ayant un nombre de canaux différent de 2 i. Le démodulateur est constitué de trois parties distinctes expliquées dans les trois souschapitres suivants. 71/106

11.2.1. 1 ère Etape : Conversion std_logic_vector / unsigned La première étape à effectuer consiste à contrôler le nombre de canaux du système et, dans le cas où le système n en possède pas 2 i, à mettre les canaux surnuméraires à la valeur 0. Compte tenu du fait que les entrées du démodulateur correspondent aux sorties des ADC de chaque canal (composés de Nbr_bits_ADC bits) et que ces valeurs sont signées, il convient de ne pas oublier que le 0 est situé à la moitié de la plage des ADC, soit à la valeur 2 (Nbr_bits_ADC-1) correspondant à un mot binaire de longueur Nbr_bits_ADC ayant son MSB à 1 et tout ces autres bits à 0. Une autre opération, résultant de l utilisation du langage VHDL, qui sera effectuée dans cette étape, vient du fait que les opérations d additions et de soustractions ne sont pas définies de manière implicite pour des signaux binaires de type std_logic_vector en VHDL. Il faudra donc transformer ces mots binaires en mots de type unsigned pour lequel ces opérations sont définies. La finalité de cette étape est donc de transformer les mots binaires d entrées en unsigned tout en complétant, au besoin, les mots des canaux manquants par la valeur 0 conformément aux réflexions faites ci-dessus. La figure 11-8 représente schématiquement cela dans le cas d un système à 3 canaux (utilisation d un démodulateur à 4 canaux) et est décrit par le code VHDL générique ci-dessous.. CONVERSION Figure 11-8 : Schéma de conversion pour un système à 3 canaux ---- CONVERSION_UNSIGNED + MISE A 0 DES CANAUX SURNUMERAIRES ---- process(rst_b,s_array_in) begin for i in 1 to Nbr_channels loop word_channels(i) <= unsigned(s_array_in(i)); end loop; -- Mise à 0 (MSB = 1, les autres bits = 0 ) des canaux surnuméraires for j in Nbr_channels+1 to 2**Nbr_bitstocodechannels loop word_channels(j) <= (Nbr_bits_ADC-1 => '1', others => '0'); end loop; end process; 72/106

11.2.2. 2 ème Etape : Opérations arithmétiques La deuxième étape est l étape de démodulation à proprement parlé où les mots venant de chaque canal sont additionnés ou soustraits entre eux de manière à correspondre aux lignes de la matrice d Hadamard et ainsi fournir les différentes valeurs à appliquer à la sortie. Comme expliqué au chapitre 6.2, cette partie se fera de manière pipelinée, les différents mots subissant les opérations 2 à 2. Chaque étage prendra comme valeurs d entrée celles fournies par l étage précédent afin d aboutir, au dernier étage, à la reconstitution des mots ayant subis les opérations décrites par les lignes de la matrice d Hadamard. Chaque résultat provenant de l addition ou de la soustraction de 2 mots sera stocké dans un autre mot, qui sera utilisé par l étage suivant, accessible grâce à un système de pointeurs. Au 1 er étage, les mots provenant des 2 premiers canaux convertis en unsigned vont être additionnés et soustraits (canal 1 canal 2) pour obtenir 2 mots stockés sur l adresse respectivement 1 et 2 du système de pointeurs (l on va dire que ces mots se trouvent dans la première colonne de l étage 1). De même pour les canaux 3 et 4 qui donneront 2 mots accessibles aux adresses 3 et 4 (2 ème colonne de l étage 1) ; 5 et 6 et ainsi de suite. Ces résultats correspondent aux opérations données par les lignes de la matrice d Hadamard d ordre 2 pour chaque paire de canal pris 2 à 2 et vont être utilisés par l étage suivant. Le nombre de mots de sortie vaudra alors : 2 Nbr_bitstocodechannels. Au 2 ème étage, l on va additionner puis soustraire au premier mot de la colonne 1 de l étage 1 et au second le premier mot de la colonne 2 (respectivement le 2 ème mot) pour donner 4 mots de sortie pour cet étage qui constitueront la colonne 1 de l étage 2. Les mots des canaux suivants vont être regroupés de manière identique (formant les colonnes 2,3, ). En entrées, l on avait donc les opérations correspondant à la matrice d Hadamard d ordre 2 pour les canaux 1 et 2, 3 et 4, Comme résultats, l on obtiendra les différentes sommes des opérations à effectuer conformément aux lignes de la matrice d Hadamard d ordre 4 en prenant les canaux 4 par 4. Le nombre de mots de sortie pour cet étage sera identique à celui du précédent. Chaque étage va ensuite être réalisé de la sorte en sommant puis en soustrayant aux j mots de la colonne 1 de l étage précédent correspondant aux résultats des opérations dictées par la matrice d Hadamard d ordre 2 j-1 appliquées aux j premiers canaux, les j mots correspondants de la colonne 2 de l étage précédent (opérations obéissant aux valeurs de la matrice d Hadamard d ordre 2 j-1 appliquées aux j canaux suivants) et formant ainsi les 2j mots constituant la 1 ère colonne de l étage considéré correspondant aux opérations à effectuer sur les 2j premiers canaux en suivant les valeurs fournies par les lignes de la matrice d Hadamard d ordre 2 j (respectivement la colonne 3 et 4 de l étage précédent vont former la colonne 2 de cet étage et ainsi de suite). Dès qu un étage ne comprend plus qu une seule colonne (ce qui arrive après Nbr_bitstocodechannels étages), les valeurs appartenant à cette dernière sont les mots recherchés résultant des opérations d additions et de soustractions réalisées sur les divers canaux conformément aux matrices d Hadamard. Un exemple, donné au point 11.2.2.1, permet d illustrer ce procédé. 73/106

Cette méthode s appuie sur la propriété de construction des matrices d Hadamard suivante : A chaque étage stage, les résultats des opérations effectués sur les canaux 2 stage par 2 stage obtenus à partir de la matrice d Hadamard d indice 2 stage résulteront simplement de l addition et de la soustraction ligne par ligne des résultats fournis par l étage précédent basé sur les matrices d Hadamard 2 stage-1 appliqués aux canaux 2 stage-1 par 2 stage-1 Chaque étage sera constitué de 2 Nbr_bitstocodechannels mots de longueur Nbr_bits_ADC en entrée et en comptera le même nombre en sortie. Il suffit donc d ajouter un offset au pointeur d une valeur égale à 2 Nbr_bitstocodechannels pour passer d un étage au suivant. Si le nombre d éléments d entrée et de sortie reste le même pour chaque étage, le nombre de colonnes et d éléments par colonne va varier sensiblement en fonction de ce dernier. L étage stage comprendra 2 Nbr_bitstocodechannels-stage colonnes contenant, pour chacune d entre elles, 2 stage valeurs. Pour passer d une colonne à la suivante pour un étage donné, il faut donc ajouter au pointeur la valeur 2 stage. Pour expliciter cette étape, nous avons développé ci-dessous le cas à 8 canaux. 11.2.2.1. Cas d un système à 8 canaux L exemple suivant permet de visualiser la stratégie utilisée pour un démodulateur à 8 canaux (Nbr_bitstocodechannels = 3). La partie de gauche nous indique les opérations à réaliser pour chaque colonne représentant chacune un canal, les tableaux suivants indiquant les opérations à effectuer à chaque étage. La partie de droite indique, quant à elle, les valeurs stockées et explicite le système de pointeurs utilisé pour le faire. Dans cet exemple, Hadn correspond aux opérations arithmétiques découlant de la matrice d Hadamard d ordre n représentée à la figure 3-2. 74/106

Canal 1 2 3 4 5 6 7 8 Opérations à effectuer Colonne 1 2 3 4 5 6 7 8 + + + + + + + + + - + - + - + - + + - - + + - - + - - + + - - + + + + + - - - - + - + - - + - + + + - - - - + + + - - + - + + - Colonne ETAGE 1 1 2 3 4 Had2[1] Had2[2] Had2[3] Had2[4] Had2[1] -Had2[2] Had2[3] -Had2[4] Had2[1] Had2[2] -Had2[3] -Had2[4] Had2[1] -Had2[2] -Had2[3] Had2[4] add (1) add (3) add (5) add (7) add (2) add (4) add (6) add (8) add (1) -add (3) add (5) -add (7) add (2) -add (4) add (6) -add (8) add (1) add (3) -add (5) -add (7) add (2) add (4) -add (6) -add (8) add (1) -add (3) -add (5) add (7) add (2) -add (4) -add (6) add (8) Colonne ETAGE 2 1 2 Had4[1] Had4[2] Had4[1] -Had4[2] add (9) add (13) add (10) add (14) add (11) add (15) add (12) add (16) add (9) -add (13) add (10) -add (14) add (11) -add (15) add (12) -add (16) ETAGE 3 Had8[1] add (17) add (18) add (19) add (20) add (21) add (22) add (23) add (24) Figure 11-9 : Exemple, démodulateur à 8 canaux Les mots de sortie, calculés à partir des valeurs des lignes de la matrice d Hadamard d ordre 8 appliquées aux canaux, sont ceux donnés au dernier étage et seront donc stockés sur les emplacements add(17) à add(24). Il est aisé de constater que l indice du pointeur est bien incrémenté de 2 Nbr_bitstocodechannels = 8 lorsque l on passe d un étage au suivant et que, pour un étage stage donné, il faut ajouter 2 Stage pour passer d une colonne de cet étage à la suivante. 75/106

11.2.2.2. Particularités et description du code implémenté Les mots d entrée du démodulateur provenant des ADC des différents canaux sont signés. Or, pour obtenir une valeur signée à la sortie d une addition de 2 mots, il ne faut pas les garder les 2 en signés, mais en garder un tel quel et donner la valeur du second en relatif par rapport au 0 du système. Par exemple, si l on veut additionner les nombres 507 et 513 en signés sur 10 bits (la valeur du 0 sera à «1000000000» = 512), il faudra faire 507 + (513-512) = 508 et non 507 + 513 = 1020. Compte tenu du fait qu un seul mot devra être signé pour obtenir le résultat en signé lors d une opération comprenant plusieurs additions et soustractions nous choisissons, pour notre démodulateur, de garder le mot venant du 1 er canal tel quel et de travailler avec les autres valeurs en relatifs (c'est-à-dire, de leur enlever la valeur 2 (Nbr_bits_ADC-1) ). De cette façon, seul la 1 ère colonne de chaque étage sera signée conduisant à des valeurs de sortie (1 ère colonne du dernier étage) signées. Le code VHDL utilisé pour le 1 er étage est le suivant : ---- 1er ETAGE ---- -- Les 2 premiers éléments du 1 er étage sont signés les autres non add_word(1)<=word_channels(1) + (word_channels(2)-2**(nbr_bits_adc-1)); add_word(2)<=word_channels(1) - (word_channels(2)-2**(nbr_bits_adc-1)); if Nbr_bitstocodechannels > 1 then for i in 2 to 2**(Nbr_bitstocodechannels-1) loop -- Les éléments suivants du 1 er étage sont non signés. Or, les mots d entrées word_channels le sont. Il faut donc retirer "1000000000" = 2**(Nbr_usefulbits_ADC-1)à chaque valeur d entrée pour obtenir un mot correspondant non signé. -- ++ -> -2*(2**(Nbr_usefulbits_ADC-1)) = -2**Nbr_usefulbits_ADC -- +- -> 2**(Nbr_usefulbits_ADC-1) - 2**(Nbr_usefulbits_ADC-1) = 0 add_word(2*i-1) <= word_channels(2*i-1) + (word_channels(2*i)-2**(nbr_bits_adc));++ add_word(2*i) <= word_channels(2*i-1) - word_channels(2*i); +- end loop; ---- Fin 1er ETAGE---- Concernant les étages suivants, le code correspond exactement à ce qui a été dit précédemment. Chaque étage prenant 2 Nbr_bitstocodechannels mots à l entrée et à la sortie, il suffit d ajouter ce nombre au pointeur pour passer à l étage suivant. Pour passer d une colonne à la suivante, il faudra incrémenter ce pointeur de 2 stage. En sachant que, pour le calcul d un étage il lui faut, en entrée, les valeurs obtenues à l étage précédent, nous avons dû utiliser 2 pointeurs ; le premier pointant sur les mots obtenus à l étage précédent utilisés comme entrées pour les additionneurs et les soustracteurs de l étage en question et le second pointant sur les mots où doivent être stockés les résultats de cet étage. Le reste du code comprend uniquement les diverses additions et soustractions réalisées sur les mots de l étage précédent afin d obtenir les mots de sortie de cet étage comme expliqué dans la première partie de ce point. 76/106

---- AUTRES ETAGES ---- -- stage = étage de l'addition pipelinée où l'on se trouve for stage in 2 to Nbr_bitstocodechannels loop offset_previousstage_pointer := offset_stage_pointer; offset_stage_pointer:=offset_stage_pointer+2**nbr_bitstocodechannels; for j in 1 to 2**(stage-1) loop -- 1ère colonne -- ++ add_word(j+offset_stage_pointer) <= add_word(j+offset_previousstage_pointer) + add_word(j+2**(stage-1)+offset_previousstage_pointer); -- +- add_word(j+2**(stage-1)+offset_stage_pointer) <= add_word(j+offset_previousstage_pointer) - add_word(j+2**(stage-1)+offset_previousstage_pointer); -- FIN 1 ère colonne -- Autres colonnes if Nbr_bitstocodechannels > stage then for k in 1 to 2**(Nbr_bitstocodechannels-stage)-1 loop -- ++ add_word(j+k*2**stage+offset_stage_pointer) <= add_word(j+k*2**stage+offset_previousstage_pointer) + add_word(j+k*2**stage+2**(stage-1)+offset_previousstage_pointer); -- +- add_word(j+k*2**stage+2**(stage-1)+offset_stage_pointer) <= add_word(j+k*2**stage+offset_previousstage_pointer) - add_word(j+k*2**stage+2**(stage-1)+offset_previousstage_pointer); end loop; end if; -- Fin autres colonnes end loop; -- Fin étage considéré end loop; -- FIN ETAGES SUIVANTS-- -- Remise à 0 des offsets des pointeurs pour le prochain coup d'horloge offset_previousstage_pointer := 0; offset_stage_pointer := 0; 11.2.3. 3 ème Etape : Système de switches de sortie Les mots, résultant des opérations d additions et de soustractions sur les valeurs d entrée provenant des différents canaux conformément aux lignes de la matrice d Hadamard considérée ayant été calculés, il reste à les appliquer tour à tour sur la sortie à une fréquence f clk. Pour faire cela, nous avons utilisé un système chargé de sélectionner le mot et qui s incrémente à chaque coup d horloge (système bouclé : dès qu il atteint sa borne supérieure, il revient à la première valeur). Ce système équivaudra à un simple compteur (qui est remplacé par de la logique combinatoire lors de la synthèse) nommé switch_clk. 77/106

Les mots du dernier étage devant être appliqués à la sortie ayant un indice variant en fonction du nombre de canaux (donc d étages) du système, nous avons crée une fonction chargée de calculer cette valeur dont le code est donné ci-dessous. Pour un démodulateur possédant Nbr_bitstocodechannels étages composés chacun de 2 Nbr_bitstocodechannels valeurs, l offset à ajouter pour passer directement au dernier étage vaudra donc simplement le nombre d étages avant le dernier (Nbr_bitstocodechannels-1) multiplié par le nombre de valeurs de chaque étage. function offset_final_calculation(nbr_bitstocodechannels : in integer) return natural is variable result : natural; begin if Nbr_bitstocodechannels > 1 then result := (Nbr_bitstocodechannels-1)*2**Nbr_bitstocodechannels; else result := 0; end if; return result; end function offset_final_calculation ; L échantillonnage se fait à un flanc montant du signal d horloge et la valeur sélectionnée dépend de l état du signal switch_clk qui fonctionne comme un compteur. Le code VHDL utilisé pour faire cela est donné ci-dessous. -- Valeur de l'offset pour le pointeur à la sortie du dernier étage du calculateur constant offset_final : natural := offset_final_calculation(nbr_bitstocodechannels); -- Switches de sortie chargés de choisir la sortie du démodulateur à appliquer à la sortie du système complet process(switch_clk,clk_system,rst_b) begin if rst_b = '0' then s_out <= (Nbr_bits_ADC-1 => '1', others => '0'); elsif clk_system'event and clk_system ='1' then for i in 2**Nbr_bitstocodechannels-1 downto 0 loop if to_integer(unsigned(not(switch_clk))) = i then end if; end loop; end if; end process; s_out end architecture bhv; <= std_logic_vector(add_word(offset_final+i+1)); 78/106

12. Annexes code 12.1. Code VHDL du Package Package package function_package is -- design_vision ne supporte pas la librairie math_real contenant les fonctions log2 et ceil qui nous auraient permis de calculer directement Nbr_bitstocodechannels à partir du nombre de canaux -- Nbr_bitstocodechannels = ceil(log2((nbr_channels)); -- On crée une fonction nous retournant directement cette valeur function bits2codechannels(input : in integer) return integer; -- Calcul de l offset à ajouter au pointeur pour à l étage de sortie du démodulateur pipeline function offset_final_calculation(nbr_bitstocodechannels : in integer) return natural; end package function_package; package body function_package is -- Corps du package function bits2codechannels(input : in integer) return integer is variable result : integer := 0; begin case input is when 1 2 => result := 1; when 3 4 => result := 2; when 5 to 8 => result := 3; when 9 to 16 => result := 4; when 17 to 32 => result := 5; when others => result := 6; end case; return result; end function bits2codechannels; function offset_final_calculation(nbr_bitstocodechannels : in integer) return natural is variable result : natural; begin if Nbr_bitstocodechannels > 1 then result := (Nbr_bitstocodechannels-1) *2**Nbr_bitstocodechannels; else result := 0; end if; return result; end function offset_final_calculation ; end package body function_package; Package (2) use work.function_package.all; package demodulator_parameters is -- Nombre de canaux du convertisseur de Walsh-Hadamard en parallèle constant Nbr_channels : integer := 4; -- Nombre de bits de sortie de l'adc constant Nbr_bits_ADC : integer := 10; -- Nombre de bits nécessaire pour coder l indice des canaux constant Nbr_bitstocodechannels: integer := bits2codechannels(nbr_channels); -- Les 2**Nbr_bitstocodehadamard premières fonctions d'hadamard seront crées constant Nbr_bitstocodeHadamard: integer := Nbr_bitstocodechannels + 1; -- Tableau contenant tous les mots de sortie des ADC type std_logic_vector_array_in_nbits_adc is array 1 to Nbr_channels) of std_logic_vector(nbr_bits_adc-1 downto 0); -- Tableaux contenant les résultats (mots de Nbr_bits_ADC) des opérations arithmétiques des différents étages du démodulateur type additionwords_pointor is array (1 to Nbr_bitstocodechannels*2**Nbr_bitstocodechannels) of unsigned(nbr_bits_adc-1 downto 0); -- Mots contenus dans l étage de sortie du démodulateur type additionwords_out_pointor is array (1 to 2**Nbr_bitstocodechannels) of unsigned(nbr_bits_adc-1 downto 0); end package demodulator_parameters; 79/106

12.2. Code VHDL du générateur de fonctions de Walsh-Hadamard Générateur de fonctions d Hadamard génériques use work.function_package.all; use work.demodulator_parameters.all; --- Générateur générique de fonctions d'hadamard binaires entre '0' et '1' --- entity Hadamard_generator is port( -- Signal de reset pour initialiser le compteur à 0. Actif au niveau BAS signal rst_b : in std_logic := '0'; -- Signal d'horloge signal clk : in std_logic := '1'; -- Fonctions d'hadamard binaires et ses inverses signal H_logic, H_logic_barre : out std_logic_vector(2**nbr_bitstocodehadamard-1 downto 0)); end entity Hadamard_generator; architecture bhv of Hadamard_generator is begin -- générateur des Nbr_bitstocodeHadamard premières fonctions de Rademacher binaires '0'-'1' -- process(clk,rst_b) -- Fonctions de Rademacher utiles pour créer les fonctions d'hadamard variable Rademacher : std_logic_vector(0 to Nbr_bitstocodeHadamard-1) := (others =>'1'); -- Compteur jouant le rôle d'un diviseur de fréquence variable compteur : unsigned(nbr_bitstocodehadamard-1 downto 0); -- Fonctions d'hadamard en variable variable Hadamard : std_logic_vector(2**nbr_bitstocodehadamard-1 downto 0); -- Registre contenant l'indice de la fonction d'hadamard calculé en binaire dont l'ordre des bits a été inversé variable reg : std_logic_vector(nbr_bitstocodehadamard-1 downto 0); begin Générateur de fonctions d Hadamard génériques (2) -- Le calcul des fonctions d'hadamard se fait entre 2 flancs montants -- Lorsque rst_b = '0' : phase d'initialisation if rst_b = '0'then compteur := (others=>'0'); Hadamard := (others=>'0'); elsif clk'event and clk = '1' then -- Fonctions de Rademacher = sortie d'un compteur binaire Rademacher := not(std_logic_vector(compteur)); compteur := compteur + 1; -- génère les fonctions d'hadamard binaires '0'-'1' à partir des fonctions de Rademacher Hadamard(0) := not(rademacher(nbr_bitstocodehadamard-1) xor Rademacher (Nbr_bitstocodeHadamard-1)); for k in 1 to 2**Nbr_bitstocodeHadamard-1 loop -- Indice k de la fonction d'hadamard en binaire dont l'ordre des bits a été inversé reg := std_logic_vector(to_unsigned(k,reg'length)); -- On initialise à '1' car c'est l'élément neutre de la fonction not xor Hadamard(k) := '1'; for m in 0 to Nbr_bitstocodeHadamard-1 loop if reg(m) = '1' then Hadamard(k) := not(rademacher (Nbr_bitstocodeHadamard-1-m) xor Hadamard(k)) ; end if; end loop; end loop; end if; H_logic <= Hadamard; H_logic_barre <= not(hadamard); end process; end bhv; 80/106

12.3. Code VHDL du démodulateur générique de Walsh-Hadamard Démodulateur générique de Walsh-Hadamard use work.demodulator_parameters.all; use work.function_package.all; -- Démodulateur générique de Walsh-Hadamard -- entity demodulator is port ( -- Horloge du système complet utilisé en sortie du démodulateur signal clk_system : in std_logic; -- Signal de reset (actif au niveau BAS signal rst_b : in std_logic; -- Horloge contrôlant les bancs de registres séparant les étages d'additionneurs (fclk_add = fclk_system/nbr_canaux) signal clk_add : in std_logic; -- Horloges contrôlant les switches de sortie signal switch_clk : in std_logic_vector (Nbr_bitstocodechannels-1 downto 0); -- Valeurs d'entrées provenant des ADC en parallèle (1 ADC par canal) codées sur le nombre de bits des ADC signal s_array_in : in std_logic_vector_array_in_nbits_adc; -- Mot binaire de sortie du système signal s_out: out std_logic_vector (Nbr_bits_ADC-1 downto 0)); end entity; architecture bhv of demodulator is -- Type identique au type des mots d'entrées sauf qu'il s'agit d'unsigned et non de bit_vector(les opérations d'additions et de soustractions utiles à la démodulation n'étant pas défini pour des bit_vector dans l'environnement VHDL) type unsigned_in4demodulator is array (1 to 2**Nbr_bitstocodechannels) of unsigned(nbr_bits_adc-1 downto 0); -- Mots d'entrées convertis en unsigned signal word_channels : unsigned_in4demodulator := (others=>(nbr_bits_adc-1 => '1', others => '0')); -- Registres contenant les résultats intermédiaires des opérations d'additions et de soustractions signal add_word : additionwords_pointor; -- Valeur de l'offset pour pointer sur le dernier étage du calculateur constant offset_final :natural := offset_final_calculation(nbr_bitstocodechannels); begin Démodulateur générique de Walsh-Hadamard (2) -- CONVERSION_UNSIGNED + MISE A 0 DES CANAUX SURNUMERAIRES -- Remarque : notre méthode de démodulation est définie pour un nombre de canal valant 2**i où i = quelconque -- Si,par exemple, i = 3, le démodulateur nécessite 8 canaux en entrée. Si l'on a que 6 canaux, les 2 derniers seront mis a une valeur constante de 0 process(rst_b,s_array_in) begin for i in 1 to Nbr_channels loop word_channels(i) <= unsigned(s_array_in(i)); end loop; for j in Nbr_channels+1 to 2**Nbr_bitstocodechannels loop -- Mise à 0 ("1000000000") des canaux surnuméraires word_channels(j) <= (Nbr_bits_ADC-1 => '1', others => '0'); end loop; end process; -- CALCUL DES ELEMENTS DES POINTEURS -- process(rst_b,clk_add) -- Offset du pointeur pour le calcul des valeurs lors du reset variable offset_reset : natural := 0; -- Offset du pointeur sur l'étage précédent variable offset_previousstage_pointer : natural := 0; -- Offset du pointeur sur l'étage analysé variable offset_stage_pointer : natural := 0; begin 81/106

Démodulateur générique de Walsh-Hadamard (3) -- Initialisation, Remise à zéro du démodulateur if rst_b = '0' then offset_reset := 0; add_word <= (others=>(others => '0')); -- Certains registres sont en signés, d autres non. On initialise donc les registres signés à "1000000000" et les autres à "000000000" pour que la sortie vaille "1000000000" durant toute la phase de latence for k in 1 to Nbr_bitstocodechannels loop for j in 1 to 2**k loop add_word(j+offset_reset) <= (Nbr_bits_ADC-1 => '1', others => '0'); end loop; offset_reset := offset_reset + 2**Nbr_bitstocodechannels; end loop; offset_previousstage_pointer := 0; offset_stage_pointer := 0; elsif clk_add'event and clk_add = '1' then -- 1er ETAGE -- -- Les 2 premiers éléments du 1 er étage sont signés les autres non add_word(1) <= word_channels(1) + (word_channels(2) 2**(Nbr_bits_ADC-1)); add_word(2) <= word_channels(1) - (word_channels(2) 2**(Nbr_bits_ADC-1)); if Nbr_bitstocodechannels > 1 then for i in 2 to 2**(Nbr_bitstocodechannels-1) loop -- Les éléments suivants du 1 étage sont non signés. Or, les mots d entrées word_channels le sont. Il faut donc retirer "1000000000" = 2**(Nbr_bits_ADC-1)à chaque valeur d entrée pour obtenir un mot correspondant non signé. -- ++ -> -2*(2**(Nbr_bits_ADC-1)) = -2**Nbr_bits_ADC -- +- -> 2**(Nbr_bits_ADC-1) - 2**(Nbr_bits_ADC-1) = 0 add_word(2*i-1) <= word_channels(2*i-1)+(word_channels(2*i)- 2**(Nbr_bits_ADC));-- ++ add_word(2*i) <= word_channels(2*i-1)-word_channels(2*i);+end loop; -- Fin 1er ETAGE Démodulateur générique de Walsh-Hadamard (4) -- AUTRES ETAGES -- -- stage = étage de l'addition pipelinée où l'on se trouve for stage in 2 to Nbr_bitstocodechannels loop offset_previousstage_pointer := offset_stage_pointer; offset_stage_pointer := offset_stage_pointer + 2**Nbr_bitstocodechannels; for j in 1 to 2**(stage-1) loop -- 1ère colonne -- ++ add_word(j+offset_stage_pointer) <= add_word(j+offset_previousstage_pointer) + add_word(j+2**(stage-1)+offset_previousstage_pointer); -- +- add_word(j+2**(stage-1)+offset_stage_pointer) <= add_word(j+offset_previousstage_pointer) - add_word(j+2**(stage-1)+offset_previousstage_pointer); -- Fin 1ère colonne -- Autres colonnes if Nbr_bitstocodechannels > stage then for k in 1 to 2**(Nbr_bitstocodechannels-stage)-1 loop -- ++ add_word(j+k*2**stage+offset_stage_pointer) <= add_word(j+k*2**stage+offset_previousstage_pointer) + add_word(j+k*2**stage+2**(stage-1) + offset_previousstage_pointer); -- +- add_word(j+k*2**stage+2**(stage-1)+offset_stage_pointer)<= add_word(j+k*2**stage+offset_previousstage_pointer) - add_word(j+k*2**stage+2**(stage-1) + offset_previousstage_pointer); end loop; end if; -- Fin autres colonnes end loop; -- Fin étage considéré end loop; -- FIN ETAGES SUIVANTS-- end if; -- Remise à 0 des offsets des pointeurs pour le cycle suivant offset_previousstage_pointer := 0; offset_stage_pointer := 0; end if; end process; 82/106

Démodulateur générique de Walsh-Hadamard (5) -- Switches de sortie chargés de choisir la sortie du démodulateur à appliquer à la sortie du système complet process(switch_clk,clk_system,rst_b) begin if rst_b = '0' then s_out <= (Nbr_bits_ADC-1 => '1', others => '0'); elsif clk_system'event and clk_system ='1' then for i in 2**Nbr_bitstocodechannels-1 downto 0 loop if to_integer(unsigned(not(switch_clk))) = i then s_out <= std_logic_vector(add_word(offset_final+i+1)); end if; end loop; end if; end process; end architecture bhv; 83/106

12.4. Code VHDL / VHDL- AMS du modulateur Phase_generator use work.demodulator_parameters.all; use work.function_package.all; -- Génération des signaux de contrôle du modulateur pour un système possédant plus de 2 canaux -- entity phases_generator is generic( -- Tension d'alimentation de la partie numérique = 1.8 V constant VDD : real := 1.8; -- GND = 0.0 V constant VSS : real := 0.0); port( -- Fonctions d'hadamard et leurs complémentaires en binaires signal HAD,HADc : in std_logic_vector(2**nbr_bitstocodehadamard-1 downto 0); -- Période où le canal A (respectivement B intègre) signal INT_A, INT_B : out std_logic; -- Reset du canal A et B signal RST_A, RST_B : out std_logic; -- Echantilonnage sur la sortie du canal A ou B signal SMPL_A, SMPL_B : out std_logic); end entity; architecture bhv of phases_generator is begin -- Les intégrateurs se chargent en complémentaire INT_A <= HAD(2**(Nbr_bitstocodeHadamard-1)); INT_B <= HADc(2**(Nbr_bitstocodeHadamard-1)); Phase_generator (2) -- Signaux de commande process(had(2**(nbr_bitstocodehadamard-3)), HAD(2**(Nbr_bitstocodeHadamard-2)), HAD(2**(Nbr_bitstocodeHadamard-1))) begin if HAD(2**(Nbr_bitstocodeHadamard-3)) = '0' and HAD(2**(Nbr_bitstocodeHadamard-2)) = '1' and HAD(2**(Nbr_bitstocodeHadamard-1)) = '0' then SMPL_A <= '1'; SMPL_B <= '0'; RST_A <= '0'; RST_B <= '0'; elsif HAD(2**(Nbr_bitstocodeHadamard-3)) = '0' and HAD(2**(Nbr_bitstocodeHadamard-2)) = '1' and HAD(2**(Nbr_bitstocodeHadamard-1)) = '1' then SMPL_A <= '0'; SMPL_B <= '1'; RST_A <= '0'; RST_B <= '0'; elsif HAD(2**(Nbr_bitstocodeHadamard-3)) = '1' and HAD(2**(Nbr_bitstocodeHadamard-2)) = '0' and HAD(2**(Nbr_bitstocodeHadamard-1)) = '0' then SMPL_A <= '0'; SMPL_B <= '0'; RST_A <= '1'; RST_B <= '0'; elsif HAD(2**(Nbr_bitstocodeHadamard-3)) = '1' and HAD(2**(Nbr_bitstocodeHadamard-2)) = '0' and HAD(2**(Nbr_bitstocodeHadamard-1)) = '1' then SMPL_A <= '0'; SMPL_B <= '0'; RST_A <= '0'; RST_B <= '1'; else SMPL_A <= '0'; SMPL_B <= '0'; RST_A <= '0'; RST_B <= '0'; end if; end process; end architecture bhv; 84/106

Phase_generator_2 use work.demodulator_parameters.all; use work.function_package.all; -- Génération des signaux de contrôle du modulateur pour un système à 2 canaux -- entity phases_generator_2 is generic( -- Tension d'alimentation de la partie numérique = 1.8 V constant VDD : real := 1.8; -- GND = 0.0 V constant VSS : real := 0.0); port( -- Horloge du système signal clk_system : in std_logic; -- Fonctions d'hadamard et leurs complémentaires en binaires signal HAD,HADc : in std_logic_vector(2**nbr_bitstocodehadamard-1 downto 0); -- Période où le canal A (respectivement B intègre) signal INT_A, INT_B : out std_logic; -- Reset du canal A et B signal RST_A, RST_B : out std_logic; -- Echantilonnage sur la sortie du canal A ou B signal SMPL_A, SMPL_B : out std_logic); end entity; architecture bhv of phases_generator_2 is begin -- Les intégrateurs se chargent en complémentaire INT_A <= HAD(2**(Nbr_bitstocodeHadamard-1)); INT_B <= HADc(2**(Nbr_bitstocodeHadamard-1)); Phase_generator_2 (2) -- Signaux de commande process(clk_system, HAD(2**(Nbr_bitstocodeHadamard-2)), HAD(2**(Nbr_bitstocodeHadamard-1))) begin if clk_system = '0' and HAD(2**(Nbr_bitstocodeHadamard-2)) = '1' and HAD(2**(Nbr_bitstocodeHadamard-1)) = '0' then SMPL_A <= '1'; SMPL_B <= '0'; RST_A <= '0'; RST_B <= '0'; elsif clk_system = '0' and HAD(2**(Nbr_bitstocodeHadamard-2)) = '1' and HAD(2**(Nbr_bitstocodeHadamard-1)) = '1' then SMPL_A <= '0'; SMPL_B <= '1'; RST_A <= '0'; RST_B <= '0'; elsif clk_system = '1' and HAD(2**(Nbr_bitstocodeHadamard-2)) = '0' and HAD(2**(Nbr_bitstocodeHadamard-1)) = '0' then SMPL_A <= '0'; SMPL_B <= '0'; RST_A <= '1'; RST_B <= '0'; elsif clk_system = '1' and HAD(2**(Nbr_bitstocodeHadamard-2)) = '0' and HAD(2**(Nbr_bitstocodeHadamard-1)) = '1' then SMPL_A <= '0'; SMPL_B <= '0'; RST_A <= '0'; RST_B <= '1'; else SMPL_A <= '0'; SMPL_B <= '0'; RST_A <= '0'; RST_B <= '0'; end if; end process; end architecture bhv; 85/106

channel -- Canal de modulation -- entity channel is generic( -- Résistance d'entrée des ports IN constant Rin : real := 10.0e9; -- Résistance d'entrée du port CM_ref constant Rcm : real := 10.0e9; -- Résistance d'entrée de l'enable constant Renable : real := 10.0e9; -- Résistance d'entrée vu par le courant de référence constant Riref : real := 10.0; -- Saturation de sortie supérieure de l'intégrateur en V en mode non différentiel constant INT_max : real := 0.750; -- Saturation de sortie inférieure de l'intégrateur en V en mode non différentiel constant INT_min : real := -0.750; -- Tension d'alimentation de la partie numérique = 1.8 V constant VDD : real := 1.8; -- GND = 0.0 V constant VSS : real := 0.0) port( -- Signaux de contrôle du S & H de sortie signal SMPL_A, SMPL_B : in std_logic; -- Signaux de reset des intégrateurs signal RST_A, RST_B : in std_logic; -- Signaux pour l'activations des intégrateurs signal INT_A, INT_B : in std_logic; -- Fonction d'hadamard modulant le signal d'entrée signal HAD, HADc : in std_logic; -- Valeurs d'entrée en différentiel terminal INP, INN : electrical; -- Tension de référence de mode commun terminal CM_REF : electrical; -- Enable pour le canal terminal CHANNEL_ENABLE : electrical; -- Référence de courant pour les blocs du canal terminal IREF_CHANNEL : electrical; -- Sorties différentielles du canal terminal OUTP, OUTN : electrical); end entity; channel(2) architecture bhv of channel is ------ Terminaux et Quantités ------------------- quantity uinp across iinp through INP; quantity uinn across iinn through INN; quantity ucm_ref across icm_ref through CM_REF; quantity uenable across ienable through CHANNEL_ENABLE; quantity uref across iref through IREF_CHANNEL; quantity uoutp across ioutp through OUTP; quantity uoutn across ioutn through OUTN; ------- Signaux internes ----------- -- Gain du modulateur afin de réduire la différence entre amplitude d entrée et de sortie constant GAIN : real := 8.34e7; -- Entrée en mode non différentielle quantity input : real; -- Entrée multipliée par la fonction d'hadamard correspondant au canal en question quantity input_with_hadamard : real; -- Valeur d'entrée des structures d'intégration quantity input_integratorchannel: real; -- Sortie du multiplieur du canal 1 quantity canal1_mult_out : real; -- Valeur de sortie de l'intégrateur du canal 1 en ne tenant pas compte de la saturation quantity int1 : real; -- Valeur de sortie de l'intégrateur du canal 1 en tenant compte de la saturation quantity int1_out : real; -- Sortie du multiplieur du canal 2 quantity canal2_mult_out : real -- Valeur de sortie de l'intégrateur du canal 2 en ne tenant pas compte de la saturation quantity int2 : real; -- Valeur de sortie de l'intégrateur du canal 2 en tenant compte de la saturation quantity int2_out : real; -- Signal de sortie donnant la valeur en mode non différentiel signal nondiff_output : real := 0.0; begin 86/106

channel(3) --- relations entre tension et courant pour les entrées --- iinp == uinp/rin; iinn == uinn/rin; icm_ref == ucm_ref/rcm; ienable == uenable/renable; iref == uref/riref; -- MODELE D'UN CANAL DE MODULATION -- -- Conversion des entrées différentielles en non différentielle input == uinp-uinn; -- Multiplication de l'entrée par le signal d'hadamard correspondant (le '0' logique correspond à un -1 et le '1' à un +1) -- Entrées mises à 0 si l'enable n'est pas actif (actif à VDD) if DOMAIN = QUIESCENT_DOMAIN use input_with_hadamard == 0.0; elsif not(uenable'above((vdd-vss)/2.0)) use input_with_hadamard == 0.0; -- Mise à 0 de l'entrée elsif HAD = '1' use input_with_hadamard == input; -- Multiplication par +1 else input_with_hadamard == -input; -- Multiplication par -1 end use; -- Ajout d'un gain d'une valeur 8,34*e7 à cette valeur réduisant l'importante différence d'amplitude entre entrée et sortie du bloc de modulation input_integratorchannel == GAIN * input_with_hadamard; -- Séparation en 2 canaux contenant chacun un multiplieur, un intégrateur et un sample&hold -- Canal 1 -- Multiplieur if DOMAIN = QUIESCENT_DOMAIN use canal1_mult_out == 0.0; elsif INT_A = '1' use canal1_mult_out == VDD*input_integratorchannel; else canal1_mult_out == VSS*input_integratorchannel; end use; channel(4) - Intégrateur avec reset et saturation inférieure et supérieure if DOMAIN = QUIESCENT_DOMAIN use int1 == 0.0; elsif RST_A = '1' use int1 == VSS; else int1'dot == canal1_mult_out; end use; if int1'above(int_max) use -- Saturation positive int1_out == INT_max; -- Zone de non-saturation elsif int1'above(int_min) use int1_out == int1; else -- Saturation négative int1_out == INT_min; end use; -- Canal 2 -- Multiplieur if DOMAIN = QUIESCENT_DOMAIN use canal2_mult_out == 0.0; elsif INT_B = '1' use canal2_mult_out == VDD*input_integratorchannel; else canal2_mult_out == VSS*input_integratorchannel; end use; -- Intégrateur avec reset et saturation inférieure et supérieure if DOMAIN = QUIESCENT_DOMAIN use int2 == 0.0; elsif RST_B = '1' use int2 == VSS; else int2'dot == canal2_mult_out; end use; 87/106

Channel (5) if int2'above(int_max) use -- Saturation positive int2_out == INT_max; elsif int2'above(int_min) use -- Zone de non-saturation int2_out == int2; else -- Saturation négative int2_out == INT_min; end use; -- Sample and Hold de sortie du bloc de modulation process(smpl_a, SMPL_B, uenable'above((vdd-vss)/2.0)) begin if not(uenable'above((vdd-vss)/2.0)) then nondiff_output <= 0.0; -- Le canal A est sélectionné elsif SMPL_A'event and SMPL_A = '1' then nondiff_output <= int1_out; -- Le canal B est sélectionné elsif SMPL_B'event and SMPL_B = '1' then nondiff_output <= int2_out; end if; end process; if DOMAIN = QUIESCENT_DOMAIN use uoutp == 0.0; uoutn == 0.0; else -- On ajoute à la tension de mode commun la moitié de la valeur de sortie du modulateur en mode non différentiel (sortie différentielle positive) uoutp == ucm_ref + nondiff_output'ramp/2.0; -- On soustrait à la tension de mode commun la moitié de la valeur de sortie du modulateur en mode non différentiel (sortie différentielle négative) uoutn == ucm_ref - nondiff_output'ramp/2.0; end use; end architecture; 88/106

12.5. Code VHDL / VHDL-AMS du Convertisseur pipeline Comparateur -- Comparateur avec possibilité d'ajout d'imperfections -- entity comparator is generic ( -- Paramètres définis comme pourcentages de (VREF_P - VREF_N) -- Offset de Threshold constant THR_OFFS: real := 0.0; -- Hytérèse (>= 0.0) constant HYST: real := 0.0); port ( -- Terminaux d'entrées + et - terminal tip, tim: electrical; -- Référence de tension terminal vref_p, vref_n : electrical; -- Mot de sortie signal dout: out std_logic); end entity comparator; architecture hyst of comparator is quantity uin across tip to tim; quantity uvref_p across vref_p; quantity uvref_n across vref_n; -- Seuil du comparateur constant THRESH_EFF: real := (0.5*HYST + THR_OFFS)*(uvref_p - uvref_n); begin process variable thresh: real := THRESH_EFF; begin if uin'above(thresh) then dout <= '1'; thresh := -thresh; else dout <= '0'; thresh := thresh; end if; wait on uin'above(thresh); end process; end architecture hyst; Conversion terminaux réels en mots logiques -- Interface de conversion de terminaux en logique pour l'horloge et le nenable -- entity conv_logic is generic ( -- Résistances d'entrées clk & Enable_barre constant Rclk : real := 10.0e9; constant Rnenable : real := 10.0e9; -- Tension d'alimentation positive, partie numérique = 1.8V constant VDD : real := 1.8; -- Tension d'alimentation négative, partie numérique = 0.0V constant VSS : real := 0.0); port ( terminal clk, nenable : electrical; signal sclk, snenable : out std_logic); end entity conv_logic; architecture bhv of conv_logic is quantity uclk across iclk through clk; quantity unenable across inenable through nenable; begin iclk == uclk/rclk; inenable == unenable/rnenable; process(uclk'above((vdd-vss)/2.0)) begin if uclk'above((vdd-vss)/2.0) then sclk <= '1'; else sclk <= '0'; end if; end process; process(unenable'above((vdd-vss)/2.0)) begin if unenable'above((vdd-vss)/2.0) then snenable <= '1'; else snenable <= '0'; end if; end process; end architecture; 89/106

Conversion différentiel / non différentiel -- Convertit les entrées différentielles en une entrée réelle -- entity conv_modenondifferential is generic( -- Résistance d'entrée constant Rin : real := 10.0e9; constant Nbr_bits:positive:= 10; -- Borne de sortie supérieure en V du signal différentiel constant Ymax : real := 375.0e-3; -- Borne de sortie inférieure en V du signal différentiel constant Ymin : real := -375.0e-3; -- Tension d'alimentation de la partie numérique = 1.8 V constant VDD : real := 1.8 -- GND = 0.0 V constant VSS : real := 0.0); port( -- Entrée différentielle négative terminal INN : electrical; -- Entrée différentielle positive terminal INP : electrical; -- Conversion des entrées différentielles en non différentiel terminal tout : electrical ); end entity conv_modenondifferential; architecture bhv of conv_modenondifferential is -- Intervalle de quantification (multiplié par 2 car l'entrée se fait en mode différentiel) constant q : real := 2.0*(Ymax-Ymin)/(2**real(Nbr_bits)); quantity uinn across iinn through INN; quantity uinp across iinp through INP; quantity uout across iout through tout; begin iinn == uinn/rin; iinp == uinp/rin; -- Conversion en non différentielle + ajoute d un LSB au convertisseur afin d'obtenir la valeur "1000000000" en sortie pour une valeur 0 en entrée uout == (uinp-uinn) + q; end architecture bhv; Amplificateur différentiel à gain variable -- Amplificateur différentiel à gain variable -- entity diff_amplifier is generic ( -- Facteur de gain constant GAIN : real := 0.5); port ( terminal tplus,tminus : electrical; terminal tout : electrical); end entity diff_amplifier; architecture bhv of diff_amplifier is quantity uin across tplus to tminus; quantity uout across iout through tout; begin uout == GAIN*uin; end architecture bhv; 90/106

Additionneur à redondance use work.demodulator_parameters.all; use work.function_package.all; -- Additionneur à redondance -- entity ovlpadd is generic ( -- Nombre d'étages du convertisseur pipeliné constant NSTAGES: positive := Nbr_bits_ADC-1; -- Nombre de bits par étage [2 pour une conversion 1,5 bits] constant NBITPST: positive := 2); port ( -- Entrée = sortie du banc de registres : vecteur de longueur NBITPST*NSTAGES signal dbin: in std_logic_vector(nstages*nbitpst-1 downto 0); -- Code de sortie de longueur NBITS signal dout: out std_logic_vector(9 downto 0)); end entity ovlpadd; architecture bhv of ovlpadd is begin process (dbin) procedure fadd2b ( variable a, b : in std_logic; variable cin : in std_logic; variable sum, co: out std_logic) is begin sum := a xor b xor cin; co := (a and b) or (a and cin) or (b and cin); end procedure fadd2b; variable vdout: std_logic_vector(dout'range); variable a, b, ci, sum, co: std_logic; variable i, j: natural; Additionneur à redondance (2) begin vdout := (others => '0'); i := 0; j := 0; while i <= NBITPST*NSTAGES-1 loop if i = 0 then vdout(0) := dbin(0); ci := '0'; i := 1; j := 1; else if i = NBITPST*NSTAGES-1 then a := '0'; else a := dbin(i+1); end if; b := dbin(i); fadd2b(a, b, ci, sum, co); vdout(j) := sum; ci := co; i := i + 2; j := j + 1; end if; end loop; dout <= vdout; end process; end architecture bhv; 91/106

Générateur des tensions de référence entity refgen is generic ( -- Résistance des lignes de référence constant Rdac_vref_plus : real := 10.0e9 ; constant Rdac_vcm : real := 10.0e9; constant Rdac_vref_minus : real := 10.0e9 -- Fraction de (vref_plus - vref_minus) pour calcul des threshold constant thresh0 : real := 3.0/8.0; constant thresh1 : real := 5.0/8.0); port ( -- Référence positive (entrée) terminal dac_vref_plus : electrical; -- Référence de mode commun (entrée) terminal dac_vcm : electrical; -- Référence négative (entrée) terminal dac_vref_minus: electrical; -- Référence positive pour les A/D & D/A = dac_vref_plusdac_vcm (sortie) terminal vref_p : electrical; -- Référence négative pour les A/D & D/A = dac_vref_minusdac_vcm (sortie) terminal vref_n : electrical; -- Seuils de décision pour les comparateurs des A/D (sortie) terminal tthr : electrical_vector(1 downto 0)); end entity; architecture bhv of refgen is quantity udac_vref_plus across idac_vref_plus through dac_vref_plus; quantity udac_vcm across idac_vcm through dac_vcm; quantity udac_vref_minus across idac_vref_minus through dac_vref_minus; quantity uvref_p across ivref_n through vref_p; quantity uvref_n across ivref_p through vref_n; quantity utthr across itthr through tthr; Générateur des tensions de référence (2) begin idac_vref_plus == udac_vref_plus/rdac_vref_plus; idac_vcm == udac_vcm/rdac_vcm; idac_vref_minus == udac_vref_minus/rdac_vref_minus; -- Les écarts entre udac_vref_plus/minus et udac_vcm sont multipliés par 2 car les entrées sont en différentielles => amplitude double en mode non différentiel uvref_p == 2.0*(udac_vref_plus - udac_vcm); uvref_n == 2.0*(udac_vref_minus - udac_vcm); utthr(0) == 2.0*(thresh0*((udac_vref_plus-udac_vcm)- (udac_vref_minus-udac_vcm)) + (udac_vref_minusudac_vcm)); utthr(1) == 2.0*(thresh1*((udac_vref_plus-udac_vcm)- (udac_vref_minus-udac_vcm)) + (udac_vref_minusudac_vcm)); end architecture bhv; 92/106

Colonne de registre pour le dernier étage -- Colonne de registre du dernier étage = 1 seul registre entity reg_slice_1 is generic ( -- Nombre de bits par étage NBPST: positive := 2); port ( signal clk, nenable: in std_logic; -- Valeurs d'entrée de la colonne de registres signal rsin : in std_logic_vector(nbpst-1 downto 0); -- Valeurs de sortie de la colonne de registres signal rsout: out std_logic_vector(nbpst-1 downto 0)); end entity reg_slice_1; architecture bhv of reg_slice_1 is begin process (clk, nenable) begin if nenable = '1' then rsout <= (others => '0'); elsif clk'event and clk = '1' then rsout <= rsin; end if; end process; end architecture bhv; Convertisseur Digital / Analogique 1,5 bits -- D/A 1,5 bits -- entity subdac_1b5 is generic ( -- Temps de transition pour l'interface D/A TT : real := 1.0e-10 ); port ( -- Entrée numérique du D/A signal din: in std_logic_vector(1 downto 0); -- Références de tension terminal vref_p, vref_n : electrical; -- Sortie analogique du D/A terminal tout: electrical); end entity subdac_1b5; architecture bhv of subdac_1b5 is signal sout : real := 0.0; quantity uvref_p across vref_p; quantity uvref_n across vref_n; quantity uout across iout through tout; begin -- Choisit en fonction du mot d entrée numérique la valeur analogique à appliquer sur la sortie process (din) begin if din = "00" then sout <= uvref_n; elsif din = "01" then sout <= (uvref_n + uvref_p)/2.0; elsif din = "11" then sout <= uvref_p; else -- Ne doit pas arriver (car code thermométrique) sout <= uvref_p; end if; end process; uout == sout'ramp(tt); end architecture bhv; 93/106

Colonne de registres -- Colonne de registres -- entity reg_slice is generic ( -- Numéro de l'étage considéré IST : integer :=9; -- Nombre de bits par étage NBPST: positive :=2; -- Valeur initiale des registres (lorsque l'enable_barre est à '1') Init_value : std_logic :='0'); port ( signal clk, nenable: in std_logic; -- Valeurs d'entrée de la colonne de registres signal rsin : in std_logic_vector(nbpst-1 downto 0); -- Valeurs de sortie de la colonne de registres signal rsout: out std_logic_vector(nbpst-1 downto 0)); end entity reg_slice; Colonne de registres (2) architecture bhv of reg_slice is type regint_arr is array (1 to IST-1) of std_logic_vector(rsin'range); begin process (nenable, clk) variable regint : regint_arr; -- Sert à retarder d'un coup de clk si Init_value = '1' pour resynchroniser le système à la sortie variable retard_enable : std_logic := '0'; begin if nenable = '1' then if Init_value = '1' then for i in 1 to IST-1 loop regint(i) (NBPST-1) := '1'; regint(i) (NBPST-2 downto 0) := (others => '0'); end loop; rsout(nbpst-1) <= '1'; rsout(nbpst-2 downto 0) <= (others => '0'); retard_enable := '1'; else for i in 1 to IST-1 loop regint(i) := (others => '0'); end loop; rsout <= (others => '0'); end if; elsif clk'event and clk = '1' then if retard_enable = '0' then rsout <= regint(ist-1); for j in IST-1 downto 2 loop regint(j) := regint(j-1); end loop; regint(1) := rsin; else retard_enable := '0'; end if; end if; end process; end architecture bhv; 94/106

Sample&hold non idéal --S&H avec imperfections modélisées sous la forme d'un filtre passe-bas du second ordre avant la sortie -- entity samplehold is generic ( -- Résistance d'entrée du S&H constant Rin : real := 10.0e9; -- Tension d'alimentation positive de la partie numérique = 1.8V constant VDD: real := 1.8; -- Tension d'alimentation négative de la partie numérique = 0.0V constant VSS: real := 0.0; -- S&H idéal si "true" constant IDEAL : boolean := true; -- Constante de temps du filtre passe-bas (si <0.0 : S&H idéal) constant TAU : real := -1.0; -- Facteur de qualité du filtre passe-bas constant QFACT: real := 0.7; -- Temps d'échantillonnage constant TT : real := 1.0e-10); port ( -- Horloge pour l'échantillonage signal clk : in std_logic; -- Signal d'enable barré signal nenable : in std_logic; -- Entrées-Sorties terminal tin, tout: electrical); end entity samplehold; Sample&hold non idéal (2) architecture lowpass of samplehold is quantity uin across iin through tin; quantity uout across iout through tout; quantity qsmpl: real; signal ssmpl: real := 0.0; begin iin == uin/rin; met dans process(clk,nenable) is begin -- Le convertisseur ne fonctionne pas si nenable = '1'. On alors la valeur de sortie au minimum possible = -750 mv notre cas if nenable = '1' then ssmpl <= -0.750; elsif clk'event and clk = '1' then ssmpl <= uin; end if; end process; qsmpl == ssmpl'ramp(tt); if IDEAL or TAU < 0.0 use uout == qsmpl; else -- Filtre passe-bas du second ordre uout == qsmpl'ltf((0 => 1.0/abs(TAU*TAU)), (0 => 1.0/abs(TAU*TAU), 1 => 1.0/(QFACT*abs(TAU)), 2 => 1.0)); end use; end architecture lowpass; 95/106

Conversion code thermométrique / binaire -- Conversion code Thermométrique-code binaire -- entity th2bin is generic ( -- Conversion en mots de 2 bits (subadc flash 1.5 bit) constant NBITS : positive := 2); port ( -- Code thermométrique signal dth : in std_logic_vector(2**nbits-1 downto 0); -- Code binaire signal dbin : out std_logic_vector(nbits-1 downto 0)); end entity th2bin; architecture bhv of th2bin is begin process (dth) begin dbin <= (others => '0'); for i in 2**NBITS-1 downto 0 loop if dth(i) = '1' then dbin <= std_logic_vector(to_unsigned(i+1, dbin'length)); exit; end if; end loop; end process; end architecture bhv; Convertisseur flash A/D 1,5 bits -- Convertisseur flash A/D 1,5 bits -- entity subadc_1b5 is generic ( -- Pourcentage de (VREF_P - VREF_N) : Offset de threshold constant THR_OFFS: real := 0.0; -- Hytérèse (>= 0.0) constant HYST: real := 0.0); port ( -- Entrée analogique terminal tin : electrical; -- Référence positive & négative terminal vref_p : electrical; terminal vref_n : electrical; -- Seuils pour les comparateurs flash terminal tthr: electrical_vector(1 downto 0); -- Sortie digital signal dout: out std_logic_vector(1 downto 0)); end entity subadc_1b5; architecture str of subadc_1b5 is begin I_COMP_1: entity work.comparator(hyst) generic map ( THR_OFFS => THR_OFFS, HYST => HYST) port map ( tip => tin, tim => tthr(1), vref_p => vref_p, vref_n => vref_n, dout => dout(1)); I_COMP_0: entity work.comparator(hyst) generic map ( THR_OFFS => THR_OFFS, HYST => HYST) port map ( tip => tin, tim => tthr(0), vref_p => vref_p, vref_n => vref_n, dout => dout(0)); end architecture str; 96/106

Banc de registres use work.demodulator_parameters.all; use work.function_package.all; -- Banc de registres -- entity reg_bank is generic ( -- Nombre d'étages pipelinés NSTAGES: integer := Nbr_bits_ADC-1; -- Nombre de bits par étage NBITPST: integer := 2); port ( signal clk, nenable: in std_logic; -- Entrées (NBITPST*NSTAGES bits) signal rbin : in std_logic_vector(nbitpst*nstages-1 downto 0); -- Sorties (NBITPST*NSTAGES bits) signal rbout: out std_logic_vector(nbitpst*nstages-1 downto 0)); end entity reg_bank; architecture str of reg_bank is constant ist9 : integer := 9; begin -- Colonne de registres : 1er étage (9 registres) I_SLICE_9: entity work.reg_slice(bhv) generic map ( Init_value => '1', IST => ist9, NBPST => NBITPST) port map ( clk => clk, nenable => nenable, rsin => rbin(nbitpst*ist9-1 downto NBITPST*ist9-NBITPST), rsout => rbout(nbitpst*ist9-1 downto NBITPST*ist9- NBITPST)); Banc de registres (2) -- Colonnes de registres ième étage (10-i registres) GEN_I_SLICE: for i in NSTAGES-1 downto 2 generate I_SLICE_I: entity work.reg_slice(bhv) generic map ( Init_value => '0', IST => i, NBPST => NBITPST) port map ( clk => clk, nenable => nenable, rsin => rbin(nbitpst*i-1 downto NBITPST*i-NBITPST), rsout => rbout(nbitpst*i-1 downto NBITPST*i-NBITPST)); end generate GEN_I_SLICE; -- Colonne de registres du dernier étage = 1 seul registre I_SLICE_1: entity work.reg_slice_1(bhv) generic map ( NBPST => NBITPST) port map ( clk => clk, nenable => nenable, rsin => rbin(nbitpst-1 downto 0), rsout => rbout(nbitpst-1 downto 0)); end architecture str; 97/106

Etage du convertisseur pipeline -- Etage du convertisseur pipeliné -- entity pipestage_1b5 is generic ( -- Tension d'alimentation positive de la partie numérique = 1.8V constant VDD : real := 1.8; -- Tension d'alimentation négative de la partie numérique = 0.0V constant VSS : real := 0.0; -- sample and hold parameters: -- S&H idéal si "true" constant IDEAL : boolean := true; -- Constante de temps du filtre passe-bas (si <0.0 : S&H idéal) constant TAU : real := 1.0e-9; -- Facteur de qualité du filtre passe-bas constant QFACT: real := 0.7; -- Paramètres définis comme pourcentages de (VREF_P - VREF_N) -- Offset de threshold constant THR_OFFS: real := 0.0; -- Hytérèse (>= 0.0) constant HYST: real := 0.0); port ( -- Horloge signal clk: std_logic; -- Signal d'enable signal nenable : std_logic; -- Entrée / Sortie terminal tin, tout: electrical; -- Tension de threshold pour les comparateurs des A/D terminal tthr: electrical_vector(1 downto 0); -- Références de tension terminal vref_p, vref_n : electrical; -- Code de sortie en format binaire signal dout: out std_logic_vector(1 downto 0)); end entity pipestage_1b5; Etage du convertisseur pipeline (2) architecture str of pipestage_1b5 is -- Signal contenant la valeur '0' signal zero : std_logic := '0'; -- Sortie du convertisseur A/D (code thermométrique) signal dadco: std_logic_vector(1 downto 0); -- Sortie du convertisseur D/A terminal tdaco: electrical; -- Sortie de l'amplificateur différentiel intermédiaire terminal tdac: electrical; -- Sortie de l'amplificateur final (entrée du S&H terminal tampl: electrical; begin -- Convertisseur A/D 1,5 bit flash -- I_SUBADC: entity work.subadc_1b5(str) generic map ( THR_OFFS => THR_OFFS, HYST => HYST) port map ( tin => tin, vref_p => vref_p, vref_n => vref_n, tthr => tthr, dout(1) => dadco(1), dout(0) => dadco(0)); - Mot thermométrique à convertir en mot binaire de sortie -- I_2BIN: entity work.th2bin(bhv) generic map ( NBITS => 2) port map ( dth(3) => zero, dth(2) => zero, dth(1) => dadco(1), dth(0) => dadco(0), dbin => dout); 98/106

Etage du convertisseur pipeline (3) -- Calcul de la tension à envoyer sur l'étage suivant ----- I_SUBDAC: entity work.subdac_1b5(bhv) port map ( din => dadco, vref_p => vref_p, vref_n => vref_n, tout => tdaco); I_GAIN_DAC: entity work.diff_amplifier(bhv) generic map ( GAIN => 0.5) port map ( tplus => tdaco, tminus => electrical_ref, tout => tdac); I_AMPLI: entity work.diff_amplifier(bhv) generic map ( GAIN => 2.0) port map ( tplus => tin, tminus => tdac, tout => tampl); I_SAMPLEH: entity work.samplehold(lowpass) generic map ( VDD => VDD, VSS => VSS, IDEAL => IDEAL, TAU => TAU, QFACT => QFACT) port map ( clk => clk, nenable => nenable, tin => tampl, tout => tout); end architecture str; Décodeur use work.demodulator_parameters.all; use work.function_package.all; -- Décodeur -- entity decoder is generic ( -- Nombre d'étages du convertisseur pipeliné constant NSTAGES: positive := Nbr_bits_ADC-1; -- Nombre de bits par étage [2 pour une conversion 1,5 bits] constant NBITPST: positive := 2); port ( -- Signal d'horloge signal clk: in std_logic; -- Signal d'enable_barre signal nenable : in std_logic; -- Entrées du décodeur (NBITPST*NSTAGES bits) signal din : in std_logic_vector(nbitpst*nstages-1 downto 0); -- Sorties du décodeur (Nbr_bits_ADC bits) signal dout : out std_logic_vector(nbr_bits_adc-1 downto 0)); end entity decoder; architecture bhv of decoder is signal dbout: std_logic_vector(nbitpst*nstages-1 downto 0); begin REG_BANK: entity work.reg_bank(str) generic map ( NSTAGES => NSTAGES, NBITPST => NBITPST) port map ( clk => clk, nenable => nenable, rbin => din, rbout => dbout); OVLP_ADDER: entity work.ovlpadd(bhv) generic map ( NSTAGES => NSTAGES, NBITPST => NBITPST) port map ( dbin => dbout, dout => dout); end architecture bhv; 99/106

Convertisseur complet use work.demodulator_parameters.all; use work.function_package.all; -- Convertisseur complet -- entity adcpipe_nb is generic ( -- Tension d'alimentation positive, partie numérique = 1.8V constant VDD : real := 1.8; -- Tension d'alimentation négative, partie numérique = 0.0V constant VSS : real := 0.0 -- Nombre d'étages du convertisseur pipeliné constant NSTAGES: positive := Nbr_bits_ADC-1; -- Nombre de bits par étage [2 pour une conversion 1,5 bits] constant NBITPST: positive := 2; -- sample and hold parameters: -- Constante de temps du filtre passe-bas du S&H constant TAU : real := 1.0e-9; -- Facteur de qualité du filtre passe-bas du S&H constant QFACT: real := 0.7; -- Offset sur le threshold constant THR_OFFS: real := 0.0; -- Hytérèse constant HYST: real := 0.0; -- VALEURS MAXIMUMS DES SIGNAUX D'ENTREES DIFFERENTIELS -- Borne d'entrée supérieure en V du signal différentiel constant Ymax : real := 375.0e-3; -- Borne d'entrée inférieure en V du signal différentiel constant Ymin : real := -375.0e-3); port ( signal clk: in std_logic; -- Signal d'enable_barre signal nenable : in std_logic; -- Référence positive terminal dac_vref_plus : electrical; -- Référence de mode commun terminal dac_vcm : electrical; -- Référence négative terminal dac_vref_minus: electrical; -- Entrées différentielles de l'adc terminal tinp, tinn : electrical; -- Sortie de l'adc signal dout:out std_logic_vector(nbr_bits_adc-1 downto 0)); end entity adcpipe_nb; Convertisseur complet (2) architecture str of adcpipe_nb is constant THRESH_NOM: real_vector := (0 => 3.0/8.0, 1 => 5.0/8.0); -- Tensions de threshold des comparateurs terminal tthr: electrical_vector(1 downto 0); -- Entrée convertit en mode non différentiel terminal tnondiff : electrical; -- Entrée des différents étages pipelinés terminal tpstage: electrical_vector(0 to NSTAGES); -- Bits de sortie des comparateurs de chaque étage signal dpso: std_logic_vector(2*nstages-1 downto 0); -- Référence positive pour les A/D & D/A = dac_vref_plus-dac_vcm terminal vref_p : electrical; -- Référence négative pour les A/D & D/A = dac_vref_minus-dac_vcm terminal vref_n : electrical; begin -- L'entrée différentielle est traduite en non différentiel -- NON_DIFF: entity work.conv_modenondifferential(bhv) generic map ( VDD => VDD, VSS => VSS, Ymax => Ymax, Ymin => Ymin) port map ( INN => tinn, INP => tinp, tout => tnondiff); -- Echantilonnage du signal d'entrée non différentiel -- I_SAH: entity work.samplehold(lowpass) generic map ( VDD => VDD, VSS => VSS, TAU => TAU, QFACT => QFACT) port map ( clk => clk, nenable => nenable, tin => tnondiff, tout => tpstage(0)); 100/106

Convertisseur complet (3) -- Etages du pipeline -- GEN_STAGES: for i in 1 to NSTAGES generate I_PSTAGE: entity work.pipestage_1b5(str) generic map ( VDD => VDD, VSS => VSS, IDEAL => true, TAU => TAU, QFACT => QFACT, THR_OFFS=> THR_OFFS, HYST => HYST) port map ( clk => clk, nenable => nenable, tin => tpstage(i-1), tout => tpstage(i), tthr => tthr, vref_p => vref_p, vref_n => vref_n, dout(1) => dpso(2*(nstages-i)+1), dout(0) => dpso(2*(nstages-i))); end generate GEN_STAGES; -- Bloc de décodage -- I_DEC: entity work.decoder(bhv) generic map ( NSTAGES => NSTAGES, NBITPST => 2) port map ( clk => clk, nenable => nenable, din => dpso, dout => dout); Convertisseur complet (4) -- Génération des tensions de référence -- I_GEN: entity work.refgen(bhv) generic map ( thresh0 => THRESH_NOM(0), thresh1 => THRESH_NOM(1)) port map ( dac_vref_plus => dac_vref_plus, dac_vcm => dac_vcm, dac_vref_minus=> dac_vref_minus, vref_p => vref_p, vref_n => vref_n, tthr => tthr); end architecture str; 101/106

12.6. Code du système complet Comparaison sortie obtenue / sortie théorique (2) -- Conversion des entrées différentielles en non différentielle uin == uinp-uinn; -- Conversion de la sortie du système en analogique process(conv_out) variable sortie : real := 0.0; begin sortie := - ADC_max; for i in 0 to 9 loop if Conv_out(i) = '1' then sortie := sortie + (2.0**i)*(2.0*ADC_max)/2.0**10; end if; end loop; s_out <= sortie; end process; uout == s_out'ramp; -- Calcul de la sortie du système attendue si les entrées sont 2 signaux sinusoïdaux différentiels -- Gain(Sortie/Entrée) = [(150*(2**nbr_bitstocodechannels) / (freq_systeme_enmhz))]*amplitude_signal_entree_mode_nondifferentiel -- Latence = Latence(modulateur)+Latence(ADC)+Latence(demodulateur) = (1 + 10 + nbr_bitstocodechannels)/fréquence_channel + 1/fréquence_système = [(1 + 10 + nbr_bitstocodechannels) * (2**nbr_bitstocodechannels) + 1]/fréquence_système if now < ((2.0**nbr_bitstocodechannels) * (10.0+real(nbr_bitstocodechannels)+1.0) + 1.0) / freq_systeme use uoutdesired == 0.0; else uoutdesired == 150*(2.0**nbr_bitstocodechannels)/(freq_systeme*1.0e-6) *(2.0*amplitude_inputsignaldiff) *sin(2.0*math_pi*freq_inputsignal*(now - ((2.0**nbr_bitstocodechannels) *(10.0+real(nbr_bitstocodechannels) +1.0) + 1.0) / freq_systeme)); end use; end architecture bce; Comparaison sortie obtenue / sortie théorique use work.demodulator_parameters.all; use work.function_package.all; -- Comparaison entre la sortie attendue et la sortie obtenue pour un signal sinusoidal en entrée -- entity comparison_input_output is generic( constant R : real := 10.0e9; -- Fréquence du système en Hz constant freq_systeme : real := 200.0e6; -- Amplitude de la sinusoide d'entrée différentielle en V constant amplitude_inputsignaldiff : real := 115.0e-3; -- Fréquence de la sinusoide d'entrée en Hz constant freq_inputsignal : real := 500.0e3; -- Plage maximum de l'adc en non différentiel constant ADC_max : real := 0.750); port( -- Entrées différentielles du système terminal INp, INn : electrical; -- Sortie binaire du système 102/106 signal Conv_out : in std_logic_vector(9 downto 0); -- Sortie du système attendue terminal OUTPUT_desired : electrical; -- Sortie du système en analogique terminal OUTPUT : electrical); end entity; architecture bce of comparison_input_output is -- Entrée du système en non différentiel terminal INPUT : electrical; quantity uinp across iinp through INp; quantity uinn across iinn through INn; quantity uin across iin through INPUT; quantity uoutdesired across ioutdesired through OUTPUT_desired; quantity uout across iout through OUTPUT; signal s_out : real := 0.0; begin iinp == uinp/r; iinn == uinn/r;

Convertisseur complet de Walsh-Hadamard, 4 canaux use work.demodulator_parameters.all; use work.function_package.all; -- Convertisseur Walsh-Hadamard 4 canaux -- entity whconverter_4 is generic ( -- Nombre d'étages du convertisseur pipeliné constant NSTAGES : positive := Nbr_bits_ADC-1; -- Nombre de bits par étage [2 pour une conversion 1,5 bits] constant NBITPST : positive := 2; -- Constante de temps du filtre passe-bas du S&H constant TAU : real := 1.0e-9; -- Facteur de qualité du filtre passe-bas du S&H constant QFACT: real := 0.7; -- Offset sur le threshold constant THR_OFFS: real := 0.0; -- Hytérèse constant HYST: real := 0.0; -- Borne supérieure en V du signal différentiel d'entrée des ADC constant Ymax : real := 375.0e-3; -- Borne inférieure en V du signal différentiel d'entrée des ADC constant Ymin : real := -375.0e-3; -- Tension d'alimentation positive de la partie numérique = 1.8V constant VDD : real := 1.8; -- Tension d'alimentation négative de la partie numérique = 0.0V constant VSS : real := 0.0); port ( -- Horloge d'entrée terminal clk : electrical; -- Signal d'enable terminal Enable : electrical; -- Tension de référence du mode commun utile au démodulateur terminal Modulator_cm_ref : electrical; -- Courant de référence utile au démodulateur terminal Modulator_i_ref : electrical; -- Entrée analogique positive du convertisseur de Walsh-Hadamard terminal Systeme_in_p : electrical; -- Entrée analogique négative du convertisseur de Walsh-Hadamard terminal Systeme_in_n : electrical; -- Tension de référence positive pour ADC terminal dac_vref_plus : electrical; Convertisseur complet de Walsh-Hadamard, 4 canaux (2) -- Tension de mode commun pour ADC terminal dac_vcm : electrical; -- Tension de référence négative pour ADC terminal dac_vref_minus : electrical; -- Sortie numérique du convertisseur de Walsh-Hadamard signal s_out: out std_logic_vector (Nbr_bits_ADC-1 downto 0)); end entity; architecture ass of whconverter_4 is signal sclk : std_logic; signal senable : std_logic; signal senable_b : std_logic; signal Had, Had_barre : std_logic_vector(2**nbr_bitstocodehadamard-1 downto 0); signal Int_A : std_logic; signal Int_B : std_logic; signal Rst_A : std_logic; signal Rst_B : std_logic; signal Smpl_A : std_logic; signal Smpl_B : std_logic; terminal Modulator_outp : electrical_vector(0 to Nbr_channels-1); terminal Modulator_outn : electrical_vector(0 to Nbr_channels-1); -- signal s_array_out_adc : std_logic_vector_array_in_nbits_adc; --# #E Error: Internal Error # Occurred at time 0fs # #E Error Loading Design -- On déclare donc un vecteur contenant toutes les valeurs de sortie [Nbr_channels*Nbr_bits_ADC] des ADC signal s_vector_out_adc : std_logic_vector(nbr_channels*nbr_bits_adc-1 downto 0) := (others => '0'); signal switch_clk : std_logic_vector (Nbr_bitstocodechannels-1 downto 0); -- Signal fictif utile pour l ADC fictif signal s_fictif : std_logic_vector(nbr_bits_adc-1 downto 0); begin 103/106

Convertisseur complet de Walsh-Hadamard, 4 canaux (3) -- Convertit l horloge analogique en binaire -- CLK2LOGIC: entity work.conv_real2logic(bhv) generic map ( VDD => VDD, VSS => VSS) port map ( clk => clk, sclk => sclk); -- Convertit l Enable analogique en binaire -- Enable2LOGIC : entity work.conv_real2logic(bhv) generic map ( VDD => VDD, VSS => VSS) port map ( clk => Enable, sclk => senable); -- Générateur d Hadamard -- HAD_GEN : entity work.hadamard_generator(bhv) port map ( rst_b => senable, clk => sclk, H_logic => Had, H_logic_barre => Had_barre); -- MODULATEUR -- -- Générateur des signaux de commande du modulateur -- PHASE_GEN : entity work.phases_generator(bhv) generic map ( VDD => VDD, VSS => VSS) port map ( HAD => Had, HADc => Had_barre, INT_A => Int_A, INT_B => Int_B, RST_A => Rst_A, RST_B => Rst_B, SMPL_A => Smpl_A, SMPL_B => Smpl_B); Convertisseur complet de Walsh-Hadamard, 4 canaux (4) -- Génération des canaux de modulation -- CHANNELS : for i in Nbr_channels downto 1 generate CHANNEL_I : entity work.channel(bhv) generic map ( VDD => VDD, VSS => VSS) port map ( INT_A => Int_A, INT_B => Int_B, RST_A => Rst_A, RST_B => Rst_B, SMPL_A => Smpl_A, SMPL_B => Smpl_B, HAD => Had(i-1), HADc => Had_barre(i-1), INP => Systeme_in_p, INN => Systeme_in_n, CM_REF => Modulator_cm_ref, CHANNEL_ENABLE => Enable, IREF_channel => Modulator_i_ref, OUTP => Modulator_outp(i-1), OUTN => Modulator_outn(i-1)); -- On doit générer 1 ADC par canal, mais cela ne peut pas être fait de manière bouclée comme pour les modulateurs car erreur (problème avec ADVance MS v4.4_1.1 qui a des problèmes avec l'indice des electrical_vector en entrée s'ils sont donnés de façon générique) -- -> # #E Error Loading Design -- Il faut donc sortir les ADC de la boucle de generate end generate CHANNELS; -- Construction du signal d Enable barre pour les ADC -- process(senable) begin senable_b <= not(senable); end process; 104/106

Convertisseur complet de Walsh-Hadamard, 4 canaux (5) -- Beug dans le programme de simulation : le 1er ADC que l'on crée inverse dans th2bin du 1er étage seulement tous ces bits (le bit 3 devient le 0, le 2 devient le 1, le 1 le 2 et le 0 le 3) -- On ajoute donc un ADC_fictif qui ne sert à rien, mais les ADc d'après n'auront pas cette faute (Beug avec les generate dans le modèle ADC pipeline lors de la simulation) ADC_FICTIF : entity work.adcpipe_nb(str) generic map ( VDD => VDD, VSS => VSS, NBITPST => NBITPST, TAU => TAU, QFACT => QFACT, THR_OFFS => THR_OFFS, HYST => HYST, Ymax => Ymax, Ymin => Ymin) port map ( clk => HAD(2**(Nbr_bitstocodeHadamard-2)), nenable => senable_b, dac_vref_plus => dac_vref_plus, dac_vcm => dac_vcm, dac_vref_minus => dac_vref_minus, tinp => Modulator_outp(0), tinn => Modulator_outn(0), dout => s_fictif); Convertisseur complet de Walsh-Hadamard, 4 canaux (6) -- ADC du canal 1 -- ADC_1 : entity work.adcpipe_nb(str) generic map ( VDD => VDD, VSS => VSS, NBITPST => NBITPST, TAU => TAU, QFACT => QFACT, THR_OFFS => THR_OFFS, HYST => HYST, Ymax => Ymax, Ymin => Ymin) port map ( clk => HAD(2**(Nbr_bitstocodeHadamard-2)), nenable => senable_b, dac_vref_plus => dac_vref_plus, dac_vcm => dac_vcm, dac_vref_minus => dac_vref_minus, tinp => Modulator_outp(0), tinn => Modulator_outn(0), dout => s_vector_out_adc(nbr_bits_adc-1 downto 0)); -- ADC du canal 2 -- ADC_2 : entity work.adcpipe_nb(str) generic map ( VDD => VDD, VSS => VSS, NBITPST => NBITPST, TAU => TAU, QFACT => QFACT, THR_OFFS => THR_OFFS, HYST => HYST, Ymax => Ymax, Ymin => Ymin) port map ( clk => HAD(2**(Nbr_bitstocodeHadamard-2)), nenable => senable_b, dac_vref_plus => dac_vref_plus, dac_vcm => dac_vcm, dac_vref_minus => dac_vref_minus, tinp => Modulator_outp(1), tinn => Modulator_outn(1), dout => s_vector_out_adc(2*nbr_bits_adc-1 downto Nbr_bits_ADC)); 105/106

Convertisseur complet de Walsh-Hadamard, 4 canaux (7) ADC_3 : entity work.adcpipe_nb(str) -- ADC du canal 3 -- generic map ( VDD => VDD, VSS => VSS, NBITPST => NBITPST, TAU => TAU, QFACT => QFACT, THR_OFFS => THR_OFFS, HYST => HYST, Ymax => Ymax, Ymin => Ymin) port map ( clk => HAD(2**(Nbr_bitstocodeHadamard-2)), nenable => senable_b, dac_vref_plus => dac_vref_plus, dac_vcm => dac_vcm, dac_vref_minus => dac_vref_minus, tinp => Modulator_outp(2), tinn => Modulator_outn(2), dout => s_vector_out_adc(3*nbr_bits_adc-1 downto 2*Nbr_bits_ADC)); ADC_4 : entity work.adcpipe_nb(str) -- ADC du canal 4 -- generic map ( VDD => VDD, VSS => VSS, NBITPST => NBITPST, TAU => TAU, QFACT => QFACT, THR_OFFS => THR_OFFS, HYST => HYST, Ymax => Ymax, Ymin => Ymin) port map ( clk => HAD(2**(Nbr_bitstocodeHadamard-2)), nenable => senable_b, dac_vref_plus => dac_vref_plus, dac_vcm => dac_vcm, dac_vref_minus => dac_vref_minus, tinp => Modulator_outp(3), tinn => Modulator_outn(3), dout => s_vector_out_adc(4*nbr_bits_adc-1 downto 3*Nbr_bits_ADC)); Convertisseur complet de Walsh-Hadamard, 4 canaux (8) -- Génération des signaux de contrôle des switches de sortie du démodulateur process(had) begin for i in Nbr_bitstocodechannels-1 downto 0 loop switch_clk(i) <= Had(2**i); end loop; end process; -- ADVance MS ne comprend pas le signal d'entrée de type s_array_in -- Un démodulateur identique à celui développé mais prenant un vecteur comme entrée et non un tableau de vecteurs a donc été défini DEMODUL : entity work.demodulator_ams(bhv) port map ( clk_system => sclk, rst_b => senable, clk_add => HAD(2**(Nbr_bitstocodeHadamard-2)), switch_clk => switch_clk, s_vector_in => s_vector_out_adc(nbr_channels*nbr_bits_adc-1 downto 0), s_out => s_out); end architecture ass; 106/106