homenowpostsprojects(english version)

Que l’aventure commence !

Durée de lecture estimée : 5 minutes

J’ai reçu hier ma première carte d’évaluation de FPGA, commandée chez Olimex !

Elle est basée sur la puce Lattice iCE40HX8K, qui est le plus gros (en terme de nombre d’entrées/sorties et de cellules logiques) FPGA qui est pris en charge par la suite d’outils libre icestorm.

En suivant la documentation de Olimex, j’ai aussi obtenu leur Olimexino 32U4, un clone d’Arduino. Celui-ci est utile pour envoyer sa programmation au FPGA. Il n’est pas nécessaire d’en posséder un si on possède déjà quelque chose pour écrire dans une flash SPI ou parler au FPGA via le port JTAG, mais ce n’était pas mon cas. Toute la procédure est détaillée sur le wiki de Olimex.

Photo de l’installation

La première chose que j’ai faite a été de récupérer le code d’exemple pour tester mon installation. Ce code ne fait pas grand chose : il fait clignoter les LED sur la carte du FPGA. On peut voir ça comme le “Hello world!” de l’électronique. :D

J’ai installé la suite d’outils icestorm depuis les paquets de ma distribution et ai compilé le projet, aucun problème ici. Cependant, l’étape d’envoi sur la carte semblait prendre un temps anormalement long… Après quelques minutes je l’ai donc interrompu, car envoyer quelques kilo-octets ne devrait pas prendre aussi longtemps. Le problème était tout bête, j’avais tout simplement oublié d’alimenter la carte FPGA ! Ce qui m’a induit en erreur est qu’une des LED (CDone) du FPGA était allumée, apparemment le programmeur envoie assez d’énergie pour allumer ça, mais c’est tout.

Une fois ce problème résolu, l’envoi du programme n’a pris que quelques secondes.

Curieusement le code… ne faisait rien. Aucune LED ne clignotait, et le seul bouton qui réagissait était le bouton reset.

J’ai donc regardé un peu le code et me suis rendu compte qu’en effet, ça ne risquait pas de fonctionner ! Le Makefile informe le compilateur que j’utilise la puce HX1K, qui a une disposition différente de bornes et de cellules logiques. J’ai donc modifié ça (de hx1k a hx8k), ainsi que le package (de vq100 à ct256).

Avec ces changements la compilation fonctionnait toujours, mais le router (arachne-pnr) me râlait dessus car j’utilisais des bornes non définies ! En effet, j’avais oublié de modifier le fichier servant à indiquer quelles bornes (ou billes dans le cas présent) du FPGA sont connectées à quels composants de la carte d’évaluation. Ceux-ci étant très différents d’une carte à une autre.

Pour m’occuper de cela, j’ai téléchargé le schéma de la carte et ait recherché quelles bornes correspondaient à l’horloge, aux LED et aux boutons.

Image du schéma de la carte, où les parties intéressantes sont mises en valeur

Voilà le fichier pcf auquel je suis parvenu :

set_io CLK J3
set_io BUT1 K11
set_io BUT2 P13
set_io LED1 M12
set_io LED2 R16

Une fois ceci fait, le processus complet de compilation fonctionnait. J’ai envoyé le programme et… hourra ! Les LED clignotent !

J’ai réitéré les mêmes modifications sur le code d’exemple VGA disponible dans le dépôt de Olimex, cependant j’ai dû utiliser le schéma de la carte VGA en plus. Ça a fonctionné aussi bien que pour le précédent exemple ! :D

Bien entendu j’ai envoyé mes modifications sur le dépôt de Olimex. Sous forme de pull request sur github.

J’ai maintenant tout ce dont j’ai besoin pour expérimenter tout un tas de choses qui m’intéressent, tels que la conception de CPU et de GPU, l’interfaçage avec différents matériels (tels que la Gameboy), et bien d’autres choses encore !