FC2カウンター FPGAの部屋 2023年09月23日
fc2ブログ

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

FPGAの部屋

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

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

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

Vitis HLS 2023.1 で RGB の各色を n 倍する color_converter_RGB24 IP を作成する2”で作成した color_converter_RGB24 IP を”ZUBoard 1CG の PYNQ v3.0.1 で自作のガウシアン・フィルタ、メディアン・フィルタとソーベル・フィルタを動作させる4”の回路に追加してみようということで、前回は、”メディアン・フィルタとガウシアン・フィルタが RBG 出力でバグっていた”で、median_axis_RGB24 IP と gaussian_axis_RGB24 IP がバグっているのがわかった。Vitis HLS 2023.1 を起動して、median_axis_RGB24 IP と gaussian_axis_RGB24 IP をバグを修正してから、C シミュレーション、C コードの合成、Export RTL を行った。できた IP を Vivado 2023.1 の i4filters プロジェクトの median_axis_RGB24 IP と gaussian_axis_RGB24 IP と入れ替えて、論理合成、インプリメンテーション、ビットストリームの生成を行って成功した。今回は、hwh ファイルと bit ファイルを ZUBoard 1CG の PYNQ Linux にアップロードし、i4filters.ipynb を作成した。i4filters.ipynb を実行したところ、無事に”Vitis HLS 2023.1 で RGB の各色を n 倍する color_converter_RGB24 IP を作成する2”で作成した color_converter_RGB24 IP を動作させることができた。

HDL/2023.1/zub1cg/i4filters/i4filters.gen/sources_1/bd/i4filters/hw_handoff/i4filters.hwh ファイルと HDL/2023.1/zub1cg/i4filters/i4filters.runs/impl_1/i4filters_wrapper.bit ファイルを ZUBoard 1CG の PYNQ Linux の Jupter Notebook にアップロードした。

test2.jpg と blue.bmp, green.bmp, red.bmp ファイルを Jupter Notebook の i3filters ディレクトリからコピーした。

i4filters.ipynb を作成した。
zub1cg_pynq_286_230922.png

i4fitlers.ipynb を示す。

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

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

dma = i4filters.axi_dma_0
median = i4filters.median_axis_RGB24_0
sobel = i4filters.sobel_axis_RGB24_0
gaussian = i4filters.gaussian_axis_RGB24_0
color_conv = i4filters.color_converter_RGB24_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), 

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
    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

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 = 0x2000 # 32.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 = 0x0100 # 1.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


i4filters.ipynb を実行した。
zub1cg_pynq_287_230922.png
zub1cg_pynq_288_230922.jpg
zub1cg_pynq_289_230922.png
zub1cg_pynq_290_230922.jpg
メディアン・フィルタでノイズを除去した後に color_converter_RGB24 IP で赤だけを 32 倍にした。
ガウシアン・フィルタとソーベル・フィルタはスルーに設定した。

メディアン・フィルタでノイズを除去した後に color_converter_RGB24 IP で緑だけを 32 倍にした。
zub1cg_pynq_291_230922.jpg

メディアン・フィルタでノイズを除去した後に color_converter_RGB24 IP で青だけを 32 倍にした。
zub1cg_pynq_292_230922.jpg
  1. 2023年09月23日 04:19 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0