FC2カウンター FPGAの部屋 2022年04月
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

XRT でアクセラレーション・カーネルのホスト・アプリケーションを書いてみよう5

XRT でアクセラレーション・カーネルのホスト・アプリケーションを書いてみよう4”の続き。

FPGAカーネル超入門 (2)”を参照して、OpenCL コードの代わりに低レベルの XRT コードを使用して、ホスト・アプリケーションを作成してみようということで、前回は、XRT のライブラリをリンクして、ビルドを成功させることができた。今回は、vadd_xrt.bit.bin と vadd_xrt.dtbo を作成し、ファイルを KV260 に SFTP でアップデートし、動作を確認する。

system.bit から vadd_xrt.bit.bin を作成する
system.bit は kv260_custom_platform/kv260_custom_pkg/square_system/Hardware/package.build/package にある。
cd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt_system/Hardware/package.build/package
echo 'all:{system.bit}'>bootgen.bif
bootgen -w -arch zynqmp -process_bitstream bin -image bootgen.bif
mv system.bit.bin vadd_xrt.bit.bin

xrt_apli_50_220430.png
xrt_apli_51_220430.png

vadd_xrt.dtbo ファイルを用意する
pl.dtsi ファイルを編集して、pl.dtbo ファイルを再度作成する。
pl.dtsi ファイルは kv260_custom_platform/device-tree-xlnx ディレクトリにある。
pl.dtsi を開いて 16 行目の kv260_custom_platform.bit.bin を vadd_xrt.bit.bin に変更する。
xrt_apli_52_220430.png

pl.dtsi を再度コンパイルして、pl.dtbo を作成し、名前を vadd_xrt.dtbo に変更した
cd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/device-tree-xlnx
dtc -@ -O dtb -o pl.dtbo pl.dtsi
mv pl.dtbo vadd_xrt.dtbo

xrt_apli_53_220430.png

KV260 を起動して、vadd_xrt ディレクトリを作成する
KV260 の Petalinux を起動して、vadd_xrt ディレクトリを作成した。
ssh 192.168.24 -X -l petalinux
mkdir vadd_xrt
cd vadd_xrt

xrt_apli_54_220430.png

KV260 にファイルを転送する
以下のファイルをPYNQ を実行していた KV260 の ubuntu のホーム・ディレクトリに FileZilla で転送した。

kv260_custom_platform/device-tree-xlnx/vadd_xrt.dtbo
kv260_custom_platform/kv260_custom_pkg/vadd_xrt_system/Hardware/package.build/package/vadd_xrt.bit.bin
kv260_custom_platform/kv260_custom_pkg/pfm/shell.json
kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/vadd_xrt
kv260_custom_platform/kv260_custom_pkg/vadd_xrt_system/Hardware/binary_container_1.xclbin


xrt_apli_55_220430.png

ハードウェアのロード
/lib/firmware/xilinx/vadd_xrt を作成し、vadd_xrt.dtbo vadd_xrt.bit.bin shell.json を /lib/firmware/xilinx/vadd_xrt に転送する。
sudo mkdir /lib/firmware/xilinx/vadd_xrt
sudo mv vadd_xrt.dtbo vadd_xrt.bit.bin shell.json /lib/firmware/xilinx/vadd_xrt
ls -l /lib/firmware/xilinx/vadd_xrt

xrt_apli_56_220430.png

すでにロードされているハードウェアをアンロードして、vadd_xrt をロードする。
sudo xmutil listapps
sudo xmutil unloadapp
sudo xmutil loadapp vadd_xrt

xrt_apli_57_220430.png

vadd_xrt を走らせる
./vadd_xrt binary_container_1.xclbin
xrt_apli_58_220430.png

xclOpen
open xclbin: No such file or directory


エラーになってしまった。
原因は良く分からない?まずい部分があったら教えてください。よろしくお願いします。
  1. 2022年04月30日 07:42 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

XRT でアクセラレーション・カーネルのホスト・アプリケーションを書いてみよう4

XRT でアクセラレーション・カーネルのホスト・アプリケーションを書いてみよう3”の続き。

FPGAカーネル超入門 (2)”を参照して、OpenCL コードの代わりに低レベルの XRT コードを使用して、ホスト・アプリケーションを作成してみようということで、前回は、”FPGAカーネル超入門 (2)”の”4. XRTコアライブラリによるプログラミング”を Vitis 2021.1 でやっていたらビルドでエラーが発生した。今回は、エラーを解消することができてビルドが成功した。

前回のエラーは

error: invalid conversion from 'int' to 'xclVerbosityLevel'

だった。
XRT/src/runtime_src/core/include/xrt.h の xclVerbosityLevel の定義を見ると、0 は XCL_QUIET だったので、これを代入し、ビルドを行った。
するとエラーがたくさん出てしまった。
xrt_apli_36_220428.png

これは xclOpen などが無いと言われているようだ。

/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: src/vadd_xrt.o: in function `main':
/media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:64: undefined reference to `xclOpen'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:91: undefined reference to `xclLoadXclBin'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:105: undefined reference to `xclOpenContext'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:113: undefined reference to `xclAllocBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:119: undefined reference to `xclAllocBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:125: undefined reference to `xclAllocBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:132: undefined reference to `xclGetBOProperties'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:139: undefined reference to `xclGetBOProperties'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:146: undefined reference to `xclGetBOProperties'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:153: undefined reference to `xclMapBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:159: undefined reference to `xclMapBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:165: undefined reference to `xclMapBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:180: undefined reference to `xclSyncBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:185: undefined reference to `xclSyncBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:193: undefined reference to `xclAllocBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:200: undefined reference to `xclMapBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:221: undefined reference to `xclExecBuf'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:227: undefined reference to `xclExecWait'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:240: undefined reference to `xclSyncBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:257: undefined reference to `xclUnmapBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:260: undefined reference to `xclUnmapBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:263: undefined reference to `xclUnmapBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:266: undefined reference to `xclUnmapBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:269: undefined reference to `xclFreeBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:272: undefined reference to `xclFreeBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:275: undefined reference to `xclFreeBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:278: undefined reference to `xclFreeBO'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:282: undefined reference to `xclCloseContext'
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/gnu/aarch64/lin/aarch64-linux/x86_64-petalinux-linux/usr/bin/aarch64-xilinx-linux/aarch64-xilinx-linux-ld.real: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_xrt/Hardware/../src/vadd_xrt.c:286: undefined reference to `xclClose'
makefile:55: recipe for target 'vadd_xrt' failed
collect2.real: error: ld returned 1 exit status
make: *** [vadd_xrt] Error 1

05:13:05 Build Finished (took 1s.121ms)


原因としては、ライブラリが参照されていないようだ。
Vitis のライブラリ・パスとライブラリの参照を追加する。
どのライブラリを使用するか?だが、”oda-g/FPGA/xilinx/vadd/src/host/Makefile”に書いてあった。
xrt_corexrt_coreutil のようだ。
さて Vitis にライブラリを追加する。
Assistant ウインドウで vadd_xrt_system -> vadd_xrt -> Hardware を右クリックし、右クリックメニューから Settings... を選択する。
xrt_apli_38_220429.png

Build Configuration Settings ダイアログが表示される。
Edit Toolchain Linker Settings... のリンクをクリックする。
xrt_apli_39_220429.png

ライブラリ・パスを追加する。
Library search path (-L) の Add... ボタンをクリックする。
ライブラリ・パスの追加の必要はないようだ。
xrt_apli_40_220429.png

Add directory path ダイアログの Directory に /opt/xilinx/xrt/lib を追加する。
xrt_apli_42_220429.png

ライブラリを追加する。
Libraries (-l) の Add... ボタンをクリックする。
xrt_apli_43_220429.png

Enter Value ダイアログが表示される。
Libraries (-l) に xrt_core を入力する。
(注)下のダイアログの入力文字列が違っているが、xrt_core が正しい。
xrt_apli_44_220429.png

xrt_coreutil も同様に入力する。
xrt_apli_48_220429.png

これでビルドを行ったところ、ビルドが成功した。
xrt_apli_49_220429.png
  1. 2022年04月29日 12:21 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

XRT でアクセラレーション・カーネルのホスト・アプリケーションを書いてみよう3

XRT でアクセラレーション・カーネルのホスト・アプリケーションを書いてみよう2”の続き。

FPGAカーネル超入門 (2)”を参照して、OpenCL コードの代わりに低レベルの XRT コードを使用して、ホスト・アプリケーションを作成してみようということで、前回は、IP_LAYOUT、 MEM_TOPOLOGY、 CONNECTIVITY、 EMBEDDED_METADATA の 4 つのセクションの情報を確認した。今回は、”FPGAカーネル超入門 (2)”の”4. XRTコアライブラリによるプログラミング”を Vitis 2021.1 でやっていこう。

まずは、Vitis 2021.1 を落としてあるので、Vitis 2021.1 を起動するところからスタートする。
最初に設定を行ってから、Vitis を起動する。
source /media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/settings64.sh
source /media/masaaki/Ubuntu_Disk/tools/Xilinx/PetaLinux/2021.1/settings.sh
source /opt/xilinx/xrt/setup.sh
vitis &

xrt_apli_17_220428.png

Vitis IDE Launcher ダイアログが起動する。
workspace に kv260_custom_platform/kv260_custom_pkg を指定して Launch ボタンをクリックする。
xrt_apli_18_220428.png

Vitis 2021.1 が起動した。
xrt_apli_19_220428.png

Vitis 2021.1 で File メニューから New -> Application Project... を選択する。
New Application Project ダイアログの Create a New Application Project 画面が開く。
Next > ボタンをクリックする。
xrt_apli_20_220428.png

Platform 画面
kv260_custom プラットフォームを選択する。
xrt_apli_21_220428.png

Application Project Detail 画面
Application project name に vadd_xrt と入力する。
xrt_apli_22_220428.png

Domain 画面
sysroot path: に kv260_custom_platform/kv260_custom_pkg/sysroots/cortexa72-cortexa53-xilinx-linux を指定した。
Root FS: に kv260_custom_platform/kv260_custom_plnx/images/linux/rootfs.ext4 を指定した。
Kernel Image: に kv260_custom_platform/kv260_custom_plnx/images/linux/Image を指定した。
xrt_apli_23_220428.png

Templates 画面
Empty Application を選択した。
Finish ボタンをクリックした。
xrt_apli_24_220428.png

vadd_xrt プロジェクトが生成された。
xrt_apli_25_220428.png

square_system -> square_kernels -> src に krnl_vadd.cpp をインポートする。
square_system -> square_kernels -> src を右クリックし右クリックメニューから Import Sources... を選択する。
Import Sources ダイアログが表示される。
From directory: の Browse... ボタンをクリックして、 kv260_custom_platform/kv260_custom_pkg/vadd_kernels/src を選択する。
krnl_vadd.cpp のチェックボックスにチェックを入れて、Finish ボタンをクリックする。
xrt_apli_26_220428.png

vadd_xrt_kernels -> src に krnl_vadd.cpp がインポートされた。
xrt_apli_27_220428.png


次は、ホスト・アプリケーションを新規作成する。
square_system -> square -> src に vadd_xrt.c を新規作成する。
square_system -> square -> src を右クリックし右クリックメニューから New -> File を選択する。

Create New File ダイアログの File name に vadd_xrt.c を入力した。
xrt_apli_28_220428.png

vadd_xrt.c が新規作成された。
oda-g/FPGA の FPGA/xilinx/vadd/src/host/vadd_xrt.c のコードをコピーした。
xrt_apli_29_220428.png

ハードウェア化する関数を指定する。
vadd_xrt_kernels.prj で Add Hardware Function... ボタンをクリックする。
xrt_apli_30_220428.png

Add Hardware Function ダイアログが表示された。
krnl_vadd 関数を選択して、OK ボタンをクリックする。
xrt_apli_31_220428.png

krnl_vadd 関数が Hardware Functions に指定された。
xrt_apli_32_220428.png

Hardware をビルドする。
Active build configuration を Hardware にして、Explorer で vadd_xrt_system をクリックして選択し、トンカチ・ボタンをクリックしてビルドを行った。
xrt_apli_33_220428.png

ビルドが終了した。
xrt_apli_34_220428.png

vadd_xrt.c でエラーが発生した。
xrt_apli_35_220428.png

エラーの内容は次の通りだった。

../src/vadd_xrt.c:64:32: error: invalid conversion from 'int' to 'xclVerbosityLevel' [-fpermissive]


  1. 2022年04月28日 05:11 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Vivado 2022.1, Vitis 2022.1 が出ています

Vivado 2022.1, Vitis 2022.1 が出ています。

Vivado の新機能

Vitis™ の新機能

Vitis HLS の新機能で興味があるのが

”Vitis HLS で新しいパフォーマンス プラグマ (set_performance_directive) を使用して、よりスマートな構築が可能”

これ試してみたい。

When set_performance_directive is specified, the tool automatically applies pragmas or directives such as PIPELINE, UNROLL, or ARRAY_PARTITION to achieve the target_ti.

だそうです。 set_directive_performance参照
  1. 2022年04月27日 20:36 |
  2. Vivado
  3. | トラックバック:0
  4. | コメント:0

XRT でアクセラレーション・カーネルのホスト・アプリケーションを書いてみよう2

XRT でアクセラレーション・カーネルのホスト・アプリケーションを書いてみよう1”の続き。

FPGAカーネル超入門 (2)”を参照して、OpenCL コードの代わりに低レベルの XRT コードを使用して、ホスト・アプリケーションを作成してみようということで、前回は、"xclbinutil --info -i binary_container_1.xclbin"で xclbin ファイルの情報を確認した。今回は、IP_LAYOUT、 MEM_TOPOLOGY、 CONNECTIVITY、 EMBEDDED_METADATA の 4 つのセクションの情報を確認した。

xclbinutil --info -i binary_container_1.xclbin”で出力したログの Sections 部分を示す。
xrt_apli_7_220426.png

IP_LAYOUT、 MEM_TOPOLOGY、 CONNECTIVITY、 EMBEDDED_METADATA の 4 つのセクションの情報を見てみよう。
最初に IP_LAYOUT から。なおディレクトリは kv260_custom_platform/kv260_custom_pkg/vadd_system/Hardware だ。
xclbinutil --dump-section IP_LAYOUT:json:ip_layout.json -i binary_container_1.xclbin
xrt_apli_8_220426.png

ip_layout.json ファイルが生成された。
xrt_apli_9_220426.png

ip_layout.json ファイルの内容を確認した。
xrt_apli_10_220426.png

カーネルの情報、バーストアドレスやブロック・レベルのインターフェースの方式などが書いてあるようだ。

次に、MEM_TOPOLOGY の情報を確認する。
xclbinutil --dump-section MEM_TOPOLOGY:json:mem_topology.json -i binary_container_1.xclbin
xrt_apli_11_220426.png

mem_topology.json ファイルが生成された。
mem_topology.json ファイルの内容を確認した。
xrt_apli_12_220426.png

DRAM の情報が書いてあるようだ。
なんだか、HP0, HP1, HP0, HP1, HP2, HP3 という文字が見えるからAXIインターフェースのマスタ・ポートの情報なのか?

CONNECTIVITY の情報を確認する。
xclbinutil --dump-section CONNECTIVITY:json:connectivity.json -i binary_container_1.xclbin
xrt_apli_13_220426.png

connectivity.json ファイルが生成された。
connectivity.json ファイルの内容を確認した。
xrt_apli_14_220426.png

CONNECTIVITY は ”FPGAカーネル超入門 (2)”によるとカーネルのポインタ引数ということのようだ。
カーネルのソースコードの krnl_vadd.cpp の krnl_vadd 関数の定義を引用すると、ポインタ引数は *in1, *in2, *out_r の 3 つであることが分かる。

void krnl_vadd(const unsigned int *in1, // Read-Only Vector 1
          const unsigned int *in2, // Read-Only Vector 2
          unsigned int *out_r,     // Output Result
          int size                 // Size in integer
) {


最後に EMBEDDED_METADATA の情報を確認した。
xclbinutil --dump-section EMBEDDED_METADATA:raw:embedded_metadata.xml -i binary_container_1.xclbin
xrt_apli_15_220426.png

embedded_metadata.xml ファイルが生成された。
embedded_metadata.xml ファイルを貼っておく。

<?xml version="1.0" encoding="UTF-8"?>
<project name="binary_container_1">
  <platform vendor="xilinx" boardid="kv260" name="kv260_custom_platform" featureRomTime="0">
    <version major="0" minor="0"/>
    <description/>
    <board name="xilinx.com:kv260:1.1" vendor="xilinx.com" fpga="XCK26-SFVC784-2LV-C">
      <interfaces/>
      <images>
        <image name="vsom_kit.jpg" type="HDPI"/>
        <image name="" type="MDPI"/>
        <image name="" type="LDPI"/>
      </images>
      <id>
        <vendor/>
        <device/>
        <subsystem/>
      </id>
    </board>
    <build_flow/>
    <host architecture="unknown"/>
    <device name="fpga0" fpgaDevice="zynquplus:xck26:sfvc784:-2LV:c" addrWidth="0">
      <core name="OCL_REGION_0" target="bitstream" type="clc_region" clockFreq="0MHz" numComputeUnits="60">
        <kernelClocks>
          <clock port="KERNEL_CLK" frequency="199.998000MHz"/>
          <clock port="DATA_CLK" frequency="99.999000MHz"/>
        </kernelClocks>
        <kernel name="krnl_vadd" language="c" vlnv="xilinx.com:hls:krnl_vadd:1.0" preferredWorkGroupSizeMultiple="0" workGroupSize="1" debug="false" interrupt="true" hwControlProtocol="ap_ctrl_chain">
          <module name="krnl_vadd">
            <module name="krnl_vadd_Pipeline_read1" instName="grp_krnl_vadd_Pipeline_read1_fu_155" type="NonDataflowHS">
              <rtlPort name="m_axi_gmem_AWVALID" object="gmem" protocol="m_axi"/>
              <rtlPort name="sext_ln83" object="sext_ln83" protocol="ap_none"/>
              <rtlPort name="trunc_ln83_1" object="trunc_ln83_1" protocol="ap_none"/>
              <rtlPort name="v1_buffer_d0" object="v1_buffer" protocol="ap_memory"/>
            </module>
            <module name="krnl_vadd_Pipeline_vadd_writeC" instName="grp_krnl_vadd_Pipeline_vadd_writeC_fu_164" type="NonDataflowHS">
              <rtlPort name="m_axi_gmem_AWVALID" object="gmem" protocol="m_axi"/>
              <rtlPort name="sext_ln90_1" object="sext_ln90_1" protocol="ap_none"/>
              <rtlPort name="sext_ln90" object="sext_ln90" protocol="ap_none"/>
              <rtlPort name="trunc_ln83_1" object="trunc_ln83_1" protocol="ap_none"/>
              <rtlPort name="v1_buffer_q0" object="v1_buffer" protocol="ap_memory"/>
            </module>
          </module>
          <port name="M_AXI_GMEM" mode="master" range="0xFFFFFFFF" dataWidth="32" portType="addressable" base="0x0"/>
          <port name="S_AXI_CONTROL" mode="slave" range="0x1000" dataWidth="32" portType="addressable" base="0x0"/>
          <arg name="in1" addressQualifier="1" id="0" port="M_AXI_GMEM" size="0x8" offset="0x10" hostOffset="0x0" hostSize="0x8" type="void*"/>
          <arg name="in2" addressQualifier="1" id="1" port="M_AXI_GMEM" size="0x8" offset="0x1C" hostOffset="0x0" hostSize="0x8" type="void*"/>
          <arg name="out_r" addressQualifier="1" id="2" port="M_AXI_GMEM" size="0x8" offset="0x28" hostOffset="0x0" hostSize="0x8" type="void*"/>
          <arg name="size" addressQualifier="0" id="3" port="S_AXI_CONTROL" size="0x4" offset="0x34" hostOffset="0x0" hostSize="0x4" type="unsigned int"/>
          <compileWorkGroupSize x="1" y="1" z="1"/>
          <maxWorkGroupSize x="1" y="1" z="1"/>
          <string_table/>
          <instance name="krnl_vadd_1">
            <addrRemap base="0x0080010000" range="0x10000" port="S_AXI_CONTROL"/>
          </instance>
          <FIFOInformation/>
        </kernel>
        <connection srcType="core" srcInst="OCL_REGION_0" srcPort="ps8_0_axi_periph_M01_AXI" dstType="kernel" dstInst="krnl_vadd_1" dstPort="S_AXI_CONTROL"/>
        <connection srcType="core" srcInst="OCL_REGION_0" srcPort="zynq_ultra_ps_e_0_S_AXI_HP0_FPD" dstType="kernel" dstInst="krnl_vadd_1" dstPort="M_AXI_GMEM"/>
      </core>
    </device>
  </platform>
</project>


FPGAカーネル超入門 (2)”によると offset= の部分の krnl_vadd の引数のオフセット・アドレスを使用するようだ。
ちなみにこのオフセット・アドレスは、krnl_vadd の Vitis HLS の Verilog 出力ファイルを見ても分かる。
kv260_custom_platform/kv260_custom_pkg/vadd_kernels/Hardware/build/krnl_vadd/krnl_vadd/krnl_vadd/solution/syn/verilog/krnl_vadd_control_s_axi.v を見ると、Address Info として表示されている。
xrt_apli_16_220427.png
  1. 2022年04月27日 05:06 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

XRT でアクセラレーション・カーネルのホスト・アプリケーションを書いてみよう1

前回までは、アクセラレーション・カーネルを OpenCL を使用したホスト・アプリケーションで制御していたが、XRT を使用してホスト・アプリケーションを書くこともできる。
FPGAカーネル超入門 (2)”を参照して、OpenCL コードの代わりに低レベルの XRT コードを使用して、ホスト・アプリケーションを作成してみよう。

FPGAカーネル超入門 (2)”を参照して、それに沿ってやっていく。

まずは、XRT の setup.sh を起動する。
source /opt/xilinx/xrt/setup.sh
xrt_apli_1_220426.png
xrt_apli_2_220426.png

kv260_custom_platform/kv260_custom_pkg/vadd_system/Hardware ディレクトリに行くと binary_container_1.xclbin があるので、xclbinutil で情報を確認する。
cd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_system/Hardware
xclbinutil --info -i binary_container_1.xclbin

xrt_apli_5_220426.png
xrt_apli_6_220426.png

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_system/Hardware$ xclbinutil --info -i binary_container_1.xclbin
XRT Build Version: 2.6.655 (2020.1)
       Build Date: 2020-05-22 12:05:03
          Hash ID: 2d6bfe4ce91051d4e5b499d38fc493586dd4859a
------------------------------------------------------------------------------
Warning: The option '--output' has not been specified. All operations will    
         be done in memory with the exception of the '--dump-section' command.
------------------------------------------------------------------------------
Reading xclbin file into memory.  File: binary_container_1.xclbin

==============================================================================
XRT Build Version: 2.6.655 (2020.1)
       Build Date: 2020-05-22 12:05:03
          Hash ID: 2d6bfe4ce91051d4e5b499d38fc493586dd4859a
==============================================================================
xclbin Information
------------------
   Generated by:           v++ (2021.1) on 2021-06-09-14:19:56
   Version:                2.6.655
   Kernels:                krnl_vadd
   Signature:              
   Content:                Bitstream
   UUID (xclbin):          2203f5a9-f92a-40ae-8eca-9f3bf7c1e011
   Sections:               BITSTREAM, MEM_TOPOLOGY, IP_LAYOUT, CONNECTIVITY, 
                           BUILD_METADATA, EMBEDDED_METADATA, SYSTEM_METADATA
==============================================================================
Hardware Platform (Shell) Information
-------------------------------------
   Vendor:                 xilinx
   Board:                  kv260
   Name:                   kv260_custom_platform
   Version:                0.0
   Generated Version:      Vivado 2021.1 (SW Build: 3247384)
   Created:                Wed Apr 13 04:03:17 2022
   FPGA Device:            XCK26
   Board Vendor:           xilinx.com
   Board Name:             xilinx.com:kv260:1.1
   Board Part:             xilinx.com:kv260:part0:1.1
   Platform VBNV:          xilinx_kv260_kv260_custom_platform_0_0
   Static UUID:            00000000-0000-0000-0000-000000000000
   Feature ROM TimeStamp:  0

Clocks
------
   No clock frequency data available.

Memory Configuration
--------------------
   Name:         HPC0
   Index:        0
   Type:         MEM_DRAM
   Base Address: 0x0
   Address Size: 0x0
   Bank Used:    No

   Name:         HPC1
   Index:        1
   Type:         MEM_DRAM
   Base Address: 0x0
   Address Size: 0x0
   Bank Used:    No

   Name:         HP0
   Index:        2
   Type:         MEM_DRAM
   Base Address: 0x0
   Address Size: 0x80000000
   Bank Used:    Yes

   Name:         HP1
   Index:        3
   Type:         MEM_DRAM
   Base Address: 0x0
   Address Size: 0x0
   Bank Used:    No

   Name:         HP2
   Index:        4
   Type:         MEM_DRAM
   Base Address: 0x0
   Address Size: 0x0
   Bank Used:    No

   Name:         HP3
   Index:        5
   Type:         MEM_DRAM
   Base Address: 0x0
   Address Size: 0x0
   Bank Used:    No
==============================================================================
Kernel: krnl_vadd

Definition
----------
   Signature: krnl_vadd (void* in1, void* in2, void* out_r, unsigned int size)

Ports
-----
   Port:          M_AXI_GMEM
   Mode:          master
   Range (bytes): 0xFFFFFFFF
   Data Width:    32 bits
   Port Type:     addressable

   Port:          S_AXI_CONTROL
   Mode:          slave
   Range (bytes): 0x1000
   Data Width:    32 bits
   Port Type:     addressable

--------------------------
Instance:        krnl_vadd_1
   Base Address: 0x80010000

   Argument:          in1
   Register Offset:   0x10
   Port:              M_AXI_GMEM
   Memory:            HP0 (MEM_DRAM)

   Argument:          in2
   Register Offset:   0x1C
   Port:              M_AXI_GMEM
   Memory:            HP0 (MEM_DRAM)

   Argument:          out_r
   Register Offset:   0x28
   Port:              M_AXI_GMEM
   Memory:            HP0 (MEM_DRAM)

   Argument:          size
   Register Offset:   0x34
   Port:              S_AXI_CONTROL
   Memory:            <not applicable>
==============================================================================
Generated By
------------
   Command:       v++
   Version:       2021.1 - 2021-06-09-14:19:56 (SW BUILD: 3246112)
   Command Line:  v++ --advanced.misc solution_name=link --advanced.param compiler.addOutputTypes=sd_card --config binary_container_1-link.cfg --connectivity.nk krnl_vadd:1:krnl_vadd_1 --input_files ../../vadd_kernels/Hardware/build/krnl_vadd.xo --link --log_dir binary_container_1.build/logs --messageDb binary_container_1.mdb --optimize 0 --output binary_container_1.xclbin --platform /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/kv260_custom/export/kv260_custom/kv260_custom.xpfm --remote_ip_cache /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/ip_cache --report_dir binary_container_1.build/reports --report_level 0 --save-temps --target hw --temp_dir binary_container_1.build 
   Options:       --advanced.misc solution_name=link
                  --advanced.param compiler.addOutputTypes=sd_card
                  --config binary_container_1-link.cfg
                  --connectivity.nk krnl_vadd:1:krnl_vadd_1
                  --input_files ../../vadd_kernels/Hardware/build/krnl_vadd.xo
                  --link
                  --log_dir binary_container_1.build/logs
                  --messageDb binary_container_1.mdb
                  --optimize 0
                  --output binary_container_1.xclbin
                  --platform /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/kv260_custom/export/kv260_custom/kv260_custom.xpfm
                  --remote_ip_cache /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/ip_cache
                  --report_dir binary_container_1.build/reports
                  --report_level 0
                  --save-temps
                  --target hw
                  --temp_dir binary_container_1.build 
==============================================================================
User Added Key Value Pairs
--------------------------
   <empty>
==============================================================================
Leaving xclbinutil.


参照する xclbin.h はたぶんこれだと思う。

kv260_custom_platform/kv260_custom_pkg/sysroots/cortexa72-cortexa53-xilinx-linux/usr/src/debug/xrt/202110.2.11.0-r0/git/src/runtime_src/core/include/xclbin.h


xrt_apli_3_220426.png

xrt_apli_4_220426.png
  1. 2022年04月26日 04:56 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

作成した KV260 のアクセラレーション・プラットフォームを使用して square を動作させる4

作成した KV260 のアクセラレーション・プラットフォームを使用して square を動作させる3”の続き。

今まで作ってきた KV260 のアクセラレーション・プラットフォームを使用して square アプリケーションを動作させてみようということで、前回は、KV260 の Petalinux を起動して、KV260 に用意したファイルを転送し、square の動作を確かめた結果、成功した。今回は、生成された Vitis HLS 2021.1 のプロジェクトと Vivado 2021.1 のプロジェクトを見ていこう。

Vitis HLS 2021.1 のプロジェクトは /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/square_kernels/Hardware/build/square/square/square にあった。
kv260_custom_platform_167_220424.png

Vitis HLS 2021.1 の square プロジェクトを示す。
kv260_custom_platform_168_220424.png

C コードの合成結果を示す。
kv260_custom_platform_169_220424.png
kv260_custom_platform_170_220424.png
kv260_custom_platform_171_220424.png

Vivado 2021.1 の prj プロジェクトは /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/square_system_hw_link/Hardware/binary_container_1.build/link/vivado/vpl/prj にあった。
kv260_custom_platform_172_220424.png

Vivado 2021.1 の prj プロジェクトを示す。
kv260_custom_platform_173_220424.png

system ブロック・デザインを示す。
square IP が追加されている。
kv260_custom_platform_174_220424.png

Address Editor を示す。
kv260_custom_platform_175_220424.png

Project Summary を示す。
Timing の Worst Negative Slack も黒だった。
kv260_custom_platform_176_220424.png
  1. 2022年04月25日 06:09 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

作成した KV260 のアクセラレーション・プラットフォームを使用して square を動作させる3

作成した KV260 のアクセラレーション・プラットフォームを使用して square を動作させる2”の続き。

今まで作ってきた KV260 のアクセラレーション・プラットフォームを使用して square アプリケーションを動作させてみようということで、前回は、プロジェクトの準備が終了したので、ビルドを行ったが、エラーになった。エラーの原因のカーネル関数の INTERFACE 指示子を削除したところ、ビルドが成功した。それに、square.bit.bin、 vadd.dtbo ファイルを作成した。今回は、KV260 の Petalinux を起動して、KV260 に用意したファイルを転送し、square の動作を確かめた結果、成功した。

MicroSD カードを KV260 に挿入して電源 ON し、PetaLinux をブートした。

KV260 にファイルを転送する
以下のファイルをPYNQ を実行していた KV260 の ubuntu のホーム・ディレクトリに FileZilla で転送した。

kv260_custom_platform/device-tree-xlnx/square.dtbo
kv260_custom_platform/kv260_custom_pkg/square_system/Hardware/package.build/package/square.bit.bin
kv260_custom_platform/kv260_custom_pkg/pfm/shell.json
kv260_custom_platform/kv260_custom_pkg/square/Hardware/square
kv260_custom_platform/kv260_custom_pkg/square_system/Hardware/binary_container_1.xclbin


kv260_custom_platform_162_220422.png

ハードウェアのロード
/lib/firmware/xilinx/square を作成し、square.dtbo square.bit.bin shell.json を /lib/firmware/xilinx/square に転送する。
sudo mkdir /lib/firmware/xilinx/square
sudo mv square.dtbo square.bit.bin shell.json /lib/firmware/xilinx/square
ls -l /lib/firmware/xilinx/square

kv260_custom_platform_163_220422.png

すでにロードされているハードウェアをアンロードして、square をロードする。
sudo xmutil listapps
sudo xmutil unloadapp
sudo xmutil loadapp square

kv260_custom_platform_164_220422.png

ターミナルの様子を示す。
kv260_custom_platform_165_220422.png

square を走らせる
square を走らせると”TEST PASSED”が表示されて成功した。。。やった〜。
./square binary_container_1.xclbin
kv260_custom_platform_166_220422.png
  1. 2022年04月23日 04:55 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

作成した KV260 のアクセラレーション・プラットフォームを使用して square を動作させる2

作成した KV260 のアクセラレーション・プラットフォームを使用して square を動作させる1”の続き。

今まで作ってきた KV260 のアクセラレーション・プラットフォームを使用して square アプリケーションを動作させてみようということで、前回は、ハードウェア化するカーネルの square.cpp とホスト・アプリケーションの square_host.cpp を用意して、プロジェクトの組み込んだ。今回は、Emulation-HW と Hardware のビルドを行って成功した。Emulation-HW を実行したが vadd 同様にエラーだった。そして、 square.bit.bin, square.dtbo などのファイルを用意した。

前回までで、プロジェクトの準備は終了したので、ビルドを行う。

Active build configuration を Emualtion-HW にして、Explorer で square_system をクリックして選択し、トンカチ・ボタンをクリックしてビルドを行った。
kv260_custom_platform_150_220421.png

エラーが発生した。
どうやらカーネル関数の INTERFACE 指示子は Vitis 2021.1 では要らなくなったようだ。krnl_vadd を見ても関数の INTERFACE 指示子が無い。
より、ソフトウェアに書く時に近づいたと言えよう。Vitis HLS では、PIPELINE 指示子もほとんど要らないし。
kv260_custom_platform_151_220421.png

カーネル関数の INTERFACE 指示子を削除して、もう一度トンカチ・ボタンをクリックしてビルドを行い、成功した。
kv260_custom_platform_152_220421.png

それでは Emualtion-HW を起動する。
square_system を右クリックし、右クリックメニューから Run As -> Launch HW Emulator を選択する。
kv260_custom_platform_153_220421.png

Emualtion-HW を実行している。
kv260_custom_platform_154_220421.png

vadd 同様にエラーだった。
kv260_custom_platform_155_220421.png

次に Hardware を起動する。
Active build configuration を Hardware にして、Explorer で square_system をクリックして選択し、トンカチ・ボタンをクリックしてビルドを行った。
kv260_custom_platform_156_220421.png

ビルドが成功した。
kv260_custom_platform_157_220421.png

system.bit から square.bit.bin を作成する
system.bit は kv260_custom_platform/kv260_custom_pkg/square_system/Hardware/package.build/package にある。
cd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/square_system/Hardware/package.build/package
echo 'all:{system.bit}'>bootgen.bif
bootgen -w -arch zynqmp -process_bitstream bin -image bootgen.bif
mv system.bit.bin square.bit.bin

kv260_custom_platform_158_220421.png
kv260_custom_platform_159_220421.png

vadd.dtbo ファイルを用意する
pl.dtsi ファイルを編集して、pl.dtbo ファイルを再度作成する。
pl.dtsi ファイルは kv260_custom_platform/device-tree-xlnx ディレクトリにある。
pl.dtsi を開いて 16 行目の kv260_custom_platform.bit.bin を square.bit.bin に変更する。
kv260_custom_platform_160_220421.png

pl.dtsi を再度コンパイルして、pl.dtbo を作成し、名前を square.dtbo に変更した。
cd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/device-tree-xlnx
dtc -@ -O dtb -o pl.dtbo pl.dtsi
mv pl.dtbo square.dtbo

kv260_custom_platform_161_220421.png

shell.json ファイルは、””Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう11(Step 4: Test the Platform その2)”で作成したファイルがそのまま使用できるはずだ。

修正したカーネルの square.cpp のコードを貼っておく。

// square.cpp
// 2019/12/11 by marsee
//

// Vitis_Accel_Examples/cpp_kernels/dataflow_stream/src/adder.cpp を参考にしています
// https://github.com/Xilinx/Vitis_Accel_Examples/blob/master/cpp_kernels/dataflow_stream/src/adder.cpp
// 2022/04/22 : square関数のINTERFACE指示子を削除した

#include <hls_stream.h>

static void read_dma(int *inm, hls::stream<int> &outs, int size){
    LOOP_RDMA: for(int i=0; i<size; i++){
#pragma HLS PIPELINE II=1
#pragma HLS LOOP_TRIPCOUNT min=10 max=10
        outs.write(inm[i]);
    }
}

static void square_stream(hls::stream<int> &ins, hls::stream<int> &outs, int size){
    LOOP_SQAURE_ST: for(int i=0; i<size; i++){
#pragma HLS PIPELINE II=1
#pragma HLS LOOP_TRIPCOUNT min=10 max=10
        int tmp = ins.read();
        outs.write(tmp * tmp);
    }
}

static void write_dma(hls::stream<int> &ins, int *outm, int size){
    LOOP_WDMA: for(int i=0; i<size; i++){
#pragma HLS PIPELINE II=1
#pragma HLS LOOP_TRIPCOUNT min=10 max=10
        outm[i] = ins.read();
    }
}

extern "C" {
void square(int *inm, int *outm, int size){

    static hls::stream<int> ins;
    static hls::stream<int> outs;
#pragma HLS STREAM variable = ins depth = 32
#pragma HLS STREAM variable = outs depth = 32

#pragma HLS dataflow
    read_dma(inm, ins, size);
    square_stream(ins, outs, size);
    write_dma(outs, outm, size);
}
}

  1. 2022年04月22日 04:32 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

作成した KV260 のアクセラレーション・プラットフォームを使用して square を動作させる1

今まで作ってきた KV260 のアクセラレーション・プラットフォームを使用して square アプリケーションを動作させてみよう。
square はデータを 2 乗するアプリケーションだ。

square のコードは”Vitis 2019.2 アプリケーション・プロジェクト square その1”に貼ってあるので、それを使用する。

すでに前回までで Vitis 2021.1 は起動しているので、それを利用する。

Vitis 2021.1 で File メニューから New -> Application Project... を選択する。
New Application Project ダイアログの Create a New Application Project 画面が開く。
Next > ボタンをクリックする。
kv260_custom_platform_137_220421.png

Platform 画面
kv260_custom プラットフォームを選択する。
kv260_custom_platform_138_220421.png

Application Project Detail 画面
Application project name に square と入力する。
kv260_custom_platform_139_220421.png

Domain 画面
sysroot path: に kv260_custom_platform/kv260_custom_pkg/sysroots/cortexa72-cortexa53-xilinx-linux を指定した。
Root FS: に kv260_custom_platform/kv260_custom_plnx/images/linux/rootfs.ext4 を指定した。
Kernel Image: に kv260_custom_platform/kv260_custom_plnx/images/linux/Image を指定した。
kv260_custom_platform_140_220421.png

Templates 画面
Empty Application を選択した。
Finish ボタンをクリックした。
kv260_custom_platform_141_220421.png

square プロジェクトが生成された。
kv260_custom_platform_142_220421.png

2021.1 バージョンは square_kernels にカーネルを入れるようだ?
square_system -> square_kernels -> src に square.cpp を新規作成する。
square_system -> square_kernels -> src を右クリックし右クリックメニューから New -> File を選択する。
kv260_custom_platform_143_220421.png

Create New File ダイアログの File name に square.cpp を入力した。
kv260_custom_platform_144_220421.png

square.cpp が新規作成された。
Vitis 2019.2 アプリケーション・プロジェクト square その1”のコードを入力した。
kv260_custom_platform_145_220421.png

次は、ホスト・アプリケーションを新規作成する。
square_system -> square -> src に square_host.cpp を新規作成する。
square_system -> square -> src を右クリックし右クリックメニューから New -> File を選択する。

Create New File ダイアログの File name に square_host.cpp を入力した。

square_host.cpp が新規作成された。
Vitis 2019.2 アプリケーション・プロジェクト square その1”のコードを入力した。
kv260_custom_platform_146_220421.png

2019.2 に比べて square_kernels でアクセラレーションする関数を指定するようになった様だ。
square_kernels.prj で Add Hardware Function... ボタンをクリックする。
kv260_custom_platform_147_220421.png

Add Hardware Function ダイアログが表示された。
square 関数を選択して、OK ボタンをクリックする。
kv260_custom_platform_148_220421.png

square 関数が Hardware Functions に指定された。
kv260_custom_platform_149_220421.png
  1. 2022年04月21日 05:11 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう13(Step 4: Test the Platform その4)

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう12(Step 4: Test the Platform その3)”の続き。

前回は、””設計開始 Kria KV260 ビジョン AI スターター キット使用”をやってみる1”の SD カードを用意して、ファイル群をコピーして環境を整えたところ、vadd が動作した。今回は、”Step 4: Test the Platform”はもう終わりだが、vadd の生成した Vitis HLS 2021.1 と Vivado 2021.1 のプロジェクトを見ていこう。

Vitis HLS 2021.1 のプロジェクトは kv260_custom_platform/kv260_custom_pkg/vadd_kernels/Hardware/build/krnl_vadd/krnl_vadd/krnl_vadd にあった。
kv260_custom_platform_127_220420.png

Vitis HLS 2021.1 に krnl_vadd プロジェクトを読み込んだ。
kv260_custom_platform_128_220420.png

C コードの合成結果を見る。
kv260_custom_platform_129_220420.png
kv260_custom_platform_130_220420.png
kv260_custom_platform_131_220420.png

AXI4 Master インターフェースとなっている。

次に、Vivado 2021.1 のプロジェクトは、kv260_custom_platform/kv260_custom_pkg/vadd_system_hw_link/Hardware/binary_container_1.build/link/vivado/vpl/prj にあった。
kv260_custom_platform_132_220420.png

Vivado 2021.1 で prj プロジェクトを開いた。
kv260_custom_platform_133_220420.png

system ブロック・デザインを示す。
Vitis HLS で作成した krnl_vadd が実装されている。
kv260_custom_platform_134_220420.png

Address Editor を示す。
kv260_custom_platform_135_220420.png

Project Summary を示す。
kv260_custom_platform_136_220420.png
  1. 2022年04月20日 04:24 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう12(Step 4: Test the Platform その3)

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう11(Step 4: Test the Platform その2)”の続き。

Step 4: Test the Platform”をやっている。
前回は、実機で動作するための準備を行って、今まで使用していた Kria-PYNQ に FTP して動作させようとしたが、xmutil コマンドが入っていなかった。今回は、””設計開始 Kria KV260 ビジョン AI スターター キット使用”をやってみる1”の SD カードを用意して、ファイル群をコピーして環境を整えたところ、vadd が動作した。

”設計開始 Kria KV260 ビジョン AI スターター キット使用”をやってみる1”の SD カードを用意する

SD カード・イメージの petalinux-sdimage-2021.1-update1.wic.xz をすでにダウンロードしてあったので、balenaEtcher を立ち上げて Micro SD カードに書き込む。
kv260_custom_platform_118_220418.png

書き込み終了。
boot と root の 2 つのパーティションがあった。
kv260_custom_platform_119_220418.png

MicroSD カードで PetaLinux をブートする
MicroSD カードを KV260 に挿入して電源 ON し、PetaLinux をブートした。
petalinux でログインして ip addr show コマンドを実行したところ、IP アドレスは 192.168.3.24 が割り振られた。
kv260_custom_platform_120_220418.png

KV260 にファイルを転送する
以下のファイルをPYNQ を実行していた KV260 の ubuntu のホーム・ディレクトリに FileZilla で転送した。

kv260_custom_platform/device-tree-xlnx/vadd.dtbo
kv260_custom_platform/kv260_custom_pkg/vadd_system/Hardware/package.build/package/vadd.bit.bin
kv260_custom_platform/kv260_custom_pkg/pfm/shell.json
kv260_custom_platform/kv260_custom_pkg/vadd/Hardware/vadd
kv260_custom_platform/kv260_custom_pkg/vadd_system/Hardware/binary_container_1.xclbin


kv260_custom_platform_121_220418.png

ハードウェアのロード
/lib/firmware/xilinx/vadd を作成し、vadd.dtbo vadd.bit.bin shell.json を /lib/firmware/xilinx/vadd に転送する。
sudo mkdir /lib/firmware/xilinx/vadd
sudo mv vadd.dtbo vadd.bit.bin shell.json /lib/firmware/xilinx/vadd
ls -l /lib/firmware/xilinx/vadd

kv260_custom_platform_122_220418.png

すでにロードされているハードウェアをアンロードして、vadd をロードする。
sudo xmutil listapps
sudo xmutil unloadapp
sudo xmutil loadapp vadd

kv260_custom_platform_123_220418.png

vadd を走らせる
vadd を走らせたがエラーになってしまった。
./vadd binary_container_1.xclbin
kv260_custom_platform_124_220418.png

Kria KV260のVitis Custom Embedded Platform Creation Exampleを試す(4/4)”の手順をみても XRT がインストールされていないようなので、インストールする。
sudo dnf install xrt
kv260_custom_platform_125_220418.png

もう一度、vadd を走らせると”TEST PASSED”が表示されて成功した。。。やった〜。
./vadd binary_container_1.xclbin
kv260_custom_platform_126_220418.png
  1. 2022年04月19日 04:18 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう11(Step 4: Test the Platform その2)

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう10(Step 4: Test the Platform その1)”の続き。

前回は、”Step 4: Test the Platform”をやっていこうということで、Vitis 2021.1 で vadd アプリケーション・プロジェクトの作成を行った。今回は、実機で動作するための準備を行って、今まで使用していた Kria-PYNQ に FTP して動作させようとしたが、xmutil コマンドが入っていなかった。

今回は、”Step 4: Test the Platform”が分かりにくいため、”Kria KV260のVitis Custom Embedded Platform Creation Exampleを試す(4/4)”も参照した。

KV260 に転送するファイルを準備する
bin ファイルを用意する
system.bit は kv260_custom_platform/kv260_custom_pkg/vadd_system/Hardware/package.build/package にある。
kv260_custom_platform_108_220418.png

system.bit から vadd.bit.bin を作成する。
cd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg/vadd_system/Hardware/package.build/package
echo 'all:{system.bit}'>bootgen.bif
bootgen -w -arch zynqmp -process_bitstream bin -image bootgen.bif
mv system.bit.bin vadd.bit.bin

kv260_custom_platform_109_220418.png
kv260_custom_platform_110_220418.png

vadd.dtbo ファイルを用意する
pl.dtsi ファイルを編集して、pl.dtbo ファイルを再度作成する。
pl.dtsi ファイルは kv260_custom_platform/device-tree-xlnx ディレクトリにある。
kv260_custom_platform_111_220418.png

pl.dtsi を開いて 16 行目の kv260_custom_platform.bit.bin を vadd.bit.bin に変更する。
kv260_custom_platform_112_220418.png

pl.dtsi を再度コンパイルして、pl.dtbo を作成し、名前を vadd.dtbo に変更した。
cd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/device-tree-xlnx
dtc -@ -O dtb -o pl.dtbo pl.dtsi
mv pl.dtbo vadd.dtbo

kv260_custom_platform_113_220418.png

shell.json ファイルを作成する
kv260_custom_platform/kv260_custom_pkg/pfm/shell.json を作成した。

{
  "shell_type" : "XRT_FLAT",
  "num_slots": "1"
}


kv260_custom_platform_114_220418.png

kv260_custom_platform_115_220418.png

KV260 にファイルを転送する
以下のファイルをPYNQ を実行していた KV260 の ubuntu のホーム・ディレクトリに FileZilla で転送した。

kv260_custom_platform/device-tree-xlnx/vadd.dtbo
kv260_custom_platform/kv260_custom_pkg/vadd_system/Hardware/package.build/package/vadd.bit.bin
kv260_custom_platform/kv260_custom_pkg/pfm/shell.json
kv260_custom_platform/kv260_custom_pkg/vadd/Hardware/vadd
kv260_custom_platform/kv260_custom_pkg/vadd_system/Hardware/binary_container_1.xclbin


kv260_custom_platform_116_220418.png

/lib/firmware/xilinx/vadd を作成し、vadd.dtbo vadd.bit.bin shell.json を /lib/firmware/xilinx/vadd に転送する。
sudo mkdir /lib/firmware/xilinx/vadd
sudo mv vadd.dtbo vadd.bit.bin shell.json /lib/firmware/xilinx/vadd
ls -l /lib/firmware/xilinx/vadd


xmutil listapps を実行したところ、Kria-PYNQ には、xmutil が入ってなかった。
kv260_custom_platform_117_220418.png
  1. 2022年04月18日 04:24 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう10(Step 4: Test the Platform その1)

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう9(Step 3: Create the Vitis Platform その2)”の続き。

前回は、、”Step 3: Create the Vitis Platform”の残りの項目の Vitis プラットフォームを作成した。今回は、”Step 4: Test the Platform”をやっていこう。

vadd アプリケーション・プロジェクトの作成
Vitis 2021.1 で File メニューから New -> Application Project... を選択する。
New Application Project ダイアログの Create a New Application Project 画面が開く。
Next > ボタンをクリックする。
kv260_custom_platform_93_220416.png

Platform 画面
kv260_custom プラットフォームを選択する。
kv260_custom_platform_94_220416.png

Application Project Detail 画面
Application project name に vadd と入力する。
kv260_custom_platform_95_220416.png

Domain 画面
sysroot path: に kv260_custom_platform/kv260_custom_pkg/sysroots/cortexa72-cortexa53-xilinx-linux を指定した。
Root FS: に kv260_custom_platform/kv260_custom_plnx/images/linux/rootfs.ext4 を指定した。
Kernel Image: に kv260_custom_platform/kv260_custom_plnx/images/linux/Image を指定した。
kv260_custom_platform_96_220416.png

Templates 画面
Vector Addition を選択した。
Finish ボタンをクリックした。
kv260_custom_platform_97_220416.png

vadd アプリケーション・プロジェクトが生成された。
Hardware Emulation をやってみよう。
Active build configuration を Emulation-HW に変更する。
Explorer から vadd_system を選択する。
トンカチ・ボタンをクリックして、ビルドを行う。
kv260_custom_platform_98_220416.png

ビルドが成功した。
kv260_custom_platform_99_220416.png

Explorer から vadd_system を右クリックし、右クリックメニューから Run As -> Lacunch HW Emulator を選択する。
kv260_custom_platform_100_220416.png

Launch On Emulator ダイアログが表示された。
Start Emulator and Run ボタンをクリックする。
kv260_custom_platform_101_220416.png

Progress Information ダイアログが表示された。
kv260_custom_platform_102_220416.png

Xilinx Vitis IDE Error が表示された。
kv260_custom_platform_103_220416.png

Error ダイアログが表示された。
kv260_custom_platform_104_220416.png

vadd プロジェクトの様子を示す。
右下の Emulation Console には Emulation ran successfully と表示されている。
kv260_custom_platform_105_220416.png

次に、Hardware でビルドしてみよう。
Active build configuration を Hardware に変更する。
Explorer から vadd_system を選択する。
トンカチ・ボタンをクリックして、ビルドを行う。
kv260_custom_platform_106_220416.png

ビルドが成功した。
kv260_custom_platform_107_220416.png
  1. 2022年04月17日 05:07 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう9(Step 3: Create the Vitis Platform その2)

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう8(Step 3: Create the Vitis Platform その1)”の続き。

前回は、”Step 3: Create the Vitis Platform”をやっていこうということで、kv260_custom_platform ディレクトリ以下を作成し、sysroot をインストールした。また、kv260_custom_pkg/pfm ディレクトリに boot ディレクトリと sd_dir ディレクトリを新規作成し、中身をコピーした。今回は、”Step 3: Create the Vitis Platform”の残りの項目の Vitis プラットフォームを作成する。

Vitis プラットフォームを作成する
Vitis を起動する。
cd ..
vitis &

kv260_custom_platform_84_220414.png

Vitis IDE Launcher ダイアログが開いた。
Workspace に kv260_custom_platform/kv260_custom_pkg を指定して、Launch ボタンをクリックする。
kv260_custom_platform_85_220414.png

Vitis IDE が起動した。
File -> New -> Platform Project... を選択する。
New Platform Project ダイアログが開いた。
Create new platform project 画面
Platform project name に kv260_custom と入力した。
kv260_custom_platform_86_220414.png

platform 画面
XSA file に kv260_custom_platform/kv260_custom_platform/kv260_custom_platform.xsa を指定した。
Operation system に Linux を指定した。
Processor に psu_cortexa53 を指定した。
Architecture に 64-bit を指定した。
Boot Components の Generate boot components のチェックボックスのチェックを外した。
Finish ボタンをクリックした。
kv260_custom_platform_87_220414.png

kv260_custom プラットフォーム・プロジェクトが生成された。
kv260_custom_platform_88_220414.png

kv260_custom プラットフォームの psu_cortexa53 → Linux on psu_cortexa53 をクリックする。
以下のように設定する。
Bif Files: Brows... の右横の下向き三角をクリックするとドロップダウンメニューが表示されるので、Generate BIF を選択する。
Boot Components Directory: Brows... ボタンをクリックして、kv260_custom_pkg/pfm/boot ディレクトリを選択する。
FAT32 Partition Directory: Brows... ボタンをクリックして、kv260_custom_pkg/pfm/sd_dir を選択する。
kv260_custom_platform_89_220414.png

トンカチ・ボタンをクリックしてビルドを行う。
kv260_custom_platform_90_220414.png

ビルドが終了した。
kv260_custom_platform_91_220414.png

kv260_custom プラットフォームは export ディレクトリ以下に生成されている。
kv260_custom_platform_92_220414.png
  1. 2022年04月16日 04:08 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう8(Step 3: Create the Vitis Platform その1)

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう7(Step 2: Create the Software Components その3)”の続き。

前回は、”Step 2: Create the Software Components”のデバイス・ツリー・オーバーレイを生成した。今回は、”Step 3: Create the Vitis Platform”をやっていこう。

kv260_custom_platform ディレクトリの下に kv_custom_pkg ディレクトリを新規作成し、その下に pfm ディレクトリを新規作成した。
cd ..
mkdir kv260_custom_pkg
cd kv260_custom_pkg
mkdir pfm

kv260_custom_platform_74_220413.png

kv260_custom_platform_75_220413.png

sysroot をインストールする。
cd ../kv260_custom_plnx/images/linux
./sdk.sh -d /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_pkg

kv260_custom_platform_76_220413.png
kv260_custom_platform_77_220413.png

kv260_custom_platform_78_220413.png

kv260_custom_pkg/pfm ディレクトリに boot ディレクトリと sd_dir ディレクトリを新規作成する。
cd kv260_custom_pkg/pfm
mkdir boot
mkdir sd_dir

kv260_custom_platform_79_220414.png

現在のディレクトリ構造を示す。
kv260_custom_platform_80_220414.png

kv260_custom_plnx/imges/linux ディレクトリの以下のファイルを kv260_custom_pkg/pfm/boot ディレクトリにコピーする。

zynqmp_fsbl.elf
pmufw.elf
bl31.elf
u-boot-dtb.elf (名前をu-boot.elfに変更する)
system.dtb


kv260_custom_platform_81_220414.png

kv260_custom_platform_82_220414.png

kv260_custom_plnx/imges/linux ディレクトリの以下のファイルを kv260_custom_pkg/pfm/sd_dir ディレクトリにコピーする。

boot.scr (u-boot初期化用のスクリプト)
system.dtb (Linuxがシステム・セットアップを理解するために起動中に読み取るデバイス・ツリー・ブロブ)


kv260_custom_platform_83_220414.png
  1. 2022年04月15日 05:05 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう7(Step 2: Create the Software Components その3)

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう6(Step 2: Create the Software Components その2)”の続き。

Step 2: Create the Software Components”をやっている。前回は、Vivado プロジェクトでビットストリームまで生成し、XSA ファイルにビットストリームをインクルードして、PetaLinux プロジェクトを生成し、petalinux-build したところ成功した。今回は、デバイス・ツリー・オーバーレイを生成する。

DTG をインストールする。
git clone https://github.com/Xilinx/device-tree-xlnx
cd device-tree-xlnx

kv260_custom_platform_69_220413.png

DTG のバージョン 2021.1 をチェックアウトして、xsct を起動する。なお、Vitis の setting64.sh は起動してある。
git checkout xlnx_rel_v2021.1
xsct

kv260_custom_platform_70_220413.png

XSA ファイルを読み取って、DTS を生成する。
hsi open_hw_design /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_platform/kv260_custom_platform.xsa
hsi set_repo_path /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/device-tree-xlnx
hsi create_sw_design device-tree -os device_tree -proc psu_cortexa53_0
hsi set_property CONFIG.dt_overlay true [hsi::get_os]
hsi set_property CONFIG.dt_zocl true [hsi::get_os]
hsi generate_target -dir /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/device-tree-xlnx
hsi close_hw_design [hsi current_hw_design]
exit

kv260_custom_platform_71_220413.png
kv260_custom_platform_71_2_220413.png

pl.dtsi が生成された。

dtsi を dtbo にコンパイルする。
dtc -@ -O dtb -o pl.dtbo pl.dtsi
pl.dtbo が生成された。
kv260_custom_platform_73_220413.png
  1. 2022年04月14日 05:31 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう6(Step 2: Create the Software Components その2)

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう5(Step 2: Create the Software Components その1)”の続き。

前回は、”Step 2: Create the Software Components”をやってみたのだが、petalinux-build でエラーになってしまった。今回は、Vivado プロジェクトでビットストリームまで生成し、XSA ファイルにビットストリームをインクルードして、PetaLinux プロジェクトを生成し、petalinux-build したところ成功した。

なお、パソコンの OS は Ubuntu 18.04 を使用している。私のところでは、Ubuntu 20.04 だとうまくビルドできなかった。

Vivado の Flow Navigator から Generate Bitstream をクリックして、論理合成、インプリメンテーション、ビットストリームの生成を行って、成功した。
kv260_custom_platform_62_220413.png

File -> Export -> Export Platform を選択した。
Export Hardware Platform ダイアログが開く。
Next > ボタンをクリックする。
kv260_custom_platform_40_220409.png

Platform Type 画面
Hardware and Hardware Emulation ラジオボタンをクリックした。
Next > ボタンをクリックする。
kv260_custom_platform_41_220409.png

Platform State 画面
Pre-synthesis ラジオボタンをクリックする。(デフォルト)
Include bitstrem チェックボックスにチェックを入れる。
Next > ボタンをクリックする。
kv260_custom_platform_63_220413.png

Platform Properties 画面
Name に kv260_custom_platform を入力した。
後はデフォルトのままとする。
Next > ボタンをクリックする。
kv260_custom_platform_43_220409.png

Output File 画面
XSA file name に kv_custom_platform と入力した。
Finish ボタンをクリックする。
kv260_custom_platform_44_220409.png

Vivado プロジェクトのディレクトリに kv260_custom_platform.xsa ファイルが生成された。
kv260_custom_platform_45_220409.png

Step 2: Create the Software Components with PetaLinux

KV260 BSP からのノーマル・ソフトウェア・コンポーネントの生成

https://www.xilinx.com/member/forms/download/xef.html?filename=xilinx-k26-starterkit-v2021.1-final.bsp
から xilinx-k26-starterkit-v2021.1-final.bsp をダウンロードした。
kv260_custom_platform_47_220411.png

Petalinux 2021.1 の環境を設定した。
source /media/masaaki/Ubuntu_Disk/tools/Xilinx/PetaLinux/2021.1/settings.sh
kv260_custom_platform_48_220411.png

tools/Xilinx/PetaLinux/2021.1/components/yocto/source/aarch64 を入れ替える。
petalinux-upgrade -u 'http://petalinux.xilinx.com/sswreleases/rel-v2021/sdkupdate/2021.1_update1/' -p 'aarch64'
これでだめな場合は、”"ERROR: Failed to Extract Yocto SDK" after updating eSDK”に書いてある通りに
petalinux-upgrade -u 'http://petalinux.xilinx.com/sswreleases/rel-v2021/sdkupdate/2021.1_update1/' -p "aarch64" --wget-args "--wait 1 -nH --cut-dirs=4"
kv260_custom_platform_49_220411.png

Petalinux プロジェクトの作成
petalinux-create --type project -s ../../xilinx-k26-starterkit-v2021.1-final.bsp -n kv260_custom_plnx
cd kv260_custom_plnx

kv260_custom_platform_50_220411.png
ディレクトリが違っているのに注意。

echo 'BOARD_VARIANT = "kv"' >> project-spec/meta-user/conf/petalinuxbsp.conf
を実行した。

XSA ファイルを使用して petalinux-config する。
petalinux-config --get-hw-description=/media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_platform
kv260_custom_platform_51_220411.png
ディレクトリが違っているのに注意。

petalinux-config 画面
→キーを押して、< Exit > を選択して、Enter キーを押す。
kv260_custom_platform_52_220411.png

セーブ画面
< Yes > を選択して Enter キーを押す。
kv260_custom_platform_53_220411.png

ターミナルに戻った。
kv260_custom_platform_54_220411.png
ディレクトリが違っているのに注意。

rootfs の xrt を有効にする。
petalinux-config -c rootfs
kv260_custom_platform_55_220411.png

Filesystem packages -> libs -> xrt を有効にする。(スペースキー)
kv260_custom_platform_56_220411.png

→キーを押して、< Exit > を選択して、Enter キーを何回か実行し、セーブ画面で< Yes > を選択して Enter キーを押してターミナルに戻った。
kv260_custom_platform_57_220411.png
ディレクトリが違っているのに注意。

ビルド
petalinux-build
成功した。
kv260_custom_platform_64_220413.png
kv260_custom_platform_65_220413.png

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_plnx$ petalinux-build
[INFO] Sourcing buildtools
[INFO] Building project
[INFO] Sourcing build environment
[INFO] Generating workspace directory
INFO: bitbake petalinux-image-minimal
NOTE: Started PRServer with DBfile: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_plnx/build/cache/prserv.sqlite3, IP: 127.0.0.1, PORT: 38761, PID: 13011
Loading cache: 100% |                                           | ETA:  --:--:--
Loaded 0 entries from dependency cache.
Parsing recipes: 100% |##########################################| Time: 0:02:55
Parsing of 3478 .bb files complete (0 cached, 3478 parsed). 5113 targets, 269 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Fetching uninative binary shim file:///media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_plnx/components/yocto/downloads/uninative/5ec5a9276046e7eceeac749a18b175667384e1f445cd4526300a41404d985a5b/x86_64-nativesdk-libc.tar.xz;sha256sum=5ec5a9276046e7eceeac749a18b175667384e1f445cd4526300a41404d985a5b (will check PREMIRRORS first)
Initialising tasks: 100% |#######################################| Time: 0:00:11
Checking sstate mirror object availability: 100% |###############| Time: 0:01:02
Sstate summary: Wanted 3436 Found 2863 Missed 573 Current 0 (83% match, 0% complete)
NOTE: Executing Tasks
NOTE: Tasks Summary: Attempted 9672 tasks of which 7386 didn't need to be rerun and all succeeded.
INFO: Failed to copy built images to tftp dir: /tftpboot
[INFO] Successfully built project


petalinux-build --sdk
kv260_custom_platform_66_220413.png
kv260_custom_platform_67_220413.png

kv260_custom_platform/kv260_custom_plnx/images/linux ディレクトリの内容を示す。
kv260_custom_platform_68_220413.png
  1. 2022年04月13日 05:48 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう5(Step 2: Create the Software Components その1)

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう4(Step 1: Create the Vivado Hardware Design and Generate XSA その4)”の続き。

Step 1: Create the Vivado Hardware Design and Generate XSA”が終了したので、今日からは、”Step 2: Create the Software Components”をやってみたのだが、petalinux-build でエラーになってしまった。

Step 2: Create the Software Components with PetaLinux

KV260 BSP からのノーマル・ソフトウェア・コンポーネントの生成

https://www.xilinx.com/member/forms/download/xef.html?filename=xilinx-k26-starterkit-v2021.1-final.bsp
から xilinx-k26-starterkit-v2021.1-final.bsp をダウンロードした。
kv260_custom_platform_47_220411.png

Petalinux 2021.1 の環境を設定した。
source /media/masaaki/Ubuntu_Disk/tools/Xilinx/PetaLinux/2021.1/settings.sh
kv260_custom_platform_48_220411.png

tools/Xilinx/PetaLinux/2021.1/components/yocto/source/aarch64 を入れ替える。
petalinux-upgrade -u 'http://petalinux.xilinx.com/sswreleases/rel-v2021/sdkupdate/2021.1_update1/' -p 'aarch64'
kv260_custom_platform_49_220411.png

Petalinux プロジェクトの作成
petalinux-create --type project -s ../../xilinx-k26-starterkit-v2021.1-final.bsp
cd xilinx-k26-starterkit-2021.1/

kv260_custom_platform_50_220411.png

XSA ファイルを使用して petalinux-config する。
petalinux-config --get-hw-description=/media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/kv260_custom_platform
kv260_custom_platform_51_220411.png

petalinux-config 画面
→キーを押して、< Exit > を選択して、Enter キーを押す。
kv260_custom_platform_52_220411.png

セーブ画面
< Yes > を選択して Enter キーを押す。
kv260_custom_platform_53_220411.png

ターミナルに戻った。
kv260_custom_platform_54_220411.png

rootfs の xrt を有効にする。
petalinux-config -c rootfs
kv260_custom_platform_55_220411.png

Filesystem packages -> libs -> xrt を有効にする。(スペースキー)
kv260_custom_platform_56_220411.png

→キーを押して、< Exit > を選択して、Enter キーを何回か実行し、セーブ画面で< Yes > を選択して Enter キーを押してターミナルに戻った。
kv260_custom_platform_57_220411.png

ビルド
petalinux-build
エラーが発生した。
kv260_custom_platform_58_220411.png
kv260_custom_platform_59_220411.png
kv260_custom_platform_60_220411.png
kv260_custom_platform_61_220411.png

ログを貼っておく。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/xilinx-k26-starterkit-2021.1$ petalinux-build
[INFO] Sourcing buildtools
[INFO] Building project
[INFO] Sourcing build environment
[INFO] Generating workspace directory
INFO: bitbake petalinux-image-minimal
NOTE: Started PRServer with DBfile: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/xilinx-k26-starterkit-2021.1/build/cache/prserv.sqlite3, IP: 127.0.0.1, PORT: 38273, PID: 26522
Loading cache: 100% |                                           | ETA:  --:--:--
Loaded 0 entries from dependency cache.
Parsing recipes: 100% |##########################################| Time: 0:03:05
Parsing of 3478 .bb files complete (0 cached, 3478 parsed). 5113 targets, 273 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Fetching uninative binary shim file:///media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/xilinx-k26-starterkit-2021.1/components/yocto/downloads/uninative/5ec5a9276046e7eceeac749a18b175667384e1f445cd4526300a41404d985a5b/x86_64-nativesdk-libc.tar.xz;sha256sum=5ec5a9276046e7eceeac749a18b175667384e1f445cd4526300a41404d985a5b (will check PREMIRRORS first)
Initialising tasks: 100% |#######################################| Time: 0:00:11
Checking sstate mirror object availability: 100% |###############| Time: 0:01:31
Sstate summary: Wanted 3436 Found 2851 Missed 585 Current 0 (82% match, 0% complete)
NOTE: Executing Tasks
ERROR: fpga-manager-util-xilinx+gitAUTOINC+f2642103e9-r0 do_compile: Execution of '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/xilinx-k26-starterkit-2021.1/build/tmp/work/zynqmp_generic-xilinx-linux/fpga-manager-util/xilinx+gitAUTOINC+f2642103e9-r0/temp/run.do_compile.7955' failed with exit code 1:
ls: cannot access '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/xilinx-k26-starterkit-2021.1/build/tmp/work/zynqmp_generic-xilinx-linux/fpga-manager-util/xilinx+gitAUTOINC+f2642103e9-r0/recipe-sysroot/boot/bitstream/*.bit': No such file or directory


****** Xilinx Bootgen v2021.1
  **** Build date : May 28 2021-21:36:22
    ** Copyright 1986-2021 Xilinx, Inc. All Rights Reserved.

[ERROR]  : Unknown option on command line: *

WARNING: exit code 1 from a shell command.

ERROR: Logfile of failure stored in: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/xilinx-k26-starterkit-2021.1/build/tmp/work/zynqmp_generic-xilinx-linux/fpga-manager-util/xilinx+gitAUTOINC+f2642103e9-r0/temp/log.do_compile.7955
Log data follows:
| DEBUG: Executing shell function do_compile
| ls: cannot access '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/xilinx-k26-starterkit-2021.1/build/tmp/work/zynqmp_generic-xilinx-linux/fpga-manager-util/xilinx+gitAUTOINC+f2642103e9-r0/recipe-sysroot/boot/bitstream/*.bit': No such file or directory


| ****** Xilinx Bootgen v2021.1
|   **** Build date : May 28 2021-21:36:22
|     ** Copyright 1986-2021 Xilinx, Inc. All Rights Reserved.

| [ERROR]  : Unknown option on command line: *

| WARNING: exit code 1 from a shell command.
| ERROR: Execution of '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/xilinx-k26-starterkit-2021.1/build/tmp/work/zynqmp_generic-xilinx-linux/fpga-manager-util/xilinx+gitAUTOINC+f2642103e9-r0/temp/run.do_compile.7955' failed with exit code 1:
| ls: cannot access '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/xilinx-k26-starterkit-2021.1/build/tmp/work/zynqmp_generic-xilinx-linux/fpga-manager-util/xilinx+gitAUTOINC+f2642103e9-r0/recipe-sysroot/boot/bitstream/*.bit': No such file or directory


| ****** Xilinx Bootgen v2021.1
|   **** Build date : May 28 2021-21:36:22
|     ** Copyright 1986-2021 Xilinx, Inc. All Rights Reserved.

| [ERROR]  : Unknown option on command line: *

| WARNING: exit code 1 from a shell command.

ERROR: Task (/media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/xilinx-k26-starterkit-2021.1/components/yocto/layers/meta-xilinx-tools/recipes-bsp/fpga-manager-util/fpga-manager-util_1.0.bb:do_compile) failed with exit code '1'
NOTE: Tasks Summary: Attempted 8790 tasks of which 7234 didn't need to be rerun and 1 failed.

Summary: 1 task failed:
  /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/xilinx-k26-starterkit-2021.1/components/yocto/layers/meta-xilinx-tools/recipes-bsp/fpga-manager-util/fpga-manager-util_1.0.bb:do_compile
Summary: There was 1 ERROR message shown, returning a non-zero exit code.
ERROR: Failed to build project. Check the /media/masaaki/Ubuntu_Disk/KRIA_KV260/2021.1/kv260_custom_platform/xilinx-k26-starterkit-2021.1/build/build.log file for more details...

  1. 2022年04月12日 04:47 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう4(Step 1: Create the Vivado Hardware Design and Generate XSA その4)

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう3(Step 1: Create the Vivado Hardware Design and Generate XSA その3)”の続き。

KV260 のアクセラレーション・プラットフォームを作ってみたいということで、”Step 1: Create the Vivado Hardware Design and Generate XSA”をやってみている。前回は、割り込み・サポートを追加した。今回は、Platform の AXI インターフェースをイネーブルし、エミュレーション設定を行って、XSA ファイルを出力した。

Platform の AXI インターフェースをイネーブルする。
Platform Setup ウインドウを表示する。
Settings の AXI Port をクリックして、指定する。
zynq_ultra_ps_e_0 M_AXI_HPM0_FPDM_AXI_HPM1_FPD をイネーブルする。
Memport は M_AXI_GP で、 SP Tag はとする。デフォルトのままとする。
kv260_custom_platform_30_220409.png

ps8_0_axi_periph M01_AXI から M07_AXI までをイネーブルする。
Memport は M_AXI_GP で、 SP Tag はとする。デフォルトのままとする。
kv260_custom_platform_31_220409.png

zynq_ultra_ps_e_0 の以下の AXI インターフェースをイネーブルする。
S_AXI_HPC0_FPD, S_AXI_HPC1_FPD, S_AXI_HP0_FPD, S_AXI_HP1_FPD, S_AXI_HP2_FPD, S_AXI_HP3_FPD
S_AXI_HPC0_FPDS_AXI_HPC0_FPD の Memport を S_AXI_HP に変更する。
SP Tag に HPC0, HPC1, HP0, HP1, HP2, HP3 を入力する。
kv260_custom_platform_32_220409.png

エミュレーション設定(オプション)
Diagram ウインドウで zynq_ultra_ps_e_0 をクリックする。
Block Properties ウインドウで ALLOWED_SIM_MODELSrtl, tlm であることを確認する。
kv260_custom_platform_33_220409.png

SELECTED_SIM_MODELtlm に変更する。
kv260_custom_platform_34_220409.png

ハードウェア XSA ファイルを出力する。
Validate Design ボタンをクリックして、エラーが無いか?を確かめる。
すると、 /axi_intc_0/intr にエラーが出るが、問題ない。
Step 1: Create the Vivado Hardware Design and Generate XSA”の文の翻訳を引用する。

v ++リンカはカーネル割り込み信号をこのフローティングintr信号にリンクするため、この警告は無視しても問題ありません。


kv260_custom_platform_35_220409.png

ブロック・デザインをセーブする。
Sources ウインドウの system_i を右クリックし右クリックメニューから Create HDL Wrapper... を選択して HDL Wrapper を作成する。
system_wrapper.v が生成された。
kv260_custom_platform_36_220409.png

Flow Navigator から IP INTEGRATOR -> Generate Block Design をクリックする。
Synthesis Options の Global ラジオボタンをクリックする。
Generate ボタンをクリックする。
kv260_custom_platform_37_220409.png

Vivado IDE に Running multiple block runs が表示される。
kv260_custom_platform_38_220409.png

それが Ready になるまで、待っていたほうが良さそうだ。
kv260_custom_platform_39_220409.png

File -> Export -> Export Platform を選択した。
Export Hardware Platform ダイアログが開く。
Next > ボタンをクリックする。
kv260_custom_platform_40_220409.png

Platform Type 画面
Hardware and Hardware Emulation ラジオボタンをクリックした。
Next > ボタンをクリックする。
kv260_custom_platform_41_220409.png

Platform State 画面
Pre-synthesis ラジオボタンをクリックする。(デフォルト)
Next > ボタンをクリックする。
kv260_custom_platform_42_220409.png

Platform Properties 画面
Name に kv260_custom_platform を入力した。
後はデフォルトのままとする。
Next > ボタンをクリックする。
kv260_custom_platform_43_220409.png

Output File 画面
XSA file name に kv_custom_platform と入力した。
Finish ボタンをクリックする。
kv260_custom_platform_44_220409.png

Vivado プロジェクトのディレクトリに kv260_custom_platform.xsa ファイルが生成された。
kv260_custom_platform_45_220409.png

  1. 2022年04月11日 04:42 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう3(Step 1: Create the Vivado Hardware Design and Generate XSA その3)

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう2(Step 1: Create the Vivado Hardware Design and Generate XSA その2)”の続き。

KV260 のアクセラレーション・プラットフォームを作ってみたいということで、”Step 1: Create the Vivado Hardware Design and Generate XSA”をやってみている。前回は、system ブロック・デザインのクロックとリセットを作成した。今回は、割り込み・サポートを追加した。

割り込み・サポートの追加
Zynq UltraScale+ MPSoC ブロックをダブルクリックして開く。
Page Navigator から PS-PL Configuration をクリックする。
PS-PL Interface を展開して、AXI HPM0 FPDAXI HPM1 FPD のチェックボックスからチェックを外す。
AXI HPM0 LPD の チェックボックスにチェックを入れる。
AXI HPM0 LPD_Data_Width32 になっていることを確認する。
kv260_custom_platform_23_220409.png

OK ボタンwをクリックすると、ブロック・デザインに反映された。
kv260_custom_platform_24_220409.png

+ ボタンをクリックして、AXI Interrupt Controller を Add IP した。
kv260_custom_platform_25_220409.png

axi_intc_0 をダブルクリックして設定を変更する。
Interrupt Output ConnectionSingle に変更した。
kv260_custom_platform_26_220409.png

Run Connection Automation をクリックした。
kv260_custom_platform_27_220409.png

Clock Source for Slave InterfaceClock Source for Master Interface/clk_wiz_0/clk_out2(200 MHz) に接続した。
kv260_custom_platform_28_220409.png

axi_intc_0.irqzynq_ultra_ps_e_0.pl_ps_irq[0:0] に接続した。
完成したブロック・デザインを示す。
kv260_custom_platform_29_220409.png

Platform Setup ウインドウで、Settings から Interrupt をクリックした。
axi_intc_0intr のチェックボックスにチェックを入れた。
kv260_custom_platform_46_220409.png
  1. 2022年04月10日 05:38 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう2(Step 1: Create the Vivado Hardware Design and Generate XSA その2)

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう1(Step 1: Create the Vivado Hardware Design and Generate XSA その1)”の続き。

KV260 のアクセラレーション・プラットフォームを作ってみたいということで、前回から”Step 1: Create the Vivado Hardware Design and Generate XSA”をやってみている。前回は、Vivado 2021.1 の kv260_custom_platform プロジェクトを作成し、system ブロック・デザインを作成して Zynq UltraScale+ MPSoC を Add IP した。今回は、system ブロック・デザインのクロックとリセットを作成した。

system デザインのクロックとリセットを設定する
Add IP ボタンをクリックし、Clocking Wizard をブロック・デザインに追加した。
kv260_custom_platform_12_220408.png

Clocking Wizard をダブルクリックして設定する。
Output Clocks タブをクリックし、
clk_out1 を 100 MHz
clk_out2 を 200 MHz
clk_out3 を 400 MHz に設定した。
Reset Type を Active Low に設定した。
kv260_custom_platform_13_220408.png

Add IP ボタンをクリックし、Processor System Reset をブロック・デザインに追加した。
kv260_custom_platform_14_220408.png

Block Properties ウインドウで、Name を proc_sys_reset1 に変更する。
kv260_custom_platform_15_220408.png

proc_sys_reset1 を ctrl-c キーを押してコピーし、ctrl-v キーを押してペーストした。これで、proc_sys_reset2 がコピーできた。
同様に proc_sys_reset3 も追加した。
Run Connection Automation をクリックして、配線を接続する。
kv260_custom_platform_16_220408.png

Run Connection Automation ダイアログが開いた。
All Automation をクリックする。
proc_sys_reset_1 -> slowest_sync_clk の Clock Source に /clk_wiz_0/clk_out1 (100 MHz) を指定した。
kv260_custom_platform_17_220408.png

proc_sys_reset_2 -> slowest_sync_clk の Clock Source に /clk_wiz_0/clk_out2 (200 MHz) を指定した。
kv260_custom_platform_18_220408.png

proc_sys_reset_3 -> slowest_sync_clk の Clock Source に /clk_wiz_0/clk_out3 (400 MHz) を指定した。
kv260_custom_platform_19_220408.png

OK ボタンをクリックして、設定を反映した。
指定通りに配線された。
kv260_custom_platform_20_220408.png

clk_wiz_0/locked を proc_sys_reset_1, proc_sys_reset_2, proc_sys_reset_1 の dcm_locked に接続した。
kv260_custom_platform_21_220408.png

platform の clock を有効にする。

Platform Setup タブをクリックする。

左の Settings から clock をクリックして選択する。

clk_out1, clk_out2, clk_out3Enable チェックボックスをクリックする。

IDを
clk_out1 を 0
clk_out2 を 1
clk_out3 を 2 に設定する。

clk_ou2 の Is Default ラジオボタンをクリックして選択する。

Info に”Info: No problem with Clock interface.”が表示されていることを確認する。
kv260_custom_platform_22_220409.png
  1. 2022年04月09日 18:47 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”Vitis Custom Embedded Platform Creation Example on KV260”をやってみよう1(Step 1: Create the Vivado Hardware Design and Generate XSA その1)

KV260 のアクセラレーション・プラットフォームを作ってみたいということで、丁度良いチュートリアルの”Vitis Custom Embedded Platform Creation Example on KV260”を見つけたので、やってみよう。
最初に”Step 1: Create the Vivado Hardware Design and Generate XSA”からやっていこう。

Ubuntu 18.04 LTS 上で、バージョン 2021.1 を使用するので、最初に以下のコマンドを実行しておく。
source /media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2021.1/settings64.sh

Vivado 2021.1 を起動する。
Vivado &

kv260_custom_platform プロジェクトを作成する
Quick Start から Create Project をクリックして、プロジェクトを作成する。

New Project ダイアログの Create a New Vivado Project 画面が開く。
Next > ボタンをクリックした。
kv260_custom_platform_1_220408.png

Project Name 画面
Project name に kv260_custom_platform を入力した。
kv260_custom_platform_2_220408.png

Project Type 画面
RTL Project のラジオボタンはデフォルトで ON になっていた。
Do not spcify source at this timeProject is an extensible Vitis platform のチェックボックスにチェックを入れた。
kv260_custom_platform_3_220408.png

Default Part 画面
Kria KV260 Vision Starter Kit を選択した。
kv260_custom_platform_4_220408.png

New Project Summary 画面
Finish ボタンをクリックした。
kv260_custom_platform_5_220408.png

Vivado 2021.1 の kv260_custom_platform プロジェクトが生成された。
kv260_custom_platform_6_220408.png

Flow Navigator の IP INTEGRATOER -> Create Block Design をクリックした。

Create Block Design ダイアログが表示された。
Design name を system に変更した。(オプションだそうだ)
kv260_custom_platform_7_220408.png

Diagram ウインドウの真ん中の + ボタンをクリックした。
kv260_custom_platform_8_220408.png

zynq で検索して Zynq UltraScale+ MPSoC を Add IP した。
kv260_custom_platform_9_220408.png

Run Block Automation をクリックした。

Run Block Automation ダイアログが開いた。
デフォルトのまま OK ボタンをクリックした。KV260 の設定が反映された。
kv260_custom_platform_10_220408.png

Zynq UltraScale+ MPSoC に KV260 の設定が反映された。
kv260_custom_platform_11_220408.png
  1. 2022年04月08日 05:07 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Vitis 2021.1, 2021.2 の GUI で、ワークスペース設定時にエラーで落ちる

Ubuntu 18.04 LTS の Vitis 2021.1 の GUI を起動してワークスペースを設定しようとしたが、エラーダイアログを出して、落ちてしまう。また、Vitis 2021.2 も同様ということで困っていたのだが、解消することができた。

Vitis 2021.1 を起動すると、Vitis IDE Launcher が起動する。
ワークスペースを設定して Launch ボタンをクリックした。
vitis_error_1_220407.png

すると、エラーダイアログが表示された。
vitis_error_2_220407.png

.metadata/.log を表示した。
vitis_error_3_220407.png

どうやら、

java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager

ってもしかして、log4j のパッチしたからなのか?

検索していると”Eclipseが起動しないときの復旧対応方法”がヒットした。
Eclipseが起動しないときの復旧対応方法”によると、困った時は

eclipse.exe -clean

するようにとのこと。(Vitis は eclipse ですよね。。。)
Vitis のオプションを示す。

Display Options:
  -help
    Help -- display help message.

  -debug -help
    Help on Debug -- Displays help for 
    'Project less Debug in Vitis IDE support using prebuilt'.

  -version
    Display Version.

  -wait
    Wait for Vitis to complete.

Options:
  -workspace <Workspace location>
    Specify the Workspace directory for Vitis projects.
  -debug <options>
    launch vitis for debugging prebuilt binaries.
  {-lp <repository_path>}
    Add <repository_path> to the list of Driver/OS/Library search directories.
  -eclipseargs <eclipse arguments>
    Any other arguments that should be passed to Eclipse.
  -vmargs <java vm arguments>
    Any other arguments that should be passed to Java VM.


-eclipseargs で行けそう。
vitis -eclipseargs -clean &
で起動した。
vitis_error_4_220407.png

無事に Vitis GUI が立ち上がった。
vitis_error_5_220407.png

最後にエラーの時の .metadata/.log を貼っておく。

!SESSION 2022-04-07 04:07:17.365 -----------------------------------------------
eclipse.buildId=2021.1
java.version=11.0.2
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US
Command-line arguments:  -os linux -ws gtk -arch x86_64

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:07:18.413
!MESSAGE Bundle reference:file:com.xilinx.sdx.robot_1.0.0.202106100226.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:07:18.445
!MESSAGE Bundle reference:file:org.apache.log4j_1.2.15.v201012070815.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:07:18.487
!MESSAGE Bundle reference:file:org.eclipse.swtbot.generator_2.4.0.201604200752.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:07:18.488
!MESSAGE Bundle reference:file:org.eclipse.swtbot.junit4_x_2.4.0.201604200752.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:07:18.488
!MESSAGE Bundle reference:file:org.eclipse.swtbot.swt.finder_2.4.0.201604200752.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:07:18.496
!MESSAGE Bundle reference:file:org.slf4j.impl.log4j12_1.7.2.v20131105-2200.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:07:25.803
!MESSAGE Application error
!STACK 1
java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
    at com.xilinx.sdk.utils.LogUtils.<clinit>(LogUtils.java:9)
    at com.xilinx.sdk.utils.ToolAnalyticsHelper.<clinit>(ToolAnalyticsHelper.java:28)
    at com.xilinx.ide.application.ui.Application.checkInstanceLocation(Application.java:221)
    at com.xilinx.ide.application.ui.Application.start(Application.java:74)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:137)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:107)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:401)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:657)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:594)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1447)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1420)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager cannot be found by com.xilinx.sdk.utils_1.0.0.202106100226
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:516)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:171)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 17 more
!SESSION 2022-04-07 04:10:17.624 -----------------------------------------------
eclipse.buildId=2021.1
java.version=11.0.2
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US
Command-line arguments:  -os linux -ws gtk -arch x86_64

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:10:18.152
!MESSAGE Bundle reference:file:com.xilinx.sdx.robot_1.0.0.202106100226.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:10:18.158
!MESSAGE Bundle reference:file:org.apache.log4j_1.2.15.v201012070815.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:10:18.178
!MESSAGE Bundle reference:file:org.eclipse.swtbot.generator_2.4.0.201604200752.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:10:18.178
!MESSAGE Bundle reference:file:org.eclipse.swtbot.junit4_x_2.4.0.201604200752.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:10:18.178
!MESSAGE Bundle reference:file:org.eclipse.swtbot.swt.finder_2.4.0.201604200752.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:10:18.185
!MESSAGE Bundle reference:file:org.slf4j.impl.log4j12_1.7.2.v20131105-2200.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:10:22.224
!MESSAGE Application error
!STACK 1
java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
    at com.xilinx.sdk.utils.LogUtils.<clinit>(LogUtils.java:9)
    at com.xilinx.sdk.utils.ToolAnalyticsHelper.<clinit>(ToolAnalyticsHelper.java:28)
    at com.xilinx.ide.application.ui.Application.checkInstanceLocation(Application.java:221)
    at com.xilinx.ide.application.ui.Application.start(Application.java:74)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:137)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:107)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:401)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:657)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:594)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1447)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1420)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager cannot be found by com.xilinx.sdk.utils_1.0.0.202106100226
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:516)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:171)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 17 more
!SESSION 2022-04-07 04:18:28.262 -----------------------------------------------
eclipse.buildId=2021.1
java.version=11.0.2
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=en_US
Command-line arguments:  -os linux -ws gtk -arch x86_64

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:18:28.698
!MESSAGE Bundle reference:file:com.xilinx.sdx.robot_1.0.0.202106100226.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:18:28.705
!MESSAGE Bundle reference:file:org.apache.log4j_1.2.15.v201012070815.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:18:28.728
!MESSAGE Bundle reference:file:org.eclipse.swtbot.generator_2.4.0.201604200752.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:18:28.728
!MESSAGE Bundle reference:file:org.eclipse.swtbot.junit4_x_2.4.0.201604200752.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:18:28.728
!MESSAGE Bundle reference:file:org.eclipse.swtbot.swt.finder_2.4.0.201604200752.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:18:28.744
!MESSAGE Bundle reference:file:org.slf4j.impl.log4j12_1.7.2.v20131105-2200.jar not found.

!ENTRY org.eclipse.osgi 4 0 2022-04-07 04:19:50.260
!MESSAGE Application error
!STACK 1
java.lang.NoClassDefFoundError: org/apache/logging/log4j/LogManager
    at com.xilinx.sdk.utils.LogUtils.<clinit>(LogUtils.java:9)
    at com.xilinx.sdk.utils.ToolAnalyticsHelper.<clinit>(ToolAnalyticsHelper.java:28)
    at com.xilinx.ide.application.ui.Application.checkInstanceLocation(Application.java:221)
    at com.xilinx.ide.application.ui.Application.start(Application.java:74)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:137)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:107)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:401)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:657)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:594)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1447)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1420)
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.LogManager cannot be found by com.xilinx.sdk.utils_1.0.0.202106100226
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:516)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:171)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 17 more

  1. 2022年04月07日 04:41 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

KV260 の PYNQ で自作のメディアン・フィルタとソーベル・フィルタを動作させる2

KV260 の PYNQ で自作のメディアン・フィルタとソーベル・フィルタを動作させる1”の続き。

前回は、”KV260 の PYNQ で自作のソーベル・フィルタを動作させる5”のブロック・デザインに”RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成する2”で作成した median_axis_RGB24 IP を追加して、論理合成、インプリメンテーション、ビットストリームの生成を行った。今回は、生成されたビット・ファイルと hwh ファイルを KV260 上の Jupyter Notebook にアップロードし、img_filt.ipynb ファイルを作成して、動作を確認したところ動作した。

KV260 の Jupyter Notebook の my_notebooks ディレクトリの下に img_filt ディレクトリを作成した。

前回の Vivado の論理合成、インプリメンテーション、ビットストリームの生成で img_filt/img_filt.gen/sources_1/bd/img_filt/hw_handoff/img_filt.hwh ファイルと img_filt/img_filt.runs/impl_1/img_filt_wrapper.bit ファイルが生成された。
2 つのファイルを KV260 の Jupyter Notebook にアップロードし、img_filt_wrapper.bit の名前を img_filt.bit に変更した。

RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成する1”に貼ったノイズ入りの画像 test2.jpg を KV260 の Jupyter Notebook にアップロードした。
median_axis_RGB24_4_220403.jpg

KV260 の Jupyter Notebook 上に作成した img_filt.ipynb ファイルを示す。

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from pynq import allocate, Overlay

img_filter = Overlay("./img_filt.bit")

dma = img_filter.axi_dma_0
median = img_filter.median_axis_RGB24_0
sobel = img_filter.sobel_axis_RGB24_0

image_path = "./test2.jpg"
original_image = Image.open(image_path)

canvas = plt.gcf()
size = canvas.get_size_inches()
canvas.set_size_inches(size*2)

width, height = original_image.size
print("Image size: {}x{} pixels.".format(width, height))
plt.figure(figsize=(12, 10));
_ = plt.imshow(original_image)

in_buffer = allocate(shape=(height, width, 3), 
                           dtype=np.uint8, cacheable=1)
out_buffer = allocate(shape=(height, width, 3), 
                            dtype=np.uint8, cacheable=1)

in_buffer[:] = np.array(original_image)

def run_kernel():
    dma.sendchannel.transfer(in_buffer)
    dma.recvchannel.transfer(out_buffer) 
    median.write(0x00,0x01) # start
    sobel.write(0x00,0x01) # start
    dma.sendchannel.wait()
    dma.recvchannel.wait()

print(height)
print(width)

median.register_map.row_size = height
median.register_map.col_size = width
#median.register_map.function_r = 2 # ORG_IMGwAxiDma
median.register_map.function_r = 3 # MEDIANwAxiDma

sobel.register_map.row_size = height
sobel.register_map.col_size = width
#sobel.register_map.function_r = 2 # ORG_IMGwAxiDma
sobel.register_map.function_r = 3 # SOBELwAxiDma

run_kernel()
sobel_image = Image.fromarray(out_buffer)

print("Image size: {}x{} pixels.".format(width, height))
plt.figure(figsize=(12, 10));
_ = plt.imshow(sobel_image)

del in_buffer
del out_buffer


最初に

median.register_map.function_r = 3 # MEDIANwAxiDma

sobel.register_map.function_r = 3 # SOBELwAxiDma

でやってみた結果を示す。
つまり、メディアン・フィルタでノイズを除去しながら、ソーベル・フィルタでエッジを抽出する。
median_axis_RGB24_21_220406.jpg
median_axis_RGB24_22_220406.jpg
median_axis_RGB24_23_220406.jpg

成功した。

次に、

median.register_map.function_r = 2 # ORG_IMGwAxiDma

sobel.register_map.function_r = 3 # SOBELwAxiDma

でやってみた結果を示す。
つまり、メディアン・フィルタを掛けずにソーベル・フィルタでエッジを抽出する。
median_axis_RGB24_24_220406.jpg

すると、ノイズもエッジを抽出されているのが分かる。
  1. 2022年04月06日 04:27 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

KV260 の PYNQ で自作のメディアン・フィルタとソーベル・フィルタを動作させる1

KV260 の PYNQ で自作のソーベル・フィルタを動作させる5”のブロック・デザインに”RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成する2”で作成した median_axis_RGB24 IP を追加して、論理合成、インプリメンテーション、ビットストリームの生成を行った。

Vivado 2021.2 プロジェクトの img_filt ディレクトリに median_axis_RGB24 ディレクトリを作成し、”RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成する2”の solution1/impl/export.zip を展開してコピーした。
median_axis_RGB24_15_220404.png

img_filt プロジェクトで IP Catalog を表示し、median_axis_RGB24 IP を追加した。これでブロック・デザインで使用できる。
median_axis_RGB24_16_220404.png

img_filt ブロック・デザインに median_axis_RGB24 IP を追加した。
median_axis_RGB24_17_220404.png

Address Editor を示す。
median_axis_RGB24_18_220404.png

論理合成、インプリメンテーション、ビットストリームの生成を行って、成功した。
median_axis_RGB24_19_220404.png

Project Summary を示す。
median_axis_RGB24_20_220404.png
  1. 2022年04月05日 04:39 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成する2

RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成する1”の続き。

前回は、RGB 24 ビット・データ入出力対応のメディアン・フィルタ median_axis_RGB24 のソースコードとテストベンチ・コードを貼って、Vitis HLS 2021.2 で作成した median_axis_RGB24 プロジェクトを示した。今回は、RGB 24 ビット・データ入出力対応のメディアン・フィルタ median_axis_RGB24 の C シミュレーション、C コードの合成、C/RTL 協調シミュレーション、Export RTL、Implementation を行った。

まずは、テストベンチの median_axis_RGB24_tb.cpp の 18 行目の

#define MEDIANwXilinxVideoStandard

を定義した状態で C シミュレーションを行った。
median_axis_RGB24_5_220404.png

median_axis_RGB24/solution1/csim/build ディレクトリを示す。
median.jpg と org.jpg が生成されている。
median_axis_RGB24_6_220404.png

median.jpg を示す。綺麗にノイズが除去されている。
median_axis_RGB24_7_220404.jpg

次に、 median_axis_RGB24_tb.cpp の 18 行目の定義を

//#define MEDIANwXilinxVideoStandard

とコメントアウトした状態で C シミュレーションを行ったところ、定義した状態と同じ結果を得た。

C コードの合成を行った。
結果を示す。
median_axis_RGB24_8_220404.png
median_axis_RGB24_9_220404.png
median_axis_RGB24_10_220404.png
median_axis_RGB24_11_220404.png

最大の解像度は HD の 1920 ピクセル X 1080 行の 2073600 ピクセルとなる。
Latency は 2073614 クロックなので、2073614 / 2073600 ≒ 1.00 クロック/ピクセルとなった。性能的に問題無さそうだ。

C/RTL 協調シミュレーションを行った。
Latency は 480011 クロックだった。テストベンチの画像の大きさは、800 ピクセル X 600 行の 480000 ピクセルなので、これも性能は良さそうだ。
median_axis_RGB24_12_220404.png

C/RTL 協調シミュレーションの波形を示す。
median_axis_RGB24_13_220404.png

Export RTL を実行した。
median_axis_RGB24/solution1/impl ディレクトリに export.zip と ip ディレクトリが作成された。

Implementation を実行した。
結果を示す。
median_axis_RGB24_14_220404.png

問題ない。
  1. 2022年04月04日 04:35 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成する1

今まで、ソーベル・フィルタを KV260 の PYNQ で動作させてきたが、メディアン・フィルタも KV260 の PYNQ で動作させてみよう。とりあえず、RGB 24 ビット・データ入出力対応のメディアン・フィルタを Vitis HLS 2021.2 で作成することにした。今回は、RGB 24 ビット・データ入出力対応のメディアン・フィルタ median_axis_RGB24 のソースコードとテストベンチ・コードを貼って、Vitis HLS 2021.2 で作成した median_axis_RGB24 プロジェクトを示す。

2023/09/21: 修正: 出力のカラーが RBG になっていたので、RGB に修正した。

まずは、ヘッダ・ファイルから。
ORG_IMGwAxiVdma、MEDIANwAxiVdma が axi_vdma 用の定義で、ORG_IMGwAxiDma、MEDIANwAxiDma が axi_dma 用の定義となる。

// median_axis_RGB24.h
// 2022/04/02 by marsee
//

#ifndef __MEDIAN_AXIS_RGB24_H__
#define __MEDIAN_AXIS_RGB24_H__

#define ORG_IMGwAxiVdma 0
#define MEDIANwAxiVdma   1
#define ORG_IMGwAxiDma  2
#define MEDIANwAxiDma    3

#endif


ソースコードの median_axis_RGB24.cpp を示す。

// median_axis_RGB24.cpp
// 2022/04/02 by marsee
//

#include <stdint.h>
#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>

#include "median_axis_RGB24.h"

constexpr int size = 3;

void median_fil(ap_int<32> (&pix_mat)[size][size], ap_uint<24> &result);
ap_int<32> pixel_sort(ap_int<32> *y);
ap_int<32> separate_rgb(ap_int<32> rgb, ap_int<32> &r, ap_int<32> &b, ap_int<32> &g);

int median_axis_RGB24(hls::stream<ap_axiu<24,1,1,1> >& ins,
        hls::stream<ap_axiu<24,1,1,1> >& outs, int32_t function,
         int32_t row_size, int32_t col_size){
#pragma HLS INTERFACE mode=s_axilite port=col_size
#pragma HLS INTERFACE mode=s_axilite port=row_size
#pragma HLS INTERFACE mode=s_axilite port=function
#pragma HLS INTERFACE axis register_mode=both register port=outs
#pragma HLS INTERFACE axis register_mode=both register port=ins
#pragma HLS INTERFACE mode=s_axilite port=return

    ap_axiu<24,1,1,1> pix;
    ap_axiu<24,1,1,1> median;
    ap_uint<24> val;

    ap_int<32> line_buf[2][1920];
#pragma HLS array_partition variable=line_buf block factor=2 dim=1

    ap_int<32> pix_mat[size][size];
#pragma HLS array_partition variable=pix_mat complete

    LOOP_WAIT_USER : do {   // user が 1になった時にフレームがスタートする
#pragma HLS LOOP_TRIPCOUNT min=1 max=1 avg=1
        ins >> pix;
        if(function==ORG_IMGwAxiDma || function==MEDIANwAxiDma)
            break;
    } while(pix.user == 0);

    LOOP_Y: for(int y=0; y<row_size; y++){
#pragma HLS LOOP_TRIPCOUNT avg=600 max=1080 min=48
        LOOP_X: for(int x=0; x<col_size; x++){
#pragma HLS LOOP_TRIPCOUNT avg=800 max=1920 min=64
#pragma HLS PIPELINE II=1
            if (!(x==0 && y==0))    // 最初の入力はすでに入力されている
                ins >> pix; // AXI4-Stream からの入力

            LOOP_PIX_MAT_K: for(int k=0; k<3; k++){
                LOOP_PIX_MAT_M: for(int m=0; m<2; m++){
                    pix_mat[k][m] = pix_mat[k][m+1];
                }
            }
            pix_mat[0][2] = line_buf[0][x];
            pix_mat[1][2] = line_buf[1][x];
            ap_int<32> y_val = pix.data;
            pix_mat[2][2] = y_val;

            line_buf[0][x] = line_buf[1][x];    // 行の入れ替え
            line_buf[1][x] = y_val;

            median_fil(pix_mat, val);
            median.data = val;
            if(x<2 || y<2)
                median.data = 0;

            if(function==ORG_IMGwAxiVdma || function == MEDIANwAxiVdma){
                if(x==0 && y==0) // 最初のピクセル
                    median.user = 1;
                else
                    median.user = 0;
                if(x == (col_size-1)) // 行の最後
                    median.last = 1;
                else
                    median.last = 0;
            }else{
                median.user = 0;
                median.last = pix.last;
            }
            median.keep = 0x7;
            median.strb = 0x7;
            if(function==MEDIANwAxiVdma || function==MEDIANwAxiDma)
                outs << median;
            else
                outs << pix;
        }
    }
    return(0);
}

// median filter
//
// x0y0 x1y0 x2y0
// x0y1 x1y1 x2y1
// x0y2 x1y2 x2y2
//
void median_fil(ap_int<32> (&pix_mat)[size][size], ap_uint<24> &result){
    ap_int<32> pix_1d_r[9], pix_1d_b[9], pix_1d_g[9];
    ap_int<32> y_r, y_b, y_g, y;

    for(int i=0; i<9; i++){
        separate_rgb(pix_mat[i/3][i%3], pix_1d_r[i], pix_1d_b[i], pix_1d_g[i]);
    }

    y_r = pixel_sort(pix_1d_r);
    y_b = pixel_sort(pix_1d_b);
    y_g = pixel_sort(pix_1d_g);

    result = (y_r << 16) + (y_g << 8) + y_b;
}

// pixel_sort()
// bubble sort
// ”メジアン(中央値)、範囲(レンジ)、ヒストグラムを求める”参照
// https://cgengo.sakura.ne.jp/arg04.html
ap_int<32> pixel_sort(ap_int<32> *y){
#pragma HLS ARRAY_PARTITION variable=y dim=1 complete
    ap_int<32> tmp;

    for(int i=1; i<9; i++){
        for(int j=0; j<9-i; j++){
            if(y[j] < y[j+1]){
                tmp = y[j];
                y[j] = y[j+1];
                y[j+1] = tmp;
            }
        }
    }
    return(y[4]);
}

// separate_rgb
// RGBを分離する
// RGBのフォーマットは、{R(8bits), B(8bits), G(8bits)}, 1pixel = 32bits
//
ap_int<32> separate_rgb(ap_int<32> rgb, ap_int<32> &r, ap_int<32> &b, ap_int<32> &g){
    b = rgb & 0xff;
    g = (rgb>>8) & 0xff;
    r = (rgb>>16) & 0xff;
    return(0);
}


テストベンチの median_axis_RGB24_tb.cpp を示す。

// median_axis_RGB24_tb.cpp
// 2022/04/03 by marsee
// MEDIANwXilinxVideoStandard を define すると axi_vdma 用となり、コメントアウトすると axi_dma 用になる
//

#include <stdio.h>
#include <stdint.h>
#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"

#include "median_axis_RGB24.h"

//#define MEDIANwXilinxVideoStandard

constexpr int size = 3;

int median_axis_RGB24(hls::stream<ap_axiu<24,1,1,1> >& ins,
        hls::stream<ap_axiu<24,1,1,1> >& outs, int32_t function,
         int32_t row_size, int32_t col_size);
int median_axis_RGB24_soft(hls::stream<ap_axiu<24,1,1,1> >& ins,
        hls::stream<ap_axiu<24,1,1,1> >& outs, int32_t function,
         int32_t row_size, int32_t col_size);
void median_fil_soft(ap_int<32> (&pix_mat)[size][size], ap_uint<24> &result);
ap_int<32> pixel_sort_soft(ap_int<32> *y);
ap_int<32> separate_rgb_soft(ap_int<32> rgb, ap_int<32> &r, ap_int<32> &b, ap_int<32> &g);

const char INPUT_JPG_FILE[] = "test2.jpg";
const char OUTPUT_JPG_FILE[] = "median.jpg";
const char ORG_OUT_JPG_FILE[] = "org.jpg";

int main(){
    hls::stream<ap_axiu<24,1,1,1> > ins, ins2;
    hls::stream<ap_axiu<24,1,1,1> > ins_soft;
    hls::stream<ap_axiu<24,1,1,1> > outs, outs2;
    hls::stream<ap_axiu<24,1,1,1> > outs_soft;
    ap_axiu<24,1,1,1> pix;
    ap_axiu<24,1,1,1> vals, vals_soft;

    // JPG ファイルをMat に読み込む
    cv::Mat img = cv::imread(INPUT_JPG_FILE);

    // ピクセルを入れる領域の確保
    std::vector<int32_t> rd_bmp(sizeof(int32_t)*img.cols*img.rows);
    std::vector<int32_t> hw_median(sizeof(int32_t)*(img.cols)*(img.rows));
    std::vector<int32_t> sw_median(sizeof(int32_t)*(img.cols)*(img.rows));

    // rd_bmp にJPGのピクセルを代入
    cv::Mat_<cv::Vec3b> dst_vec3b = cv::Mat_<cv::Vec3b>(img);
    for (int y=0; y<img.rows; y++){
        for (int x=0; x<img.cols; x++){
            cv::Vec3b pixel;
            pixel = dst_vec3b(y,x);
            rd_bmp[y*img.cols+x] = (pixel[0] & 0xff) | ((pixel[1] & 0xff)<<8) | ((pixel[2] & 0xff)<<16); // RGB 8 bits
            // blue - pixel[0]; green - pixel[1]; red - pixel[2];
        }
    }

#ifdef MEDIANwXilinxVideoStandard
    // ins に入力データを用意する
    for(int i=0; i<5; i++){ // dummy data
        pix.user = 0;
        pix.data = i;
        pix.last = 0;
        pix.user = 0;
        pix.keep = 0x7;
        pix.strb = 0x7;
        ins << pix;
    }
#endif

    for(int j=0; j < img.rows; j++){
        for(int i=0; i < img.cols; i++){
            pix.data = (int32_t)rd_bmp[(j*img.cols)+i];
#ifdef MEDIANwXilinxVideoStandard
            if (j==0 && i==0)   // 最初のデータの時に TUSER を 1 にする
                pix.user = 1;
            else
                pix.user = 0;

            if (i == img.cols-1) // 行の最後でTLASTをアサートする
                pix.last = 1;
            else
                pix.last = 0;
#else
            if(j==img.rows-1 && i==img.cols-1)
                pix.last = 1;
            else
                pix.last = 0;
            pix.user = 0;
#endif
            pix.keep = 0x7;
            pix.strb = 0x7;

            ins << pix;
            ins2 << pix;
            ins_soft << pix;
        }
    }

#ifdef MEDIANwXilinxVideoStandard
    median_axis_RGB24(ins, outs, MEDIANwAxiVdma, img.rows, img.cols); // ハードウェアのメディアンフィルタ
    median_axis_RGB24_soft(ins_soft, outs_soft, MEDIANwAxiVdma, img.rows, img.cols);  // ソフトウェアのメディアンフィルタ
#else
    median_axis_RGB24(ins, outs, MEDIANwAxiDma, img.rows, img.cols); // ハードウェアのメディアンフィルタ
    median_axis_RGB24_soft(ins_soft, outs_soft, MEDIANwAxiDma, img.rows, img.cols);  // ソフトウェアのメディアンフィルタ
#endif

    // ハードウェアとソフトウェアのメディアンフィルタの値のチェック
    for (int y=0; y<img.rows; y++){ // 結果の画像サイズはx-2, y-2
        for (int x=0; x<img.cols; x++){
            outs >> vals;
            outs_soft >> vals_soft;
            ap_uint<32> val = vals.data;
            hw_median[y*img.cols+x] = (int32_t)val;
            if (val != vals_soft.data){
                printf("ERROR HW and SW results mismatch x = %ld, y = %ld, HW = %x, SW = %x\n",
                        x, y, val, vals_soft.data);
                return(1);
            }
        }
    }
    printf("Success HW and SW results match\n");

    const int median_row = img.rows;
    const int median_cols = img.cols;
    cv::Mat wbmpf(median_row, median_cols, CV_8UC3);
    // wbmpf にmedian フィルタ処理後の画像を入力
    cv::Mat_<cv::Vec3b> sob_vec3b = cv::Mat_<cv::Vec3b>(wbmpf);
    for (int y=0; y<wbmpf.rows; y++){
        for (int x=0; x<wbmpf.cols; x++){
            cv::Vec3b pixel;
            pixel = sob_vec3b(y,x);
            int32_t rbg = hw_median[y*wbmpf.cols+x];
            pixel[0] = ((rbg >> 8) & 0xff); // blue
            pixel[1] = (rbg & 0xff); // green
            pixel[2] = ((rbg >> 16) & 0xff); // red
            sob_vec3b(y,x) = pixel;
        }
    }

    // ハードウェアのメディアンフィルタの結果を jpg ファイルへ出力する
    cv::imwrite(OUTPUT_JPG_FILE, wbmpf);

#ifdef MEDIANwXilinxVideoStandard
    median_axis_RGB24(ins2, outs2, ORG_IMGwAxiVdma, img.rows, img.cols); // ハードウェアのメディアンフィルタ
#else
    median_axis_RGB24(ins2, outs2, ORG_IMGwAxiDma, img.rows, img.cols); // ハードウェアのメディアンフィルタ
#endif

    cv::Mat wbmpf2(median_row, median_cols, CV_8UC3);
    // wbmpf2 に元画像を入力
    sob_vec3b = cv::Mat_<cv::Vec3b>(wbmpf2);
    for (int y=0; y<wbmpf.rows; y++){
        for (int x=0; x<wbmpf.cols; x++){
            cv::Vec3b pixel;
            pixel = sob_vec3b(y,x);
            outs2 >> vals;
            int32_t val = vals.data;
            pixel[0] = (val & 0xff); // blue
            pixel[1] = ((val >> 8) & 0xff); // green
            pixel[2] = ((val >> 16) & 0xff); // red
            sob_vec3b(y,x) = pixel;
        }
    }

    // 元画像を jpg ファイルへ出力する
    cv::imwrite(ORG_OUT_JPG_FILE, wbmpf2);

    return(0);
}

int median_axis_RGB24_soft(hls::stream<ap_axiu<24,1,1,1> >& ins,
        hls::stream<ap_axiu<24,1,1,1> >& outs, int32_t function,
         int32_t row_size, int32_t col_size){

    ap_axiu<24,1,1,1> pix;
    ap_axiu<24,1,1,1> median;
    ap_uint<24> val;

    ap_int<32> line_buf[2][1920];

    ap_int<32> pix_mat[size][size];

    LOOP_WAIT_USER : do {   // user が 1になった時にフレームがスタートする
        ins >> pix;
        if(function==ORG_IMGwAxiDma || function==MEDIANwAxiDma)
            break;
    } while(pix.user == 0);

    for(int y=0; y<row_size; y++){
        for(int x=0; x<col_size; x++){
            if (!(x==0 && y==0))    // 最初の入力はすでに入力されている
                ins >> pix; // AXI4-Stream からの入力

            LOOP_PIX_MAT_K: for(int k=0; k<3; k++){
                LOOP_PIX_MAT_M: for(int m=0; m<2; m++){
                    pix_mat[k][m] = pix_mat[k][m+1];
                }
            }
            pix_mat[0][2] = line_buf[0][x];
            pix_mat[1][2] = line_buf[1][x];
            ap_int<32> y_val = pix.data;
            pix_mat[2][2] = y_val;

            line_buf[0][x] = line_buf[1][x];    // 行の入れ替え
            line_buf[1][x] = y_val;

            median_fil_soft(pix_mat, val);
            median.data = val;
            if(x<2 || y<2)
                median.data = 0;

            if(function==ORG_IMGwAxiVdma || function == MEDIANwAxiVdma){
                if(x==0 && y==0) // 最初のピクセル
                    median.user = 1;
                else
                    median.user = 0;
                if(x == (col_size-1)) // 行の最後
                    median.last = 1;
                else
                    median.last = 0;
            }else{
                median.user = 0;
                median.last = pix.last;
            }
            median.keep = 0x7;
            median.strb = 0x7;
            if(function==MEDIANwAxiVdma || function==MEDIANwAxiDma)
                outs << median;
            else
                outs << pix;
        }
    }
    return(0);
}

// median filter
//
// x0y0 x1y0 x2y0
// x0y1 x1y1 x2y1
// x0y2 x1y2 x2y2
//
void median_fil_soft(ap_int<32> (&pix_mat)[size][size], ap_uint<24> &result){
    ap_int<32> pix_1d_r[9], pix_1d_b[9], pix_1d_g[9];
    ap_int<32> y_r, y_b, y_g, y;

    for(int i=0; i<9; i++){
        separate_rgb_soft(pix_mat[i/3][i%3], pix_1d_r[i], pix_1d_b[i], pix_1d_g[i]);
    }

    y_r = pixel_sort_soft(pix_1d_r);
    y_b = pixel_sort_soft(pix_1d_b);
    y_g = pixel_sort_soft(pix_1d_g);

    result = (y_r << 16) + (y_g << 8) + y_b;
}

// pixel_sort()
// bubble sort
// ”メジアン(中央値)、範囲(レンジ)、ヒストグラムを求める”参照
// https://cgengo.sakura.ne.jp/arg04.html
ap_int<32> pixel_sort_soft(ap_int<32> *y){
#pragma HLS ARRAY_PARTITION variable=y dim=1 complete
    ap_int<32> tmp;

    for(int i=1; i<9; i++){
        for(int j=0; j<9-i; j++){
            if(y[j] < y[j+1]){
                tmp = y[j];
                y[j] = y[j+1];
                y[j+1] = tmp;
            }
        }
    }
    return(y[4]);
}

// separate_rgb
// RGBを分離する
// RGBのフォーマットは、{R(8bits), B(8bits), G(8bits)}, 1pixel = 32bits
//
ap_int<32> separate_rgb_soft(ap_int<32> rgb, ap_int<32> &r, ap_int<32> &b, ap_int<32> &g){
    b = rgb & 0xff;
    g = (rgb>>8) & 0xff;
    r = (rgb>>16) & 0xff;
    return(0);
}


test2.jpg を示す。
median_axis_RGB24_4_220403.jpg

Vitis HLS 2021.2 の median_axis_RGB24 プロジェクトを示す。KV260 用だ
median_axis_RGB24_1_220403.png

今回のテストベンチ・コードでは OpenCV ライブラリを使用している。
Vitis HLS 2021.1 には内蔵された OpenCV は無いので、別にインストールした OpenCV を指定する。
Vitis HLS の Project メニューから Project Settings... を選択して、Project Settings ダイアログを開いた。
Simulation タブを開いて、median_axis_RGB24_tb.cpp の CFLAGS に

-I/usr/local/include


を設定した。
Linker Flags に

-L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_imgproc


を設定した。
median_axis_RGB24_2_220403.png

更に、 Synthesis をクリックして、 Top Function に median_axis_RGB24 を指定した。
median_axis_RGB24_3_220403.png
  1. 2022年04月03日 05:39 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

FreeCAD で 2D 図面を書く

FreeCAD で 2D 図面を書いているが、特に穴のセンター・マークを出す方法を忘れて苦労したので、ブログに書いておく。
なお、Ubuntu 18.04 で FreeCAD 0.19 を使用している。
Ubuntu への FreeCAD のインストールについては、”FreeCAD Linux でのインストール方法”を参照した。

参考にしている記事は”FreeCAD チュートリアル テックドローワークベンチ初歩(1/3)”だ。

まずは、3D 図面を書いた。3t のアルミ板のつもりだ。
FreeCad_1_220401.png

TechDraw に変更して、”テンプレートを使用してページを挿入”を選択し、Select a Template File ダイアログで「A4_LandscapeTD.svg」を選択してテンプレートを追加する。

”ビューを挿入”アイコンをクリックして、現在の 3D のビューを 2D 図面に表示する。(注:もう図面は完成している)
FreeCad_2_220401.png

寸法は入っていないので、水平寸法を挿入、垂直寸法を挿入、直径寸法を挿入などのアイコンを使用して、寸法を入れていく。
その際に穴のセンターを表示する必要がある。その方法を忘れてしまった。
その方法は、表の”ビュー”を選択する。
Arc Center Mark の値を true にする。
FreeCad_3_220401.png

これで 2d 図面が作成できる。
  1. 2022年04月01日 04:16 |
  2. CADツール
  3. | トラックバック:0
  4. | コメント:0