Les FPGA : des joujoux compliqués !


Dans ma chambre, dans un placard, il y a tout un tas de vieux matériel électronique : des morceaux de cartes mères, des radios-réveils désossés, des vieilles consoles en morceaux, des bouts de vieilles caisses-enregistreuses, et encore un paquet de choses dont je serai incapable de dire d’où elles proviennent. L’explication est la même pour toutes ces inutiles débris : “ça pourra toujours servir ! je pourrai toujours en déssouder un composant utile !”. Seulement voilà : je ne sais pas faire d’électronique, et ça ne sert à rien.

Passons.Il y a peut être un an, j’ai découvert les FPGA, grâce notamment à Pitt et Refix sur les forums Dev-FR et PlayerAdvance (sujet). Il s’agit (en gros) de “puces programmables”, mais pas au sens habituel : c’est à dire que ce ne sont pas des microprocesseurs : ce sont vraiment de gros circuits intégrés dont on peut programmer via ordinateur le comportement : cela permet de concevoir des circuits logiques. Bref, cela m’a paru comme un étage intermédiaire entre l’informatique (programmation, interface avec le PC) et l’électronique (circuit logique, etc). De plus, j’apprends qu’une boîte américaine, Digilent, en vend à prix plutôt bas par rapport au prix habituel de ces bestioles. Après avoir longuement hésité, je décide donc d’acheter une carte Nexys 2.

Je reçois la fameuse carte, je la branche, le “programme” de test préinstallé se lance, et tout fonctionne bien. Je reboote sous Windows, afin d’installer l’environnement de développement. Il s’agit en l’occurence du ISE de Xilinx. Après avoir durement combattu avec le site de Xilinx et le système de licenses (gratuites pourtant…) du logiciel, je réussis à télécharger un installateur. Lequel m’annonce qu’il y a un peu plus d’un gigaoctet de données à télécharger. Soit. Une fois le logiciel installé, je le démarre (c’est lent, mais mon ordinateur n’y est pas pour rien).

Screenshot Xilinx ISE

C’est parti ! Je recherche donc un cours sur le VHDL, puisqu’il s’agit du “langage” qui permet de spécifier le comportement d’un circuit logique. Le code écrit sera ensuite “compilé” (on dit “synthétisé” ici) puis transcrit en un fichier binaire qu’il suffira d’envoyer sur le FPGA (via le logiciel Windows “Impact” fourni par Digilent, j’y reviendrai après). Je ne raconterai pas tous les déboires qui s’ensuivirent. En effet, en vrac :

  • Si le langage paraît simple vu de loin, il est en fait semé d’embûches, et ne s’apprend sûrement pas en quelques heures comme certains langage de programmation.
  • Ce N’EST PAS un langage de programmation. Et c’est ce qui m’a causé le plus d’ennui. En effet, je suis habitué à ma bonne vieille programmation séquentielle : mes petite variables dans la mémoire, mes petites boucles, mes fonctions, et derrière tout ça, le compilateur dont je comprends le rôle, et à peu près le fonctionnement. Or, c’est ici un langage de spécification : on spécifie ce que fera la puce : tous les idiomes habituels de programmation sont à revoir.
  • Le processus de synthèse est extremmement long. J’ai l’habitude de tester souvent mes modifications, cela m’a donc largement ralenti et découragé. De plus, les messages d’erreur du synthésiteur sont incompréhensibles (pour un débutant), très mal documentés sur le site officiel, et souvent insoluble par la “méthode Google”. Bref : s’il y a une erreur, on sait à quelle ligne, mais on ne sait pas ce que sait… il n’y a plus qu’à supprimmer la ligne et à la réécrire autrement.
  • J’ai très peu de notion de logique et de combinatoire. À ce propos, il semble que le langage possède véritablement “deux niveaux”. On peut effectivement décrire le fonctionnement interne du circuit via la combinatoire (portes logiques en tous genres), mais on peut aussi utiliser des structures de plus haut niveau. Ainsi, si la plupart des cours proposent de réaliser (wow!) un additionneur en décrivant toute la logique sous-jacente, il est tout simplement possible d’utiliser le symbole “+” : ce qui est nettemment plus naturel pour moi. J’ai donc très peu suivi les cours que j’ai trouvé, puisqu’ils ne correspondaient pas à ce que je voulais faire. Bref, il y a quelque chose qui m’échappe : c’est comme si on écrivait un cours de C++ en ne parlant que d’assembleur… enfin je crois.
  • Le jonglage permanent entre ces deux “niveaux” de langage (combinatoire et séquentiel, je crois) est à l’origine d’un nombre affreux d’erreurs.

Je finis quand même par réussir à piloter les LEDs et l’afficheur 7-segments grâce aux boutons et aux interrupteurs. Youpi !

Après un long séjour dans le placard, je décide un jour de ressortir mon FPGA, et je me dis : “je vais voir si je peux le programmer avec Linux !” Quelle idée malheureux !

L’environnement de développement ISE est disponible pour Linux, mais évidemment, il faudra pour ça que j’affronte à nouveau le site de Xilinx (qui a bien sûr été modifié depuis !), et que je recharge le gigaoctet de logiciels. Bien. En tout cas, ISE fonctionne bien sous Linux, je peux synthétiser mon code et obtenir le fichier de programmation du FPGA. Reste le vrai problème : envoyer le programme sur le FPGA, via le port USB. En effet : le logiciel Impact de Digilent et propriétaire, et seulement pour Windows. Je me jette sur Google, et me voilà parti pour des heures à errer sur des forums, à lire des messages remplis de termes que je ne comprends pas, mais qui semblent parler du même matériel que moi. Je fini par abandonner, puis je réessaie quelques mois plus tard et … enfin je le trouve. Ce message. Le message du type génial qui dit à peu près cela : “Salut ! J’ai acheté ce matériel là l’autre jour, et ça ne marche pas sous Linux, alors j’ai vite fait bricolé un outil qui permet de le faire marcher, et je vous le file.” Vraiment, c’est pour ça que j’adore le monde du libre. Bref, le message est ici, et l’outil en question est . Comme je suis content de l’avoir trouvé, je le mets en gros, voilà.

nexys2prog, l’outil pour prog la nexys2

Et ca marche diablement bien. Relativement simple à mettre en place (un petit paquet à installer, une lib à compiler, et puis il faut aussi s’autoriser un certain accès au périphérique USB), il est en tout cas très simple à utiliser : on lui file le fichier “.bit” à envoyer, et il programme le FPGA en quelques secondes !

Me revoilà donc aussi bien installé que sous Windows pour bricoler mon jouet. Je décide au passage de changer de langage pour programmer mon FPGA, et de passer à Verilog. Ce dernier, concurrent du VHDL, me semblait avoir une syntaxe plus claire, plus proche du C, et plus adapté à un débutant en provenance du monde de la programmation. J’ai bien fait, ce langage a jusqu’à maintenant été bien plus clément avec moi que VHDL. Peut-être parce que les cours qu’on trouve le concernant sont plus abordables (notamment celui-ci qui m’a bien aidé).

Pour l’occasion, je décide de fouiller dans mon tiroir à vieux composant, et j’exhume ainsi une vieille mémoire SRAM, qui devait servir pour le BIOS d’un bien vieux PC. Je trouve sur internet le “datasheet” associé (un pdf avec toutes les informations techniques), et je sors mon fer à souder. Quelques heures plus tard, tout fonctionnait : je pouvais lire et écrire dans la vénérable mémoire avec mon FPGA ! J’avais enfin fait “revivre” un de ces vieux composant électronique de mon tiroir.

montage fpga sram petit2

Enfin, après un nouveau grand séjour au tiroir, j’ai ressorti mon FPGA avant-hier pour compenser une lacune de mon installation. En effet, sous Windows, je bénéficiai du logiciel “Export” de Digilent qui permettait de communiquer avec le FPGA via l’USB (et un peu plus, m’enfin bon). Rien de tel sous Linux. Comme j’ai un peu peur des interfaces USB, j’ai décidé de fouiller mon tiroire (encore lui !) pour trouver un bon vieux cable série (Null-Modem comme on disait dans le temps !) et connecter la carte à mon ordinateur. J’ai ensuite programmé en Verilog une interface permettant de gérer le port série (réception et émission), et voilà mon ordinateur et mon FPGA qui, après quelques couacs, se parlent ! C’est beau la technologie, et utile, en plus ! ^^ Enfin, maintenant, je peux envisager d’interfacer mon ordi avec tout un tas de trucs, via ce port série et le FPGA.

mon code verilog pour gérer le port série (il est sûrement affreux, et si vous vous y connaissez, dîtes-moi pourquoi !)

Voilà voilà… C’était mon article le plus long. Peut-être trop long d’ailleurs ?

  1. #1 by sylvainulg on August 18, 2009 - 6:02 am

    Merci pour ce petit moment partagé. Ca a l’air bien sympa. LED7 et boutons sur la carte … j’aurais rêvé avoir ça à 12 ans pour piloter mes LEGO … et évidemment, je l’aurais fait griller n’y connaissant rien en électronique de puissance :P

  2. #2 by Matthieu on December 11, 2009 - 6:02 pm

    Bonjour pour ma part , les CPLD et les FPGA ont un potentielle , je ne l’avais pas remarqué dés le départ , mais pour des petites applications répétitives , s’est génial …

    Le seul problème s’est que le VHDL est un langage psycorigide , s’est pourquoi j’espère que system c va s’installer dans les entreprises …

    Matthieu

  3. #3 by pinkotronic on December 23, 2009 - 5:06 am

    Salut,

    Effectivement le code verilog n’est pas très conventionnel..
    Disons qu’en règle générale, le but est de décrire de la logique très basique.. Donc dans le cas présent au lieu d’utiliser une variable à décrémenter et de faire des tests sur sa valeur, tu pourrais utiliser un registre a decalage de 9 bits, du coup à chaque cycle tu shifte d’1bit, et tu teste seulement si le bit x est à 0 ou à 1 ..

    Sinon, un petit lien très riche en IP open-sources:
    http://opencores.org/
    Tu y trouveras de “vrai” UARTs (configurable et multi rate) mais aussi de l’I2C , du SPI, bref tout ce dont tu peux avoir besoin pour communiquer avec l’extérieur..

  4. #4 by thoduv on December 29, 2009 - 4:26 pm

    Salut ! Merci pour ton commentaire, et pour le lien : effectivement, il y a de quoi faire !
    Pour mon code, c’est bien ce que je pensais, il n’a pas l’air d’être dans “l’esprit” de la programmation sur FPGA, et je suppose qu’on sent bien que c’est écrit par quelqu’un qui a l’habitude de programmation “normale”.
    Remarque, le compteur dans le module de réception, je l’avais mis à contre-coeur, parce que je n’avais pas réussi à le faire via un shift-reg 9 bits, comme dans celui d’émission.

    Matthieu> “psychorigide” ! ^^ Mais je suis bien d’accord avec toi. Par contre, je ne connais pas SystemC : je regarderai ça la prochaine fois que je me replongerai là-dedans.

  5. #5 by Hamza on February 10, 2010 - 2:06 pm

    Bas prix, 129,99$ !
    Qu’est ce que ça donne tes joujoux ?
    On peut y faire des trucs marrants ?

  6. #6 by thoduv on February 21, 2010 - 3:13 pm

    Haha, tout dépend de ce que tu appelles “marrant”. ^^ Moi ca m’amusait (quand j’avais le temps !) de m’essayer un peu à l’électronique, de faire ressuciter des vieux composants récupérés ça et là, ou bien d’essayer de bricoler des interfaces avec des vieilles consoles par exemple. Sinon, en soi-même c’est évidemment limité : quelques boutons, quelques leds, un afficheur sept segment.

    Pour le prix, à l’époque où l’euro était très fort, ca faisait dans les 70€ : pas donné, mais quand même accessible pour un curieux (pas énormément plus qu’un jeu vidéo).

  7. #7 by Pitbuell94 on March 10, 2010 - 4:31 am

    Bonjour Thoduv,

    Bravo pour tout ce que vous avez fait avec la NEXYS2.

    J’en ai achetée une la semaine dernière chez LEXTRONIC.

    J’ai acheté cette carte dans un but précis.

    Je fais parti actuellement d’un club où nous restaurons du matériel ancien.

    Mon hobby est la restauration de téléviseurs anciens datant des années 1930 à 1960.

    Ces téléviseurs étaient équipés de technologie à tubes.

    Pour les modèles les plus performants, la définition de l’image était de 819 lignes dans les années 1944.

    René Barthélemy a atteint 1015 et même 1042 lignes durant ces années( La france a été le premier pays a avoir la HD….).

    Actuellement, la définition actuelle est de 625 lignes couleur en SECAM.

    Pour faire fonctionner ces téléviseurs anciens , j’ai besoin d’un scaler vidéo qui convertira l’image vidéo 625 lignes couleur en une vidéo 819 lignes noir et blanc.

    Pour cela, il faut stocker une image entière en RAM puis extrapoler les lignes manquantes et ressortir l’image avec les bons timing de synchronisation verticale et horizontale.

    Votre manipulation m’a fortement intéressée en ce sens que vous vous servez d’une RAM externe.

    Dans l’absolue, je souhaite partir d’une source 1080 lignes en haute définition pour aller vers le 819.

    j’utilise pour la conversion vidéo un TDA 8708 CAN 8 bit à 32 MHz, pour extraire les synchronisations un LM1881.

    Pour la conversion numérique vers analogique, j’utilise un TDA8702 CNA 8 bit 30MHz.

    Concernant votre SRAM, quel était le modèle, quels sont ses temps d’accès?

    Avez-vous fait des tests de vitesse.

    Je recherche une SRAM facile à interfacer et rapide en accès.

    Merci d’avance pour tous vos renseignements.

    Pitbuell94.

  8. #8 by Pitbuell94 on March 10, 2010 - 5:21 am

    Re-bonjour,

    J’ai oublié de vous demander s’il vous était possible d’avoir votre code.

    Par avance, je vous remercie.

    Pitbuell94.

  9. #9 by thoduv on March 10, 2010 - 4:10 pm

    Bonjour !
    Le montage que j’avais fait utilisait une vieille SRAM préhistorique de 2ko (!!) récupérée sur une vielle carte mère je crois, et aux temps d’accès sûrement d’époque. Donc c’est a priori très loin d’être adapté pour faire du traitement d’image ! Par contre, la carte NEXYS2 possède une RAM embarquée, je vous conseille de regarder de ce côté là.
    Bon courage en tout cas !

  10. #10 by pitbuell94 on March 12, 2010 - 11:18 am

    Bonjour,

    Merci tout de même pour vos informations.

    Questions subsidiaire: avant de toucher la carte NEXYS 2, aviez-vous fait de l’informatique?

    Je n’ai acheté ma carte que très récemment et j’espère que l’apprentissage n’est pas trop long.

    Avez-vous mis du temps entre le moment où vous avez reçu la carte et celui ou vous avez pondu votre premier programme que vous avez injecté dans la NEXYS2.

    J’ai hâte de faire mes premiers tests pour valider mes premiers programmes.

    je vous souhaite une bonne fin de journée.

    Pitbuell94.

(will not be published)