FC2カウンター FPGAの部屋 ZUBoard 1CG の PYNQ v3.0.1 で自作の 5 個のフィルタを動作させる3
fc2ブログ

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

FPGAの部屋

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

ZUBoard 1CG の PYNQ v3.0.1 で自作の 5 個のフィルタを動作させる3

ZUBoard 1CG の PYNQ v3.0.1 で自作の 5 個のフィルタを動作させる2”の続き。

RGB24toHSV - HSVConverter - HSVtoRGB24 の各 IP を加えた 5 個のフィルタを動作させたいということで、前回は、RGB24toHSV - HSVConverter - HSVtoRGB24 の各 IP を加えたところ、HSVtoRGB24 IP に col_size の入力ポートが付いていたが、これはバグだ。正しくは、AXI4-Liteインターフェースのレジスタになるはずだった。そこで、Vitis HLS 2023.1 を起動して、バグを修正し、もう一度、HSVtoRGB24 IP をブロック・デザインに追加した。論理合成、インプリメンテーション、ビットストリームの生成を行って、成功した。今回は、ZUBoard 1CG の PYNQ を立ち上げて、upyter Notebook 上で i5filters フォルダを作成し、Jupyter Notebook で前回作成したビット・ファイルと hwh ファイルをアップグレードした。画像ファイルを用意して、i5filters.ipynb ファイルを作成し、実行したところ、真っ黒な画像が得られた。デバッグの必要がある。

まずは、前回、作成できたビット・ファイルと hwh ファイルを見る。
i5filters/i5filters.runs/impl_1/i5filters_wrapper.bit がビット・ファイルだ。
zub1cg_i5filters_86_231110.png

i5filters/i5filters.gen/sources_1/bd/i5filters/hw_handoff/i5filters.hwh が hwh ファイルだ。
zub1cg_i5filters_85_231110.png

ZUBoard 1CG の PYNQ を起動して、Jupyter Notebook で、i5filters フォルダを作成した。
i5filters フォルダに i5filters.hwh と i5filters_wrapper.bit をアップロードし、i5filters_wrapper.bit の名前を i5filters.bit に変更した。
i4filters フォルダから test2.jpg をコピーした。
Python3 の i5filters.ipynb ファイルを新規作成した。
zub1cg_i5filters_87_231110.png

i5filters.ipynb の Python3 コードを書いた。

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')
from pynq import allocate, Overlay

i5filters = Overlay("./i5filters.bit")

dma = i5filters.axi_dma_0
median = i5filters.median_axis_RGB24_0
sobel = i5filters.sobel_axis_RGB24_0
gaussian = i5filters.gaussian_axis_RGB24_0
color_conv = i5filters.color_converter_RGB24_0
rgb2hsv = i5filters.RGB24toHSV_0
hsvconv = i5filters.HSVConverter_0
hsv2rgb = i5filters.HSVtoRGB24_0

image_path = "./test2.jpg"
#image_path = "./blue.bmp"
#image_path = "./green.bmp"
#image_path = "./red.bmp"
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=(12, 10));
_ = 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) 
    gaussian.write(0x00,0x01) # start
    median.write(0x00,0x01) # start
    rgb2hsv.write(0x00,0x01) # start
    hsvconv.write(0x00,0x01) #start
    hsv2rgb.write(0x00,0x01) #start
    color_conv.write(0x00,0x01) #start
    sobel.write(0x00,0x01) # start
    dma.sendchannel.wait()
    dma.recvchannel.wait()

print(height)
print(width)

gaussian.register_map.row_size = height
gaussian.register_map.col_size = width
gaussian.register_map.function_r = 2 # ORG_IMGwAxiDma
#gaussian.register_map.function_r = 3 # GAUSSIANwAxiDma

median.register_map.row_size = height
median.register_map.col_size = width
#median.register_map.function_r = 2 # ORG_IMGwAxiDma
median.register_map.function_r = 3 # MEDIANwAxiDma

rgb2hsv.register_map.row_size = height
rgb2hsv.register_map.col_size = width
rgb2hsv.register_map.function_r = 1 # ForAXIDma

hsvconv.register_map.row_size = height
hsvconv.register_map.col_size = width
#hsvconv.register_map.function_r = 2 # ORG_IMGwAxiDma
hsvconv.register_map.function_r = 3 # HSV_CONVwAxiDma
hsvconv.register_map.h_add = 1
hsvconv.register_map.s_mult = 0x0100 # 1.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT> 
hsvconv.register_map.s_add = 1
hsvconv.register_map.v_mult = 0x0100 # 1.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT> 
hsvconv.register_map.v_add = 1

hsv2rgb.register_map.row_size = height
hsv2rgb.register_map.col_size = width
hsv2rgb.register_map.function_r = 1 # ForAXIDma

color_conv.register_map.row_size = height
color_conv.register_map.col_size = width
color_conv.register_map.function_r = 2 # ORG_IMGwAxiDma
#color_conv.register_map.function_r = 3 # COLOR_CONVwAxiDma
color_conv.register_map.red_mag = 0x0100 # 1.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT>
color_conv.register_map.green_mag = 0x0100 # 1.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT> 
color_conv.register_map.blue_mag = 0x2000 # 32.0, ap_ufixed<16, 8, AP_TRN_ZERO, AP_SAT> 

sobel.register_map.row_size = height
sobel.register_map.col_size = width
sobel.register_map.function_r = 2 # ORG_IMGwAxiDma
#sobel.register_map.function_r = 3 # SOBELwAxiDma

run_kernel()
sobel_image = Image.fromarray(out_buffer)

print("Image size: {}x{} pixels.".format(width, height))
plt.figure(figsize=(12, 10));
_ = plt.imshow(sobel_image)

del in_buffer
del out_buffer


i5filters.ipynb を実行したが、得られた画像は真っ黒だった。デバッグが必要だ。
zub1cg_i5filters_88_231110.jpg
zub1cg_i5filters_89_231110.jpg
zub1cg_i5filters_90_231110.jpg
zub1cg_i5filters_91_231110.jpg
zub1cg_i5filters_92_231110.jpg
  1. 2023年11月11日 04:16 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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