Partie 4

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 4

PRATIQUE FPGA

Cours de FGPA
Paul Goossens

Ce mois-ci, nous allons envisager


les possibilités de simulation de
Quartus. Elles permettent de
rechercher facilement les défauts
d’un projet. Les exemples choisis
vous montreront en outre
comment mettre en service
l’interface audio de la platine
d’expérimentation.

Il est bien pratique de pouvoir tester son FPGA. Il ne figure pas dans notre sans signe. Dès lors, il peut recouvrir
projet en cours d’élaboration. En VHDL, schéma d’origine. Le signal d’horloge les valeurs entre 0 et 255, précisément
on peut construire des bancs d’essais, pour la transmission de données ce que nous voulions !
ce qui simplifie le travail de vérification et (BCKIN) est fourni par le FPGA. Sa fré- Il faut synchroniser ce nombre avec le
de simulation d’un projet. quence doit correspondre à l’horloge à signal CLK (12,288 MHz). Le signal
Malheureusement, Quartus ne connaît 12,288 MHz. NEW_COUNT sert à retenir toujours la
pas les bancs d’essais VHDL. Il dispose La figure 1 reproduit le protocole de valeur que COUNT devra prendre au
en revanche d’un simulateur graphique communication de données entre prochain coup d’horloge. On y arrive à
qui, s’il ne compte pas autant de fonc- codec et FPGA. On y voit clairement l’aide de la ligne suivante :
tions, n’en est pas moins d’un usage que la transmission d’un échantillon
fort aisé. Pour la plupart des applica- des deux canaux prend 256 coups NEW_COUNT<=(COUNT+1)MOD 256;
tions développées dans ce cours, il s’a- d’horloge sur la broche « SYSCLK » de
vère d’ailleurs plus que suffisant. IC12. Si nous divisons la fréquence Cette ligne ne fait pas partie d’un pro-
Le simulateur est en fait une combinai- d’oscillation de IC13 par 256, nous cessus, sa fonction est donc évaluée à
son d’un générateur virtuel de signaux constatons que la fréquence d’échan- chaque changement de COUNT.
et d’un analyseur logique. tillonnage est de 48 kHz. À la ligne 71, on charge dans COUNT
C’est avec lui que nous allons simuler la valeur de NEW_COUNT en synchro-
le fonctionnement d’une interface nisme avec l’horloge.
audio sur notre matériel. Compteur
Toute communication sera scandée par
cette horloge. Le plus simple consiste Simulation
CODEC à créer d’abord un compteur du nom- Nous pouvons maintenant mettre à l’é-
L’exemple « ex10 » de ce numéro va bre d’impulsions du signal SYSCLK. preuve ce code par l’intermédiaire du
nous permettre de nous livrer à des Dans notre projet, ce signal s’appelle simulateur de Quartus. Nous avons
expériences sur le codec audio IC12 de « 12_288MHz ». dans ce but rédigé un fichier de simula-
la platine. Le schéma nous indique que Nous allons retrouver ce compteur tion qui porte le nom de « ex10-1.vwf ».
cette puce doit disposer d’un signal dans le signal COUNT du fichier Lors de l’ouverture de ce fichier, vous
d’horloge à 12,288 MHz, signal qui sera « PCM3006.VHD ». Il est déclaré à la découvrirez dans la colonne de gauche
aussi envoyé à la broche d’E/S (B12) du ligne 54 en qualité de nombre de 8 bits un certain nombre de signaux en face

64 elektor - 9/2006
ième
4 partie : Simulation
Celui-ci doit rester bas pendant les 128 après le coup d’horloge suivant.
premiers coups d’horloge, puis au Ces signaux sont COUNT(2) et
niveau haut au long des 128 coups sui- NEW_COUNT(2). Par le concours d’un
vants, de sorte qu’il corresponde au bit alias, nous leur avons, dans les lignes
de poids fort (MSB) du signal COUNT. 62 et 63, donné les noms BCK_INT et
Grâce à quoi, nous pouvons utiliser le NEW_BCK. Voici comment créer d’une
bit 7 du signal COUNT comme ligne le signal POSEDGE_BCK :
LRCKOUT.
Nous allons définir le nouvel état de POSEDGE_BCK <= NEW_BCKOUT
LFCKOUT par la ligne que voici : AND (NOT BCKOUT_INT);

NEW_LRCKOUT <=NEW_COUNT(7); L’envoi de données doit avoir lieu sur


le flanc descendant de BCK, comme à
Mais il existe une autre manière d’y la figure 2. Pour ce faire, nous construi-
parvenir, par recours au mot-clé rons de la même manière le signal
desquels se trouve l’évolution dans le « alias » qui autorise un signal à porter NEGEDGE_BCK.
temps du signal d’entrée. différents noms.
Avant de pouvoir utiliser ce fichier, il Si nous écrivons à présent :
nous faudra mettre Quartus en état Pointes de tension
d’en faire bon usage. ALIAS NEW_LRCOUT : STD_LOGIC is Intéressons-nous à ces signaux plus en
Aussi, choisissons dans le menu NEW_COUNT(7); détail. Établissons pour commencer
Assignments la proposition Settings. dans Settings que le simulateur doit
Dans la nouvelle fenêtre qui s’ouvre, on nous pourrons nous servir du signal utiliser le fichier ex10-2.vwf et lançons
prend Simulator Settings et dans la « NEW_LRCOUT » dans tout le reste la simulation.
case Simulation input on inscrit le du code source. Le compilateur sait Dans le résultat de la simulation, on
nom du fichier « ex10-1.vwf ». que ce signal est identique au signal trouve les signaux NEGEDGE_BCK,
NEW_COUNT(7). POSEDGE_BCK et LRCIN. Ce dernier
La simulation démarrera après avoir, est égal au signal LRCOUT de notre
dans le menu Processing, choisi Start projet VHDL.
Simulation. Dès qu’il est prêt, le résul- Synchrone Le signal POSEDGE_BCK et son pen-
tat de la simulation s’affiche (figure 2). La réception des bits de données a lieu dant NEGEDGE_BCK résultent d’une
C’est à ce moment-ci que le signal sur le flanc montant de BCK. Pour opération combinatoire, ce qui
COUNT prend toute son importance. détecter ce flanc positif, nous formons implique qu’ils n’ont pas été synchro-
Observons que, dans les résultats de le signal POSEDGE_BCK qui est nisés par une bascule. L’inconvénient
la simulation, ce compteur est incré- envoyé si, lors du prochain flanc mon- en est que ces signaux peuvent pren-
menté d’une unité à chaque flanc mon- tant du signal de l’horloge système, le dre momentanément un niveau anor-
tant du signal à 12,288 MHz. Mais signal BCK passe du niveau bas vers le mal si leurs signaux d’entrée ont suivi
remarquez que COUNT est modifié en niveau haut. des parcours différents au point de vue
un nombre de 7 bits, en raison des Il nous faut donc tenir compte de l’état temporel. Dans la simulation, ces phé-
optimalisations. De quoi cela provient- actuel de BCK ainsi que de son état nomènes se manifestent sous la forme
il, nous le verrons tout de suite. Ce qui
compte ici, c’est précisément que le
compteur marche en synchronisme
avec l’horloge.        
  
Alias   
L’étape suivante sera de générer l’hor-           
loge de transmission de données            
BCKIN. Ce signal doit rester bas     
durant deux périodes d’horloge, puis
haut pendant deux autres périodes.
Ceci correspond exactement au 3ème
  ! "  
bit du signal COUNT. Ce signal, 060025 - 4 - 11
BCKOUT du fichier VHDL, nous pou-
vons l’utiliser tel quel à la sortie.
Il en va de même pour le signal LRCK. Figure 1. Protocole pour le transfert de données entre le CODEC et le FPGA.

9/2006 - elektor 65
PRATIQUE FPGA

un coup d’horloge. Ce signal indique


l’arrivée d’un nouveau groupe d’échan-
tillons. La logique environnante peut
alors utiliser ce signal pour travailler
sur les nouvelles données.
Pour expédier des échantillons, il faut
présenter les données aux entrées
RIGHT_IN et LEFT_IN. Un niveau haut
à l’entrée LOAD provoque la mémori-
sation de ces données qui seront alors
envoyées lors de la prochaine trans-
mission.

Exemple
Dans notre exemple, nous voyons que
les sorties de données sont directe-
ment reliées aux entrées de données
correspondantes. Le signal de sortie
NEW_SAMPLE est relié avec le signal
d’entrée LOAD.
Il s’agit en effet de renvoyer vers le
Figure 2. L’émission des données se fait sur le flanc descendant de BCK comme le montre la simulation. codec lors de la prochaine transmis-
sion les échantillons reçus. Autrement
dit, le signal d’entrée réapparaît tel
quel à la sortie avec un certain retard.
de brèves impulsions que l’on désigne de BCK tous les bits d’une position. Le
souvent par le terme « glitches ». MSB de ce registre constitue d’ailleurs
la sortie sérielle de données. Simulons encore
Chaque fois qu’on veut envoyer un Le fichier ex10-3.vwf va nous exposer
Registres à décalage nouveau groupe d’échantillons, on le fonctionnement global du circuit.
Ce sont des registres à décalage qui charge ce registre à décalage avec les Dans cette simulation, nous avons
lisent les signaux d’entrée ou « glis- signaux R_IN et L_IN. Ensuite, le doté le signal DOUT d’un arrange-
sent » ceux de sortie vers l’extérieur. À contenu de ce registre sera chargé ment des bits à choisir arbitrairement.
chaque flanc montant du signal BCK, dans les registres LEFT_OUT et On retrouve aisément lors de la simu-
le contenu du registre shiftin se décale RIGHT_OUT. lation que la séquence de données se
d’une position vers la gauche. La don- répète à la sortie DIN après environ
née entrante se place dans le bit 0. 31 µs. Les données reçues sont donc
Le registre à décalage de sortie shif- Interface réellement renvoyées au codec sans
tout travaille de la même façon. Il Au même instant, on passe au niveau aucun changement.
déménage à chaque flanc descendant haut la sortie NEW_SAMPLE pendant Un certain nombre de signaux ne font
pas partie de cette simulation, du fait
qu’ils ont pour ainsi dire « disparu »
lors de la compilation. C’est que le
compilateur tâche toujours de garder
+0
le projet aussi restreint que possible. Il
-8 se peut en effet que certains signaux
-16 ne soient plus nécessaires. Le compi-
lateur ne les réalisera pas non plus
-24
dans le FPGA. Lors de la simulation,
d -32 Quartus ne pourra donc pas davantage
B les monter.
LOWPASS 500Hz
r -40 BANDPASS 1kHz - 4kHz

A -48
-56
Filtre
La fonction passe-bas décrite précé-
-64
demment n’a pas en soi d’importance
-72 particulière. Mais si nous l’utilisons
-80
pour opérer sur le signal d’entrée que
10 20 50 100 200 500 1k 2k 5k 10k 20k nous enverrons alors au codec, l’en-
Hz 060025 - 4 - 13
semble prend toute sa signification.
Nous avons construit dans ex11 un fil-
tre audio. La communication avec le
Figure 3. Caractéristiques des différents sets de coefficients. codec passe par le noyau rédigé à cet

66 elektor - 9/2006
effet dans PCM3006.VHD. Le générateur de signaux jamais dépasser 4DD0, sous peine
La description des échantillons se fait d’obtenir en sortie un sinus très
dans le morceau FIR.VHD. Il s’agit de Comme dernier exemple, ex12, nous déformé.
l’abréviation de « Finite Impuls présentons ici un générateur simple
Response » (réponse impulsionnelle de signal sinusoïdal. Sa sortie de
finie) qui s’applique à des filtres cou- canal droit produit un signal en retard Et le signal
ramment utilisés dans le traitement de phase de 90 ° sur celui du canal Pour créer une onde sinusoïdale, il faut
numérique des signaux. gauche. donc introduire dans mag une valeur
Pour former ce signal sinusoïdal, nous constante et, pour chaque échantillon,
Dans un filtre FIR, la courbe caractéris- avons fait appel à une unité de calcul augmenter quelque peu la grandeur de
tique est définie par un ensemble de capable de délivrer les valeurs de sinus l’angle.
valeurs, les coefficients, lesquels peu- et de cosinus. Il faut donc lui fournir un C’est la raison d’être du bloc
vent être adaptés à sa guise en Quar- angle (phase) et une amplitude (mag). mag_phase_accu. Toutes les fois qu’un
tus. On se sert pour cela, comme dans L’unité calcule alors les valeurs cor- échantillon est transmis, le signal
l’article précédent, du « Memory respondantes x (cos) et y (sin). new_sample passe brièvement au
Content Editor ». Les coefficients se L’unité de calcul utilise l’algorithme niveau haut. C’est l’appel lancé au bloc
trouvent en mémoire sous le nom CORDIC qui calcule les fonctions pour qu’il augmente d’un cran la valeur
COEF. La mémoire appelée IN contient goniométriques simples. CORDIC a la de phase.
les 128 derniers échantillons audio. particularité étrange de fournir la lon- On définit cet incrément à l’aide d’in-
Nous avons joint quelques fichiers hex gueur de chaque vecteur multipliée terrupteurs DIP par exemple. Plus le
avec des coefficients pour que vous par environ 1,645. nombre sera grand, plus la fréquence
puissiez essayer divers filtres. Nous devrons veiller à ce que le résul- à la sortie du codec sera haute.
Les caractéristiques correspondant à tat puisse tenir dans un nombre de Le bloc CORDIC exécute alors les cal-
ces ensembles de coefficients se retro- 16 bits avec signe. Il en découle que la culs et envoie le résultat au codec.
uvent dans la figure 3. valeur de l’entrée mag ne pourra (060025-IV)

CORDIC Notre vecteur possède maintenant un angle de 90°. Cet


angle dépasse l’angle souhaité. Lors de la seconde étape
nous allons donc diminuer l’angle.
CORDIC (Coordinate Rotation Digital Computer) est une métho-
de permettant, en numérique, de réaliser aisément des fonctions Pour ce faire nous multiplions par le vecteur (1,–1). Notez
goniométriques. Cette méthode décrit la façon de calculer des que la valeur de Y est, cette fois, négative. De ce fait, l’angle
fonctions goniométriques par simples additions et décalages. de ce vecteur devient négatif lui aussi.
CORDIC fait appel à des vecteurs. Ces vecteurs peuvent être Après cette multiplication l’angle de notre vecteur est passé à
décrits comme une combinaison d’un nombre réel et d’un 90 ° – 45 ° = 45 °. Ceci dépasse toujours les 30 °, de sorte
nombre imaginaire (coordonnées X et Y), mais également que l’étape suivante consiste à multiplier par le vecteur
sous la forme d’une combinaison de longueur et d’angle. (1,–1/2). L’angle de notre vecteur passe ainsi à 45 ° –
26,57 °= 18,43 °. L’angle est plus petit que ce que nous recher-
Si l’on multiple 2 vecteurs (A et B) l’un par l’autre, la lon-
chons. Nous allons de ce fait utiliser lors de l’étape suivante le
gueur du produit (vecteur C) est égale au produit de la lon-
vecteur 1,1/4). Celui accroît l’angle de 14,04 °. Après cette
gueur du vecteur A par celle du vecteur B. L’angle du vecteur
nouvelle étape l’angle de nitre vecteur atteint 32,47 °. Nous
résultant est la somme des angles des vecteurs A et B.
nous approchons de plus en plus de ces fameux 30 °, le résultat
En notation X et y, une multiplication prend la forme devenant plus précis après chaque étape.
suivante :
Après chaque multiplication, ce n’est pas uniquement l’angle
Xc = Xa*Xb – Ya*Yb de notre vecteur qui change, sa longueur a varié elle aussi.
Yc = Ya*Xb + Xa*Yb Dans le cas présent, la longueur de notre vecteur atteint
100*(1*1,41*1,12*1,03) = 162,66. Il nous faux multiplier
On voit à l’évidence qu’il nous faut ici opter pour les multipli- cette longueur par une valeur de correction. Autre possibilité,
cations. Si nous faisons en sorte que ces multiplications soient donner à notre vecteur de départ une longueur de 61,5 de
toutes des puissances de 2, les opérations deviennent extrê- sorte qu’il aura, en fin d’opération, une longueur de 100. Ce
mement simples. Multiplier par rapport (comme par exemple facteur de multiplication reste identique quel que soit l’angle
2–2) revient à décaler des bits. Un processus facile à réaliser que nous souhaitons.
en logique numérique.
Quelle que soit la méthode que nous choisissions, nous trou-
La méthode CORDIC décrit la façon de calculer des fonctions vons, dans la coordonnée X de notre vecteur, la valeur du
goniométriques par multiplication d’un vecteur initial par des cosinus. La coordonnée Y nous donne la valeur de sinus. Et,
vecteurs dont les coordonnées x sont égales à 1 et les coordon- de plus, gratuitement !
nées y toujours une puissance de 2. Dans ces conditions, cette
méthode est très aisément réalisable en électronique numérique. X Y Angle Longueur

Exemple 0 1 90° 1
Nous allons prendre, comme exemple, la fonction suivante : 1 1 45° 1,41
100*cosinus(30°). Nous allons prendre comme point de 1 1/2 26,57° 1,12
départ un vecteur de longueur 100 et d’angle 0° (100,0).
1 _ 14,04° 1,03
L’angle souhaité est supérieur à l’angle actuel, de sorte que
l’on commence par multiplier le vecteur par le vecteur (0,1). …. …. …. ….

9/2006 - elektor 67

Vous aimerez peut-être aussi