[PYTHON] J'ai commencé PYNQ (2) -Overlay self-made-

introduction

L'utilisation de la superposition existante semble avoir été introduite dans d'autres articles, alors sautez-la et passez au suivant. Donc, cette fois, je vais créer ma propre superposition dans le prolongement de Dernière fois. Cette vidéo ~~ Paku ~~ Référez-vous-y et faites une superposition de c = a + b.

Qu'est-ce que la superposition

La partie circuit logique de PYNQ-Z1 peut être gérée à partir d'un programme comme s'il s'agissait d'une bibliothèque (?). Pour plus de détails, accédez à Officiel.

Environnement d'exécution

Le téléchargement seul sera de 10 Go, et une fois terminé, il sera proche de 50 Go, vous devriez donc travailler dessus avec suffisamment de temps et de stockage. Cette fois, j'ai utilisé Webpack (version gratuite).

procédure

Ici, essayons un circuit qui ne fait que c = a + b selon le tutoriel.

Implémentation de l'additionneur

Tout d'abord, préparez un circuit qui n'ajoute que le FPGA.

1. Lancer un nouveau projet

  1. Démarrez Vivado HLS.
  2. Dans Configuration du projet, spécifiez le nom du projet comme additionneur et l'emplacement selon le cas. (** Si le japonais est inclus dans le chemin, une erreur peut survenir plus tard **)
  3. Dans ʻAdd Remove Files (1st) `, entrez add dans TopFunction pour créer NewFile-> adder.cpp
  4. Ignorez le deuxième «Add Remove Files» et procédez
  5. Lorsque vous atteignez Configuration de la solution, recherchez et sélectionnez Sélection de pièce-> xc7z020clg400-1
  6. Appuyez sur Terminer pour créer un projet

2. la mise en oeuvre

Une fois qu'un nouveau projet est créé, il sera mis en œuvre.

  1. Double-cliquez sur Source-> adder.cpp dans l'onglet Explorateur sur le côté gauche de l'écran
  2. Entrez le code suivant (https://pynq.readthedocs.io/en/v2.1/overlay_design_methodology/overlay_tutorial.html)

adder.cpp


void add(int a, int b, int& c) {
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS INTERFACE s_axilite port=a
#pragma HLS INTERFACE s_axilite port=b
#pragma HLS INTERFACE s_axilite port=c

    c = a + b;
}

3. 3. Exécuter

Appuyez sur la «flèche verte» en haut à gauche de l'image ci-dessous. image.png Si tout se passe bien, vous devriez voir un écran comme celui-ci. image.png

Quatre. Jetez un œil à l'adresse

Les fichiers suivants sont générés dans solution-> impl-> misc-> drivers-> add_v1_0-> src-> xadd_hw.h dans l'onglet Explorateur. image.png Si vous regardez cela, vous pouvez voir la table de correspondance entre les variables et les adresses.

variable adresse
a 0x10
b 0x18
c 0x20

Cinq. Exportation

C'est à droite de la flèche verte plus tôt![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382909/68a02ee2-8fda-1a21 Cliquez simplement sur -b767-839ce80ccd4b.png) et appuyez sur ʻOK`.

Implémentation de superposition

Configurer la superposition en utilisant l''adder 'créé précédemment

0. Ajout de PYNQ-Z1

Étant donné que les informations de PYNQ-Z1 ne sont pas enregistrées dans le pack Web Vivado, téléchargez les données depuis ici. Je l'ai utilisé. Décompressez-le et copiez-le dans C: \ Xilinx \ Vivado \ 2019.2 \ data \ boards \ board_files etc.

1. Création de projet

  1. Lancez Vivado
  2. Sélectionnez Créer un projet
  3. Lorsque Créer un nouveau projet Vivado s'affiche, cliquez sur Suivant.
  4. Cette fois, définissez «Nom du projet» sur «projet_1» et sélectionnez un dossier approprié pour «Emplacement».
  5. Sélectionnez «Projet RTL» pour «Type de projet». image.png
  6. Sélectionnez «Pièce par défaut» -> «Carte» -> «PYNQ-Z1».
  7. Lorsque le "Résumé du nouveau projet" s'affiche, créez un projet avec "Terminer".

2. Créer

Nous continuerons à travailler sur Vivado.

  1. Sélectionnez ʻIP INTEGRATOR-> Create Block Design` sur le côté gauche de l'écran et appuyez sur OK dans la fenêtre contextuelle.
  2. Cliquez sur «+» et sélectionnez «Rechercher» -> «Système de traitement ZYNQ7»![Image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/ 0/382909 / f3a0eba1-de3f-6758-118d-59f0bbf1ea66.png)
  3. Run Block Automation -> OKimage.png
  4. Depuis Tools sur l'écran, allez dans Setting-> ʻIP-> Repository, appuyez sur +, et sélectionnez / ajoutez le dossier ʻadder que vous avez créé précédemment. image.png
  5. Revenez à l'écran d'origine et ajoutez cette fois «ajouter». Changez également le nom de ʻadd_0 en scalar_add`. image.png
  6. Appuyez sur Run Connection Automation. image.png
  7. Enregistrez (Ctrl + S) et cliquez avec le bouton droit de la souris sur Sources-> design_1-> Create HDL Wrapper-> ʻOK`![Image.png](https: // qiita-image-store. s3.ap-northeast-1.amazonaws.com/0/382909/d7dd5a93-4a5a-1a3f-5412-d1cf83d8c2f8.png)
  8. Depuis la navigation sur le côté gauche de l'écran, passez à PROGRAMME ET DÉBOGAGE-> Générer Bitstream-> Oui-> ʻOK`.
  9. File -> Export -> Export Block Design -> OKimage.png

Transfert de superposition

Maintenant que vous avez créé un ensemble de fichiers, copiez-les sur PYNQ-Z1 et exécutez-les.

Préparation du dossier

Copiez les deux fichiers suivants dans le dossier du projet.

Renommez-les en ʻadder.bit, ʻadder.hwh et ʻadder.tcl` pour une meilleure compréhension.

Connectez-vous à PYNQ

Entrez \\ pynq dans la partie URL de l'Explorateur pour falsifier le dossier interne. L'identifiant et le mot de passe sont tous deux «xilinx». image.png

Placement des fichiers

Créez un nouveau répertoire ʻadderdansNetwork / pynq / xylinx / pynq / overlay et copiez ʻadder.bit, ʻadder.hwh et ʻadder.tcl.

Essayez d'utiliser Overlay de Python

Préparation de Jupyter

Accédez à [http: // pynq: 9090](http: // pynq: 9090) et connectez-vous à jupyter (ID / mot de passe est xylinx). Après la connexion, créez une nouvelle note Python3 à partir de Nouveau sur l'écran d'accueil et ouvrez-la.

Essaie

Suivez ensuite le Officiel.

Première lecture.

In[1]


from pynq import Overlay

overlay = Overlay('/home/xilinx/pynq/overlays/adder/adder.bit')

Dans les deux suivants, chaque utilisation est affichée sous forme de texte.

In[2]


overlay?

In[3]


add_ip = overlay.add_0
add_ip?

Calculons «4 + 5».

In[4]


add_ip.write(0x10, 4)
add_ip.write(0x18, 5)
add_ip.read(0x20)    #Est sortie comme 9

C'est pareil.

In[5]


add_ip.register_map.a = 3
add_ip.register_map.b = 4
add_ip.register_map.c

finalement

Cela a fonctionné pour le moment. La prochaine fois, j'aimerais faire quelque chose comme accélérer le tableau par un traitement parallèle.

Recommended Posts

J'ai commencé PYNQ (2) -Overlay self-made-
J'ai commencé Python
J'ai commencé Docker
J'ai commencé, mais ça ne démarre pas!
J'ai étudié la superposition de l'arborescence des appareils