皆さん、こんにちは。「ノリさん」です!
今回はVivadoでKR260のハードウェアデザインを作って動作させていきます。
Step0:ハードウェア要件
- Vivado・Vitis・PetaLinuxの入ったPC(バージョンは2022.1、OSはLinuxを想定)
各々のハードウェア要件については下記を参照- Vivado : https://docs.xilinx.com/r/2022.1-%E6%97%A5%E6%9C%AC%E8%AA%9E/ug973-vivado-release-notes-install-license/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A6%81%E4%BB%B6
- Vitis : https://docs.xilinx.com/r/2022.1-Japanese/ug1393-vitis-application-acceleration/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E8%A6%81%E4%BB%B6
- PetaLinux : https://docs.xilinx.com/r/2022.1-English/ug1144-petalinux-tools-reference-guide/Installation-Requirements
- KR260 Robotics Starter Kit
- KR260用電源(KR260 Robotics Starter Kit に付属)
- USB-A to micro-B ケーブル(KR260 Robotics Starter Kit に付属)
- 16GBマイクロSDカード(KR260 Robotics Starter Kit に付属)
Step1:Vivado ハードウェア デザインの作成
Vivadoを起動(<Vitis_Install_Directory> には Vitis のインストールされた場所を指定)
source <Vitis_Install_Directory>/settings64.sh vivado &
Quick Startから、Create Project を選択して、Next をクリック
Project Name に kr260_custom_platform と入力し、Next をクリック
Project is an extensible Vitis platform にチェックを入れ、Next をクリック
注: 既存の Vivado プロジェクトを拡張可能なプラットフォーム プロジェクトに変更する場合、Flow Navigator の Settings に移動し、General に移動してproject is an extensible Vitis platformをチェック
Boards タブを選択
Refresh をクリックして、ボードの情報を最新のものにする
Kria KR260 Robotics Starter Kit を選択して、Next をクリック
project summary を確認し、問題なければ、Finish をクリック
画面左側の IP INTEGRATOR の下の Project Manager の下にある、Create Block Design をクリック
OK をクリック
画面中央の Diagram ビューの空白の部分を右クリックし、Add IP を選択
検索窓に zynq と打ち込み、Zynq UltraScale+ MPSoC をダブルクリックして追加
Block Automation をクリックして、次のチェックボックスにチェックが入っていることを確認し、OK をクリック
- All Automation
- Zynq_ultra_ps_e_0
- Apply Board Presets
次の図のようになっていることを確認
Diagram ビューを右クリックし、Add IP を選択
Clocking Wizard を検索、追加
clk_wiz_0 IP ブロックをダブルクリックして、Re-Customize IP ダイアログ ボックスを開く
Output Clocks に移動し、次の図のように設定して、OKをクリック
Diagram ビューを右クリックし、Add IP を選択して、Processor System Reset を検索、追加
リセット モジュールとクロック信号の関係を理解しやすいよう、追加したProcessor System Reset の名前をproc_sys_reset_1に変更
Processor System Reset をクリックすると、Blocks Property から名前が変更できる
proc_sys_reset_1 ブロックを選択し、Ctrl-C と Ctrl-V を入力して proc_sys_reset_2 を複製
zynq_ultra_ps_e_0 の pl_resetn0 と clk_wiz_0 のresetを接続
Run Connection Automation から、All Automation を有効に
proc_sys_resetインスタンスごとに、 slowest_sync_clkを選択し、クロック ソースを次のように設定
proc_sys_reset_1と/clk_wiz_0/clk_out1
proc_sys_reset_2と/clk_wiz_0/clk_out2
各 proc_sys_reset インスタンスで ext_reset_inを選択し、Select Manual Sourceを/zynq_ultra_ps_e_0/pl_resetn0 に設定してOKをクリック
Diagram ビューを右クリックし、Regenerate Layout を選択して、デザインを整形
次の図のようになっていることを確認
Platform Setup から、Clock を選択して、次の図のようにする
(AXI Port 、Interrupt は後程設定、Platform Name は自動的に設定される)
Diagram ビューに戻り、Zynq UltraScale+ MPSoCブロックをダブルクリック
PS-PL Configuration → PS-PL interfaces → Master interfaceを選択
AXI HPM0 LPDオプションを有効にし、AXI HPM0 FPDおよびAXI HPM1 FPD を無効にする
OK をクリックして構成を終了
AXI Interrupt Controller を検索、追加
AXI Interrupt Controller ブロックをダブルクリックし、PS IRQ インターフェースに接続できるように Interrupt Output Connection を Single に変更し、OK をクリック
Connection Automation をクリック
次の図のように設定して OK をクリック
axi_intc_0.irq を zynq_ultra_ps_e_0.pl_ps_irq[0:0] に接続
Platform Setup → Interrupt から、 intr under axi_intc_0 を有効化
デザインを整形して、次の図のようになっていることを確認
Platform Setup → AXI Interface から、設定を次の図のように変更
Flow Navigatorウィンドウで Settings を選択し、Synthesis タブに移動
incremental synthesis の横にある3つのドットをクリックし、次の図のようにして OK をクリック
ポップアップ画面が出たら、Yes → OK を選択
Step2:ペリフェラルの追加
Zynq UltraScale+ MPSoC ブロックをダブルクリックし、I/O Configuration → Low Speed → I/O Peripherals → I2C から、I2C1を有効化し、I/O を MIO 24 .. 25 とする
同様に、I/O Peripherals → UART から、UART1 を有効化し、I/O を MIO 36 .. 37 とする
Processing Unit → TTC → TTC0 から、Waveout を有効化し、I/O を EMIO にする
High Speed → GEM から、GEM 0 、GEM 1 、MDIO 1 を有効化し、それぞれ I/O をGT Lane 0 、MIO 38 .. 49 、MIO 50 .. 51 とする
同様に、High Speed → USB から、次の図のように設定
Display Port から、Lane Selection を Single Lower にする
PS-PL Configuration → General → Fabric Reset Enable から、 Number of Fabric Resets を 4 に変更
OKをクリックして、設定を反映させる
デザインに Slice IP を加え、それをダブルクリックして、次の図のように設定して、OK をクリック
xslice_0 のDin を Zynq MPSoC IP の emio_ttc0_wave_o に接続
xslice_0 のDout を右クリックして、Make External を選択
デザインを整形して、次の図のようになっていることを確認
Step3:ビットストリームとXSAの生成
Sources →Design Sources から、design1.bd を右クリックして、Create HDL Wrapper を選択し、OKをクリックして、次の図のようになっていることを確認
PROJECT MANAGER の下の Add Sources を開き、Add or create constraints を選択して、Next をクリック
Create File をクリックし、ファイル名を入力してFinish をクリック
Sources → Constraints → constrs_1 から、先程作成した xdc ファイルを開き、次を書き込む
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property PACKAGE_PIN A12 [get_ports {Dout_0}]
set_property IOSTANDARD LVCMOS33 [get_ports {Dout_0}]
set_property SLEW SLOW [get_ports {Dout_0}]
set_property DRIVE 4 [get_ports {Dout_0}]
左側のIP INTEGRATOR の下の Generate Block Designをクリックして、Synthesis Options を Global に変更して、Generate をクリックする
左下のGenerate Bitstream をクリックし、OKをクリックして、ビットストリームを生成する
終了後、OKを押して、Implemented Design を見る
File → Export → Export Platform を選択して、Next をクリックする
Next → Include Bitstramにチェックを入れて Next → Next とクリックする
XSA のファイル名を kr260_custom_platform として、Next をクリックする
設定を確認してから、Finish をクリックすると、kr260_custom_platformの下に XSA が生成される
Step4:PetaLinux を使用したソフトウェア コンポーネントの作成
https://www.xilinx.com/member/forms/download/xef.html?filename=xilinx-kr260-starterkit-v2022.1-05140151.bsp から BSP をダウンロード
(<petaLinux_tool_install_dir> には PetaLinux のインストールされた場所を指定する)
$ source <petaLinux_tool_install_dir>/settings.sh
https://japan.xilinx.com/content/dam/xilinx/support/download/plnx/Petalinux_Tool_Upgrade_2022.1_update3.txtを参考に、PetaLinux をアップグレード
$ petalinux-upgrade -u http://petalinux.xilinx.com/sswreleases/rel-v2022/sdkupdate/2022.1_update3/ -p "aarch64" --wget-args "--wait 1 -nH --cut-dirs=4"
PetaLinux プロジェクト を作成
(<target directory> は Vivado で作成した kr260_custom_platform と同じ階層を指定する)
$ petalinux-create --type project -n kv260_custom_plnx -p <target directory> -s xilinx-kr260-starterkit-v2022.1-05140151.bsp
次の階層構造になっていることを確認
- - kr260_custom_platform # Vivado Project Directory
- - kr260_custom_plnx # PetaLinux Project Directory
ハードウェア情報を PetaLinux に組み込む
<target directory> は Vivado で作成した kr260_custom_platform と同じ階層を指定
$ cd <target directory>/kr260_custom_plnx $ petalinux-config --get-hw-description=<target directory>/kr260_custom_platform
Config画面が表示されたら、次のように設定する(スペースキーでチェックを入れたり外したりできる)
FPGA Manager → Fpga Manager[*] (チェックを入れる)
Image Packaging Configuration → Copy final images to tftpboot[] (チェックを外す)
設定終了後は Exit で抜ける、抜けた後に保存するかどうか問われるので、Save を選択して保存
Please input "y" to proceed the installing SDK into project, "n" to exit:
というメッセージが表示されたら、y を入力して、Enter を押す
XRT を有効化
$ petalinux-config -c rootfs
Filesystem packages → libs → xrt から、xrt と xrt-dev を有効化
Filesystem packages → libs → zocl から、zocl を有効化
kr260_custom_plnx にて、PetaLinux をビルドして SDK を生成する
$ petalinux-build $ petalinux-build --sdk
DTG をインストール(場所は任意)
$ git clone -b xlnx_rel_v2022.1 https://github.com/Xilinx/device-tree-xlnx
XSCT を起動し、XSA から DTS を生成
<design_name.xsa> は kr260_custom_platform の下の XSA ファイル、<path to device-tree-xlnx> は DTG のインストール場所を指定
$ xsct xsct% hsi open_hw_design <design_name.xsa> xsct% hsi set_repo_path <path to device-tree-xlnx> xsct% hsi create_sw_design device-tree -os device_tree -proc psu_cortexa53_0 xsct% hsi set_property CONFIG.dt_overlay true [hsi::get_os] xsct% hsi set_property CONFIG.dt_zocl true [hsi::get_os] xsct% hsi generate_target -dir dts xsct% hsi close_hw_design design_1_wrapper xsct% exit
カスタム イメージのブート バイナリをパッケージ化
$ petalinux-package --boot --u-boot --force
SD カードの WIC イメージをパッケージ化
$ petalinux-package --wic --images-dir images/linux/ --bootfiles "ramdisk.cpio.gz.u-boot,boot.scr,\ Image,system.dtb,system-zynqmp-sck-kr-g-revB.dtb" --disk-name "sda"
WIC イメージを圧縮する
$ gzip petalinux-sdimage.wic
balenaEtcher をダウンロードして、展開
SDカードを差し込む
balenaEtcher を展開した場所でターミナルを開き、以下のコマンドを実行して balenaEtcher を起動
<ver>はバージョンを表す
$ chmod u+x balenaEtcher-<ver>-x64AppImage $ ./balenaEtcher-<ver>-x64AppImage
balenaEtcher でSDカードに書き込む
petalinux-sdimage.wic.gz を選択 → 差し込んだSDカードを選択 → Flash! をクリック
Step5:Vitis プラットフォームの作成
kv260_custom_platformと同じ階層に kv260_custom_pkg 、その下に pfm を作成
$ cd <target directory> $ mkdir -p kr260_custom_pkg/pfm
次のディレクトリ構成になっていることを確認
- kr260_custom_platform # Vivado Project Directory
- kr260_custom_plnx # PetaLinux Project Directory
- kr260_custom_pkg # Platform Packaging Directory
- pfm # Platform Packaging Sources
<kr260_custom_plnx>(kr260_custom_plnx までのパス)の下の image/linux に移動し、<kr260_custom_pkg> (kr260_custom_pkg の下、pfm と同じ階層)に sysroot を作成
3つ目のコマンド実行時に <kr260_custom_pkg> にsysroot を作成するかどうかを問うてくるので、その場合は y を入力
$ cd <kr260_custom_plnx>/images/linux/ $ unset LD_LIBRARY_PATH $ ./sdk.sh -d <kr260_custom_pkg>
Vivado で作成した kr260_custom_platform と同じ階層に移動し、pfm の下に、boot と sd_dir を作成
$ cd <target directory> $ mkdir kr260_custom_pkg/pfm/boot $ mkdir kr260_custom_pkg/pfm/sd_dir
次のディレクトリ構成になっていることを確認
- kr260_custom_platform # Vivado Project Directory
- kr260_custom_plnx # PetaLinux Project Directory
- kr260_custom_pkg # Platform Packaging Directory
- sysroots # Extracted Sysroot Directory
- pfm # Platform Packaging Sources
- boot # Platform boot components
- sd_dir # Files to be put in FAT32 partition of SD card
images/linux/ から、必要なファイルを pfm/boot、/pfm/sd_dir にコピー
$ cd <kr260_custom_plnx>/images/linux/ $ cp u-boot-dtb.elf u-boot.elf $ cp zynqmp_fsbl.elf pmufw.elf bl31.elf u-boot.elf system.dtb <kr260_custom_pkg>/pfm/boot $ cp boot.scr system.dtb <kr260_custom_pkg>/pfm/sd_dir
<kr260_custom_pkg> にて、Vitis を立ち上げる
$ cd <kr260_custom_pkg> $ vitis &
<kr260_custom_pkg> をワークスペースとする
クイックスタートから、Create Platform Project を選択
XSA ファイルは初めにVivado で作成したものを使用し、OSなどの設定は次の図のようにする
Generate boot conponetnts のチェックを外し、Finish をクリック
linux on psu_cortex53 を次のように設定
Bif file: Generate BIF
Boot Components Directory: Browse から <kv260_custom_pkg>/pfm/boot を選択
FAT32 Partition Directory: Browse から <kv260_custom_pkg>/pfm/sd_dir を選択
kr260_custom を選択し、ハンマーのアイコンをクリックして、Vitis Platform をビルド
ビルド終了後、次の図のようになっていることを確認
Step6:プラットフォームのテスト
ここでは、サンプルアプリケーションである Simple Vector Additon を例として用いる
以前使用していた Vitis ワークスペースを引き続き使用
File → New → Application Project を選択して、Next をクリック
kr260_custom が選択されていることを確認して、Next をクリック
プロジェクト名を vadd として、Next をクリック
各パスを次のように設定して、Next をクリック
Root FS : <kr260_custom_pkg>/sysroots/cortexa72-cortexa53-xilinx-linux
Kernel Image : <kr260_custom_plnx>/images/linux/rootfs.ext4
Kernel Image : kr260_custom_plnx/images/linux/images
Acceleration templates with PL and AIE accelerators から、Simple Vector Addition を選択して、Finishをクリック
Active Build configuration を Hardware に変更
vadd_system を選択し、ハンマーのアイコンからビルド
必要なファイルを入れるディレクトリを作成
$ mkdir <target directory>/vadd
fpgamanager がロードできるように、.bit ファイルを .bin ファイルに変換
$ cd <kr260_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 <target directory>/vadd/vadd.bit.bin
DTBO作成時のディレクトリに移動し、pl.dtsi を開く
$ cd <kr260_custom_plnx>/dts/ $ vi pl.dtsi
pl.dtsiを次のように編集
firmware-name = "bin"; → firmware-name = "vadd.bit.bin";
dtsi を dtbo にコンパイル
$ dtc -@ -O dtb -o <kria-vitis-platforms>/vadd/vadd.dtbo <kr260_custom_plnx>/dts/pl.dtsi
vadd アプリケーションと binary_container_1.xclbin を vadd ディレクトリにコピー
$ cp <kr260_custom_pkg>/vadd/Hardware/vadd <target directory>/vadd $ cp <kr260_custom_pkg>/vadd_system/Hardware/binary_container_1.xclbin <target directory>/vadd
shell.json を作成
$ cd <target directory>/vadd $ vi shell.json
shell.json に次を書き込む
{
"shell_type" : "XRT_FLAT",
"num_slots": "1"
}
あらかじめ PetaLinux イメージを起動しておく(ユーザー名はpetalinux、パスワードはユーザーが設定する)
scp コマンドでファイルをKR260にコピー(<SOM Starter Kit IP> は KR260 の IP を指す)
$ cd <target directory>/vadd $ scp vadd.dtbo vadd.bit.bin shell.json vadd binary_container_1.xclbin petalinux@<SOM Starter Kit IP>:/home/petalinux
ファームウェアを入れるディレクトリを作成し、ファームウェアをそこにコピー
(以下はKR260で実行)
$ cd /home/petalinux $ sudo mkdir /lib/firmware/xilinx/vadd $ cp pl.dtbo binary_container_1.bin shell.json /lib/firmware/xilinx/vadd
vadd アプリケーションを実行
$ sudo xmutil unloadapp $ sudo xmutil loadapp vadd $ chmod u+x vadd $ ./vadd binary_container_1.xclbin
次のように出力される
INFO: Reading binary_container_1.xclbin Loading: 'binary_container_1.xclbin' TEST PASSED

感想
今回は、回路のデザインをVivadoで作成し、PetaLinuxでSDイメージを作成後、Vitisでアプリケーションを作成してKR260実機で動作させるまでの過程を実行しました。今回はKR260でしたが、他のボードでも同じようなプロセスになるので、初学者向けとしては丁度良いテーマであったように感じられます。
それでは、また次回お会いしましょう!See you next time!

ブログ
AMDによる設計およびデバッグ手法のブログ、およびアヴネット社員によるAMD製品を用いた開発チャレンジのブログです。

Kria
Kria SOMはアダプティブSoCデバイスを搭載しており、スマートカメラやエンベデッドビジョンなどに最適です。
AMD製品に関連する技術ブログ
- エンジニアブログの再開およびテクニカルウェビナーのご案内
- 初心者のためのPython & Numpy入門
- KR260でIntel RealSenseを動かしてみた!
- Vitis HLSで足し算IPを作ってみた!(プログラミング編)
- KD240でモータ制御してみた!
- KR260でデジタル信号処理してみた! (3)
- KR260でデジタル信号処理してみた! (2)
- KR260でデジタル信号処理してみた! (1)
- KR260でロボットアームを動かしてみた! (2)
- KR260でロボットアームを動かしてみた! (1)
- KR260でROS2を使ってキャリブレーション&マーカー検出してみた!
- KR260とPynqでAIカメラを動かしてみた!
- KR260でROS2 Perception Stack Applicationを動かしてみた!【2】
- KR260でROS2 Perception Stack Applicationを動かしてみた!
- Kria SOMでTPM2.0を動かしてみた!
- VivadoでKR260のハードウェアデザインを作って動かしてみた!
- ROS2 Multi-Node Communications via TSNを動かしてみた!
- AIBOX-ReIDを動かしてみた!