Partie 4
Partie 4
Partie 4
Cours de FGPA
Paul Goossens
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);
9/2006 - elektor 65
PRATIQUE FPGA
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)
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