Processeur RISC 32 bits maison • 8 Mo de SDRAM • Sortie HDMI XGA 1024×768 • Clavier filaire USB (CH9350) • Système de fichiers FAT32 • Micro-noyau Unix-like & Compilateur C natif. Pièce jointe au présent article : le pack de déploiement en 1 clic riscena-n32-deploy.zip (Flashage FPGA + Micro-SD vierge via USB).
1. Introduction : L’Esprit du Projet Riscena n32
À l’époque des micro-ordinateurs 8 et 16 bits des années 1980 et 1990 (Apple II, Commodore 64, Atari ST, Amiga), allumer une machine signifiait être immédiatement accueilli par un environnement interactif, transparent et totalement compréhensible. Aucun système d’exploitation opaque ne s’interposait entre le programmeur et le silicium.
Le projet Riscena n32 renoue avec cette philosophie fondatrice en la transposant dans le monde moderne des FPGA : concevoir from scratch (à partir d’une feuille blanche en langage Verilog) un ordinateur RISC 32 bits complet et autonome, hébergé sur une carte de développement ultra-accessible (~ 40 € en 2026) : la Sipeed Tang Nano 20K.
Le nom Riscena est l’acronyme de RISC EducatioNalArchitecture (Architecture Éducative RISC). Il résume l’ambition du projet : offrir une architecture matérielle et logicielle entièrement transparente, documentée et modifiable, idéale pour comprendre en profondeur comment fonctionnent un processeur, un bus mémoire, une interface vidéo et un système d’exploitation.
Les Objectifs Majeurs du Projet :
Démocratisation et Pédagogie : Démontrer qu’il est possible de concevoir et comprendre chaque transistor logique d’un SoC complet : cœur CPU, bus mémoire, contrôleur vidéo HDMI, contrôleur Micro-SD et périphériques d’E/S.
Autonomie et Confort Moderne : Équiper la machine d’une mémoire vive confortable (8 Mo de SDRAM), d’une résolution d’affichage nette en HDMI (VESA XGA 1024×768) et d’un système de fichiers standardisé (FAT32 arborescent).
Auto-Hébergement Intégral (Self-Hosting) : La machine ne doit pas être un simple récepteur passif. Grâce à son compilateur C natif et son assembleur intégrés, Riscena n32 peut modifier et recompiler son propre système d’exploitation directement sur le silicium, sans dépendre d’un PC hôte !
2. Le Matériel Hôte : La Carte Sipeed Tang Nano 20K en Détail
La Sipeed Tang Nano 20K est aujourd’hui l’une des plateformes de développement FPGA les plus séduisantes et économiques du marché (~ 40 €). Malgré ses dimensions lilliputiennes (55 × 23 mm, à peine la taille d’une clé USB), elle embarque une densité de fonctionnalités remarquable qui en fait le support idéal pour implémenter un micro-ordinateur autonome :
20 736 tables de correspondance (LUT4) et 15 552 bascules (Flip-Flops / DFF), offrant une capacité logique très confortable pour synthétiser un processeur 32 bits, ses contrôleurs de bus et ses pipelines vidéo.
46 blocs de mémoire Block RAM (BSRAM 18 Kbits) totalisant 828 Kbits (~103 Ko) de SRAM interne double-port ultra-rapide (utilisée ici pour le bootloader IPL et les tampons de ligne vidéo).
48 multiplicateurs matériels DSP 18×18 bits pour les calculs intensifs.
2 boucles à verrouillage de phase (PLL) et un oscillateur à quartz embarqué à 27 MHz, multiplié en interne pour générer l’horloge système et le pixel-clock HDMI haute fréquence (jusqu’à 324 MHz).
Mémoire Vive Intégrée SiP (System-in-Package) de 8 Mo (64 Mbits) :
L’atout majeur de cette puce GW2AR-18C est d’intégrer une mémoire SDRAM de 8 Mo dans le même boîtier plastique QFN88 que la matrice FPGA.
Elle est reliée en interne via un bus 32 bits ultra-rapide (cadencé jusqu’à 133 MHz). Cette intégration évite d’occuper les broches d’E/S externes de la carte et fournit à Riscena n32 tout l’espace nécessaire pour charger le noyau, les applications et les gros buffers.
Connectique Numérique et Périphériques Embarqués :
Sortie Vidéo HDMI Directe : Un port HDMI standard (type A femelle) connecté directement aux broches différentielles LVDS/TMDS du FPGA sans puce externe intermédiaire.
Double Pont USB-C Débogueur / Série (Bouffalo Lab BL702) : Un microcontrôleur RISC-V 32 bits BL702 sert d’interface USB-C multifonction. Il assure simultanément la programmation JTAG haute vitesse (compatible sans pilote complexe avec openFPGALoader et le programmeur officiel Gowin) et un port série virtuel CDC (UART 115 200 bauds) pour dialoguer avec la console.
Lecteur de Carte Micro-SD : Un slot push-pull câblé directement sur le FPGA, exploité par Riscena n32 pour héberger le système de fichiers FAT32.
Périphériques Audio & I/O Utilisateur : Un amplificateur audio avec sortie haut-parleur, 6 LEDs CMS multicolores programmables, 2 boutons-poussoirs utilisateur, un bouton Reset matériel et 40 broches d’extension GPIO au pas standard 2,54 mm.
Grâce à cette intégration poussée, la Tang Nano 20K n’exige aucun shield ni extension : branchée simplement à un câble USB-C pour l’alimentation/console et à un écran HDMI, elle devient une station de travail autonome.
3. Architecture et Implémentation du SoC Riscena n32
Le système repose sur une symbiose étroite entre logique synthétisée sur le FPGA et composants physiques de la Tang Nano 20K.
Largeur de traitement : Registres généraux 32 bits (R1 à R8, pointeur de pile SP, pointeur de cadre FP, registre de lien LR, et registre nul R0).
Jeu d’instructions orthogonal : Arithmétique et logique 32 bits (ADD, SUB, AND, OR, XOR, décalages logiques et arithmétiques SHL, SHR, SAR), accès mémoire alignés 8, 16 et 32 bits (LDB, LDH, LDW, STB, STH, STW), et sauts conditionnels relatifs (BEQ, BNE, BLT, BGE).
Gestion des interruptions : Vecteur d’interruption matérielle dédié pour l’interruption Ctrl+C (permettant d’interrompre proprement n’importe quel programme sans planter le système).
3.2 Mémoire Vive & Espace d’Adressage Linéaire
8 Mo de SDRAM SiP (System-in-Package) : Intégrée directement dans le boîtier du FPGA GW2AR-18C, elle offre un espace linéaire unifié :
0x00000000 – 0x0007FFFF : Micro-noyau résident et Shell Unix.
0x00080000 : Zone de communication et passage des arguments (APP_ARGS).
0x00100000 – 0x001FFFFF : 1 Mo dédié à l’exécution dynamique des applications.
0x00200000 – 0x007FFFFF : 6 Mo de mémoire libre pour les gros buffers, compilateurs et fichiers de données.
16 Ko de BSRAM interne (Bootloader IPL) : Mémoire SRAM interne ultra-rapide contenant le chargeur d’amorçage qui s’exécute à la mise sous tension.
3.3 Sortie Vidéo HDMI VESA XGA 1024×768 @ 60 Hz
Le contrôleur vidéo génère un signal HDMI numérique pur via les broches différentielles TMDS du FPGA :
Mode Terminal Texte ANSI : 128 colonnes × 48 lignes (6 144 caractères simultanés en police VGA 8×16), doté d’un décodeur matériel complet des séquences ANSI (16 couleurs de texte et de fond).
Mode Graphique Rétro 256 Couleurs : Résolution de 160×120 pixels en palette RGB332, avec mise à l’échelle matérielle 6×6 pour un rendu net et centré sur n’importe quel moniteur HDMI moderne.
3.4 Clavier Filaire Externe : Gestion USB Host via le Coprocesseur CH9350
Pour faire de Riscena n32 un véritable ordinateur de bureau indépendant (sans avoir besoin d’un PC connecté en série pour saisir les commandes), la machine intègre la gestion matérielle d’un clavier filaire USB standard grâce au coprocesseur dédié WCH CH9350 :
Pourquoi un coprocesseur externe ? : L’implémentation directe d’une pile USB Host sur FPGA (contrôleur PHY Full-Speed, énumération des périphériques, gestion des descripteurs HID) consomme généralement entre 2 000 et 4 000 LUTs. Utiliser la petite puce économique CH9350 permet de confier l’énumération USB matérielle à ce circuit dédié, préservant ainsi 100% de la puissance et de la mémoire du FPGA pour le CPU 32 bits et le générateur vidéo HDMI.
Câblage ultra-simple sur la Tang Nano 20K (Connecteur J6) :
VCC (5V) : Broche 1 du connecteur d’extension J6.
GND : Broche 2 (masse commune).
Signal Série (TXD) : Relié directement à la broche 76 du FPGA (flux série asynchrone à 115 200 bauds).
Synchronisation par silence inter-trames : Détecte les paquets HID du CH9350 (formats 0x88/0x83 et direct 0x01) en mesurant les silences de 1,5 ms pour isoler précisément chaque paquet sans dérive.
Prise en charge native de la disposition AZERTY française : Conversion matérielle directe des scancodes HID avec gestion complète de la touche Majuscule (chiffres 0-9 et majuscules), des caractères accentués (é, è, à, ç) et de la touche AltGr pour les symboles de programmation essentiels (~, #, {, [, |, \, @).
Fusion transparente des flux d’entrée : Les frappes issues du clavier physique USB externe et les caractères reçus via le port série USB-C du PC sont fusionnés au niveau matériel dans la même file d’attente d’entrée du processeur.
Diagnostic visuel matériel : La LED 4 de la Tang Nano 20K flashe à chaque impulsion reçue sur la broche 76, et la LED 5 flashe à chaque caractère ASCII valide injecté dans le système.
Grâce à la combinaison de ce clavier USB externe et de la sortie HDMI, Riscena n32 se comporte comme les ordinateurs mythiques des années 80 : branchez un clavier, un écran et une alimentation 5V, et vous disposez d’un poste de développement autonome complet !
4. Le Système d’Exploitation RiscenaOS
Inspiré de la philosophie Unix, RiscenaOS refuse les architectures monolithiques figées : le noyau est minimal et chaque commande est un binaire autonome exécutable.
A:\ (Carte Micro-SD FAT32)
├── README.TXT, BUILD.SH, INSTALL.SH, DEMO.C
├── OS/ <- Binaires système (.BIN) : LS, CAT, NANO, CC, AS, FORMAT, HELP...
├── INCLUDE/ <- Fichiers d'en-tête C standard : STDIO.H, FAT32.H, STRING.H...
├── GAMES/ <- Logithèque rétro (.BAS et .BIN) : SNAKE, PONG, BRICK, INVADERS...
└── SRC/ <- Codes sources C intégraux de tout le système d'exploitation
4.1 Utilisation et Catalogue des Commandes
Dès le démarrage, l’invite de commande moderne ~$ vous accueille.
Shell
Commande
Rôle & Fonctionnalités
ls [dossier]
Liste les fichiers et dossiers avec colonnes, tailles et clusters. Accepte un paramètre facultatif (ex: ls os, ls games, ls .., ls /).
cd <dossier>
Navigation arborescente (cd os, cd .., cd /).
cat <fichier>
Affiche le contenu d’un fichier texte (supporte les pipes et flux).
nano <fichier>
Éditeur de texte plein écran interactif (style GNU nano) avec touches fléchées, raccourcis Ctrl+O (sauvegarder) et Ctrl+X (quitter).
df
Diagnostic de l’espace disque FAT32 (taille totale, espace libre, pourcentage).
bench
Suite de benchmarks mesurant la vitesse de l’UAL, de la SDRAM 8 Mo et du bus Micro-SD.
basic [jeu.bas]
Interpréteur BASIC complet avec primitives graphiques et accès mémoire (PEEK/POKE).
colordemo
Démonstration graphique affichant la palette ANSI 16 couleurs et les métriques système.
time <cmd>
Mesure avec précision le temps d’exécution et le nombre de cycles d’horloge consommés.
Le shell prend également en charge les redirections (commande > fichier.txt) et les tubes / pipes (ls | cat ou df | more).
5. Une Machine 100% Modifiable : L’OS Modifiable sur la Carte SD !
C’est l’un des aspects les plus passionnants de Riscena n32 : les sources complètes du système d’exploitation sont directement présentes sur la carte Micro-SD, dans le dossier /SRC/ !
Vous n’êtes pas un simple utilisateur d’un firmware figé :
Vous pouvez ouvrir n’importe quel composant de l’OS avec l’éditeur plein écran intégré :nano /src/ls.c # ou nano /src/nano.c
Modifiez le code C selon vos envies (ajoutez une option, personnalisez les couleurs, créez vos propres commandes).
Recompilez nativement le programme directement sur le FPGA grâce au script build.sh :sh build.sh ls
En coulisses, le compilateur C natif /os/cc.bin compile votre code C en assembleur, puis l’assembleur natif /os/as.bin produit le nouveau fichier binaire exécutable .bin !
Riscena n32 est ainsi un système entièrement auto-suffisant et vivant.
6. Comment Déployer sur une Tang Nano 20K Neuve et une SD Vierge ?
Dans l’hypothèse où vous recevez une carte Sipeed Tang Nano 20K neuve sortie d’usine et une carte Micro-SD vierge, vous n’avez pas besoin d’installer la lourde suite Gowin EDA.
Nous mettons à votre disposition l’archive tout-en-un jointe à cet article : riscena-n32-deploy.zip (676 Ko).
Étape 1 : Télécharger et décompresser l’archive
Téléchargez le fichier riscena-n32-deploy.zip joint et décompressez-le sur votre ordinateur (Linux, macOS ou Windows).
Étape 2 : Installer les prérequis légers
Python 3
L’outil de programmation open-source openFPGALoader :
Lancez simplement le script d’installation inclus :
./install.sh # Sous Linux / macOS
# ou double-clic sur install.bat sous Windows
Étape 3 : Flasher en 1 clic (Zéro lecteur de carte SD nécessaire !)
Insérez votre carte Micro-SD vierge directement dans le port de la Tang Nano 20K.
Reliez la Tang Nano 20K à votre ordinateur avec un câble USB-C.
Lancez la commande :
python3 deploy.py --all
Ce qui se passe alors automatiquement :
deploy.py grave le bitstream précompilé (riscenan32_soc.fs) dans la Flash SPI permanente du FPGA.
Le SoC démarre son Bootloader IPL.
deploy.py formate la carte Micro-SD et transfère la structure FAT32 (le noyau, /OS, /INCLUDE, /GAMES, /SRC) directement à travers le câble USB de la Tang Nano 20K !
La console interactive RiscenaOS s’ouvre automatiquement dans votre terminal à 115 200 bauds.
7. Logithèque Rétro-Gaming Intégrée
Pour se détendre ou explorer la programmation de jeux vidéo en mode graphique, le dossier /GAMES/ contient une série de classiques prêts à l’emploi :
SNAKE : Le serpent rétro classique avec gestion dynamique du score.
PONG : Pong haute vélocité en résolution 320×240 contre une IA.
BRICK : Casse-briques / Breakout complet (32 briques destructibles).
INVADERS : Space Invaders avec vagues d’extraterrestres et boucliers.
LUNAR : Simulateur physique d’atterrisseur lunaire avec gravité et jauge de carburant.
RACER : Jeu de course sur autoroute avec défilement fluide.
Ces jeux existent en deux versions : en code source BASIC (.bas), facilement modifiables, et en binaires compilés ultra-rapides (.bin).
8. Perspectives et Évolutions Futures
Le SoC Riscena n32 dispose d’une solide marge de progression sur le FPGA Gowin GW2AR-18C :
Caches L1 d’Instructions et de Données (I-Cache / D-Cache 4 Ko) : Intégration de caches directs en mémoire Block RAM interne afin d’éliminer les temps d’attente de la SDRAM et de diviser par deux le nombre de cycles moyen par instruction (CPI).
Pipelining RISC 5 Étages (IF / ID / EX / MEM / WB) : Transition vers un pipeline matériel complet avec unités de contournement (forwarding) pour atteindre 1 instruction par cycle à 27 MHz.
Synthèse Sonore Matérielle I2S : Raccordement d’un DAC audio (ex: MAX98357A) pour doter la machine d’un générateur sonore programmable (PSG) 3 voix pour la musique chiptune et les bruitages.
Connectivité Réseau Wi-Fi : Raccordement d’un co-processeur ESP32/ESP8266 sur le second port UART du SoC pour offrir des commandes réseau natives (ping, wget, synchronisation horaire ntp).
Multitâche Préemptif & Protection Mémoire (MPU) : Séparation des privilèges noyau/utilisateur et ordonnancement temps réel préemptif.
9. Conclusion et Téléchargement
Riscena n32 prouve qu’avec une carte FPGA à 40 euros et de la passion, il est possible de bâtir un système informatique complet, élégant, rapide et entièrement transparent de bout en bout.
Que vous souhaitiez apprendre le Verilog, explorer l’architecture des processeurs RISC, coder en C sur un système nu ou simplement vous amuser à concevoir des jeux rétro, Riscena n32 est le bac à sable idéal.
📦 Fichier joint à l’article : Téléchargez riscena-n32-deploy.zip et démarrez votre propre station de travail 32 bits dès aujourd’hui !
De la Feuille Blanche au Silicium : Toute la Chaîne de Développement de Riscena n32 (FPGA, Verilog, C et Python)
Guide pédagogique complet • Hardware/Software Co-Design • Simulation Icarus & GTKWave • Synthèse Gowin EDA • Chaîne de compilation C & Assembleur maison • Pack Banc de Développement portable joint. Pièce jointe au présent article : le banc de développement autonome prêt à l’emploi riscena-n32-devbench.zip (Sources complètes RTL, suite d’outils Python, compilateur C, simulateurs et scripts).
1. Introduction : Qu’est-ce que le Hardware/Software Co-Design ?
Lorsque nous allumons un ordinateur moderne (PC, Mac, smartphone), nous interagissons avec une pyramide de couches logicielles massives : système d’exploitation, pilotes de périphériques, microcode processeur, firmware UEFI… Dans ce modèle classique, le matériel est immuable et le logiciel s’adapte au silicium.
Avec un FPGA (Field Programmable Gate Array), les règles s’inversent : nous ne programmons pas une puce existante, nous concevons le processeur lui-même, fil par fil, registre par registre, et nous écrivons en même temps les outils logiciels pour le piloter. C’est ce qu’on appelle le Hardware/Software Co-Design (conception conjointe matériel-logiciel).
Le projet Riscena n32 est né d’un défi : concevoir un micro-ordinateur 32 bits complet sur une petite carte FPGA économique (Sipeed Tang Nano 20K d’environ 40 €), sans utiliser aucun processeur pré-fait (comme ARM, RISC-V prépackagé ou PicoRV32), et en écrivant l’intégralité des outils :
Le cœur CPU 32 bits et ses périphériques en Verilog.
Les outils de simulation, de compilation croisée, de formatage de disque et de flashage en Python.
Le système d’exploitation, l’éditeur de texte, les jeux et les compilateurs natifs en C.
Cet article vous ouvre le capot du projet pour vous expliquer pas à pas chaque maillon de cette chaîne d’ingénierie, comment les outils interagissent, et comment vous pouvez reproduire ce banc de développement chez vous sur n’importe quel ordinateur grâce au fichier zip joint.
2. Vue d’Ensemble : Comment les Pièces du Puzzle s’Emboîtent
3. La Chaîne Matérielle : Du Code Verilog au Silicium
3.1 Écrire le Matériel : Le Langage Verilog HDL
Contrairement au C ou au Python où le processeur exécute séquentiellement des instructions une à une, le Verilog décrit des circuits électroniques qui fonctionnent tous en parallèle au rythme des fronts d’horloge.
Dans Riscena n32, le matériel est découpé en modules spécialisés et modulaires :
riscenan32_cpu.v : Le processeur 32 bits. Il contient le compteur de programme (PC), le décodeur d’instructions, le banc de 16 registres généraux 32 bits et la machine d’état principale (Fetch, Decode, Execute, Memory, Write-Back).
alu32.v : L’Unité Arithmétique et Logique 32 bits. Elle réalise les additions, soustractions, opérations logiques (AND, OR, XOR) et tire parti des blocs DSP matériels du FPGA pour exécuter une multiplication entière 32 bits (MUL) en un seul cycle d’horloge.
sdram_controller32.v : Le pont vers la mémoire vive de 8 Mo intégrée en SiP (System-in-Package). Il génère automatiquement les séquences d’initialisation JEDEC, les cycles de rafraîchissement périodiques (Auto-Refresh) et traduit les requêtes de lecture/écriture 32 bits du CPU en commandes SDRAM synchrones (Precharge, Row Activate, Column Read/Write).
hdmi_text_terminal.v : Le processeur vidéo. Il génère les synchronisations VESA XGA 1024×768 @ 60 Hz, lit la mémoire d’écran interne, décode les séquences ANSI pour les couleurs, et encode les signaux numériques en flux série TMDS différentiels conformes à la norme DVI/HDMI.
ch9350_keyboard.v : Le décodeur série pour le coprocesseur hôte USB physique CH9350, transformant les trames de touches USB en caractères ASCII avec prise en charge du clavier français AZERTY.
3.2 Vérifier Avant de Construire : La Simulation avec Icarus Verilog et GTKWave
Une règle d’or en ingénierie FPGA : on ne teste JAMAIS directement sur le silicium sans avoir simulé au préalable. Si un signal d’écriture mémoire reste bloqué ou si la machine d’état saute une étape, le FPGA restera muet et il est impossible de brancher un oscilloscope sur chaque bascule interne.
C’est ici qu’interviennent deux outils open-source indispensables :
Icarus Verilog (iverilog) : Un compilateur et simulateur Verilog rapide. Il prend nos fichiers Verilog matériels et les connecte à un testbench (par exemple tb_cpu32.v ou tb_soc_sdram32.v). Le testbench simule l’horloge à 27 MHz, applique un signal de reset, injecte un programme binaire de test en mémoire, et affiche sur la console ce que le processeur envoie sur son port UART série virtuel !
GTKWave : Un visualiseur graphique de chronogrammes. Pendant la simulation, Icarus Verilog génère un fichier d’enregistrement temporel .vcd (Value Change Dump). En l’ouvrant dans GTKWave, vous pouvez inspecter l’évolution de chaque bit, vérifier la latence exacte d’un cycle de bus SDRAM ou détecter une course critique (race condition).
# Exemple de commande de simulation d'un SoC complet en 1 ligne :
iverilog -o sim_soc tb_soc_sdram32.v ../rtl/cpu/*.v ../rtl/mem/*.v
vvp sim_soc # Exécute la simulation
gtkwave trace.vcd # Ouvre la vue chronogramme interactive
3.3 Synthèse et Placement/Routage : Gowin EDA (gw_sh)
Une fois le Verilog validé en simulation, il faut le transformer en un fichier de configuration binaire que le FPGA peut charger : le bitstream (fichier .fs chez Gowin).
La suite Gowin EDA accomplit cette transformation en plusieurs étapes :
La Synthèse : Elle analyse le code Verilog pour le traduire en portes logiques réelles disponibles sur le composant Gowin GW2AR-18C (LUT4, registres DFF, mémoires Block RAM, blocs DSP).
Le Placement et Routage (P&R) : Elle choisit physiquement l’emplacement exact de chaque cellule logique sur la puce de silicium et trace les interconnexions métalliques entre elles tout en respectant les contraintes temporelles strictes imposées par le fichier tangnano20k.sdc (par exemple : le pixel clock HDMI doit tourner à 65 MHz sans violation de temps d’établissement setup/hold).
Le fichier de contraintes physiques (tangnano20k.cst) : Ce fichier fait la correspondance entre les noms de signaux dans le code Verilog (clk, uart_tx, tmds_clk_p, tmds_d0_p, sd_clk, etc.) et les numéros de broches physiques réelles du boîtier de la carte Tang Nano 20K.
Pour automatiser entièrement cette étape sans avoir à ouvrir une interface graphique lourde, nous utilisons l’outil en ligne de commande de Gowin : gw_sh (Gowin Shell), orchestré par notre script build_and_flash.sh :
echo "open_project riscenan32_soc.gprj; run all; exit" | gw_sh
3.4 Le Flashage Matériel : openFPGALoader
Pour programmer la Tang Nano 20K, nous n’utilisons aucun programmateur propriétaire coûteux. La carte intègre une puce USB Bouffalo Lab BL702 qui émule un adaptateur JTAG.
L’utilitaire libre et ultra-rapide openFPGALoader permet de graver le bitstream en une commande :
L’option -b tangnano20k identifie automatiquement la carte et ses paramètres d’interface.
L’option -f indique d’écrire dans la mémoire Flash SPI permanente soudée sur la carte (et pas seulement dans la SRAM volatile du FPGA) : au prochain redémarrage ou à la mise sous tension, le micro-ordinateur démarre instantanément en moins de 50 millisecondes !
L’option -r applique un reset matériel pour lancer immédiatement le SoC après gravure.
4. La Chaîne Logicielle : C, Assembleur et Système d’Exploitation
Avoir un processeur opérationnel sur un FPGA est une formidable prouesse, mais sans logiciel pour l’animer, ce n’est qu’un bloc de silicium inerte. Nous avons donc conçu une chaîne logicielle complète adaptée à l’architecture Riscena n32.
4.1 L’Assembleur 32 bits (riscenan32-as.py et natif as.c)
L’assembleur est le traducteur direct entre le langage humain (ADD R1, R2, R3, LDW R4, [R14+8], BEQ fin) et les mots de 32 bits exécutés par l’UAL.
Notre assembleur fonctionne selon le modèle classique en deux passes :
Passe 1 (Analyse et Table des Symboles) : L’assembleur lit l’intégralité du fichier source. Pour chaque étiquette de fonction ou de boucle (main:, .boucle:, str_hello:), il calcule son adresse mémoire exacte en octets.
Passe 2 (Génération du Code Machine) : L’assembleur encode chaque instruction dans son format binaire 32 bits orthogonal :
6 bits d’opcode (ADD, SUB, JAL, BEQ…).
4 bits pour le registre destination (Rd).
4 bits pour le registre source 1 (Rs1).
4 bits pour le registre source 2 ou modificateur (Rs2).
14 bits pour les valeurs immédiates signées ou les décalages de saut relatif.
Sorties générées :
Un fichier binaire plat .bin : prêt à être chargé en mémoire SDRAM et exécuté.
Un fichier listing .lst : un document précieux montrant côte à côte l’adresse mémoire, l’instruction en hexadécimal et la ligne assembleur correspondante, idéal pour le débogage.
4.2 Le Compilateur C (mini-c32.py et natif cc.c)
Programmer un système d’exploitation et une suite de jeux en pur assembleur est long et fastidieux. C’est pourquoi Riscena n32 dispose d’un compilateur C dédié respectant le modèle de données ILP32 (les entiers int, les mots word et les pointeurs void* font exactement 32 bits = 4 octets).
L’architecture interne du compilateur est un modèle de clarté pédagogique :
L’Analyseur Lexical (Lexer) : Il découpe le flux de caractères du fichier source .c en jetons typés (tokens) : mots-clés (if, while, for, return, int, char), identifiants de variables, constantes numériques et opérateurs.
L’Analyseur Syntaxique (Parser) : Il utilise la méthode de la descente récursive pour valider la grammaire du langage et construire l’arbre d’exécution des expressions arithmétiques en respectant scrupuleusement les priorités mathématiques des opérateurs (* et / avant + et -).
Le Générateur de Code (Code Generator) :
Il alloue dynamiquement les registres et gère la pile d’exécution via le pointeur de pile SP (R14).
Il respecte l’ABI Riscena n32 : les trois premiers arguments d’une fonction et la valeur de retour transitent par les registres rapides R1, R2, R3, et le registre de lien LR (R15) mémorise l’adresse de retour.
Il supporte la récursivité complète, les variables locales, les tableaux et la manipulation directe de pointeurs mémoire.
4.3 Le Système d’Exploitation RiscenaOS et sa Libc Minimale
Pas de dépendance lourde : la bibliothèque C standard fournie (stdio.h, fat32.h, string.h) est conçue pour s’interfacer directement avec les registres d’entrées/sorties mappés en mémoire (MMIO) du SoC :
L’adresse 0x10000000 correspond au registre de données de l’UART (l’écriture d’un octet l’envoie sur le terminal, la lecture dépile un caractère du clavier).
L’adresse 0x10000030 bascule instantanément l’affichage HDMI entre le terminal texte ANSI 128×48 et le mode graphique 160×120 en 256 couleurs.
Le pilote FAT32 autonome permet de lire, créer et modifier des fichiers et des sous-dossiers sur n’importe quelle carte Micro-SD standard.
5. L’Outillage Hôte en Python : Le Couteau Suisse de l’Ingénieur
Le langage Python 3 joue un rôle central dans le projet Riscena n32 : il constitue le pont agile entre l’ordinateur de développement et le silicium de la carte.
5.1 L’Émulateur Logiciel CPU (riscenan32-emu.py)
Avant même d’avoir synthétisé le SoC en Verilog, comment être certain que le compilateur C génère du code valide ? En utilisant l’émulateur logiciel Python ! Il reproduit fidèlement le fonctionnement du CPU Riscena n32, son banc de registres, ses 8 Mo de SDRAM et ses registres MMIO. Il permet d’exécuter pas à pas les binaires générés, d’afficher l’état des registres à chaque instruction et de tester les algorithmes en une fraction de seconde sur votre PC.
5.2 Le Générateur d’Images Disque FAT32 (mksd.py)
Créer une carte Micro-SD avec un système de fichiers FAT32 valide contenant des dizaines de répertoires (/OS, /INCLUDE, /GAMES, /SRC) nécessite habituellement sous Linux des privilèges administrateur (sudo losetup, mkfs.vfat, sudo mount…).
Pour rendre le banc de développement 100% portable (fonctionnant sous Windows, macOS et Linux sans aucun droit root), nous avons écrit mksd.py :
Il construit une image disque brute de 15 Mo en binaire pur.
Il calcule mathématiquement la géométrie du disque, la table de partition MBR, le secteur de boot FAT32 (BPB), les deux tables d’allocation FAT et le répertoire racine.
Il copie les fichiers octet par octet dans les clusters correspondants.
Bonus exclusif : il intègre un protocole série permettant d’injecter cette image disque directement sur la carte SD de la Tang Nano 20K via le câble USB, sans jamais avoir besoin d’un lecteur de carte SD physique !
5.3 La Console Série et Moniteur de Débogage (console.py)
Un script Python interactif moderne qui :
Détecte automatiquement le port USB de la Tang Nano 20K (/dev/ttyUSB1 sous Linux ou COMx sous Windows).
Ouvre la liaison série à 115 200 bauds.
Gère les séquences d’échappement ANSI en temps réel (couleurs, déplacement du curseur, effacement d’écran).
Supporte le raccourci matériel Ctrl+C et offre des commandes intégrées pour téléverser et télécharger des fichiers directement entre le PC et RiscenaOS.
6. Le Nouveau Pack Téléchargeable : riscena-n32-devbench.zip
Pour permettre à toute personne curieuse de s’approprier cette chaîne sans perdre des heures à rassembler les composants, nous avons réuni l’intégralité du banc de développement dans l’archive riscena-n32-devbench.zip (jointe à cet article).
6.1 Contenu de l’Archive :
riscena-n32-devbench/
├── README.md <- Guide pas-à-pas de configuration et tutoriels
├── requirements.txt <- Dépendances Python légères (pyserial)
├── setup_bench.sh / .bat <- Script de diagnostic automatique de votre environnement
├── run_sim.sh / .bat <- Lanceur automatique de simulation Verilog (Icarus + GTKWave)
├── build_soc.sh <- Script de synthèse Gowin EDA et génération du bitstream
│
├── rtl/ <- SOURCES VERILOG COMPLÈTES DU SOС
│ ├── cpu/ <- Cœur RISC 32 bits, UAL DSP, registres
│ ├── mem/ <- Contrôleur SDRAM 8 Mo SiP et mémoire IPL
│ ├── periph/ <- UART 115200, SD Card SPI, Clavier USB CH9350
│ ├── video/ <- Contrôleur HDMI XGA 1024x768 & générateur TMDS
│ └── top/ <- soc_tangnano20k_n32.v (Top-level physique)
│
├── sim/ <- BANCS DE SIMULATION CYCLE-FIDÈLES
│ ├── tb_cpu32.v <- Testbench processeur avec console UART simulée
│ ├── tb_sdram_ctrl32.v <- Testbench contrôleur SDRAM avec modèle de mémoire
│ └── tb_soc_sdram32.v <- Testbench système complet
│
├── fpga/ <- PROJET GOWIN EDA OFFICIEL
│ ├── riscenan32_soc.gprj <- Fichier projet Gowin
│ ├── tangnano20k.cst <- Brochage matériel physique de la Tang Nano 20K
│ ├── tangnano20k.sdc <- Contraintes d'horloge et de timing
│ └── bin/riscenan32_soc.fs <- Bitstream précompilé prêt à être flashé immédiatement !
│
├── tools/ <- OUTILLAGE PYTHON COMPLET
│ ├── mini-c32.py <- Compilateur C vers assembleur n32
│ ├── riscenan32-as.py <- Assembleur n32 deux passes
│ ├── riscenan32-emu.py <- Émulateur cycle-par-cycle du processeur n32
│ ├── mksd.py <- Formateur et flasheur de système de fichiers FAT32
│ └── console.py <- Terminal série interactif avec support ANSI
│
├── firmware/ & apps/ <- SOURCES C DE TOUT LE SYSTÈME D'EXPLOITATION
│ ├── os/shell.c <- Le Shell Unix interactif
│ ├── apps/ (ls, nano, cc...)<- Tous les utilitaires système et jeux rétro
│ └── include/ & lib/ <- Les bibliothèques standards d'en-tête (stdio, fat32...)
│
└── doc/ <- DOCUMENTATIONS TECHNIQUES INTÉGRALES
├── isa_spec_n32.md <- Manuel formel du jeu d'instructions (ISA 32b)
└── guide_basic_graphique.md <- Manuel de programmation graphique rétro
7. Tutoriel Guidé : Vos Premiers Pas avec le Banc de Développement
Voici comment démarrer concrètement sur votre machine (Linux, macOS ou Windows) en moins de 10 minutes :
Étape 1 : Installer les Outils Libres Prérequis
Sur votre machine hôte, installez les composants essentiels :
Python 3 (disponible nativement ou via python.org).
Icarus Verilog et GTKWave (pour simuler le Verilog) :
./setup_bench.sh # Sous Linux/macOS
# ou double-cliquez sur setup_bench.bat sous Windows
Il vérifie la présence de tous vos outils et installe la bibliothèque pyserial.
Étape 2 : Votre Premier TP Matériel — Simuler le Cœur CPU
Pour voir le processeur s’exécuter sous vos yeux dans le simulateur :
./run_sim.sh cpu
Le script compile le testbench Verilog sim/tb_cpu32.v, charge un binaire de test en mémoire virtuelle et exécute les cycles d’horloge. Vous verrez immédiatement les caractères émis par le cœur CPU s’afficher dans votre console texte, et le fichier chronogramme tb_cpu32.vcd est généré pour être inspecté dans GTKWave !
Étape 3 : Votre Premier TP Logiciel — Compiler un Programme C
Créez un petit fichier bonjour.c :
#include <stdio.h>
void main() {
printf("Bonjour le monde depuis Riscena n32 !\n");
}
Compilez-le et assemblez-le en une ligne avec les outils du banc :
Formatez et injectez l’OS sur la carte Micro-SD via l’USB :
python3 tools/mksd.py --flash /dev/ttyUSB1
Ouvrez la console :
python3 tools/console.py /dev/ttyUSB1
Vous êtes désormais aux commandes de votre propre micro-ordinateur 32 bits !
8. Conclusion et Perspectives Pédagogiques
Concevoir un système informatique de bout en bout — du transistor logique en Verilog jusqu’au compilateur C de haut niveau — est sans doute l’une des expériences les plus formatrices et gratifiantes pour un informaticien ou un électronicien.
Elle dissipe la sensation de « boîte noire » qui entoure souvent l’informatique moderne et redonne au développeur le pouvoir absolu sur sa machine.
Téléchargez le banc de développement ci-dessous, explorez les sources Verilog, personnalisez les commandes C, et amusez-vous à repousser les limites de votre carte Tang Nano 20K !
📦 Téléchargement du banc complet : riscena-n32-devbench.zip (Banc de développement tout-en-un avec sources Verilog, outils Python, compilateur C, simulateurs et documentations).
Genèse et Philosophie de GrimOS Introduction Dans un monde technologique où la course à la puissance semble sans fin, l’industrie informatique nous pousse inexorablement vers le renouvellement constant de nos équipements. Chaque nouvelle version d’un Lire la suite
Monitor Dashboard Cette documentation décrit de manière exhaustive l’architecture, le fonctionnement et les procédures de maintenance du projet PiAware Monitor. Pour utiliser ce projet, il faut disposer d’un raspberry équipé du système Piaware de FlightAware. Lire la suite
Introduction Ce projet est un serveur centralisé d’intelligence artificielle conçu pour être exécuté sur un réseau local (LAN). Il permet aux autres machines du réseau d’envoyer des requêtes vers des modèles d’IA (LLM, Génération d’images, Lire la suite