FC2カウンター FPGAの部屋 PYNQ の画像ファイル・フォーマットを調査するために choose_RGB IP を Vitis HLS 2021.2 で作成する8
fc2ブログ

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

FPGAの部屋

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

PYNQ の画像ファイル・フォーマットを調査するために choose_RGB IP を Vitis HLS 2021.2 で作成する8

PYNQ の画像ファイル・フォーマットを調査するために choose_RGB IP を Vitis HLS 2021.2 で作成する7”の続き。

PL の FPGA で画像処理をアクセラレーションする時の、R, G, B のバイト・フィールドを確かめるために、前回は、データ幅を 24 ビットに変更した choose_RGB IP と AXI4-Stream Data Width Converter を使用して Vivado 2021.2 でブロック・デザインを修正して、論理合成、インプリメンテーション、ビットストリームの生成を行った。今回は、できあがったビットファイルと hwh ファイルを KV260 の Jupyter Notebook にアップロードし、動作をテストしたところ成功した。

前回、Vivado 2021.2 の check_RGB で作成した check_RGB.gen/sources_1/bd/check_RGB/hw_handoff/check_RGB.hwh と check_RGB/check_RGB.runs/impl_1/check_RGB_wrapper.bit を Jupyter Notebook の check_RGB ディレクトリにアップロードして check_RGB_wrapper.bit の名前を check_RGB.bit に変更した。

もう一度 Python3 のソースコードを示す。
ソースコードのみを示す。(なお、このソースコードは resizer_pl.ipynb を参考にさせていただいています)
変換後の画像を表示する行を追加した。

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from pynq import allocate, Overlay

check_RGBd = Overlay("./check_RGB.bit")

dma = check_RGBd.axi_dma_0
chRGB = check_RGBd.choose_RGB_0

image_path = "./RGB_test.png"
original_image = Image.open(image_path)

canvas = plt.gcf()
size = canvas.get_size_inches()
canvas.set_size_inches(size*2)

width, height = original_image.size
print("Image size: {}x{} pixels.".format(width, height))
plt.figure(figsize=(6, 5));
_ = plt.imshow(original_image)

in_buffer = allocate(shape=(height, width, 3), 
                           dtype=np.uint8, cacheable=1)
out_buffer = allocate(shape=(height, width, 3), 
                            dtype=np.uint8, cacheable=1)

in_buffer[:] = np.array(original_image)

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

print(height)
print(width)

chRGB.register_map.row_size = height
chRGB.register_map.col_size = width
chRGB.register_map.choose_rgb_val = 0

run_kernel()
chRGB_image = Image.fromarray(out_buffer)

print("Image size: {}x{} pixels.".format(width, height))
plt.figure(figsize=(6, 5));
_ = plt.imshow(chRGB_image)

del in_buffer
del out_buffer


Jupyter Notebook の実行結果を示す。

chRGB.register_map.choose_rgb_val = 0

の場合。
image_format4PYNQ_47_220319.png
image_format4PYNQ_48_220319.png

ビット 7 〜 0 まで抽出すると赤が含まれているフィールドのみを表示できた。成功だ。

chRGB.register_map.choose_rgb_val = 1

の場合。
image_format4PYNQ_49_220319.png

ビット 15 〜 8 まで抽出すると緑が含まれているフィールドのみを表示できた。

chRGB.register_map.choose_rgb_val = 2

の場合。
image_format4PYNQ_50_220319.png

ビット 23 〜 16 まで抽出すると青が含まれているフィールドのみを表示できた。

chRGB.register_map.choose_rgb_val = 2

の場合の実際の波形を見てみよう。
Vivado 2021.2 で ILA ダッシュボードを起動した。
axi_dma_0_M_AXI_S2MM : AWVALID の立ち上がりでトリガーを掛けた。
image_format4PYNQ_51_220319.png

AXI4 Master インターフェースの axi_dma_0_M_AXI_S2MM のデータが変化している部分を表示した。
やはり、cv::xf::Mat 形式のようだ。
image_format4PYNQ_53_220319.png

Vivado 2021.2 の check_RGB ブロック・デザインをもう一度見る。
image_format4PYNQ_42_220317.png

slot2 が axi_dma_0 の MM2S の出力で、slot3 が AXI4-Stream Data Width Converter の出力になるので、観察すると、axi_dma_0 の MM2S の出力は cv::xf::Mat 形式だが、 AXI4-Stream Data Width Converter の出力は色でバイト・フィールドを決定されたフォーマットに変換されている。
image_format4PYNQ_52_220319.png

AXI4-Stream Data Width Converter を使用すると cv::xf::Mat 形式を色でバイト・フィールドを決定されたフォーマットに変換してくれるようだ。
  1. 2022年03月19日 04:48 |
  2. KRIA KV260 Vision AI Starter Kit
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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