Pratique avec une nouvelle carte FPGA Arduino: MKR Vidor 4000 | shoppingmaroc.net


Hackaday vous a apporté un premier coup d'oeil sur l'Arduino MKR Vidor 4000 quand il a annoncé. Arduino a envoyé l'une des premières planches alors maintenant nous en avons finalement les mains! Il est tôt et la documentation est encore un peu éparse, mais nous l'avons fait fonctionner pour faire passer le tableau à travers quelques exercices de bonjour. Cet article ira au-delà de ce que nous avons pu comprendre sur le système FPGA jusqu'à présent pour vous aider à démarrer avec le nouveau matériel.

Juste pour rafraîchir votre mémoire, voici ce qui est sur la carte Vidor: [19659003] 8 Mo SRAM

  • Une puce Flash QSPI de 2 Mo – 1 Mo allouée aux applications utilisateur
  • Un connecteur Micro HDMI
  • Un connecteur caméra MIPI
  • Wi-Fi et BLE alimenté par un U-BLOX NINA Périphérique série W10
  • Interface MKR sur laquelle toutes les broches sont pilotées à la fois par SAMD21 (CPU ARM 32 bits) et FPGA
  • Connecteur Mini PCI Express avec jusqu'à 25 broches programmables par l'utilisateur
  • Le FPGA (Intel / Altera Cyclone 10CL016) contient 16K éléments logiques, 504 KB de RAM intégrée, et 56 multiplicateurs HW 18 × 18 bits
  • Ça sonne bien. Vous pouvez obtenir plus de détails techniques gores sur Arduino et il y a même un schéma (.zip).

    Documentation

    La documentation est – jusqu'à présent – très difficile à trouver mais l'équipe travaille pour changer cela par jour. Voici les ressources que nous avons utilisées jusqu'à présent (en plus du schéma):

    En outre, Arduino vient de sortir un exemple de projet FPGA pour Quartus . Je vais expliquer ce que cela signifie dans un peu.

    Lancez-vous avec l'IDE Arduino Desktop

    Malgré le guide de démarrage, il ne semble pas que les bibliothèques soient utilisables depuis l'IDE basé sur le cloud, donc nous suivi les instructions pour charger le support de la carte bêta pour le MKR 4000 dans notre IDE de bureau. Sachez que les instructions montrent le paquet de carte SAMD "normal", mais vous voulez en fait la bêta qui dit que c'est pour le MKR 4000. Si vous recherchez SAMD dans la boîte de dialogue Boards Manager, vous le trouverez (voir la deuxième entrée dans l'image ci-dessous).

    Les bibliothèques que nous avons récupérées en tant que fichiers ZIP de GitHub et utilisaient la bibliothèque d'installation à partir de l'option de fichier ZIP sans problème. La partie la plus intéressante de ce forum est bien sûr l'inclusion du FPGA qui nous a laissé se demander à quoi ressemblerait le code de l'appareil. En parcourant le code, nous étions un peu consternés par l'absence de commentaires dans tout le code JTAG. Nous avons décidé de nous concentrer d'abord sur le référentiel VidorPeripherals et de creuser dans le fichier d'en-tête pour trouver des indices sur la façon dont tout fonctionne.

    En regardant VidorPeripherals.h vous pouvez voir qu'il y a quelques périphériques d'E / S inclure SPI, I2C, UART, lire un encodeur en quadrature, et NeoPixel. Il y a aussi quelques en-têtes qui n'existent pas (et n'auront vraisemblablement pas la définition pour les activer) alors ne soyez pas trop excités par certains noms de fichiers d'en-tête jusqu'à ce que vous soyez sûr qu'ils sont vraiment là.

    Ensuite, nous avons décidé d'essayer l'exemple de code de test . La bibliothèque fournit un objet FPGA global que vous devez configurer:

     // Commençons par initialiser le FPGA
    if (! FPGA.begin ()) {
        Serial.println ("L'initialisation a échoué!");
        alors que (1) {}
    }
    
    // Voyons quelle version nous utilisons
    int version = FPGA.version ();
    Serial.print ("Vidor bitstream version:");
    Serial.println (version, HEX);
    
    // Demandons également quelles adresses IP sont incluses dans ce flux binaire
    FPGA.printConfig (); 

    La sortie de ce bit de code ressemble à ceci:

     Vidor bitstream version: 1020107
    nombre d'appareils 9
    1 01000000 MB_DEV_SF
    1 02000000 MB_DEV_GPIO
    4 04000000 MB_DEV_I2C
    6 05000000 MB_DEV_SPI
    8 06000000 MB_DEV_UART
    1 08000000 MB_DEV_SDRAM
    4 09000000 MB_DEV_NP
    11 0A000000 MB_DEV_ENC
    0 0B000000 MB_DEV_REG
    
    

    Dans de nombreux cas, les périphériques fournis par le FPGA sont assez transparents. Par exemple, voici un autre extrait de l'exemple de code:

     // Ok, donc nous savons maintenant que le FPGA contient l'IP GPIO étendu
    // Les pins GPIO contrôlés par le FPGA démarrent à partir de 100
    // Veuillez vous référer à la documentation en ligne pour l'affectation réelle des broches
    // Configurons la broche A0 comme sortie, contrôlée par le FPGA
    FPGA.pinMode (33, OUTPUT);
    FPGA.digitalWrite (33, HIGH);
    
    // La même broche peut être lue par le processeur SAMD 🙂
    pinMode (A0, INPUT);
    Serial.print ("Pin A0 est");
    Serial.println (digitalRead (A0) == LOW? "LOW": "HIGH");
    
    FPGA.digitalWrite (33, LOW);
    Serial.print ("Pin A0 est");
    Serial.println (digitalRead (A0) == LOW?: "HIGH": "HIGH"); 

    C'est assez facile et c'est bien que les broches soient utilisables depuis le CPU et FPGA. Nous n'avons pas pu trouver la documentation qui mappe les broches, mais nous supposons qu'elle arrive.

    L'utilisation, disons, d'une interface série supplémentaire est également facile:

     SerialFPGA1.begin (115200);
    tandis que (! SerialFPGA1);
    SerialFPGA1.println ("test"); 

    Bitstream

    Alors, où est le code FPGA? Pour autant que vous le sachiez, il s'agit juste d'un nouvel Arduino avec beaucoup de périphériques supplémentaires qui se connectent à travers cet objet FPGA mystérieux. L'astuce est que le code FPGA est dans la bibliothèque. Pour voir comment cela fonctionne, parlons un peu de la façon dont fonctionne un FPGA.

    Lorsque vous écrivez un programme en C, ce n'est pas vraiment ce que l'ordinateur regarde, n'est-ce pas? Le compilateur le convertit en un tas de nombres qui indiquent au processeur de faire les choses. Un FPGA est à la fois le même et différent de cela. Vous écrivez votre programme – généralement dans un langage de conception matérielle comme Verilog ou VHDL. Vous le compilez en nombres, mais ces nombres ne sont pas exécutés comme le ferait un processeur.

    La meilleure analogie à laquelle j'ai pu penser est qu'un FPGA est comme un de ces vieux Radio Shack 100-in-1. kits électroniques. Il y a un tas de pièces sur une carte et un moyen de les connecter avec des fils. Mettez les fils dans un sens et vous avez une radio. Mettez-les d'une autre façon et vous avez une alarme antivol. Rebranchez-le et vous avez un détecteur de métal. Les chiffres correspondent à des fils. Ils établissent des connexions et configurent des options dans les circuits du FPGA. Sauf si vous avez construit un CPU, il n'y a rien là-dedans qui examine et agit sur les nombres comme avec un CPU.

    Les nombres qui sortent d'un outil FPGA sont généralement appelés bitstream. Quelqu'un doit envoyer ce flux binaire à un FPGA comme le Cyclone à bord de l'Arduino à chaque fois qu'il se met sous tension. Cette personne est généralement un périphérique de mémoire sur la carte, bien que le CPU puisse le faire aussi.

    Donc, cela conduit à deux questions: Où est le flux de bits? Comment ça arrive au FPGA?

    La réponse à la première question est facile. Si vous regardez sur Github, vous verrez dans la bibliothèque un fichier appelé VidorBase.cpp . Il a les lignes suivantes:

     __ attribute__ ((used, section (". Fpga_bitstream")))
    const unsigned char bitstream [] = {
        #include "app.ttf"
    }; 

    Qu'est-ce que cela signifie s'il y a un tableau appelé bitstream que l'éditeur de liens va mettre dans une section spécialement marquée de la mémoire. Ce tableau est initialisé avec app.ttf qui est juste un fichier ASCII complet de nombres. Malgré le nom, ce n'est pas une police TrueType. Que signifient les numéros? Difficile à dire, bien que, en théorie, vous puissiez l'inverser comme vous pouvez le faire pour un CPU. Cependant, c'est la configuration requise pour faire tous les appels de bibliothèque dont nous venons de parler.

    La deuxième question sur la façon dont cela se passe dans la configuration FPGA est un peu un mystère. Autant que nous puissions le dire, le bootloader comprend que les données de cette section doivent être copiées dans la mémoire de configuration du FPGA et faire la copie pour vous. Il n'est pas clair s'il y a une copie dans le flash principal et une copie dans la configuration flash mais cela semble fonctionner de toute façon.

    Une somme de contrôle est définie dans le code mais nous l'avons modifiée et tout a fonctionné. Vraisemblablement, à un certain point, l'IDE ou le bootloader se plaindra si vous avez la mauvaise somme de contrôle, mais cela ne semble pas être le cas maintenant.

    En passant, selon le forum Arduino, il y a réellement deux trains de bits . Celui qui charge sur power-up que vous changeriez rarement (si jamais). Puis il y en a un autre qui est celui inclus avec la bibliothèque. Vous pouvez double-cliquer sur le bouton de réinitialisation pour entrer en mode bootloader et nous suspectons que le FPGA soit initialisé avec le premier train de bits, mais nous ne le savons pas à coup sûr. En mode bootloader, cependant, la LED rouge à bord a un effet de respiration donc vous pouvez dire que le double clic fonctionne

    Qu'en est-il de mon code FPGA?

    Ce n'est pas une bonne nouvelle Si vous espériez un moyen facile Arduino de faire votre propre développement FPGA en Verilog ou VHDL. Intel vous donnera une copie de Quartus Prime qui générera des bitstreams toute la journée pour vous. Nous pensons – mais nous ne sommes pas sûrs – que le format ASCII est juste une conversion brute du binaire des fichiers bitstream.

    Très récemment, Arduino a fourni un projet Quartus qui créerait un flux binaire. Cela fournit quelques pièces clés du puzzle, comme le fichier de contraintes qui permet au compilateur FPGA de trouver les différentes parties sur la carte.

    Cependant, même avec ce projet, vous avez encore du reverse engineering à faire si vous voulez obtenir commencé. Pourquoi? Voici ce que dit Arduino à propos du chargement de votre propre code FPGA (nous avons ajouté l'accent):

    Quartus produira un ensemble de fichiers sous le répertoire output_files dans le dossier du projet. Afin d'intégrer le FPGA dans le code Arduino, vous devez créer une bibliothèque et pré-traiter le fichier ttf généré par Quartus afin qu'il contienne les en-têtes appropriés requis par l'infrastructure logicielle. Les détails de ce processus seront divulgués dès que le flux sera stable

    La programmation du FPGA est possible de différentes manières:

    • Clignote l'image avec le code Arduino créant une bibliothèque qui incorpore le ttf file
    • Programmation de l'image dans la RAM via USB Blaster (ceci nécessite le montage de l'en-tête FPGA JTAG). ceci peut être fait en toute sécurité seulement quand SAM D21 est en mode bootloader comme dans d'autres conditions il peut accéder à JTAG et provoquer une contention
    • Programmation de l'image en RAM via le USB Blaster émulé via SAM D21 ( ce composant est en attente de publication )

    En outre, le référentiel lui-même indique que certaines pièces clés sont manquantes jusqu'à ce qu'elles puissent établir des licences ou nettoyer le code. Donc, cela nous rapproche, mais vous auriez toujours besoin d'inverser l'en-tête des exemples et / ou de comprendre comment forcer le processeur hors du bus JTAG. La bonne nouvelle, c'est que cette information semble venir, elle n'est tout simplement pas encore là.

    Bien sûr, vous allez avoir besoin de comprendre beaucoup plus pour faire quelque chose d'important. Nous savons que le FPGA est défini dans le mode de configuration AS. Nous avons aussi interrogé Arduino sur l'architecture de l'horloge et ils nous ont dit:

    [The CPU] a sa propre horloge qui est utilisée pour générer une horloge de référence de 48 MHz qui est envoyée au FPGA (et qui peut être enlevée à tout moment) temps de "geler" fpga). En plus de cette horloge de référence, le FPGA possède un oscillateur RC interne qui ne peut pas être utilisé comme [a] référence de synchronisation précise pour les problèmes de tolérance, mais peut être utilisé si vous ne voulez pas que [the CPU] produise la référence clock

    Bien sûr, le FPGA a un certain nombre de PLL à bord qui peuvent prendre n'importe quelle horloge valide et produire d'autres fréquences. Par exemple, dans l'application de vision, a démontré Arduino, l'horloge de 48 MHz est convertie en horloges 24 MHz, 60 MHz, 100 MHz et 120 MHz par des PLL

    Mix and Match?

    Une chose qui est décevante est que – au moins pour l'instant – vous ne serez pas en mesure de mélanger et de faire correspondre différentes bibliothèques FPGA. Il y a exactement un train de bits et vous ne pouvez pas les coincer ensemble. Bien que les FPGA puissent souvent être partiellement configurés, c'est une technique difficile. Mais nous étions un peu surpris que l'IDE ne comprenne pas comment prendre des bibliothèques avec, par exemple, des fichiers de conception EDIF pour IP qui seraient tous compilés ensemble. De cette façon, je pourrais choisir l'Arduino UART et le mélanger avec le module de sortie Hackaday PWM avec mon propre Verilog ou VHDL.

    La façon dont les choses sont structurées maintenant vous aurez un train de bits précompilé par un autre outil (probablement Quartus pour le un avenir prévisible). Cela correspond à une bibliothèque C ++ particulière. Et c'est tout. Peu importe la quantité de FPGA restante ou la quantité de FPGA réellement utilisée, vous l'utiliserez tous pour la bibliothèque.

    Bien sûr, vous pouvez charger une autre bibliothèque mais elle va remplacer la première un. Ainsi, vous ne disposez que d'un ensemble de fonctions à la fois et quelqu'un d'autre peut décider ce qu'il y a dans cet ensemble. Si vous lancez le vôtre, vous devrez rouler le vôtre tout le long

    Et ensuite?

    Il est encore tôt pour l'Arduino Vidor. Nous espérons que nous aurons les outils et les procédures nécessaires pour laisser tomber nos propres configurations de FPGA. Ce serait formidable, aussi, si les bibliothèques de stock étaient disponibles dans le format source, y compris le Verilog HDL. La version récente de GitHub montre un peu, bien que ce ne soit pas tous les exemples, il est probablement suffisant si nous obtenons le reste de l'information.

    Quant à une interface plus intuitive, nous ne savons pas si c'est dans les cartes ou non. Nous ne voyons pas beaucoup de preuves de cela, bien que les messages sur le forum Arduino indiquent qu'ils fourniront éventuellement un "IP Assembler" qui vous permettra de composer différents modules en un seul flux binaire. Nous ne savons pas si cela fonctionnera uniquement avec des modules "officiels" ou non. Cependant, nous savons que la communauté Arduino est très débrouillarde, donc si nous n'obtenons pas un bon écosystème, cela ne nous surprendra pas si quelqu'un d'autre le fait. Finalement,

    Pour l'instant, nous continuerons à jouer avec les trains de bits existants qui deviennent disponibles. Il y a aussi de nouvelles fonctionnalités sur le CPU. Par exemple, vous pouvez mapper deux modules série inutilisés. Il existe une capacité multitâche coopérative basée sur le matériel . Au fur et à mesure que plus de détails sur le FPGA apparaîtront, nous vous tiendrons au courant et si vous apprenez quelque chose, assurez-vous de laisser un mot dans les commentaires afin que tout le monde puisse en bénéficier.


    Arduino Maroc
    Acheter Arduino ICI

    Source

    Laisser un commentaire

    Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *