Contexte
Mini-projet de Systèmes Numériques Embarqués en Master 1 MESI (Faculté de Physique & Ingénierie, Université de Strasbourg, encadré par M. F. Dadouche). L'objectif était de pratiquer le co-design, concevoir ensemble la partie matérielle et la partie logicielle d'un système sur puce programmable (SoPC) sur FPGA. La cible était une carte DE10-Lite (FPGA Intel MAX 10) à transformer en réveil électronique complet.
Approche / Solution
Côté matériel (Quartus Prime et Platform Designer/Qsys), j'ai assemblé un système sur puce autour d'un processeur Nios II cadencé à 50 MHz, avec mémoire On-Chip, PIOs et deux timers. Chaque périphérique de la DE10-Lite est relié au processeur par un PIO dimensionné au bit près (6 afficheurs 7 segments, 10 interrupteurs, 2 boutons, LEDs, haut-parleur). Une subtilité de co-design, un inverseur placé dans le schéma BDF rend les boutons actifs à l'état haut, donc les PIO sont configurés en détection de front montant avec interruption. Côté logiciel (C, Nios II SBT), une boucle principale lit les entrées et rafraîchit l'affichage, pendant que deux routines d'interruption gèrent le temps réel. Le SYS_CLK_TIMER (1 ms) sert de base de temps, le TONE_TIMER génère le signal carré du son en basculant une sortie. Pour le partage de variables entre ISR et boucle, j'ai sécurisé les accès par sections critiques (désactivation temporaire des interruptions). Au-delà du cahier des charges, j'ai ajouté une bascule 12h/24h, 8 mélodies sélectionnables par interrupteurs (au lieu d'un simple bip 500 Hz), deux modes de réglage (par appuis ou en continu, pas de 0,5 s), un verrouillage de l'affichage, et l'initialisation automatique à l'heure de compilation via la macro __TIME__.
Résultats
Un réveil entièrement fonctionnel sur FPGA, avec toutes les fonctions du cahier des charges et plusieurs améliorations, validé fonctionnalité par fonctionnalité sur la carte. Deux apprentissages m'ont marqué. • Les contraintes réelles de l'embarqué. Pour initialiser l'horloge, j'ai d'abord voulu utiliser sscanf, impossible ici, car le BSP est configuré en Small C Library (-msmallc) pour réduire la taille du binaire, et sscanf (stdio.h) en est exclu. J'ai donc écrit un décodage ASCII manuel de __TIME__ (quelques soustractions et multiplications), plus léger, plus rapide, sans dépendance. En embarqué, chaque octet compte. • La méthode. J'ai d'abord codé l'alarme d'un bloc en m'appuyant trop sur des exemples et de l'IA, ce qui a produit beaucoup de bugs difficiles à isoler. Sur les conseils de mon encadrant, je suis passé à un développement incrémental, concevoir la logique sur papier, puis coder et tester chaque sous-fonction isolément avant intégration. C'est l'enseignement le plus important du projet. Pistes d'évolution, un RTC externe (tenue de l'heure sur coupure), une fonction Snooze, un écran LCD/OLED, un DAC pour un son plus riche, et un portage full hardware en VHDL pour comparer avec l'approche SoPC.