My first steps in the FPGA world

Posted by Benoît Papillault on Nov 8, 2009 in Linux |

Ca y est, j’ai enfin franchi le pas, je suis allé à un workshop sur les FPGA où j’ai réussi à faire clignoter une petite LED. Comme tout ceci n’est pas évident pour moi et j’espère que cela sera utile à d’autres, voici un petit article sur cette grande aventure.

Tout d’abord, l’évènement était organisé ce dimanche 8 Novembre 2009 au /tmp/lab, un endroit assez … hummm… assez bizarre. Le workshop s’est déroulé en trois parties :

  1. Une présentation sur rétroprojecteur
  2. L’installation complète des outils Xilinx
  3. La programmation d’une porte AND sur une carte Spartan-3A et un simple câble USB

Présentation sur rétroprojecteur

La présentation est disponible ici : http://lekernel.net/presentations/FPGA_Workshops/091108_tmplab/scenes_draft.pdf . La présentation a été faite par lekernel (Sébastien Bourdeauducq dans la vraie vie). Cela à complété mes cours d’IUT sur les architectures à base de portes logiques, sauf les registres qui restent encore un mystère pour moi.

Installation des outils Xilinx

L’installation étant non triviale, je vais détailler les étapes que j’ai suivies pour arriver à mes fins (j’espère n’avoir rien oublié). Tout d’abord, l’installation a été réalisée sur une Debian.

  1. Téléchargement du ISE WebPack à l’adresse suivante : http://www.xilinx.com/tools/webpack.htm. Pour le téléchargement, il faut s’enregistrer gratuitement sur le site de Xilinx. Plus exactement, j’ai téléchargé le fichier SW, ISE WebPACK 11.1, Single File Download Image. Au final, cela donne un fichier Xilinx_11.1_WebPack_SFD.tar de 2.7 Go!
  2. Après avoir décompressé l’archive (encore 2.7 Go!), il faut lancer en root xsetup : $ sudo ./xsetup
  3. Il se peut que la bibliothèque libXm.so.3 manque à l’appel, une solution simple : # aptitude install libmotif3
  4. De même pour la bibliothèque libstdc++.so.5. Dans ce cas, cette bibliothèque n’est pas dans le dépôt testing de Debian, il faut utiliser les dépôts stable en éditant /etc/apt/sources.list et enfin : # aptitude install libstdc++5
  5. Pour accélérer le démarrage, je vous conseille également : # aptitude install portmap
  6. Pour pouvoir utiliser la commande bitgen, il faut également une license valide (à récupérer en lançant ise et en cherchant un peu…)
  7. Pour lancer l’éditeur de FPGA utilisé dans cet article, il faut ouvrir une console dédiée et y faire : $ source /opt/Xilinx/11.1/settings32.sh (on suppose que vous utilisez le shell bash), puis : $ fpga_editor

Programmation d’une porte AND

Le but était d’avoir deux entrées matérialisées sous forme de push-button (d’ailleurs, c’était de simple pad, pas de vrais push-button), de faire un AND entre elles pour allumer une LED (ie la LED s’allume seulement si les deux push-buttons sont enfoncés en même temps).

Dans l’outil fpga_editor (voir section précédente), on va créer un nouveau circuit grâce au menu File->New. Il faut cocher la case Design et non Hard Macro. On clique également sur le bouton Select Part pour remplir les champs suivants :

Family : Spartan3A and Spartan3AN
Device : XC3S400A
Package : FT256
Speed Grade : -4

D’ailleurs, en relisant la datasheet d’AVNET, je me rends compte d’une erreur. Au cours du workshop, j’avais sélectionné : Family : Automotive Spartan3A, Device: XA3S400A, Package : FTG256 et Speed Grade: -4Q.

Une fois le fichier créé, on va pouvoir implémenter notre porte AND. Pour cela, il faut :

  1. Connecter les broches des deux PAD + LED sur des IOCells
  2. Créer une porte AND via une 4-LUT
  3. Connecter les IOCells sur la porte AND
  4. Router le tout (pour le chemin entre les IOCelles et la porte AND)

1. Connecter les broches : pour cela il faut repérer le nom des broches. Il faut les trouver dans la documentation d’AVNET, intitulé “Xilinx Spartan-3A Evaluation Kit – Schematics” disponible dans la section download du site d’AVNET. On trouve donc :

LED2 = C16

FPGA_PUSH_A = K3

FPGA_PUSH_B = H5

On va donc chercher ces sites via le menu Edit->Find pour chacun de ces sites (C16, K3, H5).  Lorsque la recherche est fructueuse, un composant est sélectionné, il faut alors cliquer sur le bouton “add” (panneau de droite). Si rien ne ce passe, il faut bien vérifier que vous êtes en “editmode”. Une nouvelle fenêtre s’ouvre alors vous demandant le nom du composant (ex: LED2) et son Type : il faut mettre IOB (je ne sais pas pourquoi…).

Une fois fait, il faut double-cliquer sur le composant pour pouvoir l’éditer plus précisément. Une nouvelle fenêtre apparait avec le schéma des portes. Dans les 3 cas, il faut router le carré “PAD” vers l’entrée ou la sortie. Attention : il ne faut pas oublier de cliquer sur le bouton “Begin Editing” (deuxième bouton de la fenêtre).

Dans la partie supérieure droite du composant, on trouve une sorte de cartouche où l’on indiquera :

IO STANDARDS = LVCMOS533

DRIVE STRENGTH = 8 (8 mA)

IBUF DELAY = DLY0

SLEW_RATE = SLOW

Cliquez enfin sur le bouton “Saves Changes and Closes Window” et répéter la même opération pour les autres composants. A compléter…

Maintenant que toutes les interfaces externes sont créées, on va ENFIN programmer notre porte AND!

2. Création de la porte AND

Sélectionnez un composant au hasard (ou presque), ex : SLICE_X23Y40 et ajouter le (bouton “add”). En double cliquant, une nouvelle fenêtre apparait, il faut alors localiser le bloc A1A2A3A4 et “router” sa sortie vers X. Pour définir la fonction, il faut cliquer sur F= et remplir A1 * A2 dans la ligne adéquate.

3. Connexion de la porte AND aux IOCells

Si vous avez suivi jusqu’ici, on veut donc connecter A1(en fait F1) à BUTTON1.I, A2(en fait F2)  à BUTTON2.I et X à LED2.O2. Dans le schéma général, on va donc cliquer sur la pate BUTTON1.I (en haut à gauche du composant) et faire “add”. Une nouvelle fenêtre apparait en demandant le nom d’un “net” . La valeur $NET_0 proposée par défaut convient très bien. On sélectionne maintenant F1 dans le schéma générale. Dans la liste à gauche, on sélectionne alors “Unrouted Net” et on sélectionne $NET_0 puis le bouton “add”. On a alors connecté les deux composants. Un dernier clic sur le bouton “autoroute” et c’est bon!

Une fois que tout est sauvé, il faut alors générer le bitstream (fichier binaire qui sera chargé ensuite dans le FPGA lui-même) par :

$ bitgen -w my-first-fpga

On envoie alors le bitstream dans la carte (grâce au câble USB!) avec l’outil avs3a.

Dans mon cas, l’outil avs3a a du être modifié en mettant en commentaire la ligne suivante :

if (strcmp(devType, "3s400aft256") != 0)
 {
 printf("\nDevice code %s is not supported by this utility\n\n", devType);
 //exit(EXIT_FAILURE);
 }

Pour télécharger le bitstream vers la carte Spartan-3A :

$ avs3a -p /dev/ttyACM0 -s -b my-first-fpga.bit

Quelques photos de la carte  et du workshop :

Liens:

  1. Le site du tmplab : http://www.tmplab.org/
  2. L’annonce du workshop FPGA : http://www.tmplab.org/wiki/index.php/FPGA_Workshop_4:_Behind_the_Scenes
  3. Le premier workshop FPAG : http://www.tmplab.org/wiki/index.php/Workshop_Introduction_aux_FPGA
  4. Téléchargement sur le site de Xilinx : http://www.xilinx.com/tools/webpack.htm
  5. Téléchargement de avs3a : http://avs3a.googlecode.com/files/avs3a-2008-10-19-14-38.tar.gz
  6. En cas de plantage avec KDE4 :http://lekernel.net/blog/?p=697

Tags: , ,

Comments are closed.

Copyright © 2014 Blog de Benoît Papillault ! All rights reserved. Theme by Laptop Geek.