FC2カウンター FPGAの部屋 自作した Vivado プロジェクトの DMA_pow2_test を PYNQ で実行する2(制御用 Python コードの書き方を調べる)
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

自作した Vivado プロジェクトの DMA_pow2_test を PYNQ で実行する2(制御用 Python コードの書き方を調べる)

自作した Vivado プロジェクトの DMA_pow2_test を PYNQ で実行する1(構想編)”の続き。

Sobel IP などの自分で作成した IP を実装して Kria-PYNQ で動作させてみたいということで、前回は、PYNQ で使用される Vivado の生成ファイルを調べた。今回は、制御用 Python コードの書き方を調べてみた。

pynq-helloworld/resizer_pl.ipynb ファイルを引用する。
この Jupyter Notebook では Zynq MP でなく Zynq を使用して書かれているようだ。ポートは、AXI_GP_0 と AXI_HP_0 が使用されている。ACP ポートは使用されていないので、CPU のキャッシュに直接読み書きすることができない。
resizer_pl.ipynb ファイルの図を引用する。
Kria-PYNQ_56_220221.png

ライブラリのインポート
pynq ライブラリの allocate と Overlay をインポートする必要がある。

from pynq import allocate, Overlay


その他、画像を扱うのに必要なライブラリを読み込んでいる。

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline


IP のビットストリームを FPGA にダウンロードする
Overlay でビットファイルを FPGA にダウンロードして、 resize_design オブジェクトを作成する。

resize_design = Overlay("resizer.bit")


DMA エンジンと Resizer IP のオブジェクトを作成する。

ma = resize_design.axi_dma_0
resizer = resize_design.resize_accel_0


axi_dma_0 と resize_accel_0 は IP インテグレーターで IP を追加した時のインスタンス名だと思う。

PIL を使用して画像オブジェクトを作成する

image_path = "images/sahara.jpg"
original_image = Image.open(image_path)



バッファをアロケートする
新しい画像サイズを元の画像サイズの縦横それぞれ 1/2 に設定する。

resize_factor = 2
new_width = int(old_width/resize_factor)
new_height = int(old_height/resize_factor)


in_buffer と out_buffer を生成する。画像なので、サイズ + RGB 3 チャネルを生成している。 cacheable=1 はキャッシュ禁止なのか?

in_buffer = allocate(shape=(old_height, old_width, 3), 
                           dtype=np.uint8, cacheable=1)
out_buffer = allocate(shape=(new_height, new_width, 3), 
                            dtype=np.uint8, cacheable=1)


in_buffer に画像イメージを代入

in_buffer[:] = np.array(original_image)


ハードウェアをスタートする run_kernel 関数を定義する

def run_kernel():
    dma.sendchannel.transfer(in_buffer)
    dma.recvchannel.transfer(out_buffer)    
    resizer.write(0x00,0x81) # start
    dma.sendchannel.wait()
    dma.recvchannel.wait()


axi_dma の設定手順だが、私の作った DMA_pow2_test は Vitis HLS で作成されているので、resizer の設定方法と同じになる。
resizer は 0x00 番地に 0x81 を書いているので、ap_start + auto_restart となり、動作し続けることになるが良いのだろうか?
なお、IP への引数の設定方法は以下に示す。

Vitis HLS で作成した IP の引数への代入
作成してあった Resizer IP のオブジェクトを使用して、オブジェクトの register_map.(レジスタ名)に値を代入できるようだ。
レジスタ名は、Vitis HLS で作成した IP であれば、C コードの合成レポートの S_AXILITE Registers の Register に書いてある名前を使用する。

resizer.register_map.src_rows = old_height
resizer.register_map.src_cols = old_width
resizer.register_map.dst_rows = new_height
resizer.register_map.dst_cols = new_width


ハードウェアを走らせる

run_kernel()


これで、out_buffer にサイズ変換された画像イメージが入ったはず。。。
  1. 2022年02月21日 05:07 |
  2. PYNQ
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/5507-db6949e3
この記事にトラックバックする(FC2ブログユーザー)