ZephyrのR5コアからFPGA(PL)のメモリ・GPIO制御してみた

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

KV260上で動作するリアルタイムOS「Zephyr」から、PMODインターフェースのGPIOを制御するテストを実施しました。

Vivadoでのハードウェア作成から、デバイスツリーのコンパイル、そしてxmutilを使用したアプリケーションのロードまでの手順をまとめます。

スポンサーリンク

ZephyrのR5コアからFPGA(PL)のメモリ・GPIO制御してみた

KV260上で動作するリアルタイムOS「Zephyr」から、PMODインターフェースのGPIOを制御するテストを実施しました。

Vivadoでのハードウェア作成から、デバイスツリーのコンパイル、そしてxmutilを使用したアプリケーションのロードまでの手順をまとめます。

デモ動画は下記となっています。

詳細は下記hackster.ioの記事でも書いています。

AI Safety Monitor with FPGA + Zephyr RTOS
Monitoring AI Inference (DPU) on AMD Kria KV260 with Zephyr RTOS for Functional Safety. By misoji engineer.

 

KV260でZephyrのHelloWorld

下記でKV260でのZephyr(RTOS)を使ったHello Worldの手法を紹介しています。

この準備が前提の記事となっています。

KV260のR5コアにZephyr(RTOS)を実装してみる

KV260のR5コアにZephyr(RTOS)を実装してみる
KV260のR5コアにZephyr(RTOS)を実装してみました。Zephyrの公式ドキュメント通り、まずはテストしてみました。PetaLinuxのインストールからBSPビルドの自分用のメモです。KV260のR5コアにZephyr(RTOS...

 


テスト環境

今回のテスト環境は以下の通りです。

  • 開発PC: Vivado 2025.2 / Vitis 2025.2 /Petalinux 2025.1

  • ターゲットボード: Kria KV260 Vision AI Starter Kit

  • OS: Zephyr RTOS v4.4.0(Cortex-R5F) / PetaLinux (Cortex-A53)

 


Vivadoでのハードウェア作成

まずは、KV260のPMODに接続されたGPIOを含むデザインをVivadoで作成します。

こちらのHackster.ioの記事を参考に、KV260用のGPIOデザインを構築します。

Control GPIO from PYNQ and KR260
This project is part of a subproject for the AMD Pervasive AI Developer Contest. We are conducting tests with PYNQ and G...

 

今回のデザインにおける XDC制約(ピンアサイン) は以下の通りです。PMODインターフェースに合わせて設定しています。

 

論理合成・インプリメンテーションを実行し、 .xsa ファイルをエクスポートします。

 


デバイスツリー(pl.dtbo)の作成

FPGA部分をロードするために、デバイスツリー・オーバーレイ(DTBO)を作成します。

Vitisの xsct を使用して、エクスポートした .xsa から生成およびコンパイルを行います。

作成した pl.dtbo は、後ほどKV260の /lib/firmware/xilinx/ 配下で使用します。


ビットストリーム(.bin)の生成

Vivadoで生成された.bitファイルを、Kriaのユーティリティで扱える.bin形式に変換します。

 


shell.jsonの作成

xmutilでアプリケーションをロードする際に必要なshell.jsonを作成します。

これは、アクセラレータのタイプ(今回はXRT_FLAT)を定義するファイルです。


ZephyrのMPU設定

ZephyrからPL(FPGA)領域のレジスタやメモリにアクセスするためには、MPU(Memory Protection Unit)の設定を変更して、該当するアドレス空間へのアクセスを許可する必要があります。

MPU設定の修正(PL AXI領域の解放)

Zephyrソースコード内の以下のファイルを編集し、PL領域(0x80000000〜)へのアクセス許可を追加します。

対象ファイル: zephyr/soc/xlnx/zynqmp/arm_mpu_regions.c

追記内容:

 


Zephyrのデバイスツリー・オーバーレイ設定

Zephyr側でFPGA上のGPIO(AXI GPIO)を認識させるため、プロジェクト内に .overlay ファイルを作成し、以下の内容を記述します。

  • エイリアスの設定: led0led2sw0 を定義することで、Zephyrのアプリケーション(C言語)側から DT_ALIAS(led0) のような形でデバイスを簡単に参照できるようにしています。

  • アドレスの解釈(&{/soc}): ZynqMPのような64bit対応SoCでは、デバイスツリーのルート直下だとアドレスセルの解釈が複雑になることがありますが、&{/soc} ノードを明示的に指定することで、PL領域の32bitレジスタアドレスを確実にマッピングさせています。

 

 

KV260へのデプロイと実行

作成した3つのファイル(pl.dtbo, design_1_wrapper.bit.bin, shell.json)をKV260に転送し、xmutilでロードします。

フォルダの作成とファイル配置

Zephyrのビルドディレクトリ(build/zephyr/zephyr.elf)にあるバイナリを、KV260の /lib/firmware ディレクトリにコピーします。

 

アプリケーションのロード

現在のアプリをアンロードし、新しく作成したGPIO用のアプリをロードします。

正常にロードされると、ZephyrからPMODのGPIOを叩く準備が整います。

実際にロードすると下記形となります。

 

Zephyrバイナリ(.elf)のデプロイと実行

PL(FPGA)のロードが完了したら、次にZephyrの実行本体である .elf ファイルをR5コアへデプロイして実行します。これにはLinuxの remoteproc フレームワークを使用します。

remoteprocによるロードと起動

Linux側からR5プロセッサ(remoteproc0)に対して、ファームウェアの指定と実行指示を出します。この操作にはroot権限が必要なため、sudo -i で切り替えて実行します。

 

実行状態の確認

正常に起動すれば、KV260に接続したシリアルコンソール等からZephyrのログが確認でき、PMOD経由でのGPIO制御が可能になります。

Zephyrを起動すると、シリアルコンソールに以下のログが表示されます。

ログを確認すると、以下のことが分かります。

  • バージョンの確認: Zephyr OS v4.4.0 が正常に起動しています。

  • GPIOの制御: LEDの状態に合わせて、FPGA上のAXI GPIOレジスタ(0xb0000000)の値が 0x1, 0x2, 0x4 と変化しており、ZephyrからPL(FPGA)側のLEDを正しく制御できています。

  • スイッチの監視: SW0 state の表示により、PL側の入力ピンの状態もリアルタイムに監視できています。

これにより、Cortex-R5上のZephyrから、ZynqMPのPL領域(AXIインターフェース)へ正常にアクセスできていることが確認できました!

冒頭でも紹介しましたが、下記がデモ動画となっています。

 

まとめ

KV260上で動作するリアルタイムOS「Zephyr」から、PMODインターフェースのGPIOを制御するテストを実施しました。

Vivadoでのハードウェア作成から、デバイスツリーのコンパイル、そしてxmutilを使用したアプリケーションのロードまでの手順をまとめました。

コメント