MKR Vidor 4000 : Programmation du FPGA (Partie 1)

MKR Vidor 4000 : Programmation du FPGA (Partie 1)

Je vous faisais le mois dernier, une présentation de la nouvelle carte ARDUINO MKR Vidor 4000.
Dans cet article, je vais vous présenter les bases pour reprogrammer la configuration utilisateur du FPGA.

Notez que je décline toutes responsabilités quant aux conséquences que pourraient avoir le suivi de ce tutoriel. Les composants de la carte sont sensibles et n’apprécieront pas une mauvaise tension sur leurs broches ou que vous mettiez celles-ci en court circuit suite à une mauvaise configuration chargée dans le FPGA.

Installation de Quartus

Le FPGA étant un ALTERA Cyclone 10LP, commencez par installer le logiciel Quartus :

  • Allez sur la page de téléchargement d’INTEL/ALTERA et choisissez la dernière version de Quartus en version Lite .
  • Les éléments minimum à télécharger sont Quartus Prime (includes Nios II EDS)  et Cyclone 10 LP device support . Placez les dans le même répertoire.
  • Si vous ne disposez pas déjà d’un compte ALTERA, vous aurez certainement besoin de vous inscrire.

Note : si vous pensez utiliser un boîtier USB BLASTER pour la programmation en direct du FPGA, vous pourriez avoir besoin du package « Quartus II Programmer and SignalTap II » de la version Web Edition 13.0.

Une fois le téléchargement effectué, lancez l’installation de Quartus (QuartusLiteSetup-xx.yy-windows.exe).

Si par défaut l’installation ne le propose pas, sélectionnez le support du Cyclone 10LP dans la boite de dialogue suivante.

Projet Arduino de base.

Il nous faut ensuite avoir une base de projet avec les configurations d’E/S de la carte ARDUINO.
Vous pourrez trouver celle-ci à cet emplacement.

Décompressez le fichier ZIP et ouvrez avec Quartus (File → Open Project) le fichier MKRVIDOR4000.qpf.
Celui-ci se trouve sous l’arborescence : …\VidorFPGA-master\projects\MKRVIDOR4000_template

Le module de plus haut niveau « Top level entity » est pour ce projet le module MKRVIDOR4000_top.

Ce fichier défini :

  • le nom des signaux d’E/S et leur direction (input, output, inout,..),
  • les liaisons internes (Wire), les buffers ou registres (reg),…
  • les instances d’autres modules ( ici cyclone10lp_oscillator et SYSTEM_PLL),
  • les règles combinatoires (assign) ou séquentielles (always/begin/end)

Un autre fichier indispensable est celui qui met en relation les signaux d’E/S avec le brochage du FPGA. Ce fichier définit également les niveaux de tension de ces signaux donc NE LE MODIFIEZ PAS.
Vous pouvez le visualiser en sélectionnant « Assignments → Assignments Editor ».

Si vous compilez le projet (Processing → Start compilation), et regardez l’architecture générée (Tools → Netlist viewers → RTL viewer), vous constaterez que le projet ne contient pour le moment que peu de chose.

 

L’entrée d’horloge iCLK à 48 Mhz venant du SAMD21 passe par une PLL générant en sortie une horloge à 100 Mhz reliée à la SDRAM.

 

Clignotement d’une LED.

Nous allons ajouter une feuille de schéma à ce projet :
Faites File→New et choisissez « Block Diagram/Schematic File »

 

S’ouvre alors une feuille dans laquelle nous allons pouvoir ajouter et connecter des composants comme sur un schéma électronique.
Pour faire clignoter notre LED nous avons besoin d’un port d’entrée (une horloge), et d’un port de sortie (le signal de la LED).
Ajoutez ces ports (1 Input + 1 Output) sur la feuille en cliquant sur l’icône suivant :

 

Puis, soit en cliquant 2 fois sur le nom, soit en faisant un click droit et « Properties » : renommez l’entrée « iLEDCLK » et la sortie « oLED »

 

Avant d’ajouter toute la logique nécessaire entre ces 2 ports : sauvegardez le schéma (CTRL+S) sous le nom « TUTO_Schematic.bdf »

L’horloge que nous allons utiliser en entrée est celle fournie par l’oscillateur interne du Cyclone 10. Celle ci à une fréquence d’environ 80Mhz, ce qui est beaucoup trop élevé pour notre besoin. Plutôt que d’utiliser une PLL en diviseur de fréquence nous allons ici lui préférer un compteur.
A chaque coup d’horloge en entrée, le compteur sera incrémenté. Chacun des bits du compteur changera donc d’état à une fréquence qui lui sera propre : Freq_bit_n = ( Freq_entrée / (2 ^ (n+1)))
Pour un clignotement toutes les secondes il faudra prendre n=25.

Ajout du compteur.

Pour ajouter le compteur, appuyez sur l’icône « Symbol Tool » :

 

Sélectionnez un LPM_COUNTER et cliquez sur « OK » pour le positionner dans le schéma.

 

Éditez ensuite les propriétés du compteur (click droit + « Properties ») et entrez la valeur 26 pour LPM_WIDTH.

 

Vous allez ensuite :

– Relier l’entrée iLEDCLK à l’horloge du compteur en utilisant la commande « Node Tool ».

 

– Sortir un bus de données depuis la sortie q[] du compteur avec la commande « Bus Tool »

 

– nommer ce bus « compteur[25..0] » (Click droit sur le bus et « Properties »)

 

– et finalement relier (avec l’outil Node Tool) la sortie oLED au bus compteur.

Comme seulement un des signaux du bus nous intéresse, vous devez dire à Quartus lequel prendre en le nommant (ici : compteur[25]).

 

Vous en avez fini avec le schéma. Sauvegardez le !

La prochaine étape sera d’inclure ce schéma dans le «Top level entity » du projet.

Pour cela, double cliquez sur le fichier MKRVIDOR4000_top.v

 

Et ajoutez y les lignes suivantes (au dessus de reg [5:0] rRESETCNT;) :

TUTO_Schematic TUTO_Schematic_inst
(
.iLEDCLK(wOSC_CLK) , // L’entrée d’horloge est reliée à l’oscillateur interne 80Mhz
.oLED(bMKR_D[6]) // La sortie LED est reliée à la broche 6 du port MKR
);

Il ne vous reste plus qu’à recompiler le projet :

 

Création du fichier app.h et intégration dans le sketch.

La compilation a généré un fichier MKRVIDOR4000.ttf dans le répertoire output_files. Ce fichier liste au format texte les octets décrivant la configuration du FPGA.
Il va falloir inverser bit à bit chacun de ces octets avant de l’envoyer à la carte ARDUINO.
Pour cela, téléchargez le logiciel écrit en java disponible ici

Exécutez la ligne de commande  : java ReverseByte MKRVIDOR4000.ttf app.h

Cela va générer le fichier app.h que vous pourrez inclure dans le sketch vide disponible ici.

Il ne vous reste plus qu’à charger le sketch dans la carte avec l’IDE Arduino.

Notes :
– En aucun cas vous ne devez reconfigurer le port PA20 du SAMD21 en sortie. Celui-ci est déjà utilisé en sortie par le FPGA.
– Le port PA20 (nommé bMKR_D[6] coté FPGA) correspond à la broche 1 du connecteur J5 (notée « 6 »). Vous devez connecter une LED en série avec une résistance de valeur appropriée entre cette broche et la masse (GND) pour voir clignoter la LED.

 

Dans la prochaine partie de ce tutoriel, nous verrons comment implémenter un bloc PWM, et le paramétrer via le SAMD21.

 

 

13 réponses

  1. DjTGv dit :

    Merci Philippe

  2. DjTGv dit :

    Tout s’est bien déroulé en suivant les instructions il ne me reste plus qu’à charger le sketch dans la carte avec l’IDE Arduino et monter mon Vidor sur un breadboard avec une résistance de 220 ohms et une led.

  3. DjTGv dit :

    It blinks ! Funny

  4. François dit :

    Salut,
    Ta série de 3 articles est géniale. Je t’en remercie beaucoup. Juste une petite question : est tu sûr qu’il faut inverser “bit à bit” et non pas octet par octet ? Pour être certain de bien comprendre la logique, te serait-il possible de donner le source de ReverseByte.java, s’il te plaît ?

    Merci encore

    • Philippe dit :

      Bonjour François, et merci pour ce retour.
      Il faut inverser les bits pour chaque octet du stream.
      Le code source est ici : https://systemes-embarques.fr/wp/reversebyte-2/

      • François dit :

        Génial. Merci beaucoup pour le code source.

        J’ai une autre question et une suggestion :
        – Où as-tu trouvé qu’il fallait faire cette étape ?
        – Tu devrais peutêtre éditer le texte de l’article pour y préciser que l’inversion des bits se fait octet par octet avec la source de l’information.

        Je suis en train d’essayer d’adapter ton code pour avoir un PWN sur 2000us et pour le tester avec un servo. Ce sera mon premier bout de code perso pour FPGA, grâce à toi. Merci encore.

        • philippe dit :

          – L’information sur l’inversion des bits se trouve sur le forum arduino https://forum.arduino.cc/index.php?topic=559800.msg3833743#msg3833743
          (Dario Pennisi : “The hint I can give you is that the ttf needs to be bit reversed as quartus generates them in the opposite bit endianness required by the flash.”)
          – Le texte dans l’article me paraît assez clair : “Il va falloir inverser bit à bit chacun de ces octets avant de l’envoyer à la carte ARDUINO.”
          – Je mettrais à jour le fichier ReverseByte.zip de la page téléchargement très bientôt.

      • François dit :

        Ah, deux autres petits détails :
        – le fichier ReverseByte.zip de la page de téléchargements ne contient pas le source
        – le fichier class du zip n’est pas utilisable par tout le monde (ma distrib utilise un JRE 1.8 et je ne souhaite pas polluer mon système).

  5. Gabriel Bravo dit :

    Bonjour, pourrais-je avoir une copie de votre fichier app.h? merci

  6. philippe dit :

    J’ai mis à jour la page téléchargement en incluant :
    – ReverseByte compilé avec un JAVA 1.8
    – Projet Quartus de cet article
    – Sketch correspondant.

  7. alorbac dit :

    Bonjour
    Supers articles. Un vrai régal.
    J’ai juste une question : comment retrouver l’association PA20 — bMKR_D[6] –Broche 1 connecteur J5 notée ‘6’ ????
    J’ai essayé avec les schémas publiés par Arduino mais étant novice, un simple fichier texte aurait été bien utile.
    Comment accéder à ces informations plus facilement ?

  8. Gabriel Bravo Martinez dit :

    Merci beaucoup Philippe, tu as été très attentif dans toutes tes connaissances, tout s’est très bien passé !!!!

Les commentaires sont fermés.