Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

2,411 views

Published on

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

Published in: Software
  • Be the first to comment

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

×