Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

PYNQ単体でUIを表示してみる(PYNQまつり)

2 425 vues

Publié le

PYNQ-Z1用のフレームバッファドライバを用意して、PYNQのHDMI出力を使ってX Window Systemなどのフレームバッファを使えるようにするという内容で、PYNQまつりにて発表した内容です。

Publié dans : Logiciels
  • Soyez le premier à commenter

PYNQ単体でUIを表示してみる(PYNQまつり)

  1. 1. PYNQ単体でUIを表示してみる PYNQまつり 2017/03/04 Kenta IDA (@ciniml)
  2. 2. 自己紹介 •Kenta IDA (@ciniml) •仕事 • 組み込みソフト(~2017/01) • FPGA(2017/02~) • Vivado HLS書き始めました •使用言語:C#, C++, VHDL, 仕方なくC PYNQ単体でUIを表示してみる 2017/3/4
  3. 3. PYNQのHDMIまわり PYNQ単体でUIを表示してみる •HDMIから入力 •入力したフレームを編集 • 図形を描画するなど •HDMIへ出力 →画像処理結果の表示などに便利 2017/3/4
  4. 4. HDMIからの出力方法 PYNQ単体でUIを表示してみる • 出力用にHDMI初期化 hdmi = HDMI('out') hdmi.mode(0) # 640x480@60 hdmi.start() • フレーム取得,編集,設定 hdmi = hdmi.frame(0) frame[x,y] = (0, 255, 255) #ピクセル設定 hdmi.frame(0, frame) 2017/3/4
  5. 5. 図形の描画 PYNQ単体でUIを表示してみる •用意されていない • フレームバッファ直接アクセス •主にHDMI入力に処理をするのが目的 •簡単なGUIつくるのも割と面倒な感じ • X動かない。 →X動くようにしよう。 2017/3/4
  6. 6. PYNQのHDMI処理部 PYNQ単体でUIを表示してみる •video sub block • HDMIの信号解析 • TMDSポート • HDMIの信号生成 • TMDS1ポート(名前雑…) • フレームバッファアクセス • M00_AXI (AXI4 Master) 2017/3/4
  7. 7. PYNQのHDMI処理部内部構成 PYNQ単体でUIを表示してみる 2017/3/4 HDMI入力 HDMI信号生成 クロック生成 タイミング信号 生成 フレームバッファ アクセス
  8. 8. HDMI出力に必要なモジュール PYNQ単体でUIを表示してみる • HDMI信号生成 • 特に設定する項目はない、というかCPUにつながってない • データを流せば動く • クロック生成(axi_dynclk_0) • タイミング信号生成(v_tc_0) • 出力したい画面の解像度に応じた設定が必要 • フレームバッファアクセス(axi_vdma_0) • 確保したフレームバッファを使うように設定が必要 →これらのモジュールを設定して使うドライバを作ればよい 2017/3/4
  9. 9. フレームバッファドライバの作成 PYNQ単体でUIを表示してみる •XilinxのリポジトリからLinuxカーネルソース取得 • v2016.2-sdsoc • ちょっとバージョン違うかも? •drivers/video/fbdev 以下にFBドライバのコード • FPGAマガジンNo.12の特集を参考に新しいコードを追加 • simplefb.c 、PYNQのHDMIモジュールのコードも参照 2017/3/4
  10. 10. フレームバッファドライバの作成(2) PYNQ単体でUIを表示してみる •PYNQのHDMIドライバの設定を解析 • Jupiter上で各モジュールのレジスタを読みだし • PYNQのソースコードを読む • Python/pynq/_pynq以下にドライバのコードあり • _pynq/src/video_display.c • bspディレクトリ以下にレジスタのオフセット定義 2017/3/4
  11. 11. フレームバッファドライバの作成(3) PYNQ単体でUIを表示してみる •PYNQのHDMIドライバの設定を解析 • XilinxのIPはドキュメントあり • Video Timing Controller • AXI VDMA • DigilentのIPにはない。→コード見るしかない • dynclk • AXI-Lite経由で動的に設定変更可能なクロックジェネレータ • Video Timing Controller用のクロック生成 • PLLのフィルタ係数とかドライバのソースコード上に定義されてる模様 2017/3/4
  12. 12. 使用例1:PLで計算結果の表示 PYNQ単体でUIを表示してみる •X上のGUIから独自overlayのモジュールを使用 • bitreversal(ビット反転)モジュール • 入力した32bit値のビット順序を反転 • e.g. 11010 -> 01011 2017/3/4
  13. 13. 使用例1:PLで計算結果の表示 PYNQ単体でUIを表示してみる 2017/3/4
  14. 14. 使用例1:PLで計算結果の表示 PYNQ単体でUIを表示してみる 2017/3/4
  15. 15. 動画 PYNQ単体でUIを表示してみる 2017/3/4
  16. 16. 使用例1:PLで計算結果の表示 PYNQ単体でUIを表示してみる •一応PythonからPLにアクセスしている •これだけだとあまりPYNQっぽくない 2017/3/4
  17. 17. 使用例2:PLの描画調整 PYNQ単体でUIを表示してみる •X上のGUIで指定した位置にPLのモジュールで描画 • モジュールのレジスタに描画先の座標を設定 • モジュールがAXI Streamに割り込んで 対象ピクセルの値を置換 2017/3/4 rectangular overlay AXI VDMA AXIS to Video Out 指定した矩形範囲のピクセルなら 設定した色に置き換える
  18. 18. 使用例2:実装 PYNQ単体でUIを表示してみる 2017/3/4 AXI VDMA AXIS to Video Out rectangular overlay AXI VDMA AXIS to Video Out 変更前 変更後 ピクセルデータ (AXI Stream)
  19. 19. 使用例2:実装 PYNQ単体でUIを表示してみる •X上のGUIで指定した位置にPLのモジュールで描画 2017/3/4 Window on PYNQ 指定した矩形範囲のピクセルなら 設定した色に置き換える (波形表示とか) button button Text Text Text Text
  20. 20. 使用例2:実装 PYNQ単体でUIを表示してみる •X上のGUIで指定した位置にPLのモジュールで描画 2017/3/4 Window on PYNQ 指定した矩形範囲のピクセルなら 設定した色に置き換える (波形表示とか) button button Text Text Text Text 左上座標 幅 高さ
  21. 21. 使用例2:利点 PYNQ単体でUIを表示してみる •PS(CPU)を使うことなく画面更新 • 単にストリームに割り込んでいるだけ •Pythonの既存UIライブラリを使用可能 • マウスのイベント処理とかやりたくない。 2017/3/4 rectangular overlay AXI VDMA AXIS to Video Out 指定した矩形範囲のピクセルなら 設定した色に置き換える
  22. 22. 動画 PYNQ単体でUIを表示してみる •…はありません。 • Vivado HLSで適当に書いてみたが間に合わなかった • Co-SIM結果はよさげだったけど… • 実装してパッケージ化するところまで行きたい 2017/3/4
  23. 23. まとめ PYNQ単体でUIを表示してみる •とりあえずPYNQのbase overlayで フレームバッファ使用可能 • ドライバのソースは整理して後日公開 •Jupyter Notebookはデバッグにも便利 •PYNQらしくPLを有効活用するのはもう少し先 • できたらパッケージ作りたい 2017/3/4

×