動作環境
Windows 10 Pro (v1909)
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
概要
- bitstreamはbase.bitを使う
- pynq.lib.video ModuleにあるAPIでHDMI入力とHDMI出力を行う
- readframe(), writeframe()を使う
- writeframe()の前にframeの値を変更することで、線を引く
接続
PCのHDMI出力をPYNQに読み取らせる。
- A. PCのHDMI端子 <-> PYNQのHDMI IN
- B. PYNQのHDMI OUT <-> モニタのHDMI
手順
上記で実行したbase/videoのvideoサンプルを使う。
実際には下記を実行する。
準備
from pynq.overlays.base import BaseOverlay
from pynq.lib.video import *
base = BaseOverlay("base.bit")
hdmi_in = base.video.hdmi_in
hdmi_out = base.video.hdmi_out
hdmi_in.configure()
hdmi_out.configure(hdmi_in.mode)
hdmi_in.start()
hdmi_out.start()
ここまででHDMI入力とHDMI出力の準備ができる。
線を引く
frameの一部のRGB値を0にすることで黒の線を引く。
aframe = hdmi_in.readframe()
print(aframe.shape)
for idx in range(100):
aframe[idx][100][0] = 0
aframe[idx][100][1] = 0
aframe[idx][100][2] = 0
hdmi_out.writeframe(aframe)
(720, 1280, 3)
27インチ縦置きのモニタで線を引くことができた。
frame
今回試した設定ではframeのサイズは(720, 1280, 3)。単純なRGB値のnumpy ndarrayのようだ。
これであれば、HDMI OUTで任意の図形描画(と文字)ができる気がする。
座標は、右上が(0,0)になるようだ。
frame[column][row][RGB]
RGBは下記のようになるようだ。
0: blue
1: green
2: red
HDMI INなし
HDMI INをつなげずに出力だけの場合は下記のようにする。
黒い背景に赤色の線が見える。
frame2 = hdmi_out.newframe()
for idx in range(700):
frame2[idx][100][0] = 0 # blue
frame2[idx][100][1] = 0 # green
frame2[idx][100][2] = 255
hdmi_out.writeframe(frame2)
遅い
frame2(numpy ndarray)への代入は遅い。
70 * 700 の代入で13秒程度かかる。
np.zeros()などを使った場合、flush()がない、などのエラーとなる。
単純なnumpy ndarrayでもないのかもしれない。