← Retour← Back
CV

Lecteur audio et sortie PWM sur FPGAAudio player and PWM output on FPGA

Matériel numériqueDigital hardwareVHDLArtix-7 XC7A100TVivadoEN201
QuoiWhat
Un lecteur audio sur FPGA Artix-7 (Nexys 4) : une interface à 8 modules (FSM, compteurs 1–599 et 1–9, afficheurs 7 segments multiplexés), puis une sortie audio en PWM à 44,1 kHz depuis une ROM, puis une RAM chargée par UART.An audio player on an Artix-7 FPGA (Nexys 4): an 8-module interface (FSM, 1–599 and 1–9 counters, multiplexed 7-segment displays), then a 44.1 kHz PWM audio output from a ROM, then a RAM loaded by UART.
PourquoiWhy
Concevoir une architecture numérique complète et entièrement synchrone, et produire de l'audio avec une seule sortie binaire.To design a complete, fully synchronous digital architecture, and to produce audio with a single binary output.
CommentHow
VHDL sous Vivado, découpe en modules validés chacun par testbench, Clock Enable (~3 kHz pour le balayage des afficheurs, ~10 Hz pour le compteur), PWM sur l'horloge 100 MHz, filtre de Butterworth d'ordre 4 de la carte.VHDL in Vivado, split into modules each validated by a testbench, Clock Enables (~3 kHz for display scanning, ~10 Hz for the counter), PWM on the 100 MHz clock, the board's 4th-order Butterworth filter.
RésultatsResults
Chiffres clés : 100 MHz vers un PWM à 44,1 kHz (p = 2267 cycles, ≈ 11 bits), ROM de 44 100 échantillons de 11 bits, compteur 1–599 à 10 Hz, 8 afficheurs balayés à ≈ 375 Hz chacun.Key figures: 100 MHz down to a 44.1 kHz PWM (p = 2267 cycles, ≈ 11 bits), ROM of 44,100 11-bit samples, 1–599 counter at 10 Hz, 8 displays scanned at ≈ 375 Hz each.

Synthèse des TPs de VHDL du module EN201 : un lecteur audio sur une carte Nexys 4 (FPGA Xilinx Artix-7 XC7A100T, horloge 100 MHz), de l'interface de commande jusqu'à la sortie son. L'interface reprend celle d'un lecteur MP3 (lecture, pause, sens, volume), mais il n'y a aucun décodage MP3 : le son est une suite d'échantillons lue directement en mémoire. Certains blocs reprennent ceux du projet LOTO du semestre 5.

L'interface du lecteur

Cinq boutons pilotent une machine à états, qui commande deux compteurs : un compteur/décompteur de 1 à 599 (la position de lecture, un pas toutes les 100 ms) et un autre de 1 à 9 (le volume). Les huit afficheurs 7 segments à anode commune montrent le compteur sur trois d'entre eux, le volume suivi d'un point sur un quatrième, et un codage de l'état de la FSM sur les quatre derniers.

detec_impulsion5 boutonsdetec_impulsion5 buttonsfsm_MP3gestion_freqcpt_1_599cpt_1_9volumecpt_1_9volumeTranstranscodage 7 seg.Trans7-seg. decodingmux8mod8Play / Restart / FwdVolume UP / DWSept_SegmentsANCE 10 HzCE 3 kHz
Architecture à 8 modules du lecteur audio : la FSM pilote les deux compteurs, le transcodage prépare les 8 afficheurs, mod8 et mux8 les balaient à ~3 kHz.The audio player's 8-module architecture: the FSM drives the two counters, the decoding block prepares the 8 displays, mod8 and mux8 scan them at ~3 kHz.
  • Tout est synchrone : bascules, registres et compteurs sont sur la même horloge, et on cadence avec des signaux Clock Enable. La remise à zéro synchrone ne sert qu'à l'initialisation.
  • Un seul afficheur à la fois : mod8 (compteur modulo 8) choisit l'anode, mux8 sélectionne la donnée correspondante, et la persistance rétinienne fait le reste. Un segment s'allume avec un 0 (anode commune).
  • Entrées filtrées : detec_impulsion synchronise les 5 boutons avec des bascules avant de les donner à la FSM.
  • Méthode : découpe en fonctions élémentaires avec des interconnexions fixées, validation de chaque module par testbench VHDL, assemblage, simulation de l'ensemble, puis seulement la synthèse.
État de la FSMFSM stateCodage affichéDisplayed code
INIT / STOP[--]
PLAY-FWD---]
PLAY-BWD[---
PAUSE----
GrandeurQuantityValeurValueCe que ça impliqueWhat it implies
Horloge FPGAFPGA clock100 MHzPériode de 10 ns10 ns period
CE perception≈ 3 kHz≈ 33 000 cycles par pas ; 8 afficheurs, donc ≈ 375 Hz de rafraîchissement chacun≈ 33,000 cycles per step; 8 displays, so ≈ 375 Hz refresh each
CE affichage≈ 10 Hz10⁷ cycles ; le compteur avance toutes les 100 ms10⁷ cycles; the counter steps every 100 ms
CompteurCounter1 à 599599 pas de 100 ms, soit ≈ 60 s599 steps of 100 ms, i.e. ≈ 60 s
PWM100 MHz / 44,1 kHzp = 2267 cycles, soit un peu plus de 11 bits de dynamiquep = 2267 cycles, a bit over 11 bits of dynamic range
ROM44 100 × 11 bits≈ 485 kbit, soit 1 s d'audio échantillonné≈ 485 kbit, i.e. 1 s of sampled audio

Du numérique à l'audio

La carte relie le FPGA au jack par un filtre de Butterworth d'ordre 4, qui transforme un signal binaire en tension analogique. Une seule sortie binaire suffit donc à reconstruire un son, avec les bons timings : c'est le rôle d'un module PWM, qui code chaque échantillon par la largeur d'une impulsion.

CLKCEOUTd cyclesp − d cyclesp − d cyclesun échantillon tous les p cycles (p = 2267 à 100 MHz pour 44,1 kHz)one sample every p cycles (p = 2267 at 100 MHz for 44.1 kHz)
Le format PWM : pour un échantillon d, la sortie reste à 1 pendant d cycles puis à 0 pendant p − d cycles. La période vaut un échantillon audio.The PWM format: for a sample d, the output stays at 1 for d cycles then at 0 for p − d cycles. The period is one audio sample.
  • Dimensionnement : à 44,1 kHz d'échantillonnage et 100 MHz d'horloge, une période PWM dure p = ⌊100 MHz / 44,1 kHz⌋ = 2267 cycles. Cette valeur borne l'amplitude des échantillons, soit un peu plus de 11 bits, ce qui correspond aux 11 bits des données de la mémoire.
  • Le système : une base de temps à 44,1 kHz, un compteur d'adresses, une ROM (ROM_Sinus, 44 100 données) et le module PWM. Un sinus de 1 s remplit la mémoire.
  • De la ROM à la RAM : pour charger des sons depuis le PC, la ROM devient une RAM alimentée par une liaison série (récepteur UART, fusion 8 bits vers 16 bits, adresse d'écriture). Le compteur de lecture est alors borné par le nombre de données réellement reçues. Le récepteur UART et la fusion sont des blocs fournis.
Base de tempsCE à 44,1 kHzTime baseCE at 44.1 kHzCompteurd'adressesAddresscounterROM44 100 × 11 bitsModule PWMp = 2267PWM modulep = 2267Filtre de Butterworthordre 4 (carte)4th-order Butterworthfilter (board)sortie Jack monomono jack outputRx UARTFusion8 b → 16 bMerge8 b → 16 bRAMadresse de lectureread addressvariante : la ROM est remplacée par une RAM chargée depuis le PC par la liaison sérievariant: the ROM is replaced by a RAM loaded from the PC through the serial link
Génération du signal audio : un compteur parcourt la mémoire au rythme de 44,1 kHz, le PWM code chaque échantillon, le filtre de la carte reconstruit la tension.Audio signal generation: a counter walks through the memory at 44.1 kHz, the PWM encodes each sample, the board's filter rebuilds the voltage.

Assembler lecteur et audio

Il reste à brancher l'interface sur la sortie audio : la FSM doit pouvoir arrêter la lecture ou la faire repartir dans l'autre sens, et le volume doit agir sur le signal. Ça veut dire redessiner le schéma du système, adapter le lecteur audio aux signaux de commande de l'interface et ajouter un module qui relie les deux sous-systèmes.

Synthesis of the VHDL labs of the EN201 module: an audio player on a Nexys 4 board (Xilinx Artix-7 XC7A100T FPGA, 100 MHz clock), from the control interface up to the sound output. The interface mimics an MP3 player's (play, pause, direction, volume), but there is no MP3 decoding: the sound is a series of samples read straight from memory. Some blocks come from the semester 5 LOTO project.

The player interface

Five buttons drive a state machine, which controls two counters: an up/down counter from 1 to 599 (the playback position, one step every 100 ms) and another from 1 to 9 (the volume). The eight common-anode 7-segment displays show the counter on three of them, the volume followed by a dot on a fourth, and a code for the FSM state on the last four.

detec_impulsion5 boutonsdetec_impulsion5 buttonsfsm_MP3gestion_freqcpt_1_599cpt_1_9volumecpt_1_9volumeTranstranscodage 7 seg.Trans7-seg. decodingmux8mod8Play / Restart / FwdVolume UP / DWSept_SegmentsANCE 10 HzCE 3 kHz
Architecture à 8 modules du lecteur audio : la FSM pilote les deux compteurs, le transcodage prépare les 8 afficheurs, mod8 et mux8 les balaient à ~3 kHz.The audio player's 8-module architecture: the FSM drives the two counters, the decoding block prepares the 8 displays, mod8 and mux8 scan them at ~3 kHz.
  • Everything is synchronous: flip-flops, registers and counters share the same clock, and pacing is done with Clock Enable signals. The synchronous reset is only used for initialization.
  • One display at a time: mod8 (a modulo-8 counter) picks the anode, mux8 selects the matching data, and persistence of vision does the rest. A segment lights up with a 0 (common anode).
  • Filtered inputs: detec_impulsion synchronizes the 5 buttons with flip-flops before handing them to the FSM.
  • Method: split into elementary functions with fixed interconnections, validation of each module with a VHDL testbench, assembly, simulation of the whole, and only then synthesis.
État de la FSMFSM stateCodage affichéDisplayed code
INIT / STOP[--]
PLAY-FWD---]
PLAY-BWD[---
PAUSE----
GrandeurQuantityValeurValueCe que ça impliqueWhat it implies
Horloge FPGAFPGA clock100 MHzPériode de 10 ns10 ns period
CE perception≈ 3 kHz≈ 33 000 cycles par pas ; 8 afficheurs, donc ≈ 375 Hz de rafraîchissement chacun≈ 33,000 cycles per step; 8 displays, so ≈ 375 Hz refresh each
CE affichage≈ 10 Hz10⁷ cycles ; le compteur avance toutes les 100 ms10⁷ cycles; the counter steps every 100 ms
CompteurCounter1 à 599599 pas de 100 ms, soit ≈ 60 s599 steps of 100 ms, i.e. ≈ 60 s
PWM100 MHz / 44,1 kHzp = 2267 cycles, soit un peu plus de 11 bits de dynamiquep = 2267 cycles, a bit over 11 bits of dynamic range
ROM44 100 × 11 bits≈ 485 kbit, soit 1 s d'audio échantillonné≈ 485 kbit, i.e. 1 s of sampled audio

From digital to audio

The board connects the FPGA to the jack through a 4th-order Butterworth filter, which turns a binary signal into an analog voltage. A single binary output is therefore enough to rebuild a sound, with the right timings: that is the job of a PWM module, which encodes each sample by the width of a pulse.

CLKCEOUTd cyclesp − d cyclesp − d cyclesun échantillon tous les p cycles (p = 2267 à 100 MHz pour 44,1 kHz)one sample every p cycles (p = 2267 at 100 MHz for 44.1 kHz)
Le format PWM : pour un échantillon d, la sortie reste à 1 pendant d cycles puis à 0 pendant p − d cycles. La période vaut un échantillon audio.The PWM format: for a sample d, the output stays at 1 for d cycles then at 0 for p − d cycles. The period is one audio sample.
  • Sizing: at a 44.1 kHz sampling rate and a 100 MHz clock, a PWM period lasts p = ⌊100 MHz / 44.1 kHz⌋ = 2267 cycles. This value bounds the sample amplitude, a bit over 11 bits, which matches the 11 bits of the memory data.
  • The system: a 44.1 kHz time base, an address counter, a ROM (ROM_Sinus, 44,100 words) and the PWM module. A 1 s sine fills the memory.
  • From ROM to RAM: to load sounds from the PC, the ROM becomes a RAM fed by a serial link (UART receiver, 8-bit to 16-bit merge, write address). The read counter is then bounded by the number of data actually received. The UART receiver and the merge are provided blocks.
Base de tempsCE à 44,1 kHzTime baseCE at 44.1 kHzCompteurd'adressesAddresscounterROM44 100 × 11 bitsModule PWMp = 2267PWM modulep = 2267Filtre de Butterworthordre 4 (carte)4th-order Butterworthfilter (board)sortie Jack monomono jack outputRx UARTFusion8 b → 16 bMerge8 b → 16 bRAMadresse de lectureread addressvariante : la ROM est remplacée par une RAM chargée depuis le PC par la liaison sérievariant: the ROM is replaced by a RAM loaded from the PC through the serial link
Génération du signal audio : un compteur parcourt la mémoire au rythme de 44,1 kHz, le PWM code chaque échantillon, le filtre de la carte reconstruit la tension.Audio signal generation: a counter walks through the memory at 44.1 kHz, the PWM encodes each sample, the board's filter rebuilds the voltage.

Putting player and audio together

What's left is plugging the interface into the audio output: the FSM must be able to stop playback or send it the other way, and the volume must act on the signal. That means redrawing the system schematic, adapting the audio player to the interface's control signals, and adding a module that links the two subsystems.