- 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.
- 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,mux8sé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_impulsionsynchronise 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 state | Codage affichéDisplayed code |
|---|---|
| INIT / STOP | [--] |
| PLAY-FWD | ---] |
| PLAY-BWD | [--- |
| PAUSE | ---- |
| GrandeurQuantity | ValeurValue | Ce que ça impliqueWhat it implies |
|---|---|---|
| Horloge FPGAFPGA clock | 100 MHz | Pé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 Hz | 10⁷ cycles ; le compteur avance toutes les 100 ms10⁷ cycles; the counter steps every 100 ms |
| CompteurCounter | 1 à 599 | 599 pas de 100 ms, soit ≈ 60 s599 steps of 100 ms, i.e. ≈ 60 s |
| PWM | 100 MHz / 44,1 kHz | p = 2267 cycles, soit un peu plus de 11 bits de dynamiquep = 2267 cycles, a bit over 11 bits of dynamic range |
| ROM | 44 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.
- 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.
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.
- 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,mux8selects the matching data, and persistence of vision does the rest. A segment lights up with a 0 (common anode). - Filtered inputs:
detec_impulsionsynchronizes 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 state | Codage affichéDisplayed code |
|---|---|
| INIT / STOP | [--] |
| PLAY-FWD | ---] |
| PLAY-BWD | [--- |
| PAUSE | ---- |
| GrandeurQuantity | ValeurValue | Ce que ça impliqueWhat it implies |
|---|---|---|
| Horloge FPGAFPGA clock | 100 MHz | Pé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 Hz | 10⁷ cycles ; le compteur avance toutes les 100 ms10⁷ cycles; the counter steps every 100 ms |
| CompteurCounter | 1 à 599 | 599 pas de 100 ms, soit ≈ 60 s599 steps of 100 ms, i.e. ≈ 60 s |
| PWM | 100 MHz / 44,1 kHz | p = 2267 cycles, soit un peu plus de 11 bits de dynamiquep = 2267 cycles, a bit over 11 bits of dynamic range |
| ROM | 44 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.
- 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.
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.