- QuoiWhat
- Un tirage de Loto (6 nombres différents entre 1 et 49) sur FPGA Artix-7, affiché sur les 7 segments.A lottery draw (6 different numbers between 1 and 49) on an Artix-7 FPGA, shown on the 7-segment displays.
- PourquoiWhy
- Concevoir une architecture numérique synchrone complète : FSM, Clock Enable, multiplexage.To design a complete synchronous digital architecture: FSM, Clock Enables, multiplexing.
- CommentHow
- VHDL sous Vivado, blocs validés un par un en simulation, puis prototypage sur Nexys A7. En binôme avec Lucas Traoré.VHDL in Vivado, blocks validated one by one in simulation, then prototyping on the Nexys A7. With Lucas Traoré.
- RésultatsResults
- 148 LUT, 135 bascules, f_max ≈ 200 MHz (2× de marge sur 100 MHz), validé sur la carte.148 LUTs, 135 flip-flops, f_max ≈ 200 MHz (2× margin on 100 MHz), validated on the board.
Projet du module NUME2, avec Lucas Traoré : un tirage de Loto en VHDL sur la carte Nexys A7 (Artix-7 XC7A100T). Six nombres différents entre 1 et 49, mémorisés et affichés sur les 7 segments au format « N - VV » (rang, tiret, valeur).
Comment ça marche
Un compteur 1 à 49 tourne tant qu'on garde le bouton appuyé. Au relâchement il s'arrête, et c'est la durée d'appui, impossible à prédire, qui fait l'aléa. Si le nombre est nouveau il est mémorisé et la LED verte s'allume, sinon la LED rouge dit de recommencer. Après six tirages, les deux LEDs clignotent (et on a ajouté un chenillard, parce que pourquoi pas).
Architecture
Tout est synchrone sur l'horloge 100 MHz, avec des signaux Clock Enable pour les fréquences plus basses. Huit modules, dont tirage qui est lui-même hiérarchique :
- gestion_horloge : trois CE (25 MHz pour le traitement, 3 kHz pour l'affichage, 1 Hz pour le défilement) et un signal
tempo. - basculeFF : synchronise le bouton à 3 kHz, ce qui filtre les rebonds.
- tirage :
counter49,counter6, un comparateur anti-doublon, six registres de 6 bits et la FSM. - FSM à 7 états : init, attente d'appui, comptage, analyse, sauvegarde, erreur (≈ 1 s) et fin de tirage.
- Affichage :
modulo4+mux4balaient les 4 digits (chaque digit est rafraîchi ~750 fois par seconde),modulo6+mux6font défiler les six valeurs,transcodeursort dizaines et unités.
Ce qui nous a fait perdre du temps
- L'assemblage : une dizaine de fichiers écrits chacun de notre côté, donc des noms de ports pas cohérents (
ce_processingvsc_e,horlogevsclk…). Vivado a sorti des erreurs de port map à la première compilation, qu'on a démêlées une par une. On aurait dû s'accorder sur les noms dès le début. - Le testbench : les appuis faisaient quelques centaines de ns, et à cette échelle les CE d'affichage et de défilement ne battent même pas une fois, donc la moitié du circuit dort. Passage en µs.
Résultats
Validé en simulation (testbenches de la FSM, du tirage et du top) puis sur la carte : un appui long donne un nombre sur les deux digits de droite, un doublon volontaire allume le rouge, et au sixième tirage les valeurs défilent à 1 Hz avec les LEDs qui clignotent. Synthèse Vivado 2023.2 :
- 148 LUT (0,23 %), 135 bascules (0,11 %), 36 E/S
- ~0,1 W, dont 97 % de statique du composant
- fmax ≈ 200 MHz, donc 2× de marge sur le 100 MHz
Le FPGA est très largement surdimensionné pour ça.
NUME2 module project, with Lucas Traoré: a lottery draw in VHDL on the Nexys A7 board (Artix-7 XC7A100T). Six different numbers between 1 and 49, stored and shown on the 7-segment displays as "N - VV" (rank, dash, value).
How it works
A 1 to 49 counter runs as long as the button is held. On release it stops, and the press duration, which nobody can predict, is the randomness. If the number is new it is stored and the green LED lights up, otherwise the red LED says to try again. After six draws both LEDs blink (and we added a LED chaser, because why not).
Architecture
Everything is synchronous on the 100 MHz clock, with Clock Enable signals for slower rates. Eight modules, including tirage which is hierarchical itself:
- gestion_horloge: three CEs (25 MHz for processing, 3 kHz for display, 1 Hz for scrolling) and a
temposignal. - basculeFF: synchronizes the button at 3 kHz, which filters the bounce.
- tirage:
counter49,counter6, an anti-duplicate comparator, six 6-bit registers and the FSM. - 7-state FSM: init, wait for press, counting, analysis, save, error (≈ 1 s) and end of game.
- Display:
modulo4+mux4scan the 4 digits (each refreshed ~750 times a second),modulo6+mux6scroll the six values,transcodeuroutputs tens and units.
What cost us time
- Assembly: about ten files written separately, so inconsistent port names (
ce_processingvsc_e,horlogevsclk…). Vivado threw port map errors on the first compile, which we sorted out one by one. We should have agreed on names from the start. - The testbench: our presses lasted a few hundred ns, and at that scale the display and scroll CEs don't even tick once, so half the circuit sleeps. We moved to µs.
Results
Validated in simulation (FSM, draw module and top-level testbenches) then on the board: a long press shows a number on the two right digits, a deliberate duplicate lights the red LED, and at the sixth draw the values scroll at 1 Hz with the LEDs blinking. Vivado 2023.2 synthesis:
- 148 LUTs (0.23 %), 135 flip-flops (0.11 %), 36 I/Os
- ~0.1 W, 97 % of it static power from the device
- fmax ≈ 200 MHz, so a 2× margin on the 100 MHz clock
The FPGA is hugely oversized for this.