FC2カウンター FPGAの部屋 ZUBoard
fc2ブログ

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

FPGAの部屋

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

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する5

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する4”の続き。

median_hlsst_RGB24 に tlast を追加するということで、前回は、Bambu で生成された median_hlsst_RGB24.v を Vivado 2023.2 の bambu_median プロジェクトの median_hlsst_RGB24.v と入れ替えて、tdata と tlast を出力できるように Slice を追加した。その後、論理合成、インプリメンテーション、ビットストリームの生成を行って、成功した。今回は、前回作成した bit ファイルと hwh ファイルを ZUBoard 1CG の PYNQ Linux の Jupyter Notebook 上にアップロードして動作を確認したところ、問題なく動作した。

ZUBoard 1CG で PYNQ Linux を起動して、ホスト・パソコンの Chrome ブラウザで PYNQ Linux の Jupyter Notebook を表示した。
bambu_median ディレクトリに移動した。
bambu_median.bit と bambu_median.hwh ファイルを削除した。

bit ファイルと hwh ファイルを再アップロードした。
bambu_median_wrapper.bit を bambu_median.bit に名前を変更した。

現在の bambu_median ディレクトリを示す。
bambu_267_240126.png

bambu_median.ipynb を実行したところ、”Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる5”とは異なり、問題なく動作した。やはり、tlast が axi dma に入らないのが問題だったようだ。
bambu_268_240126.png
bambu_269_240126.jpg
bambu_274_240126.png
bambu_270_240126.jpg

ILA ダッシュボードで tlast を確認した。
median_hlsst_RGB24_outs_din の最後が 0x1948170 になっているのが分かる。
median_hlsst_RGB24_outs_din[24] の最上位ビットが 1 のときが tlast = 1 なので、tlast が出力されいることが分かる。
tlast は最後のデータ転送以外は 0 になっている。
bambu_271_240126.png
bambu_272_240126.png
bambu_273_240126.png

sobel_axs_RGB24_0_outs : TLAST も最後に 1 になっているのが分かる。
  1. 2024年01月26日 04:45 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する4

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する3”の続き。

median_hlsst_RGB24 に tlast を追加するということで、前回は、Cocotb でシミュレーションを行って、tlast が正常に出力できているのが確認できた。今回は、Bambu で生成された median_hlsst_RGB24.v を Vivado 2023.2 の bambu_median プロジェクトの median_hlsst_RGB24.v と入れ替えて、tdata と tlast を出力できるように Slice を追加した。その後、論理合成、インプリメンテーション、ビットストリームの生成を行って、成功した。

前回までで、Bambu で生成された median_hlsst_RGB24.v を Vivado 2023.2 の bambu_median プロジェクトの median_hlsst_RGB24.v と入れ替えた。
bambu_261_240125.png

なお、bambu_median プロジェクトについては、以下のブログ記事を参照のこと。
Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる1
Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる2
Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる3
Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる4

median_hlsst_RGB24_0 の outs_din の 0 ビット目から 23 ビット目までを tdata24 の Slice で分離して、sobel_axis_RGB24_0 の TDATA[23:0] に入力した。
bambu_262_240125.png

median_hlsst_RGB24_0 の outs_din の 24 ビット目を tlast の Slice で分離して、sobel_axis_RGB24_0 の TLAST[0:0] に入力した。
bambu_263_240125.png

tkeep の Constant の出力を sobel_axis_RGB24_0 の TKEEP[2:0] に入力した。
Const Width は 3 、Const Val は 7 に設定した。
bambu_264_240125.png

Address Editor を示す。
bambu_266_240125.png

論理合成、インプリメンテーション、ビットストリームの生成を行って、成功した。
Project Summary を示す。
bambu_265_240125.png
  1. 2024年01月25日 04:23 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する2

Bambu で実装した hls stream インターフェースのメディアン・フィルタに tlast を追加する1”の続き。

median_hlsst_RGB24 に tlast を追加するということで、前回は、median_hlsst_RGB24.cpp を変更し、outs 出力ストリームのデータ・ビット幅を 1 ビット増やして、そこに tlast の機能を割り当てた。そして、g++ コンパイラでコンパイルし動作を確認した。今回は、median_hlsst_RGB24.cpp を Bambu で高位合成して、median_hlsst_RGB24.v を生成した。

median_hlsst_RGB24.cpp を Bambu で高位合成した。
bambu median_hlsst_RGB24.cpp --top-fname=median_hlsst_RGB24 -I/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 -O5 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -p=mult=1

ログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/examples/median_hlsst_RGB24$ bambu median_hlsst_RGB24.cpp --top-fname=median_hlsst_RGB24 -I/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 -O5 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -p=mult=1
 ==  Bambu executed with: /tmp/.mount_bambuZtXzVh/usr/bin/bambu --top-fname=median_hlsst_RGB24 -I/media/masaaki/Ubuntu_Disk/PandA-bambu-2023.1/etc/libbambu/ac_types/include --compiler=I386_CLANG13 -O5 --generate-tb=test.xml --simulator=ICARUS --print-dot --simulate --generate-vcd --generate-interface=INFER --registered-inputs=no -p=mult=1 median_hlsst_RGB24.cpp 


********************************************************************************
                    ____                  _
                   | __ )  __ _ _ __ ___ | |_   _   _
                   |  _ \ / _` | '_ ` _ \| '_ \| | | |
                   | |_) | (_| | | | | | | |_) | |_| |
                   |____/ \__,_|_| |_| |_|_.__/ \__,_|

********************************************************************************
                         High-Level Synthesis Tool

                         Politecnico di Milano - DEIB
                          System Architectures Group
********************************************************************************
                Copyright (C) 2004-2023 Politecnico di Milano
 Version: PandA 2023.1 - Revision 04336c437a53bc96ae90b74052c455629946ec8b-main

Target technology = FPGA
  Analyzing function _Z18median_hlsst_RGB24R10ac_channelI6ac_intILi24ELb0EEERS_IS0_ILi25ELb0EEEii
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 24
      Alignment : 8
    Interface specification:
      Protocol  : fifo
      Bitwidth  : 25
      Alignment : 8
  Analyzed function _Z18median_hlsst_RGB24R10ac_channelI6ac_intILi24ELb0EEERS_IS0_ILi25ELb0EEEii

  Functions to be synthesized:
    median_hlsst_RGB24


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 17
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 65536
    Internally allocated memory: 96328
  Time to perform memory allocation: 0.00 seconds


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 17
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 65536
    Internally allocated memory: 96328
  Time to perform memory allocation: 0.00 seconds


  Memory allocation information:
    BRAM bitsize: 32
    Spec may not exploit DATA bus width
    All the data have a known address
    Internal data is not externally accessible
    DATA bus bitsize: 64
    ADDRESS bus bitsize: 17
    SIZE bus bitsize: 7
    ALL pointers have been resolved
    Internally allocated memory (no private memories): 65536
    Internally allocated memory: 96328
  Time to perform memory allocation: 0.00 seconds


  Module allocation information for function median_hlsst_RGB24:
    Number of complex operations: 26
    Number of complex operations: 26
  Time to perform module allocation: 0.39 seconds


  Scheduling Information of function median_hlsst_RGB24:
    Number of control steps: 21
    Minimum slack: 0.16582799699998785
    Estimated max frequency (MHz): 101.686242593168
  Time to perform scheduling: 0.15 seconds


  State Transition Graph Information of function median_hlsst_RGB24:
    Number of states: 21
    Done port is registered
  Time to perform creation of STG: 0.08 seconds


  Easy binding information for function median_hlsst_RGB24:
    Bound operations:175/859
  Time to perform easy binding: 0.00 seconds


  Storage Value Information of function median_hlsst_RGB24:
    Number of storage values inserted: 120
  Time to compute storage value information: 0.00 seconds

  Slack computed in 0.01 seconds
  Weight computation completed in 0.03 seconds
  False-loop computation completed in 0.00 seconds

  Register binding information for function median_hlsst_RGB24:
    Register allocation algorithm obtains a sub-optimal result: 116 registers(LB:53)
  Time to perform register binding: 0.01 seconds


  Register binding information for function median_hlsst_RGB24:
    Register allocation algorithm obtains a sub-optimal result: 116 registers(LB:53)
  Time to perform register binding: 0.00 seconds

  Clique covering computation completed in 0.02 seconds

  Module binding information for function median_hlsst_RGB24:
    Number of modules instantiated: 843
    Number of performance conflicts: 2567
    Estimated resources area (no Muxes and address logic): 9857
    Estimated area of MUX21: 349
    Total estimated area: 10206
    Estimated number of DSPs: 0
  Time to perform module binding: 0.07 seconds


  Register binding information for function median_hlsst_RGB24:
    Register allocation algorithm obtains a sub-optimal result: 116 registers(LB:53)
  Time to perform register binding: 0.00 seconds


  Connection Binding Information for function median_hlsst_RGB24:
    Number of allocated multiplexers (2-to-1 equivalent): 24
  Time to perform interconnection binding: 0.01 seconds

  Total number of flip-flops in function median_hlsst_RGB24: 2395
error -> Value of ins is missing in test vector

Please report bugs to <panda-info@polimi.it>


やはり、”Bambu で hls stream インターフェースのメディアン・フィルタを高位合成する2”よりもリソース使用量が増えている。

median_hlsst_RGB24.v が生成された。
outs_din 出力ポートが 25 ビット幅になっているのが分かる。
bambu_256_240123.png

やはり、PandA-bambu-2023.1/examples/median_hlsst_RGB24/HLS_output/simulation ディレクトリは空で、VCD ファイルが生成されていなかった。
  1. 2024年01月23日 04:42 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる6

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる5”の続き。

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみたいということで、前回は、bit ファイルと hwh ファイルを ZUBoard 1CG の PYNQ Linux の Jupyter Notebook 上にアップロードして動作を確認したが、dma.recvchannel.wait() でエラーになった。今回は、ILA ダッシュボードで波形を観測したところ、問題なく各モジュールが動作していたので、そ~ベル・フィルタの出力画像を確認したところ、問題なく画像が表示された。多分、Bambu で作成したメディアン・フィルタ IP からTLAST が出力されないのが問題のようだ?

ILA ダッシュボードで median_hlsst_RGB24_0 の outs_write の立ち上がりでトリガを掛けた。
bambu_250_240121.png

問題なく、トランザクションが行われているようだ。

次に、sobel_axis_RGB24_0 の TVALID でトリガを掛けた。
bambu_251_240121.png

こちらも問題なく、トランザクションが行われているようだ。

ここまで問題なかったので、axi_dma_0 の S2MM の波形を観察する。
axi_dma_0 の S2MM の WVALID でトリガを掛けた。
bambu_252_240121.png
bambu_253_240121.png
bambu_254_240121.png

う〜ん。良さそうだ。。。

ここまで動作しているとなると、最後の TLAST が axi_dma_0 に入力されないという不具合だと思うので、ソーベル・フィルタ出力は正常に出力されているはずだ。
Jupyter Notebook の plt.imshow() のところに、sobel_image = Image.fromarray(out_buffer) を追加して、実行してみると、ソーベル・フィルタ画像が表示できた。
bambu_255_240121.jpg

つまり、予想通り、最後の TLAST が axi_dma_0 に入力されないという不具合だったようだ。
  1. 2024年01月21日 05:07 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる5

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる4”の続き。

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみたいということで、前回は、System ILA を追加するのを忘れていたので、System ILA を追加して、もう一度、論理合成、インプリメンテーション、ビットストリームの生成を行って、bit ファイルと hwh ファイルを生成した。今回は、前回作成した bit ファイルと hwh ファイルを ZUBoard 1CG の PYNQ Linux の Jupyter Notebook 上にアップロードして動作を確認したが、dma.recvchannel.wait() でエラーになった。

ZUBoard 1CG で PYNQ Linux を起動して、ホスト・パソコンの Chrome ブラウザで PYNQ Linux の Jupyter Notebook を表示した。
bambu_median ディレクトリを作成し、bit ファイルと hwh ファイルをアップロードした。
bambu_median_wrapper.bit を bambu_median.bit に名前を変更した。
ノイズ付きの画像ファイル test2.jpg を他のディレクトリからコピーした。

bambu_median.ipynb ファイルを作成した。
Python コードを示す。

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

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

dma = bambu_median.axi_dma_0
median_reg = bambu_median.median_reg_0
sobel = bambu_median.sobel_axis_RGB24_0

image_path = "./test2.jpg"
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)
                            
def run_kernel():
    dma.sendchannel.transfer(in_buffer)
    dma.recvchannel.transfer(out_buffer)
    median_reg.register_map.start_p = 1
    median_reg.write(0x00,0x01) # start
    median_reg.register_map.start_p = 0
    median_reg.write(0x00,0x01) # start
    sobel.write(0x00,0x01) # start
    dma.sendchannel.wait()
    dma.recvchannel.wait()

print(height)
print(width)

median_reg.register_map.rows = height
median_reg.register_map.cols = width
median_reg.register_map.start_p = 0

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


bambu_median ディレクトリを示す。
bambu_246_240120.png

bambu_median.ipynb を実行した。
bambu_247_240120.png
bambu_248_240120.jpg
bambu_249_240120.png

dma.recvchannel.wait() で”RuntimeError: DMA channel not started”だった。
  1. 2024年01月20日 19:03 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる4

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる3”の続き。

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみたいということで、前回は、HDL ラッパー・ファイルを生成し、論理合成、インプリメンテーション、ビットストリームの生成を行って、bit ファイルと hwh ファイルを生成した。今回は、System ILA を追加するのを忘れていたので、System ILA を追加して、もう一度、論理合成、インプリメンテーション、ビットストリームの生成を行って、bit ファイルと hwh ファイルを生成した。

回路にデバッグのための System ILA を追加する。
axi_dma_0 の M_AXI_MM2S, M_AXI_S2MM の AXI4 インターフェースと、median_hlsst_RGB24_0 の clock, reset 以外の信号、sobel_axis_RGB24_0 の outs にDebug を指定して、System ILA を追加した。
bambu_243_240119.png

Address Editor を示す。
bambu_244_240119.png

論理合成、インプリメンテーション、ビットストリームの生成を行ったところ、成功した。
Project Summary を示す。
bambu_245_240119.png

前回から、リソース使用量が増えている。

HDL/2023.2/zub1cg/bambu_median/bambu_median.gen/sources_1/bd/bambu_median/hw_handoff ディレクトリに bambu_median.hwh が再度、生成された。

HDL/2023.2/zub1cg/bambu_median/bambu_median.runs/impl_1 ディレクトリに bambu_median_wrapper.bit がさいs度、生成された。
  1. 2024年01月19日 05:09 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる3

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみる2”の続き。

Bambu で高位合成した median_hlsst_RGB24 を ZUBoard 1CG の PYNQ で試してみたいということで、前回は、bambu_median ブロック・デザインを完成させた。今回は、HDL ラッパー・ファイルを生成し、論理合成、インプリメンテーション、ビットストリームの生成を行って、bit ファイルと hwh ファイルを生成した。

Vivado の Sources ウインドウのタブをクリックし、Sources ウインドウに移った。
bambu_median_i ブロック・デザインを右クリックし、右クリックメニューから Create HDL Wrapper... を選択し、HDL ラッパー・ファイルの bambu_medain_wrapper.v を生成した。
bambu_237_240117.png

現在、median_hlsst_RGB24.v がトップに設定されているので、bambu_medain_wrapper.v をトップに設定する必要がある。
bambu_medain_wrapper.v を右クリックし、右クリックメニューから Set as Top を選択した。
bambu_medain_wrapper.v がトップになった。
bambu_238_240117.png

これで、論理合成を行うことができる。
Vivado の Flow Navigator の PROGRAM AND DEBUG -> Generate Bitstream をクリックして、論理合成、インプリメンテーション、ビットストリームの生成を行った。
しかし、長い時間、論理合成を行っていたが、エラーになった。
原因を追求したところ、IP Catalog に間違って不正な IP が入っていたので、それを削除した。
bambu_239_240117.png

もう一度、論理合成、インプリメンテーション、ビットストリームの生成を行ったところ、成功した。
Project Summary を示す。
bambu_240_240117.png

HDL/2023.2/zub1cg/bambu_median/bambu_median.gen/sources_1/bd/bambu_median/hw_handoff ディレクトリに bambu_median.hwh が生成された。
bambu_242_240117.png

HDL/2023.2/zub1cg/bambu_median/bambu_median.runs/impl_1 ディレクトリに bambu_median_wrapper.bit が生成された。
bambu_241_240117.png
  1. 2024年01月18日 04:22 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0
»