catch-img

Raspberry Pi Camera v2 on KV260(前編)

これから登校される方も、今からお仕事に向かわれる方も、おはようございます、 FPGAやろうのお時間です。

この記事を執筆させてていただくのは、アーキテクチャ開発部AIアクセラレータ開発チームの山野です。

本日は夏休みの自由研究にぴったりな、 Raspberry Pi Camera v2 をつなぐことができ、更にはFPGA初心者の方でも簡単に作れる、KV260を使ったイメージ・シグナル・プロセッサ(ISP)のずぼらレシピを紹介したいと思います。

本ブログで紹介させていただく内容について、できる限り正確な情報提供を心がけておりますが、正確性や安全性を保証するものではありません。
また、リンク先の他サイトで提供される情報・サービスについても、責任を負いかねますのでご了承ください。

目次[非表示]

  1. 1.はじめに
    1. 1.1.準備するもの
  2. 2.Vivadoを使った回路生成
    1. 2.1.Projectの作成
    2. 2.2.デザインの作成
    3. 2.3.信号線の定義
    4. 2.4.HDLの生成
    5. 2.5.コンパイル
    6. 2.6.回路情報の取得
    7. 2.7.システム構成情報の取得
  3. 3.関連リンク
    1. 3.1.Raspberry Pi Camera v2 on KV260(後編)
    2. 3.2.Xilinx Kria KV260 Kit / KV260 SOM / KR260
    3. 3.3.Raspberry Pi Camera Module v2.1
    4. 3.4.FPGAに搭載可能な低遅延、高画質なISPを研究開発の紹介
    5. 3.5.Xlinx Vitis(v2022.1)
    6. 3.6.Raspberry Pi Camera-v2 on KV260
    7. 3.7.免責事項、著作権、商標権

はじめに

この記事で使うデバイスは Xilinx Kria KV260 Kit という、ARMとFPGAが載ったSoCと更にDDRメモリまでも実装したSOMというパッケージで、 FPGAカスタム基板を作ることを簡単にする K26 SOM のリファレンスボードです。
つい最近ではロボティクス向けの Kria KR260 (K26 SOMが共通) が登場し、大注目のデバイスです。

そして今日はこの大注目のデバイスに、みんな大好きRaspberry Pi公式のカメラモジュールをつなぎ FPGAの回路内で画像処理ができる、ずぼらイメージ・シグナル・プロセッサ(ISP)の作り方と Xilinx 公式の Ubuntu イメージを使ったこのISPを動かし方を紹介します。
一応念のためですが、今回は簡単にカメラモジュールを動かすために最小限の機能のみを持ったずぼらISPの作り方になります。
なので画質や速度についてはまだまだ改良の余地がありますが、そこは夏休みの自由研究ということで予めご了承下さい。

また手前味噌になりますが、弊グループには FPGAに搭載可能な低遅延、高画質なISPを研究開発しているチーム もいるので、ご興味ありましたらぜひお問い合わせお待ちしております。

準備するもの

以下は今回使用するデバイスと開発環境です。

  • デバイス
    • Xilinx Kria KV260 Kit
    • Raspberry Pi Camera Module v2.1
    • micro sdカード(8GB 以上推奨、Xilinx Ubuntu 22.04 LTSイメージ用)
    • KV260に接続する機材
      • モニター(HDMI or DisplayPort対応)
      • USBキーボード
      • USBマウス
      • LANケーブル
    • (あると便利) USBメモリー
  • 開発環境

注意事項
Vitisはバージョンごとに,利用可能なIPやxlnx-linuxのバージョンに依存関係があります。 v2022.1以前のバージョンでは今回利用するRaspberry Pi Camera Module v2.1のイメージセンサー imx219用のドライバサポートがxlnx-linuxに入っていないので,本記事をトレースされる場合は 必ずv2022.1を利用ください。

Vivadoを使った回路生成

Projectの作成

それではVivadoを起動しISPの回路を作っていきます。
起動画面のCreate Projectを押して、Projectを作成します。


Next をクリックして次に進みます。


プロジェクトを作成するディレクトリを選択し、適当なプロジェクト名を入力します。
ここでは kv260_mipicsi2_simpleISP という名前でプロジェクトを作成します。 Next をクリックして次に進みます。

Do not specify sources at this time のチェックを外し、Next をクリックして次に進みます。

Next をクリックして次に進みます。

Next をクリックして次に進みます。

デバイスやチップの一覧が表示されるので、Boards タブを押した後に Kria KV260 Vision AI Starter Kit を選択します。 そして Kria KV260 Vision AI Starter Kit の下にある Connections をクリックします。

キャリアカードの種類を選択できるドロップダウンリストのGUIが表示されるので、 Vision AI Starter Kit carrier card を選択してOKをクリックします。

Xを飛ばしてGUIを利用している場合、マウスでconnector1の リストを開けない現象が起きることがあるようです。 そうなった際はキーボードを駆使してVision AI Starter Kit carrier cardを 選択してください。

Next をクリックして次に進みます。

Next をクリックして次に進みます。

Projectが作成出来たら次のような画面になります。

デザインの作成

VivadoではIP Intergratorという機能を利用して、 GUIでIPベースのハードウェア設計をおこなうことが出来ます。
今回のISPも開発画面左側にある Flow Navigator から Create Block Design を クリックしてGUIで回路設計をおこないました。
GUIでのシステム設計はマウスでIPブロックを繋いでいくだけなので非常に簡単ですが、 配線が多くなるとミスを埋め込みやすいです。
なので今回はGUIの操作を自動化して実行できるスクリプトをGithubで公開いたしますので、これを利用します。 
Raspberry Pi Camera-v2 on KV260 から isp_block_design.tcl を適当なディレクトリにダウンロードします。 ダウンロード出来たら次にメニューバーから Tools -> Run Tcl Script をクリックします。

先ほどダウンロードしてきた isp_block_design.tcl を選択し、OK をクリックします。

ブロックデザインの生成が完了すると、次の画面のように水色の矩形に配線がなされた ブロック図が表示されます。

本稿で作成するISPは次の画像処理をおこなうパイプラインになっています。 IPインテグレータのブロックダイアグラムでこのパイプラインを実装しています。

以上でFPGA内部の回路設計が完了しました。 次にFPGA内部からイメージセンサーにアクセスするために、ブロックデザインと外の世界との入出力を定義するラッパーファイルを生成します。 Sources ウィンドウの中から design_1 を右クリックすると、以下のようなポップアップが表示されるので、 この中から Create HDL Wrapper... をクリックします。

OK をクリックします。

すると頂上が緑のピラミッドマークがついたファイルがブロックデザインの上に作られていることが確認できます。 このファイルはVerilogHDLで記述されているソースコードなのでテキストエディタで開くことができ、ブロックデザインから出てくる信号線が記述されています。

信号線の定義

次にラッパーファイルで定義されている信号線について、FPGAと外の世界との入出力を定義する制約ファイルというものを準備します。 これについてはブロックデザイン生成と同様に、事前に用意した制約ファイルを用意したので、先ほど出てきた Raspberry Pi Camera-v2 on KV260 から pin.xdc を適当なディレクトリにダウンロードします。 ダウンロード出来たら Sources ウィンドウ内の constrs_1 を右クリックして出てくるポップアップ内の Add Sources をクリックします。 もし自身で制約ファイルを作成する場合は、まずは回路図を用意してからイメージセンサーに電気的に繋がるFPGAのピン(端子)名を確認し、各信号線との対応付けとIO用のドライバ回路を指定します。

Next をクリックして次に進みます。

Add Files... をクリックします。

先ほどダウンロードしてきた pin.xdc を選択し、 OK をクリックします。

Finish をクリックします。

HDLの生成

ここまででハードウェア設計はほぼ完了ですが、ブロックデザインはパラメータを変更可能なIPの集まりなので、現状のブロックデザインでパラメータをFIXした HDL を生成してやる必要があります。 それでは Sources ウィンドウ内のブロックデザインを右クリックして、 Generate Output Products... をクリックします。

HDLとは
Hardware Description Languageの略称です。 本稿では直接記述する工程は含まれていませんが、 論理回路を設計するためのプログラミング言語の総称で、 VHDLやVerilogHDLという言語がよく用いられます。

Generate をクリックします。

OK をクリックします。

先ほどの Generate Output Products の設定だと、ブロックデザイン内部の各IPのHDLが生成されると自動で各HDLの論理合成が開始されます。 下部にある Design Runs ウィンドウを開くと各IPの論理合成のステータスを確認できます。

コンパイル

それではISPの回路全体をFPGA上にロード出来る回路情報にするため、全体のコンパイルをします。 画面左の Flow Navigator 内のGenerate Bitstream をクリックします。

本来であればFlow Navigatorの順番に従い Synthesis 、Implementation を順番に実行して、 生成される回路規模を確認しながら進めるのですが、 今回のISPはFPGAのリソースにかなり余裕がある回路規模だと思われるので、 Generate Bitstream をいきなり指定して、Synthesis 、Implementation は 自動でVivadoにやらせることにします。 そしてこの画面で出ているウィンドウは自動で Synthesis Implementation を行うことの確認なので、 Yes をクリックして次に進みます。

OK をクリックします。

合成が終わると次のようなウィンドウが出てくるので、Cancel をクリックします。

回路情報の取得

合成したFPGAの回路情報であるbitstreamファイルを任意のパスにエクスポートします。 メニューバーから File -> Export -> Export Bitstream をクリックします。

ファイル名を kv260_mipicsi2_simpleISP.bit として Save します

OK をクリックします。

システム構成情報の取得

ISPをKV260の実機上でソフトウェアから制御するためには、FPGA内部のシステム構成を後ほど利用するLinuxカーネルに認識させる必要があります。 Linuxに組み込みシステムの構成情報を認識させるには、 devicetreeという組み込みシステムの構成情報を記述するファイルを作成する必要があります。Vivadoで作成したシステム構成情報を含んだxsaというファイルから半自動でdevicetreeを生成するDevice Tree Generatorという機能があり、 これを利用するためにxsaファイルとしてシステムの構成情報をエクスポートします。 メニューバーから File -> Export -> Export Hardware をクリックします。

Next をクリックします。

Next をクリックします。

Next をクリックします。

Finish をクリックします。

以上でVivadoでの作業は終了です。 Vivadoは重たいので X を押して閉じましょう。

後編もご覧ください。

関連リンク

Raspberry Pi Camera v2 on KV260(後編)

  Raspberry Pi Camera v2 on KV260(後編) FPGA初心者の方でも簡単に作れる、KV260を使ったイメージ・シグナル・プロセッサ(ISP)のずぼらレシピ(後編)を紹介したいと思います。 コニカミノルタ株式会社(サイトリニューアル)

Xilinx Kria KV260 Kit / KV260 SOM / KR260

  Kria KV260 ビジョン AI スターター キット Kria K26 SOM 向けの開発プラットフォーム KV260 を利用することで、複雑なハードウェア設計の知識がなくても高度なビジョン アプリケーション開発を簡単にできます。電源は別売りです。 Xilinx
  システム オン モジュール (SOM) ボード システム オン モジュール (SOM) とは、プロセッサ コア、通信インターフェイス、メモリ ブロックなど、エンベデッド処理システムの主なコンポーネントを単一ボードに搭載した、量産対応可能なプリント回路基板 (PCB) です。 Xilinx
  Kria KR260 ロボティクス スターター キット KR260 は、ロボットや産業用アプリケーション向けに構築された Kria K26 SOM 搭載の開発プラットフォームです。高性能インターフェイスを備え、ROS 2 をネイティブ サポートしているため、ロボット開発者やソフトウェア開発者は使い慣れた環境で今すぐ開発を始められます。 Xilinx

Raspberry Pi Camera Module v2.1

  Raspberry Pi カメラモジュール Camera Module, Raspberry Pi Camera Module V2.1 | RS https://jp.rs-online.com/web/p/raspberry-pi-cameras/9132664

FPGAに搭載可能な低遅延、高画質なISPを研究開発の紹介

  低遅延カメラシステムの紹介|FORXAI 5G通信を利用した画像IoT技術の一つとして、低遅延カメラシステムを紹介します。 コニカミノルタ株式会社(サイトリニューアル)

Xlinx Vitis(v2022.1)

  ダウンロード Vivado, Vitis, Vitis Embedded Platform, PetaLinux, Device models Xilinx

Raspberry Pi Camera-v2 on KV260

  Build software better, together GitHub is where people build software. More than 83 million people use GitHub to discover, fork, and contribute to over 200 million projects. GitHub

免責事項、著作権、商標権

  サイトのご利用について | コニカミノルタ コニカミノルタのウェブサイトのご利用条件、免責事項、著作権・商標権、推奨環境、アクセシビリティ、個人情報の取り扱い、本ウェブサイトへのリンクについて説明しています。 コニカミノルタ




コニカミノルタは画像IoTプラットフォームFORXAIを通じて、お客様やパートナー様との共創を加速させ、技術・ソリューションの提供により人間社会の進化に貢献してまいります。

Yamano Ryusuke
Yamano Ryusuke
技術開発本部FORXAI開発センター アーキテクチャ開発部 所属 AIアクセラレーターを活用したデバイス開発やNNgenの開発を担当


pagetop