filtre adaptatif lms avec système on chi (soc) sur fpga

38
1 Filtrage Adaptatif Par SOC Université ibn Tofail Faculté des Sciences de Kenitra Master Microélectronique IMPLEMENTATION DU FILTRE LMS SUR FPGA PAR S.O.C Encadrant : Pr. R. EL GOURI Réalisé par : BOUGHAIDI Mohammed Taha KHARMOUDI Ali Mouslim BENKERROUM Houssam OUBARI Abed

Upload: houssam-benkerroum

Post on 12-Aug-2015

33 views

Category:

Science


1 download

TRANSCRIPT

Page 1: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

1Filtrage Adaptatif Par SOC

Université ibn Tofail

Faculté des Sciences de Kenitra

Master Microélectronique

IMPLEMENTATION DU FILTRE LMS SUR FPGA PAR S.O.C

Encadrant : Pr. R. EL GOURI

Réalisé par :

BOUGHAIDI Mohammed Taha

KHARMOUDI Ali Mouslim

BENKERROUM Houssam

OUBARI Abed

Page 2: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

2Filtrage Adaptatif Par SOC

Introduction :

Dans le cas général lorsqu’on parle du mot filtrage ou bien filtre il s’agit alors d’un

système servant à séparer des éléments dans un flux. Ce flux peut être un flux de matières, un

courant électronique, un flux d'informations, un flux optique, etc. L'action du filtre consiste à

retenir, supprimer, rediriger ou modifier les éléments indésirables du flux, et à en laisser passer

librement les éléments utiles.

Dans le domaine du traitement du signal et de l’électronique, le terme filtre désigne à

l'origine, par analogie avec les filtres de fluides, un circuit qui rejette une partie indésirable du

signal ; par extension, un circuit qui réalise une opération de traitement du signal, On trouve

notamment :

Des filtres passe-bas (qui coupent les hautes fréquences), passe-haut (qui coupent les

basses fréquences), passe-bande(qui ne laissent passer qu'une bande définie de fréquence), et

coupe band(qui laissent passer toutes les fréquences sauf la bande rejeté).

filtre audio, filtre électronique dédié au traitement du signal dans l'enregistrement et la

reproduction sonore.

Dans le cas général on distingue deux classes fondamentales des filtres : filtres

analogiques et filtres numériques.

Les filtres électroniques analogiques utilisent, éventuellement en combinaison avec des

composants actifs (amplificateurs), des résistances, qui sont des composants indifférents aux

variations dans le temps, avec d'autres dipôles qui emmagasinent l'énergie pour la restituer

ultérieurement, appelés réactances :

sous forme électrostatique : pour les condensateurs dont la capacité s'oppose aux

variations de la tension à leurs bornes, en absorbant ou restituant un courant.

sous forme électromagnétique : pour les bobines dont l'inductance s'oppose aux variations

du courant qui les traverse en élevant ou abaissant la tension.

Certaines constructions utilisent des composants qui introduisent un délai ou retard dans la

transmission du signal.

Un filtre numérique est un élément qui effectue un filtrage à l'aide d'une succession

d'opérations mathématiques sur un signal discret. C'est-à-dire qu'il modifie le contenu spectral

du signal d'entrée en atténuant ou éliminant certaines composantes spectrales indésirables.

Page 3: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

3Filtrage Adaptatif Par SOC

Contrairement aux filtres analogiques, qui sont réalisés à l'aide d'un agencement de composantes

physiques (résistance, condensateur, inductance, transistor, etc.), les filtres numériques sont

réalisés soit par des circuits intégrés dédiés, des processeurs programmables (FPGA,

microprocesseur, DSP, microcontrôleur, etc.), soit par logiciel dans un ordinateur.

Les filtres numériques peuvent, en théorie, réaliser la totalité des effets de filtrage pouvant

être définis par des fonctions mathématiques ou des algorithmes. Les deux principales

limitations des filtres numériques sont la vitesse et le coût. La vitesse du filtre est limitée par la

vitesse (l'horloge, le « clock » en anglais) du processeur. Pour ce qui est du coût, celui-ci dépend

du type de processeur utilisé. Par contre, le prix des circuits intégrés ne cesse de diminuer, et

les filtres numériques se retrouvent partout dans notre environnement, radio, téléphone

cellulaire, télévision, lecteurs MP3, etc.

Les filtres numériques étant généralement réalisés par des processeurs, ils sont décrits à l'aide

de langages de programmation.

Un filtre numérique est défini par sa réponse impulsionnelle ou aussi par sa fonction de

transfert ( ) ( )h n H z .

L’équation aux différences dans le cas d’un filtre numériques s’écrit :( ) ( )k p

k p

a x n k b y n p , La fonction de transfert d’un tel filtre numérique est défini par :

( )( ) ( ) ( ). ( )

( )

Y zH z Y z H z X z

X z

Pour les filtres classiques on distingue deux types :

Filtres à réponse impulsionnelle finie : Ce type de filtre est dit fini, car sa réponse

impulsionnelle se stabilisera ultimement à zéro. Un filtre FIR est non récursif, c'est-à-dire

que la sortie dépend uniquement de l'entrée du signal, il n'y a pas de contre-réaction

Filtres à réponse impulsionnelle infinie : les RII (Filtre à réponse impulsionnelle infinie), en

l'anglais IIR (infinite impulse response), possèdent une réponse impulsionnelle qui ne se

stabilisera jamais, et ce, même à l'infini. Ce type de filtre est récursif, c'est-à-dire que la

Page 4: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

4Filtrage Adaptatif Par SOC

sortie du filtre dépend à la fois du signal d'entrée et du signal de sortie, il possède ainsi une

boucle de contre-réaction

Notre objectif consiste à faire une étude théorique sur le filtre adaptatif à travers l’exemple

des filtres LMS et on va essayer d’implémenter ce filtre sur la carte FPGA en utilisant la

méthode des Systèmes On Chip, pour cela on va décomposer notre projet selon trois chapitre :

Chapitre I : Le Filtrage Adaptatif – Filtre LMS

Chapitre II : SOC – Micro blaze – Carte FPGA

Chapitre III : Implémentation Du Filtre

Réalisation pratique

Page 5: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

5Filtrage Adaptatif Par SOC

Chapitre I : Le Filtrage Adaptatif –Filtre LMS

L'annulation de bruit comprend l'ensemble des techniques qui permettent d'annuler le bruit

contenu dans un signal. Le signal peut représenter une image ou un son. Le bruit étant un

composant indésirable, il est nécessaire de l’éliminer le plus possible pour recueillir le signal qui

nous intéresse. Les méthodes d’annulation de bruits touchent au domaine du génie électrique, plus

particulièrement celui des télécommunications.

Il existe de nombreuses applications à l’annulation de bruit. En voici quelques-unes : Domaine de

l’aviation : l’annulation permet aux pilotes d’avion de chasse de communiquer entre eux, malgré le

bruit assourdissant qui règne dans le cockpit.

Domaine de l’automobile : les pilotes de course doivent pouvoir communiquer clairement avec les

membres de son équipe, sans que le bruit du moteur interfère avec le signal utile (la voix).

Domaine des téléphones portables : kit mains libres sans fils accroché permettant de

communiquer clairement, bien que le microphone soit au niveau de l’oreille.

Militaire : le domaine militaire regorge de technologies de pointe, et l’annulation de bruit et

l’une des technologies utilisée depuis longtemps. Elle permet aux militaires dans des situations

délicates confrontés à des environnements très bruyants de pouvoir continuer à communiquer

entre eux.

Sécurité publique : en cas d’interventions, les pompiers sous leurs masques confrontés à des

conditions extrêmes nécessitent ce genre de technologie pour dialoguer.

Médical: lors d'un électrocardiogramme, on obtient un signal qui contient deux informations: le

battement du cœur de la mère et celui du fœtus. L'annulation de bruit permet d'annuler le

battement de la mère dans le signal pour permettre l'analyse du battement du bébé.

Dans notre cas on va utiliser un filtrage adaptatif de type RLS.

I. Algorithme adaptatif :

Un algorithme adaptatif est un algorithme qui est capable de changer automatiquement son

comportement en fonction de son contexte d’exécution pour atteindre des performances

optimales. Les changements peuvent être sur les données manipulées par l’algorithme, des

paramètres de configurations de l’environnement d’exécution et de l'occupation des ressources.

Page 6: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

6Filtrage Adaptatif Par SOC

Ces algorithmes sont des algorithme au sens classique, le terme adaptatif est ici utilisé pour

souligné le fait que le comportement de l'algorithme peut varier de façon importante selon

l'environnement.

On parle par exemple d'apprentissage adaptatif pour le boosting en apprentissage automatique

(par exemple l'algorithme Adaboost), de filtrage adaptatif en traitement du signal1 et en

géométrie algorithmique.

II. Filtrage Adaptatif :

a) Notation :

Avant de commencer le traitement on va définir quelques notations :

une lettre en minuscule désigne un scalaire et une lettre en majuscule désigne un vecteur

:x n signal scalaire de n.

( ) :X n signal vecteur de n. ( ) ( ), ( 1)................... ( 1)T

X n x n x n x n L est un vecteur de

longueur L.n représente le temps discret.

Filtre RIF àL coefficients: 0 1 1H( ) ( ), ( )................... ( )T

Ln h n h n h n .a) Filtrage adaptatif :

Un filtrage est rendu adaptatif si ses paramètres, les coefficients, sont modifiés selon un

critère donné, dés qu’une nouvelle valeur du signal devient disponible. Ces modifications

doivent suivre l’évolution des systèmesdans leur environnement aussi rapidement que possible.Le

filtrage adaptatif est généralement associé avec unfonctionnement en temps réel.

Les filtres adaptatifs peuvent être classés en fonctiondes choix qui sont faits sur les points

suivants :

le critère d’optimisation,

Page 7: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

7Filtrage Adaptatif Par SOC

l’algorithme de mise à jour des coefficients,

la structure du filtre programmable

le type de signal traité, mono ou multidimensionnel.

Il existe deux classes importantes de filtres linéairesoptimaux :

A : filtrage de Wiener (où les signaux considérés d(n)et x(n) sont stationnaires),

B : filtrage de Kalman (qui est une généralisation dufiltre deWiener valable aussi dans le cas de

processus(ou de signaux) non stationnaires).

b) Algorithme :

Le choix de l’algorithme se fera en fonction des critèressuivants:

la rapidité de convergence qui sera le nombred’itérations nécessaires pour converger assez

prèsde la solution optimale,

la capacité de poursuite (tracking) des variations(non-stationnarités) du système,

la robustesse au bruit,

la complexité,

la structure (modularité, parallélisme, ...),

les propriétés numériques (stabilité et précision)dans le cas d’une précision limitée sur les

donnéeset les coefficients du filtre.

Le filtrage adaptatif est un outil puissant en traitementdu signal, communications numériques, et

contrôleautomatique. Les applications sont diverses maisprésentent les caractéristiques

suivantes : on disposed’une entrée ( ) ainsi que de la réponse désirée(référence) d(n) et l’erreur

e(n), qui est la différenceentre d(n) et la sortie du filtre y(n), sert à contrôler(adapter) les

valeurs des coefficients du filtre. Ce quidifférencie essentiellement les applications provient

dela façon de définir la réponse désirée d(n). On peutdistinguer quatre grandes classes

d’applications :

• l’identification de systèmes,

• la prédiction,

• la modélisation inverse,

• l’annulation d’interférences.

Page 8: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

8Filtrage Adaptatif Par SOC

L’identification de systèmes :( )est la sortie du système que l’on souhaiteidentifier :

La prédiction :( )est le signal à l’instant n .Et y(n) le signalprédit à partir du signal aux instants précédents(retardées)[ ( − 1), ( − 2),· · · ].

La modélisation inverse :

d(n) est l’entrée (retardée) du system que l’on cherche à inverser

Page 9: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

9Filtrage Adaptatif Par SOC

L’annulation d’interférence :

d(n) est un signal contenant le signal utile et lesinterférences à annuler. x(n) est un signal dénué(ouPresque) d’information et obtenu par un capteur prochedes interférences.

III. Filtre LMS (Least MeanSquare):

L’algorithme du gradient stochastique est uneapproximation de l’algorithme du gradient

déterministe.L’algorithme LMS est certainement l’algorithmeadaptatif le plus populaire qui

existe en raison desa simplicité.

Rappel sur l’algorithme du gradient déterministe :

L’algorithme du gradient déterministe est :1

( 1) ( ) ( )2

h n h n g n

Où ( )

( ) 2 ( ) ( ) 2 2 ( )( )

J h ng n E x n e n p Rh n

h n

avec ( ) ( ) ( )e n y n d n et g(n) est le

gradient de la fonction coût ( ) ²( )J h n E e n Cet algorithme peut encore s’écrire enutilisant

le signal d’erreur :

Page 10: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

10Filtrage Adaptatif Par SOC

( ) ( ) ( ). ( )

( 1) ( ) ( ). ( )

Te n d n x n h n

h n h n E x n e n

Or le problème de cet algorithme se pose en pratique ( ). ( )E x n e n ou de manière équivalente R

et p ne sont pas connus.

L’algorithme LMS :

Puisque ( ) ( )TR E x n x n et ( ). ( )P E x n d n sontinconnus, on approchera ces grandeurs

déterministespar des estimées( )R n et ( )P n à l’instant n. Dans lecas du LMS, on choisit les

estimées les plus simplespossibles, àsavoir :( ) ( ) ( )TR n x n x n et ( ) ( ) ( )P n x n d n Ce sont

simplement les estimées instantanées descorrélations.En remplaçant : ( )R n et ( )P n dansl’algorithme dugradient déterministe, on obtient :

( 1) ( ) ( ) ( ) (

( 1)

( 1

)

( ) ( ) ( ) ( ) ( )

() ( ) ) ( )

T

h n h n P n R n h n

h n xh n d n x n h n

h e n

n

n xn nh

L’équation ( 1) ( ) ( ) ( )h n h n x n e n est l’algorithme LMS. On remarquera que h(n)estmaintenant une variable aléatoire [puisqu’à chaquenouvelle itération n h(n) dépend desprocessusaléatoires x(n) et d(n)].

Calcul de la sortie du filtre : ( ) ( ) ( )Ty n h n x n

Calcul du signal d’erreur : ( ) ( ) ( )e n y n d n

Mise à jour du filtre : ( 1) ( ) ( ) ( )h n h n x n e n

μ est le pas d’adaptation de l’algorithme qui démarreavec une initialisation quelconque h(0)

L’algorithme LMS est très simple : il nécessiteseulement 2L + 1 multiplications et 2L additions

par itération, où L est le nombre de coefficients du filtre.

Conclusion sur l’algorithme LMS :

Les performances du LMS dépendent de trois facteurs :

1. le pas d’adaptation .2. les valeurs propres de la matrice R.3. la longueur L du filtre h.

Page 11: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

11Filtrage Adaptatif Par SOC

Chapitre II: Systèmes On Chip-MicroBlaze - Carte FPGA

I. Les Systèmes On Chip:

Du transistor au SoC

On se basant aussi sur les études suivants de ces graphes :

le nombre detransistors par circuit

Page 12: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

12Filtrage Adaptatif Par SOC

la bandepassante mémoire

On remarque que la technologie évolue en réduisant la taille des transistors selon des

spécifications ce qui permet de :

Augmenter la fréquence d’horloge

Augmenter la densité d’intégration

Augmenter la capacité mémoire

Augmenter la taille des mots

Augmenter la consommation de l’énergie

L’évolution de la technologie (Les lois d’évolution) :

1)1965 Modélisation par la Loi de Moore :

La densité d’intégration (le nombre de transistorspar unité de surface sur une puce)

double tous les18 mois (60% l’an)

Prédiction empirique devenu incroyablement exacteet même un objectif à tenir.

Cercle vertueux.

2) Evolution des circuits et des mémoires:

L’augmentation de la taille des puces est moinsprévisible : entre 10 et 25% par an.

L’effet combiné est une augmentation dunombre de transistors par circuit de 60 à 80%

Page 13: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

13Filtrage Adaptatif Par SOC

par an.

La densité croit d’un peu moins de 60% par an(x4 en 3 ans).

3) Loi de Nathan :

Le logiciel se comporte comme un gaz : son expansion est tellequ’il remplit tout contenant,

Le logiciel crée une pression d’évolution sur les : Mémoire, Processeurs, Entrées / Sorties.

Concrètement, la quantité de mémoire dont a besoin unprogramme augmente d’un facteur

1,5 à 2 par an.

Augmentation du nombre de bits d’adresse de 0,5 à 1 par an.

4) Loi de Joy :

La puissance CPU des processeurs embarqués enMIPS double tous les 2 ans)

Ils sont de plus en plus communicants :On a besoin d’une bande passante réseau de0,3 à 1

Mb/s par MIPS !!

5) L’industrie électronique ne vit que grâce à son expansion rapide. Aujourd’hui la durée de vie

d’une technologie est d’environ 5 ans.Face à cela, l’industrie électronique doit :Maintenir son taux

de progression, et Révolutionner régulièrement ses méthodes de conception/production.

6)La conception vise aujourd’hui l’intégration deplusieurs composants (d’un système) sur un

seulchip

Systèmes On Chip :

La conception vise aujourd’hui l’intégration de plusieurs composants (d’un système) sur une seule

puce appelée aussi chip. Ceci a donnée naissance à la technologie des Systèmes On Chip

(SOC)(Système sur puce),

Un système sur une puce, également souvent désigné dans la littérature scientifique par le terme

anglais system on a chip ou son abréviation SOC, est un système complet embarqué sur une seule

puce, pouvant comprendre de la mémoire, un ou plusieurs microprocesseurs, des périphériques

d'interface, ou tout autre composant nécessaire à la réalisation de la fonction attendue.

Particularités des Systèmes On Chip :

Les contraintes des SOC conditionnent leur conception :

Coûts de conception et de vérification (faibles marges de bénéfice)

Contraintes de temps strictes ou souples

Page 14: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

14Filtrage Adaptatif Par SOC

Consommation d’énergie (portables, PDA, Wireless, ...)

Sécurité (automobile, aviation)

Poids, taille (UMTS vs GSM)

Accroissement du logiciel embarqué

Applications des Systèmes On Chip :

Processeur d'images DIGIC Canon ou EXPEED de Nikon.

Processeur Cell du consortium STI

Architecture ARM : Toutes les puces contenant des processeur ARM Cortex-A, que ce soit,

AllWinner, Exynos de Samsung,MediaTek, OMAP de Texas Instrument, Rockchip, Tegra de

nVidia, Snapdragon de Qualcomm,, etc.

Architecture x86 : différentes déclinaisons du processeur Intel Atom, Intel Core et AMD

Fusion reprennent ce principe, limité au processeur et aux unités de calculs. Les commerciaux des

architectures x86 appellent cela APU, mais en architecture informatique un APU désigne de

façon générique une unité spécialisée dans l'accélération des calculs, que ce soit GPU, GPGPU,

DSP…

II. Micro Blaze:

Le MicroBlaze est un cœur de processeur softcore 32 bits de la société Xilinx. Il est conçu pour

être implémenté sur les FPGA de ce fabricant. Le code source de MicroBlaze est fermé.

Architecture générale :

Le MicroBlaze est un microprocesseur softcore RISC, d'architecture Harvard, entièrement 32

bits. En effet, il possède :

32 registres internes de 32 bits,

un bus instructions interne (ILMB)

un bus donné interne (DLMB),

un bus d'instructions externe (IOPB),

un bus de données externe (DOPB).

Le processeur comporte 70 options de configuration2 permettant à l’utilisateur de sélectionner

ou de paramétrer les composants internes selon ses besoins :

Page 15: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

15Filtrage Adaptatif Par SOC

un pipeline à 3 ou 5 niveaux,

utilisation des multiplieurs câblés du FPGA (sauf sur Spartan II)

opérateur de division

opérateur de décalage (Barrel Shifter)

FPU (Floating Point Unit)

mémoires cache instructions et données

logique de débug (hardware breakpoints)

On-Chip Peripheral Bus (OPB) :

Le bus OPB, conçu par IBM pour ses microcontrôleurs PowerPC, permet de lier plusieurs maîtres

à plusieurs esclaves. Il autorise un maximum de 16 maîtres et un nombre d’esclaves illimité selon

les ressources disponibles. Xilinx conseille néanmoins un maximum de 16 esclaves. Comme ce bus

est multi maîtres, il a donc une politique d’arbitrage paramétrable. Ce bus permet donc d’ajouter

des périphériques au MicroBlaze dont les besoins en communications seront faibles.

Local Memory Bus (LMB) :

Le bus LMB est un bus synchrone utilisé principalement pour accéder aux blocks RAM inclus sur

le FPGA. Il utilise un minimum de signaux de contrôle et protocole simple pour s’assurer d’accéder

à la mémoire rapidement (un front d’horloge).

Fast Simplex Link (FSL) :

Le MicroBlaze comporte 8 liens entrées/sorties FSL. Le bus FSL est un moyen rapide de

communication entre le processeur et une autre entité. Chaque lien FSL 32 bits est

unidirectionnel (simplex) et met en œuvre une FIFO (pour stocker les données) et des signaux de

contrôle (FULL, EMPTY, WRITE, READ, …). Il met aussi à la disposition du développeur plusieurs

fonctions intéressantes dont les plus utilisées sont : “microblaze_bwrite_datafsl” et

“microblaze_bread_datafsl”. Ces deux fonctions permettent d'échanger des données entre

différents microblazes, par exemple, en utilisant la FIFO déjà intégrée dans le bus FSL. Ces

deux fonctions sont bloquantes;bwrite se bloque lorsque la FIFO du bus FSL est saturée et

bread se bloque lorsque la FIFO est vide. Il doit y avoir un bwrite pour débloquer la lecture. Les

communications sur les liens FSL se font très simplement grâce à des instructions prédéfinies.

Elles peuvent atteindre les 300 Mo/s à 150 Mhz.

Xilinx Cache Link (XCL)

Page 16: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

16Filtrage Adaptatif Par SOC

Le lien XCL est un lien FSL particulier, dédié à la connexion d'un contrôleur mémoire externe

avec la mémoire cache interne. Ceci permet au contrôleur de cache de ne pas être ralenti par la

latence du bus OPB.

Périphériques :

De nombreux périphériques sont fournis avec le MicroBlaze, afin de constituer un

microcontrôleur complet et personnalisable. Il y a, entre autres :

contrôleur mémoire (SRAM, Flash)

contrôleur mémoire SDRAM

UART lite

Timer/compteur avec fonction PWM

interface SPI

contrôleur d'interruptions

GPIO (entrées-sorties génériques)

convertisseurs A/N et N/A Delta-Sigma

DMA

De plus, des périphériques payants sont proposés en version d'évaluation, qui ont la particularité

de ne fonctionner que quelques heures :

UART 16550

interface Ethernet

interface I²C

interface PCI

Méthode de développement :

Un processeur soft-core présente la particularité d'une programmation à deux niveaux :

configuration matérielle du FPGA pour associer un (ou des) processeur(s) et des périphériques,

programmation logicielle sur ce(s) processeur(s).

Cette spécificité nécessite des outils de développement adaptés, et présente plusieurs

avantages :

démarche de CoDesign,

Page 17: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

17Filtrage Adaptatif Par SOC

homogénéité entre matériel et logiciel (interfaces et mapping logiciels générés par les outils

hardware),

possibilité de faire une simulation HDL du processeur et de ses périphériques (bien que ce soit

une opération longue),

possibilité de pré-chargement du code résidant en RAM interne lors de la configuration du

FPGA : lorsque le système se "réveille" à la mise sous tension, une partie du code est déjà

présente en mémoire.

synchronisation entre le module de débug (MDM) et l'"analyseur logique virtuel" ChipScope,

afin de mener un débug combiné matériel/logiciel.

Bien que la chaîne de développement logiciel (outils GNU), et les outils de synthèse, placement-

routage FPGA soient soit tout à fait standard, des outils spécifiques en amont et en aval sont

proposés :

Assistant de configuration pour cartes existantes (choix de périphériques et placement des

entrées-sorties selon le routage de la carte)

sélection et assemblage des périphériques

choix du processeur

connexion des périphériques sur les différents bus, choix des adresses

configuration des périphériques

déclaration des routines d'interruptions, directement associées aux périphériques

compilation des bibliothèques C en fonction des périphériques et options du processeur (FPU,

division) choisis

initialisation des mémoires internes dans le fichier binaire de configuration du FPGA

téléchargement matériel et logiciel, ainsi que débug logiciel, avec le même lien JTAG

Méthode de développement :

Un processeur soft-core présente la particularité d'une programmation à deux niveaux :

configuration matérielle du FPGA pour associer un (ou des) processeur(s) et des

périphériques,

programmation logicielle sur ce(s) processeur(s).

Cette spécificité nécessite des outils de développement adaptés, et présente plusieurs avantages

:

Page 18: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

18Filtrage Adaptatif Par SOC

démarche de CoDesign,

homogénéité entre matériel et logiciel (interfaces et mapping logiciels générés par les outils

hardware),

possibilité de faire une simulation HDL du processeur et de ses périphériques (bien que ce

soit une opération longue),

possibilité de pré-chargement du code résidant en RAM interne lors de la configuration du

FPGA : lorsque le système se "réveille" à la mise sous tension, une partie du code est déjà

présente en mémoire.

synchronisation entre le module de débug (MDM) et l'"analyseur logique virtuel" ChipScope,

afin de mener un débug combiné matériel/logiciel.

Bien que la chaîne de développement logiciel (outils GNU), et les outils de synthèse, placement-

routage FPGA soient soit tout à fait standard, des outils spécifiques en amont et en aval sont

proposés :

Assistant de configuration pour cartes existantes (choix de périphériques et placement des

entrées-sorties selon le routage de la carte)

sélection et assemblage des périphériques

compilation des bibliothèques C en fonction des périphériques et options du processeur

(FPU, division) choisis

possibilité de pré-chargement du code résidant en RAM interne lors de la configuration du

FPGA

téléchargement matériel et logiciel, ainsi que débug logiciel, avec le même lien JTAG

III. Carte FPGA:

Un circuit logique programmable, ou réseau logique programmable, est un circuit intégré logique

qui peut être reprogrammé après sa fabrication. Notons qu'il serait impropre de parler de

programmation au sens logiciel (contrairement à un microprocesseur, il n'exécute aucune ligne de

code). Ici, mieux vaudrait parler de « reconfiguration » plutôt que de reprogrammation (on

modifie des connexions ou le comportement du composant, on connecte des portes logiques entre

elles, etc.). Le verbe programmer est toutefois le plus fréquent, mais au sens de personnaliser. Il

s'agit bel et bien de réseaux logiques reconfigurables et modifiables.

Page 19: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

19Filtrage Adaptatif Par SOC

il est composé de nombreuses cellules logiques élémentaires et bascules logiques librement

connectables (c'est justement la reconfiguration, ou programmation, du composant qui définit les

connexions faites entre portes logiques).

La plupart des grands FPGA modernes sont fondés sur des cellules SRAM aussi bien

pour le routage du circuit que pour les blocs logiques à interconnecter.

Un bloc logique est de manière générale constitué d'une table de correspondance (LUT

ou Look-Up-Table) et d'une bascule (Flip-Flop en anglais). La LUT sert à implémenter des

équations logiques ayant généralement 4 à 6 entrées et une sortie. Elle peut toutefois être

considérée comme une petite mémoire, un multiplexeur ou un registre à décalage. Le registre

permet de mémoriser un état (machine séquentielle) ou de synchroniser un signal (pipeline).

Les blocs logiques, présents en grand nombre sur la puce (de quelques milliers à

quelques millions en 2007) sont connectés entre eux par une matrice de routage configurable.

Ceci permet la reconfiguration à volonté du composant, mais occupe une place importante sur le

silicium et justifie le coût élevé des composants FPGA. La topologie est dite « Manhattan », en

référence aux rues à angle droit de ce quartier de New York.

Les densités actuelles ne permettent plus un routage manuel, c'est donc un outil de

placement-routage automatique qui fait correspondre le schéma logique voulu par le concepteur

et les ressources matérielles de la puce. Comme les temps de propagation dépendent de la

longueur des liaisons entre cellules logiques, et que les algorithmes d'optimisation des placeurs-

routeurs ne sont pas déterministes, les performances (fréquence max.) obtenues dans un FPGA

sont variables d'un design à l'autre. L'utilisation des ressources est par contre très bonne, et

des taux d'occupation des blocs logiques supérieures à 90 % sont possibles.

Comme la configuration (routage et LUTs) est faite par des points mémoire volatils, il

est nécessaire de sauvegarder le design du FPGA dans une mémoire non volatile externe,

généralement une mémoire Flash série, compatible « JTAG ». Certains fabricants se distinguent

toutefois par l'utilisation de cellules EEPROM pour la configuration, éliminant le recours à une

mémoire externe, ou par une configuration par anti-fusibles (la programmation par une tension

élevée fait « claquer » un diélectrique, créant un contact). Cette dernière technologie n'est

toutefois pas reconfigurable.

Page 20: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

20Filtrage Adaptatif Par SOC

Chapitre III :Implémentation Du Filtre

La conception d’un système embarqué en INF3990 se réalise grâce à une série d’outils compris

dans la suite logicielle Xilinx ISE Design Suite. Parmi ceux-ci, deux retiennent notre attention

pour le cours : XPS (Xilinx Platform Studio) et SDK (Software Development Kit). À eux seuls, ils

forment la partie EDK (Embedded Development Kit) de la suite et permettent le design complet

d’une architecture matérielle munie d’un ou plusieurs processeurs, puis le développement et la

compilation d’un logiciel pour ces derniers.

1) Flot de conception :

La conception d’un système embarqué suit un tracé linéaire particulier et inévitable. Le schéma

suivant résume celui-ci (inutile d’y porter attention immédiatement) :

La figure précédente montre bien que la conception nous fait passer d’un logiciel à l’autre, sans

trop avoir à revenir en arrière.

Au départ, tout se passe dans XPS. Ce logiciel permet de créer et de paramétrer tout le côté

matériel du système. Pensez, par exemple, à une maison : avant de la décorer et de la remplir de

meubles, elle doit contenir des planchers, des murs, des entrées et des sorties, de la plomberie,

un réseau électrique, etc., lesquels ont tous été déterminés au préalable par l’architecte. Une

fois le design matériel terminé et implémenté dans le FPGA de la carte, l’exportation de ses

caractéristiques permet de passer à SDK.

Page 21: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

21Filtrage Adaptatif Par SOC

SDK, c’est la décoration. Si la maçonnerie d’une maison peut prendre des semaines avant d’être

complétées, changer un cadre d’un mur à l’autre ou déplacer un meuble se fait en un tour de main.

Dans le contexte d’INF3990, on parle d’une quinzaine de minutes pour synthétiser et

implémenter le design matériel contre une dizaine de secondes pour la compilation du logiciel.

Enfin, l’outil XMD, un débogueur, permet d’envoyer le logiciel compilé et assemblé vers la

mémoire de la carte, de l’exécuter et le déboguer.

Sans oublier notre analogie, il faut comprendre que modifier un aspect du design matériel

demande souvent de recommencer une bonne partie de la synthèse et l’implémentation, tout

comme l’ajout d’un étage à une maison demande d’abord une déconstruction partielle. À la lumière

de ce fait, il est important de vérifier tous les paramètres et les modules matériels

correctement avant de lancer la synthèse et l’implémentation.

2) XPS : Xilinx Platform Studio :

Tel que mentionné ci-haut, XPS permet la conception matérielle du système embarqué. Celui-ci

comprendra la plupart du temps un ou plusieurs processeurs, ainsi que plusieurs modules

matériels, nommés cores ou IP cores, interconnectés par un ou plusieurs bus.

BSB : Base System Builder

Un système matériel dans XPS est décrit à l’aide de plusieurs fichiers de spécifications

textuels. Comme leurs formats sont plutôt complexes, surtout en début de cours, il est

préférable d’utiliser l’outil BSB dans XPS. Celui-ci présente un guide intelligent muni d’une

interface graphique et écrit, selon les options choisies, les fichiers de spécifications

automatiquement. Ceux-ci peuvent par la suite être modifiés pour atteindre des objectifs plus

précis, mais le BSB à lui seul permet de créer un système matériel de base complet et

fonctionnel.

Afin d’utiliser le BSB, il suffit de lancer XPS afin de se faire proposer ce choix :

Page 22: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

22Filtrage Adaptatif Par SOC

En s’assurant que la première option est

sélectionnée, cliquer sur « OK » lance le BSB. La

fenêtre suivante demande où enregistrer les

fichiers du projet et où se trouvent les

périphériques additionnels :

Le répertoire de recherche des périphériques

additionnels devrait être

C:\Xilinx\13.1\ISE_DS\edk_user_repository.

Comme nous désirons créer un nouveau design, nous laissons l’option « I wouldlike to create a new

design » sélectionnée et appuyons sur « Next> ».

La page suivante demande des informations sur la carte. Ici, une définition de carte est déjà

intégrée à la suite et les champs « BoardVendor », « Board Name » et « BoardRevision »

22Filtrage Adaptatif Par SOC

En s’assurant que la première option est

sélectionnée, cliquer sur « OK » lance le BSB. La

fenêtre suivante demande où enregistrer les

fichiers du projet et où se trouvent les

périphériques additionnels :

Le répertoire de recherche des périphériques

additionnels devrait être

C:\Xilinx\13.1\ISE_DS\edk_user_repository.

Comme nous désirons créer un nouveau design, nous laissons l’option « I wouldlike to create a new

design » sélectionnée et appuyons sur « Next> ».

La page suivante demande des informations sur la carte. Ici, une définition de carte est déjà

intégrée à la suite et les champs « BoardVendor », « Board Name » et « BoardRevision »

22Filtrage Adaptatif Par SOC

En s’assurant que la première option est

sélectionnée, cliquer sur « OK » lance le BSB. La

fenêtre suivante demande où enregistrer les

fichiers du projet et où se trouvent les

périphériques additionnels :

Le répertoire de recherche des périphériques

additionnels devrait être

C:\Xilinx\13.1\ISE_DS\edk_user_repository.

Comme nous désirons créer un nouveau design, nous laissons l’option « I wouldlike to create a new

design » sélectionnée et appuyons sur « Next> ».

La page suivante demande des informations sur la carte. Ici, une définition de carte est déjà

intégrée à la suite et les champs « BoardVendor », « Board Name » et « BoardRevision »

Page 23: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

23Filtrage Adaptatif Par SOC

Nous accédons ensuite à la page où un choix doit être fait entre un système à un ou à plusieurs

processeurs. Pour cette introduction simple, nous choisissons un seul processeur :

Page 24: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

24Filtrage Adaptatif Par SOC

Il est ensuite possible de configurer le processeur choisi. Ici, nous désirons que celui-ci soit un

MicroBlaze (qui devrait d’ailleurs être le seul choix), avec une fréquence d’horloge de 50 MHz et

32kB de mémoire locale (mémoire contenant éventuellement notre logiciel compilé et assemblé) :

La page suivante est probablement la plus importante. Elle permet d’inclure ou d’exclure des

périphériques au système. Ces périphériques sont liés par un seul et même bus. Ils ne

Page 25: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

25Filtrage Adaptatif Par SOC

représentent pas la totalité des périphériques, ou cores, disponibles, mais plutôt un sous-

ensemble déjà configuré pour nous. Dans cette introduction, nous n’allons inclure que les 8 DEL,

les 8 boutons poussoirs et l’UART (pour communication par RS-232) dans le système :

25Filtrage Adaptatif Par SOC

représentent pas la totalité des périphériques, ou cores, disponibles, mais plutôt un sous-

ensemble déjà configuré pour nous. Dans cette introduction, nous n’allons inclure que les 8 DEL,

les 8 boutons poussoirs et l’UART (pour communication par RS-232) dans le système :

25Filtrage Adaptatif Par SOC

représentent pas la totalité des périphériques, ou cores, disponibles, mais plutôt un sous-

ensemble déjà configuré pour nous. Dans cette introduction, nous n’allons inclure que les 8 DEL,

les 8 boutons poussoirs et l’UART (pour communication par RS-232) dans le système :

Page 26: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

26Filtrage Adaptatif Par SOC

Les étapes suivantes, la cache et le résumé, peuvent être traversées rapidement. Pour la cache,

aucune option ne sera disponible puisque nous n’avons pas inclus de mémoire externe dans notre

design. Cliquer sur « Finish » termine le BSB, crée le système et ouvre le projet dans XPS :

26Filtrage Adaptatif Par SOC

Les étapes suivantes, la cache et le résumé, peuvent être traversées rapidement. Pour la cache,

aucune option ne sera disponible puisque nous n’avons pas inclus de mémoire externe dans notre

design. Cliquer sur « Finish » termine le BSB, crée le système et ouvre le projet dans XPS :

26Filtrage Adaptatif Par SOC

Les étapes suivantes, la cache et le résumé, peuvent être traversées rapidement. Pour la cache,

aucune option ne sera disponible puisque nous n’avons pas inclus de mémoire externe dans notre

design. Cliquer sur « Finish » termine le BSB, crée le système et ouvre le projet dans XPS :

Page 27: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

27Filtrage Adaptatif Par SOC

L’interface régulière de XPS permet de modifier les paramètres des périphériques configurés

par le BSB, d’en ajouter de nouveaux, de modifier les plages d’adresses des bus et de poursuivre

de façon générale le design matériel du système.

Page 28: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

28Filtrage Adaptatif Par SOC

Après on rédige l’ucf

Page 29: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

29Filtrage Adaptatif Par SOC

# Generic Template

Net fpga_0_RS232_RX_pin LOC="U8";

Net fpga_0_RS232_TX_pin LOC="M13";

Net fpga_0_clk_1_sys_clk_pin TNM_NET = sys_clk_pin;

TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 50000 kHz;

Net fpga_0_clk_1_sys_clk_pin LOC="C9";

Net fpga_0_rst_1_sys_rst_pin TIG;

Net fpga_0_rst_1_sys_rst_pin LOC="K17";

Pour l’instant, nous nous contentons de synthétiser et d’implémenter le système en appuyant sur

le bouton montré dans la capture suivante :

Il faudra attendre quelques minutes avant de voir apparaitre la ligne « Done! » dans la console au

bas de l’interface.

Que s’est-il alors passé? Le schéma suivant résume de façon générale le processus effectué et

ses produits dérivés :

Page 30: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

30Filtrage Adaptatif Par SOC

Suite à la génération du fichier system.bit, le FPGA de la carte de développement peut être

programmée avec notre design, Cette action lancera iMPACT et configurera automatiquement le

FPGA.

Pour passer au développement logiciel, il suffit d’exporter les caractéristiques du système

matériel vers un dossier de travail, ou workspace, où SDK basera ses projets. Pour ce faire, il

faut sélectionner le menu « Project » puis l’item « Export Hardware Design to SDK… ». Ensuite,

le bouton « Export &Launch SDK » peut être appuyé pour lancer automatiquement SDK suite à

l’exportation. SDK demandera alors où placer le dossier de travail : il est conseillé de le placer à

l’extérieur du répertoire de projet XPS.

Page 31: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

31Filtrage Adaptatif Par SOC

La partie matérielle du système est créée, le FPGA est programmé et les caractéristiques du

design sont exportées dans un dossier de travail pour SDK : il est maintenant temps de

développer un logiciel pouvant s’exécuter sur notre plateforme personnalisée.

Une fois dans SDK, l’onglet « Project Explorer » à gauche ne liste qu’un item nommé «

hw_platform_0 ». Il s’agit d’une référence aux caractéristiques de notre design matériel; c’est

en fait le produit de l’exportation réalisée précédemment.

Page 32: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

32Filtrage Adaptatif Par SOC

Après on va suivre les étapes suivantes :

1- Création d’un Board Support Package :

Avant toute chose, un Board Support Package doit être créé. Celui-ci est un projet logiciel du

dossier de travail qui contient les librairies et entêtes importantes pour nos futurs projets

C/C++. Afin d’en créer un, il faut atteindre l’item de menu « File New XilinxBoard Support

Package ». Nous pouvons alors lui donner un nom (sans importance). Nous voyons qu’il cible une

plateforme matérielle particulière : celle exportée par XPS vers notre dossier de travail. Grâce à

celle-ci, il pourra configurer automatiquement certains fichiers et paramètres. À noter

également qu’il est ici possible de choisir un système d’exploitation pour notre système : «

xilkernel » est un petit noyau permettant des services de style POSIX (ordonnancement, fils

d’exécution, synchronisation, compteurs, etc.) tandis que « standalone », que nous choisissons,

est une couche logicielle de très bas-niveau (l’exécution commence à la fonction main et ne gère

pratiquement rien d’autre, un peu comme dans le cours INF1995). En cliquant sur « Finish », la

fenêtre des options du Board Support Package s’affiche.C’est ici qu’il est possible d’inclure des

librairies additionnelles, comme lwIP (couches TCP et IP du réseau) ou Xilinx Memory File

System (système de fichiers en mémoire). Les options du « système d’exploitation » standalone

montrent que les entrée et sortie standards sont redirigées vers l’UART (RS-232).

Page 33: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

33Filtrage Adaptatif Par SOC

Nous voyons qu’il cible une plateforme matérielle particulière : celle exportée par XPS vers notre

dossier de travail. Grâce à celle-ci, il pourra configurer automatiquement certains fichiers et

paramètres. À noter également qu’il est ici possible de choisir un système d’exploitation pour

notre système : « xilkernel » est un petit noyau permettant des services de style POSIX

(ordonnancement, fils d’exécution, synchronisation, compteurs, etc.) tandis que « standalone »,

que nous choisissons, est une couche logicielle de très bas-niveau (l’exécution commence à la

fonction main et ne gère pratiquement rien d’autre, un peu comme dans le cours INF1995). En

cliquant sur « Finish », la fenêtre des options du Board Support Package s’affiche.

C’est ici qu’il est possible d’inclure des librairies additionnelles, comme lwIP (couches TCP et IP

du réseau) ou Xilinx Memory File System (système de fichiers en mémoire). Les options du «

système d’exploitation » standalone montrent que les entrée et sortie standards sont redirigées

vers l’UART (RS-232).

2- Création d’un projet C :

Il est maintenant temps de créer un projet C. Via « File -> New ->Xilinx C Project », une fenêtre

présente un choix de modèles pour le nouveau projet; nous choisissons ici un projet vide, « Empty

Application ».

Page 34: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

34Filtrage Adaptatif Par SOC

En appuyant sur « Next> », nous avons l’option de créer un nouveau Board Support Package ou

d’en associer un déjà existant au nouveau projet, ce que nous faisons.

Appuyer sur « Finish » termine l’assistant et crée le nouveau projet C.

Nous pouvons désormais créer un nouveau fichier source en cliquant droit sur notre nouveau

projet dans l’onglet « Project Explorer », puis en sélectionnant « New Source file ». Nous le

nommons ici main.c, mais le nom du fichier est sans importance.

Pour ce test, nous ferons simplement en sorte d’envoyer une chaine vers le canal RS232 en

utilisant la fonction standard printf. Comme nous l’avons déjà vu, la sortie standard est redirigée

vers l’UART (donc tout ce qui est envoyé par printf)

Le programme du filtre LMS :

#include "xparameters.h"

#include "xutil.h"

#include "platform.h"

#include "xuartlite_l.h"

Page 35: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

35Filtrage Adaptatif Par SOC

intmain()

{

int I, J;

float D, Y, E, N=21, beta=0.01; // desire - signal sortie - erreur

floath[22] = {0.0}; // coefficients

floatX[22] = {0.0}; // bruit

init_platform();

while(1)

{ Y = 0; //initialisation de la sortie du filtre

for (J = 0; J <= N; J++)

{

X[J] = XUartLite_RecvByte(XPAR_UARTLITE_0_BASEADDR);

Y += (h[J] * X[J]);

//calcul de la sortie du filtre

E = Y - D; // calcul d erreur

if (E>0)

{

for (I = N; I >= 0; I--)

{

h[I] = h[I] + (beta*E*X[I]); //mise a jours de coefficients du filtre

if (I != 0)

X[I] = X[I-1]; //mise a jour des donnees du signal

}

}

XUartLite_SendByte(XPAR_UARTLITE_0_BASEADDR, Y);

}

}

Page 36: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

36Filtrage Adaptatif Par SOC

cleanup_platform();

return 0;

}

Aussitôt le fichier enregistré, SDK compile automatiquement notre projet et crée l’exécutable

ELF. Celui-ci se trouve par défaut dans le répertoire Debug du projet.

Envoi de l’exécutable vers la carte

Le fichier ELF compilé et assemblé peut maintenant être envoyé vers la carte. Pour ce faire, nous

utilisons XMD, le débogueur de Xilinx qui est couvert en détails par une autre partie du cours.

Le débogueur peut être lancé dans XPS ou dans SDK. Pour cette introduction, nous utilisons SDK.

Pour le démarrer, il suffit de sélectionner le menu « Xilinx Tools XMD Console » puis de tapper

la commande

connect mb mdm

ainsi :

Il faut ensuite aller retrouver l’exécutable (fichier ELF) en naviguant dans les dossiers avec les

commandes cd (changer de répertoire), ls (liste des fichiers du répertoire) et pwd (chemin

complet en cours). Dans notre cas, nous tapons

cd Z:/test3_sdk/un_test/Debug

L’utilisation de barres obliques (/) plutôt que des barres obliques inverses (\) est importante

puisque ce terminal est de type UNIX.

Pour envoyer le fichier un_test.elf, nous utilisons la commande dow :

dowun_test.elf

Page 37: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

37Filtrage Adaptatif Par SOC

Le terminal affichera alors l’information suivante aux dernières lignes :

Setting PC with Program Start Address 0x00000000 System Reset .... DONE

Ceci est signe que l’exécutable est désormais dans la mémoire programmable de la carte et que le

logiciel est prêt à être lancé.

Avant l’exécution de ce logiciel qui, nous le rappelons, envoie une chaine par communication RS-

232 vers le PC et se termine, nous devons ouvrir sur le PC un émulateur de terminal. Le logiciel

Termite en est un simple et efficace, qui devrait se connecter automatiquement avec les bons

paramètres au lancement.

Page 38: Filtre adaptatif LMS avec Système On Chi (SOC) sur FPGA

38Filtrage Adaptatif Par SOC

Réalisation pratique :

Nous avons utilisé une carte à base de microcontrôleur ATMEGA8 équipée d’un circuit MCP9801

pour mesurer la température et un circuit MAX232 pour la communication série. On a programmé

le microcontrôleur de façon a ce qu’il reçoit la température et l’envoyée vers l’UART.

La broche Tx du circuit Max232 et connectée à la broche Rx de la carte FPGA et la broche Tx

de la carte FPGA et connectée a la broche Rx du PC, comme ça le microcontrôleur envoie a la

carte FPGA les données, cette dernière les traite et les envoie vers le PC ce dernier affiche la

température sur hyper Terminal.