KV260のFPGA上のDPUステータスを確認してみました。
DPU…(Deep Learning Processor Unit)
リアルタイムOS「Zephyr」(Cortex-R5)側から接続・監視するシステムを構築したメモです。
ZephyrとKV260からDPUを接続・監視してみる
KV260のFPGA上のDPUステータスを確認してみました。
DPU…(Deep Learning Processor Unit)

リアルタイムOS「Zephyr」(Cortex-R5)側から接続・監視するシステムを構築します。

デモ動画は下記となっています。
詳細は下記hackster.ioの記事でも書いています。
KV260でZephyrのメモリアクセス
下記でKV260でのZephyr(RTOS)を使ったメモリアクセスの手法を紹介しています。
この準備が前提の記事となっています。
ZephyrのR5コアからFPGA(PL)のメモリ・GPIO制御してみた

VivadoでのDPUの準備
DPU(Deep Learning Processor Unit)を実装するため、Zynq UltraScale+ MPSoC(ZynqMP)を構成し、必要なクロックおよびリセットブロックを設定します。

詳細な手順は下記記事で紹介しています。
DPUをビルドした後は、Vivado上で追加のGPIOを配置し、Address Editorを用いてDPUおよびGPIOのアドレスが正しくマッピングされているか確認・検証しておきます。

VitisでのDPUモデルの準備
Vitis Classic Modeを使って、特定のDPUアーキテクチャに合わせた環境構築とモデルのコンパイルを行います。


ZephyrのDPUモニター設定
Zephyr側でDPUの監視を行うための設定を行います。
プロジェクト内にデバイスツリー・オーバーレイ(.overlay)ファイルを作成し、DPUとAXI GPIOをマッピングします。詳細は下記をご確認ください。
https://github.com/iotengineer22/zephyr-kv260/blob/main/src/zephyr/kv260_r5_dpu/boards/kv260_r5.overlay
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
/* SPDX-License-Identifier: Apache-2.0 */ #include <zephyr/dt-bindings/gpio/gpio.h> / { aliases { led0 = &led_0; led1 = &led_1; led2 = &led_2; sw0 = &sw_0; }; leds { compatible = "gpio-leds"; led_0: led_0 { gpios = <&axi_gpio_0 0 GPIO_ACTIVE_HIGH>; }; led_1: led_1 { gpios = <&axi_gpio_0 1 GPIO_ACTIVE_HIGH>; }; led_2: led_2 { gpios = <&axi_gpio_0 2 GPIO_ACTIVE_HIGH>; }; }; buttons { compatible = "gpio-keys"; sw_0: button_0 { gpios = <&axi_gpio_1 0 GPIO_ACTIVE_HIGH>; }; }; }; /* * Key point of the fix: * By describing it inside the &{/soc} node instead of the root, * the 32-bit address will be interpreted correctly. */ &{/soc} { /* New address for GPIO 0 */ axi_gpio_0: gpio@a0010000 { compatible = "xlnx,xps-gpio-1.00.a"; reg = <0xa0010000 0x10000>; status = "okay"; gpio-controller; #gpio-cells = <2>; }; /* New address for GPIO 1 */ axi_gpio_1: gpio@a0020000 { compatible = "xlnx,xps-gpio-1.00.a"; reg = <0xa0020000 0x10000>; status = "okay"; gpio-controller; #gpio-cells = <2>; }; /* DPU (for control) */ dpu_ctrl: dpu@a0000000 { compatible = "generic-uio"; /* For register manipulation since there is no dedicated DPU driver */ reg = <0xa0000000 0x1000>; status = "okay"; }; }; |
続いて、メインプログラム(main.c)を実装します。
このプログラムは、Address Editorでの設定を基に各IPのベースアドレス(DPU、Softmax、割り込みコントローラ)を定義し、レジスタの特定のビット(Idleビットなど)を直接読み出して状態を監視、それに応じてLEDを制御(点滅または点灯)する仕組みです。
詳細は下記を参考ください。

コードの準備ができたら、Zephyrの開発環境(west)を用いて、kv260_r5ボード向けにビルドを実行します。
|
1 |
west build -p -b kv260_r5 |
ビルドが正常に完了すると、ビルドディレクトリ内に zephyr.elf ファイルが生成されます。
PL(FPGA)へのデプロイ
生成したPL(FPGA)用のアーティファクトファイル(pl.dtbo、shell.json、design_1_wrapper.bit.bin)と、Zephyrのバイナリ(zephyr.elf)をKV260へ転送し配置します。

|
1 2 3 4 5 6 |
# Create the firmware directory sudo mkdir -p /lib/firmware/xilinx/zephyr_kv260_dpu # Copy the files sudo cp pl.dtbo shell.json design_1_wrapper.bit.bin /lib/firmware/xilinx/zephyr_kv260_gpio/ sudo cp zephyr.elf /lib/firmware/zephyr_dpu.elf |
次に、Kriaのユーティリティである xmutil を使用して、新しく作成したDPU用のデザインをFPGA(PL領域)にロードします。
|
1 2 3 |
sudo xmutil listapps sudo xmutil unloadapp sudo xmutil loadapp zephyr_kv260_dpu |
PLのロードが完了したら、Linuxの remoteproc フレームワークを利用して、R5コアにファームウェア(zephyr_dpu.elf)をロードして起動させます。
|
1 2 3 |
sudo -i echo zephyr_dpu.elf > /sys/class/remoteproc/remoteproc0/firmware echo start > /sys/class/remoteproc/remoteproc0/state |
ZephyrからのDPU監視と動作確認
ファームウェアが正常に起動すると、KV260のMicroUSB経由で接続したシリアルコンソール上に、ZephyrのブートログおよびDPU、SFM(Softmax)、INTC(割り込み)の監視ログがリアルタイムに表示されるようになります。


コンソールに出力される実際のログ内容は以下の通りです。
|
1 2 3 4 5 6 7 8 9 10 |
--- KV260 HW System Monitor (Zephyr) --- Monitoring: DPU(0xA0000000), SFM(0xA0001000), INTC(0x80000000) STAT -> DPU: 0x04 | SFM : 0x04 | INTC_ISR : 0x00 STAT -> DPU: 0x04 | SFM : 0x04 | INTC_ISR : 0x00 ~~~~~~~~~~~~~ # DPU IP Running from PetaLinux sudo devmem 0xA0000000 32 1 ~~~~~~~~~~~~~ STAT -> DPU: 0x01 | SFM : 0x04 | INTC_ISR : 0x00 STAT -> DPU: 0x01 | SFM : 0x04 | INTC_ISR : 0x00 |
DPUモニターのデモ動画
実装したDPU監視システムが、Linux上のAI推論の状態をCortex-R5(Zephyr RTOS)から正しく可視化・監視できている様子を実際のデモ動画で紹介します。
まとめ
KV260のFPGA上のDPUステータスを確認してみました。
DPU…(Deep Learning Processor Unit)
リアルタイムOS「Zephyr」(Cortex-R5)側から接続・監視するシステムを構築したメモを紹介しました。


コメント