DPUのIPを合成して、PYNQで動かしてみた

本サイトはアフィリエイト広告を利用しています。
AI

VivadoとVitisを利用して、DPUのIPを合成したプロジェクトを作りました。

KR260でPYNQ上で作成したDPUを使い、Vitis AIの物体検出(YOLOv3)をしています。

その上でKR260にて、GPIO(PWM)も一緒に動かすまでの流れを紹介します。

 

スポンサーリンク

DPUのIPを合成して、PYNQで動かしてみた

VivadoとVitisを利用して、DPUのIPを合成したプロジェクトを作りました。

KR260でPYNQ上で作成したDPUを使っています。

 

Vitis AIの物体検出(YOLOv3)をしています。

DPUと一緒にGPIO(PWM)も一緒に動かすまでの流れを紹介します。

 

まとめたテスト動画は下記となります。

 

 

作成フロー

DPUのIPを含んだプロジェクトは色々な作成方法があります。

今回のはあくまで一例です。DPUと下記フローで作成していきます。

筆者は2023.1の環境で作成しています。同様に実施する方は適宜修正をしてください。

 

①VivadoでDPUに必要なMPSoC・クロック・リセットを合成する。

②VitisでDPUを合成する。

③VivadoでGPIOやPWMなどDPU以外のIPを合成する

 

VivadoでDPUのプロジェクトを作る

Vivadoを開いて、プロジェクトを作成していきます。

最初にDPUに必要なMPSoC、クロックやリセットのIPを配置していきます。

 

Create Project

「Create Project」→適当な名前つけて進めていきます。

 

Project Typeでは、デフォルトのRTLにしています。

 

Default Partでは、Boardを選択してKR260を選びます。

 

Create Block Design

Projectファイルが出来上がります。

Create Block Designを選択して、ブロックのデザインを進めます。

 

Diagramの「+」箇所から、Zynq UltraScale+ MPSoCを選びます。

その後Run Block Automationの設定を行います。(デフォルトでOKです)

 

Diagramの「+」箇所からclockで検索して、Clocking WizardのIPを選びます。

IP選択後はクロックを100,150,200,300,400,600の6出力にして、ResetをActiveLowにしときます。

 

 

ResetのIPを用意します。Processor System Resetです。クロックと同じ5個分用意します。

Run Block Automationの設定で各6つのリセットのIPに、各5つのクロックのソースを選択します。

 

自動接続の後、更新マークの「Regenerate Layout」をするとIPが綺麗に整理されます。

その後クロックのlockedと各リセットのdcm_lockedを繋げます。

 

今回はVivadoの後にVitisでも編集します。

Setting→Generalの箇所で、「Project is an extensible Vitis platform」のチェックを入れます。

※一番最初にプロジェクトを作る際に設定してもOKです。

 

その後はWindowのタブからPlatform Setupを選択します。

 

クロックは全てEnabledにチェックを入れて、IDを0から振っていきます。

デフォルトは300MHzとしています。

 

Zynq UltraScale+ MPSoCのIPの設定で「PS-PL Configuration」の項目を開きます。

AXI HPHM0 LPDにチェックをいれます。

 

IPの検索でInterと入力して、AXI Interrupt Controllerを配置します。

下にあるInterrupt Actionを「Single」にしておきます。

 

その後Run Block Automationで繋げて、interの出力とMPSoCの入力を接続します。

 

Platform SetupでIntrにチェックを入れます。

またAXI Portも設定しておきます。SPTagまで名前を付けておきます。

これでVivadoでのDPU周りの設定が終了です。

 

これでDPUを作成に必要なクロック・リセットの作成が完了しました。

Generate Bitstreamをクリックして合成します。

 

この時点でのFPGAの使用率(Utilization)としては下記状況でした。

まだDPUやGPIO,PWMを合成していないため、全く使っていない状況です。

 

Export Platform

合成後はExport PlatformでVitis用へのPlatformを作成します。

 

「Hardware and Hardware emulation」を選択します。

 

include bitstreamの箇所にチェックを入れます。

 

プラットフォームの名前を付けて、XSAファイルを出力します。

 

デフォルトだとプロジェクトフォルダ内に.xsaファイルが出来ます。

Vitisでプラットフォームの登録する際に使います。

 

VitisでDPUを組み込む

VitisでDPUに必要なイメージ・IPをダウンロードしておきます。

 

ZYNQMP common image

下記ページから「ZYNQMP common image」をダウンロードします。

ZYNQMPとはFPGAとCPUを組み合わせたプラットフォームです。

Downloads
Vivado, Vitis, Vitis Embedded Platform, PetaLinux, Device models

 

ダウンロード後は解凍して、インストールを実行しておきます。

 

Vitis AIのRuntime

Vitis AIのRuntime パッケージもダウンロードして、ZynqMPの中に解凍します。

 

 

DPUCZDX8G

DPUCZDX8GはDPUのIPです。

今回使うKR260用のものをダウンロード・解凍します。

 

Vitisを起動してDPUのIPを登録します。

WindowsのタブからPreferencesを選択します。

 

Library Repositoriesの箇所からDPUのIPを登録します。

AddからDPUCZDX8Gの位置を指定します。

 

 

VitisでPlatformを作る

Vitisを起動して、Create Platform Projectから新規プラットフォームを作成します。

 

Vivadoで作成した,xsaファイルを選択して、LinuxをOSとして選びます。

また一番下にあるGenerate…のチェック項目は外しておきます。

 

platform.sprを選択して、上にあるビルドのアイコンをクリックします。

直ぐにPlatformのビルドが完了するはずです。

 

Vitisでプロジェクトを作る

Vitisでプロジェクトを作成していきます。

New→Application Projectを選択します。

 

先ほど作ったPlatformがあるので、選択します。

 

Applicationの名前を決めます。

 

Sysrootのパスは、用意したZYNQMPのcortexa72...を選択します。

 

DPUのIPを事前に登録したので、DPU Kernelが選択できます。

 

ここからアプリケーションの設定をしていきます。

最初に右上にあるActive build ...の項目を「Hardware」に選択します。

 

DPUのIPの数を設定します。..._hw_link.prjの箇所から設定できます。

今回は1個あれば十分なのでDPUCZDX8Gを2→1にしています。

 

DPUの設定をします。kernels→src→prj→Vitisの箇所にdpu_conf.vhがあります。

 

デフォルト設定から、URAMやDWCVなどの設定を変更しました。

下記のPYNQ-DPUの設定を参考にしました。DPUのサイズはB4096を使用しています。

 https://qiita.com/basaro_k/items/dc439ffbc3ea3aed5eb2

 https://github.com/Xilinx/DPU-PYNQ/blob/master/boards/README.md#dpu-ip

 

DPUへのクロック・AXIの設定も修正します。

Assistant箇所のHW_Linkの下にあるHardware→dpuを右クリックします。

 

V++のsettingsを修正します。デフォルトでは2個分の設定がされています。

そのため不要な2個目の箇所は#をつけて省略しています。

 

 

最後にビルドします。..._hw_link[pl]の箇所を選択して、上にあるビルドのアイコンを選択します。

おそらくPCのスペック次第ですが数十分~数時間かかります。

 

DPUのビルドは多くのメモリを使います。

CPU2個でのビルドで、16Gのメモリぐらい必要としました。

もしメモリが足りない方は、下記のように仮想メモリを増やすなどの対応をお願いします。

 

Vitisでのビルド完成後は、DPUが組み込まれたモデルをVivadoで確認します。

下記例のようにVitisのプロジェクト(***_hw_link)のHardwareの奥深くにあります。

~/***_hw_link/Hardware/dpu.build/link/vivado/vpl/prj

 

Vivadoでプロジェクトを開くと下記のようにDPUのIPが確認できます。

DPUを入れるとFPGAの使用率(Utilization)は一気に上がります。

 

VivadoでGPIOやPWMのIPを追加する

Vivadoで、DPU以外に必要なGPIOやPWMのIPを追加していきます。

今回はGPIOのIPを2個、PWMを4個追加しました。

 

KR260のPMODコネクタからモータドライバ、LED、SW、センサを制御します。

GPIO、PWMのIPの使い方は下記記事で紹介しています。

KR260とPYNQでLチカ+SW入力してみた
FPGAボードのKR260でGPIOを制御してみました。Python(PYNQ)経由でPMODコネクタからLED出力・SW入力しています。オリジナルの基板を作り、テスト動作させた内容を紹介します。KR260とPYNQでLチカ+SW入力してみ...
PWMのIPからDCモータを制御してみた(KR260+PYNQ)
FPGAボードのKR260でPWMを制御してみました。Python(PYNQ)経由でPWM出力して、モータドライバの基板を制御しています。オリジナルの基板を作り、DCモータ制御した内容を紹介します。PWMのIPからDCモータを制御してみた(...

 

Create HDL Wrapper

全てのIPが設定できたら、Sources箇所で右クリックをして、Create HDL Wrapper をします。

 

XDCファイルを作成する

ピンアサインをしていきます。

Constrainsの箇所で右クリックしてAdd Sorucesから設定します。

GPIOやTimerなど外部出力するピンがある場合はXDCファイルも設定しておきます。

 

今回はKR260のPMODに合わせた形で記載しています。

 

Generate Bitstreamから合成します。エラーなければ作成できます。

 

DPUやGPIO,PWM含めた、最終的なFPGAの使用率(Utilization)は下記になりました。

 

KR260+PYNQで作ったDPUを動かす

KR260のPYNQ上で動かすには、下記3つのファイル「.bit」「.xclbin」「.hwh」が必要です。

Vitisで作成したプロジェクト(***_hw_link)内にあります。

KR260に送れるようにコピーとリネームをします。筆者は「dpu.***」の名前にしました。

  • dpu.bit → ~/***_hw_link/Hardware/dpu.build/link/vivado/vpl/prj/prj.runs/impl_1
  • dpu.xclbin → ~/***_hw_link/Hardware
  • dpu.hwh → ~/***_hw_link/Hardware/dpu.build/link/vivado/vpl/prj/prj.gen/sources_1/bd/design_1/hw_handoff

 

KR260に必要なファイルを転送します。

 

参考までにKR260でのデフォルトの「dpu.bit」「dpu.xclbin」「dpu.hwh」は下記にあります。

/usr/local/share/pynq-venv/lib/python3.10/site-packages/pynq_dpu/

ファイル場所を指定しないと、dpuoverlayで下記場所のものが使われます。

 

 

Yoloで物体検出をして、GPIO・PWMでLチカする

あとはプログラムを実行するのみです。

実行したJupyter notebookは下記GitHubに置いています。

 https://github.com/iotengineer22/AMD-Pervasive-AI-Developer-Contest/blob/main/jupyter_notebooks/pynq-original-dpu-model/my-dpu-gpio-test.ipynb

 

PYNQ-DPUのサンプルプログラムを修正したものです。

メインに変更した箇所としては下記です。

最初にDpuoverlayで読み込んだものを、普通のoverlayにも適用しています。

 

指定の物体(Bus、Ball)が検出できれば、特定のGPIO・PWMを出力させています

 

 

冒頭でも紹介しましたが、実際のテスト動画は下記です。

 

Vitis AIの物体検出(YOLOv3)をしています。

DPUと一緒にGPIO(PWM)も一緒に動かすまでの流れを紹介します。

 

参照先

・KV260にVitis AIを組み込む(AIEDGEコンテスト対応版)

 https://qiita.com/basaro_k/items/dc439ffbc3ea3aed5eb2

毎回KV260/KR260にVitis AIを組み込むときに見させていただいてます。

 

・KV260向けにVitisプラットフォームを作成してDPUを動かす その1 (Vitis 2022.1 + Vitis-AI v2.5)

 https://qiita.com/lp6m/items/df1b87b11f8275ee6210

同じくDPU触るとき、毎回見させていただいています。

 

まとめ

KR260用にDPUとGPIOとPWMのIPを合成しました。

物体検出(Object Detect)する中で、GPIO,PWMも出力出来ました。

 

今回のKR260で実施した内容は、下記記事で紹介したテストの一部です。

AMD(Xilinx)のFPGAコンテストに参加した感想

AMD(Xilinx)のFPGAコンテストに参加した感想
AMD(Xilinx)とHackster(Avnet)が合同主催する、海外のコンテストに参加していました。AMD Pervasive AI Developer Contest の「Robotics AI」部門です。KR260というFPGAボ...

コメント