Présentation du projet
Il y a deux semaines, nous avons réussi à exécuter le jeu Doom sur un CPU que nous avons conçu et construit nous-mêmes. Pour y arriver, nous avons dû concevoir un CPU personnalisé au niveau des portes logiques, le connecter à des périphériques, adapter le code source de Doom pour qu'il fonctionne sur notre machine, et le déployer sur un FPGA pour une exécution en temps réel.
Les défis techniques
Au départ, notre conception de CPU pipelinée ne pouvait exécuter que des programmes simples comme Pong et des ensembles de Mandelbrot. Pour passer à des programmes plus complexes comme Doom, nous devions surmonter deux problèmes majeurs : la mémoire et la vitesse. La version shareware de Doom nécessite 14 Mo de mémoire, ce qui dépasse la capacité de la BRAM de l'FPGA. De plus, notre CPU devait être plus rapide pour exécuter Doom en temps réel.
Intégration de la mémoire
Pour résoudre le problème de la mémoire, nous avons décidé d'utiliser une mémoire DDR3 externe. Cependant, cela a introduit de nouvelles complexités, car la mémoire DDR3 a une latence variable et des largeurs de bus plus grandes. Pour pallier ces problèmes, nous avons mis en œuvre un système de cache pour stocker les régions actives de la mémoire dans la BRAM, ce qui a permis d'accélérer l'accès à la mémoire.
Architecture du CPU
Notre CPU personnalisé utilise une architecture de pipeline à 5 étapes : Instruction Fetch, Decode, Register Read, Execute et Writeback. Le système de cache est divisé en deux caches indépendants : l'Instruction Cache (ICache) et le Data Cache (DCache). Chaque cache utilise 2048 lignes de cache avec 4 mots chacune. Lorsqu'une requête de mémoire est reçue, le cache isole l'adresse du mot, calcule l'index de cache et extrait la ligne de cache correspondante de la BRAM.
// Exemple de code pour la gestion des caches
// ICache et DCache utilisent le même code sous-jacent
// avec la logique d'écriture supprimée pour l'ICache
cache_index = word_address[10:0];
cache_line = bram[cache_index];
Grâce à cette architecture et à l'implémentation du système de cache, nous avons pu exécuter Doom sur notre CPU personnalisé, démontrant ainsi la faisabilité de notre conception et ouvrant la voie à de nouvelles possibilités pour les systèmes embarqués et les applications à faible consommation d'énergie.