1. Introduction
Le projet est né, fin 2007, d'une passion multiple pour la musique, l'électronique numérique et le développement logiciel.
Ayant participé en tant que « VJ » (Video Jockey) à plusieurs événements, je me suis intéressé à rendre plus interactives mes performances : possibilité de dessiner sur l'écran de projection par l'intermédiaire d'un PDA sans fil à écran tactile, interaction avec l'éclairage de la scène (en utilisant le protocole DMX512), récupération des informations des instruments électroniques MIDI, etc.
Après de nombreuses « bidouilles » et certains succès, je me suis dit que, plutôt que continuer à transporter et installer ordinateur, péripheriques variés et leur lot de câbles, il pourrait être intéressant de disposer d'une plate-forme embarquée de petite taille permettant de faire le rendu des effets vidéo, tout en étant opérationelle en quelques secondes (pas de logiciel à lancer ni de séquence de démarrage interminable), facile d'utilisation et intégrant de nombreuses interfaces (qui sont autant de périphériques et câbles en moins).
Un rapide tour d'horizon des technologies « traditionnelles » qui pourraient permettre de réaliser ce genre d'appareil dresse un tableau assez sombre. Le rendu vidéo demande une puissance de calcul conséquente que seuls quelques processeurs embarqués (tels que les OMAP de Texas Instruments) sont capables de fournir. Or, ces puces hautement spécialisées sont incompatibles entre elles, proposées en général par un seul fabricant, et en constante évolution, ce qui ne garantit pas la pérennité du développement. De plus, ces puces ne sont pas forcément prévues pour accommoder un grand nombre d'interfaces variées, ce qui rendrait le circuit imprimé complexe et coûteux. Enfin, elles vont à l'encontre des principes du libre à plusieurs niveaux : implémentation propriétaire de certains algorithmes dans le silicium, pilotes de certains organes internes disponibles parfois sous forme binaire uniquement, et nécessité de signer un NDA (accord de confidentialité) pour avoir accès à certaines informations.
Concevoir soi-même une puce sur mesure ouvre des perspectives bien plus excitantes. En plus de résoudre les problèmes techniques et de licence cités, cela permet de repousser plus loin les frontières du monde du libre. Des projets comme OpenRISC et OpenSPARC ont déjà pris ce parti en proposant sous une licence libre des fichiers HDL de conception de microprocesseurs. C'est cette voie qui a été choisie pour le projet Milkymist.
2. Concevoir une puce, comment ?
Un grand nombre de puces numériques modernes sont conçues de fichiers sources écrits dans un langage de description du matériel (HDL pour « Hardware Description Language » en anglais). Les plus répandus sont de loin Verilog et VHDL. Ces fichiers sources décrivent formellement et précisément le comportement attendu de la puce. Ensuite, des logiciels assez sophistiqués vont, de façon semi-automatique, réaliser un circuit se comportant comme spécifié.
Il existe plusieurs façons de réaliser ce circuit. Certains logiciels permettent d'obtenir des fichiers décrivant la forme de chaque élément de la puce (zones de dopage du silicium pour obtenir les transistors, interconnexions, etc.) en vue de la « gravure » sur silicium. Le principal inconvénient de cette technique est le prix à payer pour lancer la production (ce qui est nécessaire même pour un prototype) : il peut atteindre facilement le million d'euros, ce qui met le procédé hors de portée du commun des mortels.
Il existe cependant des puces reconfigurables (FPGA pour « Field Programmable Gate Array ») permettant d'implémenter la totalité des circuits numériques. Cela se fait au prix de performances moindres et un coût à l'unité plus élevé par rapport à une puce « en dur » (ASIC) ; mais ces FPGA sont à la portée des particuliers. Un FPGA permet d'implémenter de la même façon qu'un ASIC la quasi-totalité des sources HDL.
3. L'environnement de travail sur FPGA
Programmer sur FPGA est une activité tout à fait à la portée de l'amateur éclairé.
Au niveau du hardware, le FPGA en lui-même n'est qu'un composant électronique, souvent délicat à souder. Pour faciliter la tâche des utilisateurs, les fabricants proposent des cartes de développement intégrant le FPGA, l'alimentation électrique et de nombreuses autres fonctions (RAM, VGA, ...). Milkymist a été développé en utilisant principalement une carte Xilinx ML401, intégrant VGA, 64 Mo de DDR SDRAM, Ethernet, USB, audio AC'97 et bien d'autres choses, à un prix abordable. Un circuit imprimé dédié est en cours de conception afin de disposer de plus d'interfaces (notamment MIDI, DMX512 et entrées vidéo).
En ce qui concerne les logiciels de programmation (permettant de « compiler » les fichiers HDL et charger le résultat dans le FPGA), il n'existe malheureusement aucune solution libre à l'heure actuelle. Par ailleurs, les logiciels disponibles sont lourds et comportent de nombreux bugs. La solution la moins contraignante est d'utiliser ISE Webpack de Xilinx, qui est disponible gratuitement pour la plate-forme GNU/Linux, et ce au maximum en ligne de commandes afin de limiter la lourdeur et les bugs.
La situation est meilleure du côté des logiciels permettant de simuler le code HDL et ainsi de faciliter grandement le débogage. Il existe Icarus Verilog, GPL Cver et Verilator, tous trois libres et de bonne qualité.
4. Fonctionnalités du System-on-Chip Milkymist
Comme présenté dans l'introduction, Milkymist est un System-on-Chip orienté vers le rendu vidéo interactif en temps réel. Nous allons voir quelles sont les fonctionnalités proposées dans ce but.
4.1 Microprocesseur
Milkymist est basé sur le cœur de microprocesseur LatticeMico32, développé par Lattice Semiconductor et distribué sous une licence libre de style BSD.
Ce processeur est rapide et utilise efficacement les ressources. Il peut fonctionner facilement à une centaine de MHz dans un FPGA dont il n'occupe qu'environ 2500 cellules logiques alors que les FPGA modernes en comptent plusieurs dizaines de milliers. Une simulation des performances de ce processeur a montré qu'une implémentation dans une technologie silicium moderne 90nm pourrait fonctionner à une fréquence proche de 800MHz.
Il s'agit d'un microprocesseur RISC basé sur un pipeline à six étages et implémentant un jeu d'instructions qui lui est propre. Il comporte un cache d'instructions et un cache de données séparés à deux voies.
4.2 Mémoire
Le système comporte trois types de mémoires :
- La mémoire Flash externe, permettant de contenir le chargeur de démarrage. Son code peut être exécuté à la volée (« execute in place ») afin de limiter drastiquement la consommation de RAM pendant les premiers instants du démarrage.
- La mémoire SRAM, intégrée au FPGA, qui ne fait que quelques Ko. Elle est utilisé par le chargeur de démarrage lorsque la SDRAM n'est pas encore opérationnelle.
- La SDRAM externe. Il s'agit de 64 ou 128 Mo de DDR SDRAM, qui est utilisée comme mémoire principale après le démarrage du système. HPDMC (« High Performance Dynamic Memory Controller »), le contrôleur de SDRAM, a été réalisé spécifiquement pour le projet Milkymist. Il a fait l'objet d'une attention particulière afin de maximiser les performances de la mémoire (latence et bande passante) qui sont délicates à obtenir avec la technologie DRAM, qui est malheureusement la seule qui soit financièrement viable. Il a été réutilisé dans un projet de radio logicielle de la NASA et rejoindra très probablement la station spatiale internationale en 2011.
4.3 Sortie vidéo
Milkymist comporte une sortie vidéo VGA. Comme les FPGAs sont des composants entièrement numériques, cela nécessite l'adjonction d'un convertisseur numérique/analogique externe permettant de générer les signaux de couleur. Les données à afficher sont stockées dans un framebuffer en SDRAM, auquel le contrôleur VGA accède directement par un mécanisme de DMA.
4.4 Audio
Dans le but de permettre la réalisation de visuels réagissant automatiquement au son, Milkymist est équipé d'un système audio. Le System-on-Chip se connecte directement sur un codec AC'97 standard du monde PC afin d'offrir le même degré de fonctionnalité qu'avec une carte son typique d'ordinateur. Afin de ne pas surcharger inutilement le CPU, les flux de données audio sont transférés par DMA.
4.5 Accélération graphique
Comme la synthèse vidéo est une opération lourde en termes de calcul, le microprocesseur nécessite une assistance matérielle conséquente afin d'obtenir un bon taux de rafraîchissement. Milkymist propose pour cela deux unités de traitement dédié.
4.5.1 Coprocesseur flottant programmable
Cette unité (PFPU pour « Programmable Floating Point Unit ») est très similaire au vertex shader des cartes graphiques modernes. Il s'agit d'un microprocesseur aux fonctionnalités réduites, mais très rapide. Son but est d'évaluer une fonction mathématique (en utilisant des nombres flottants) pour un grand nombre de valeurs d'entrée. Avec le programme adéquat, il peut, par exemple, servir à calculer rapidement les coordonnées des points d'un polygone après une rotation. Sur des cas réels, le PFPU met environ 1.3 cycles en moyenne pour effectuer un calcul, ce qui donne une performance de 75 MFLOPS sur l'implémentation FPGA.
4.5.2 Unité de texturing de polygones
Le texturing consiste à dessiner un polygone en le remplissant avec une texture qui « suit » sa forme. C'est une opération particulièrement coûteuse en termes de calcul, et est implémentée matériellement par la totalité des cartes graphiques 3D.
L'unité de texturing de Milkymist est plus limitée en fonctionnalités que celle des cartes 3D, afin de réduire le temps déjà important de développement et l'utilisation de ressources matérielles sur la puce. Elle est notamment limitée aux polygones 2D (pas de Z-Buffer ni de correction de perspective). Elle permettra cependant d'implémenter la totalité des effets graphiques produits par le programme de visualisation MilkDrop, et sa vitesse de traitement est très rapide par rapport à la routine logicielle équivalente.
4.6 Extras
De nombreuses autres fonctionnalités sont en cours de développement : Ethernet, interface MIDI (instruments électroniques), interface DMX512 (éclairage de scène), entrée vidéo (permettant de connecter une source PAL/SECAM/NTSC et de mixer ses images), carte microSD, ports USB et capteur infrarouge RC5. Toute aide est la bienvenue ! Les composants externes au FPGA nécessaires au fonctionnement de ces interfaces seront présents sur la carte Milkymist dédiée, en développement également.
4.7 Bus internes
A l'instar d'un ordinateur, un System-on-Chip possède des bus internes faisant communiquer ses différents composants.
Dans Milkymist, trois types de bus sont mis en œuvre. Le premier est le bus Wishbone, développé et promu dans le cadre du projet Opencores œuvrant pour l'électronique numérique libre. Ce bus à usage général est utilisé autour du microprocesseur LatticeMico32 et des périphériques ayant des besoins modestes en bande passante, tels que le moteur DMA du contrôleur audio.
Wishbone est cependant trop complexe pour certaines applications ; par exemple, pour l'accès aux registres de statut et de configuration des périphériques. Un nouveau bus a donc été développé (CSR), qui est plus simple à utiliser que Wishbone (ce qui permet d'accélérer le développement) et permet d'économiser quelques ressources sur la puce. Ce bus est ensuite connecté au bus Wishbone par l'intermédiaire d'un pont, ce qui permet au microprocesseur d'accéder aux registres des périphériques de manière totalement transparente.
Wishbone est également inadapté, pour plusieurs raisons, à l'accès performant à une mémoire SDRAM. Il a donc été développé un troisième bus (FML) dédié spécialement à cette application. Les périphériques consommateurs de bande passante, tels que la sortie VGA ou l'unité de texturing, sont connectés directement sur ce bus. Afin de permettre également au processeur d'accéder à la SDRAM, il est connecté au bus Wishbone par l'intermédiaire d'un pont intégrant un second niveau de cache.
5. Logiciel
5.1 Compilateur
Les outils GNU Binutils récents supportent d'ores et déjà le jeu d'instructions LatticeMico32. GCC peut également, à l'aide d'un patch, compiler du code pour cette architecture. Après de nombreux mails avec les responsables du projet, le patch a été intégré dans le futur GCC 4.5, ce qui signifie que la toolchain GNU sera bientôt capable de générer directement des binaires pour le System-on-Chip Milkymist sans avoir besoin du moindre patch.
5.2 Chargeur de démarrage
Le premier programme à être exécuté est le chargeur de démarrage, ou BIOS. Sa fonction principale est d'initialiser la SDRAM afin de rendre son accès possible, puis de charger dedans un programme depuis un support de boot (par exemple, une carte mémoire ou un téléchargement depuis un port série) et enfin de l'exécuter.
En cas de problème ou de boot interrompu par l'utilisateur, le BIOS propose un petit shell accessible par une console série permettant de déboguer ou « hacker » le système.
5.3 Linux
Grâce en large partie à une contribution de Takeshi Matsuya de l'Université de Keio (Tokyo), Linux fonctionne sur Milkymist. Il s'agit pour l'instant de la version noMMU (uClinux) car LatticeMico32 ne propose pas encore de MMU. Le portage de la distribution OpenWrt est en cours.
5.4 Synthèse de visuels
La première application prévue du système est la synthèse d'effets vidéo. L'idée est de se baser sur le principe de fonctionnement du plug-in MilkDrop de Winamp, mais en ajoutant de nouveaux paramètres et de nouvelles façons d'interagir avec le visuel. Pour le moment, un programme « proof of concept » est disponible, permettant de faire fonctionner quelques « presets » MilkDrop sur Milkymist, mais cette partie reste largement à développer.
Conclusion
La disponibilité de FPGA performants et à faible coût ouvre de nouvelles perspectives pour les « bidouilleurs » et le monde du libre : la conception de puces, l'architecture des systèmes informatiques, l'électronique numérique à haute vitesse. On peut se surprendre à rêver qu'un jour, le mouvement FabLab aidant, il sera possible de graver soi-même, à un coût abordable, ses propres puces en dur dans le silicium. Ce qui pourrait procurer d'immenses avantages de performance, d'intégration des parties analogiques et de consommation électrique.
D'une façon plus pragmatique, si vous souhaitez en apprendre davantage, des ateliers (workshops) sont parfois organisés dans des hackerspaces comme le /tmp/lab, autour de l'utilisation générale des FPGA ou du développement logiciel ou matériel sur Milkymist. Les annonces sont faites par l'intermédiaire de mon blog ainsi que de la liste de diffusion milkymist-devel. J'espère vous y rencontrer !
Liens
Site du projet : http://www.milkymist.org
Site et blog de l'auteur : http://lekernel.net
Icarus Verilog : http://www.icarus.com/eda/verilog/
GPL Cver : http://sourceforge.net/projects/gplcver/
Verilator : http://www.veripool.org/wiki/verilator
OpenCores : http://www.opencores.org
LatticeMico32 : http://www.latticesemi.com/products/intellectualproperty/ipcores/mico32/index.cfm
Jeri Ellsworth's Home Chip Fab : http://www.vimeo.com/channels/26257
Début d'un projet de FabLab en France : http://usinette.org/
MilkDrop : http://www.nullsoft.com/free/milkdrop/
/tmp/lab : http://www.tmplab.org