FPGAの部屋

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

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

カテゴリ: Vitis HLS

Vitis HLS 2023.2 で AXI4-Lite インターフェースのレジスタを生成する2”の続き。

Vitis HLS 2023.2 (本当は統合されたので Vitis 2023.2 を使用しているが高位合成ということで、ご勘弁願いたい)で AXI4-Lite インターフェースのレジスタを生成したいということで、前回は、median_reg.cpp と median_reg_tb.cpp を貼って、C シミュレーションと C コードの合成を行った。今回は、C/RTL 協調シミュレーションと Package, Implementation を行った。

C/RTL 協調シミュレーションを行う。
左の VITIS COMPONENT ウインドウの median_reg -> Settings -> hls_config.cfg をクリックし、C/RTL Cosimulation の trace_level を all に設定した。
9c4d61ad.png


C/RTL 協調シミュレーションが終了した。
3e71baf6.png


FLOW ウインドウの C/RTL COSIMULATION -> REPORTS -> Cosimulation をクリックして、レポートを表示した。
4056e3c4.png


レイテンシは 1 クロックだった。

C/RTL 協調シミュレーションの波形を確認する。
FLOW ウインドウの C/RTL COSIMULATION -> REPORTS -> Wave Viewer をクリックした。
89d0d2c2.png


なお、s_axi_control_WDATA と col_size, row_size 信号は十進数に変換してある。

FLOW -> PACKAGE -> Run をクリックして、Package を行った。
Summary を示す。
58533665.png


median_reg/median_reg/hls/impl/ip ディレクトリに xilinx_com_hls_median_reg_1_0.zip が生成された。

hls_config.cfg をクリックし、Implementation の flow はデフォルトで Run full implementation (RTL synthesis, place and routte) に設定されていた。これで問題無い。
FLOW -> IMPLEMENTATION -> Run をクリックした。
Implementation が終了し、成功した。
67d86533.png


FLOW -> IMPLEMENTATION -> Place and Route をクリックした。
af75feed.png


CP achieved post-implementation の値は、1.529 ns で全く問題ない。

Vitis HLS 2023.2 で AXI4-Lite インターフェースのレジスタを生成する1”の続き。

Vitis HLS 2023.2 (本当は統合されたので Vitis 2023.2 を使用しているが高位合成ということで、ご勘弁願いたい)で AXI4-Lite インターフェースのレジスタを生成したいということで、前回は、Vitis 2023.2 で ZUBoard 1CG 用の HLS Development プロジェクトの median_reg プロジェクトを作成した。今回は、median_reg.cpp と median_reg_tb.cpp を貼って、C シミュレーションと C コードの合成を行った。

まずは、median_reg.cpp を示す。

// median_reg.cpp
// 2024/01/13 by marsee

#include <cstdint>
#include <stdint.h>
#include <ap_int.h>

void median_reg(int32_t rows, int32_t cols, int32_t &row_size, int32_t &col_size,
    ap_uint<1> start_p, ap_uint<1> &start_port){
#pragma HLS INTERFACE mode=ap_none port=start_port register
#pragma HLS INTERFACE mode=s_axilite port=start_p
#pragma HLS INTERFACE mode=s_axilite port=return
#pragma HLS INTERFACE mode=ap_none port=col_size register
#pragma HLS INTERFACE mode=ap_none port=row_size register
#pragma HLS INTERFACE mode=s_axilite port=cols
#pragma HLS INTERFACE mode=s_axilite port=rows
    row_size = rows;
    col_size = cols;
    start_port = start_p;                  
}


テストベンチの median_reg_tb.cpp を示す。

// median_reg_tb.cpp
// 2024/01/13 by marsee

#include <stdio.h>
#include <stdint.h>
#include <ap_int.h>

void median_reg(int32_t rows, int32_t cols, int32_t &row_size, int32_t &col_size,
    ap_uint<1> start_p, ap_uint<1> &start_port);

int main(){
    int32_t rows, cols;
    int32_t row_size, col_size;
    ap_uint<1> start_p, start_port;

    rows = 600;
    cols = 800;
    start_p = 1;

    median_reg(rows, cols, row_size, col_size, start_p, start_port);
    printf("rows_size = %d, col_size = %d, start_port = %d\n"
        , row_size, col_size, start_port);

    return(0);
}


C シミュレーションを行った。
”rows_size = 600, col_size = 800, start_port = 1”が表示された。
f5029f4c.png


C コードの合成を行う前に、合成するトップの関数を指定した。
Vitis Unified IDE 2023.2 で、左の VITIS COMPONENTS の median_reg -> Settings -> hls_config.cfg をクリックした。
C Synthesis sources をクリックし、top に median_reg を設定した。
3581375d.png


FLOW の C SYNTHESIS -> Run をクリックして、C コードの合成を行って成功した。
072da8c6.png


FLOW の C SYNTHESIS -> REPORTS -> Synthesis を表示した。
rows, cols, start_p の各レジスタが実装された。
64ffd2a7.png


Vitis Unified IDE 2023.2 で、左の VITIS COMPONENTS の median_reg -> Output -> syn -> verilog に median_reg.v と median_reg_control_s_axi.v が生成されていた。
median_reg.v には、row_size, col_size, start_port の出力ポートが実装されている。
median_reg.v を示す。
2e568efc.png


median_reg_control_s_axi.v には、0x10 番地に rows レジスタが、0x18 番地に cols レジスタが、そして、0x20 番地に start_p レジスタが実装されている。
4852e794.png

Vitis HLS 2023.2 (本当は統合されたので Vitis 2023.2 を使用しているが高位合成ということで、ご勘弁願いたい)で AXI4-Lite インターフェースのレジスタを生成したい。というのも、Bambu では画像の縦、横のピクセル数の設定を入力ポートでしか設定できなようだからだ。つまり、プロセッサから自由に画像サイズを設定したいということで、Vitis HLS 2023.2 で作成することにした。

使用するボードは ZUBoard 1CG とする。PYNQ を使用して、回路の動作を確認する予定だ。
久しぶりに Vitis 2023.2 の HLS Development を使用するので、丁寧にプロジェクトを作っていこう。

まずは Vitis 2023.2 を起動した。
HLS Development の Create Component をクリックして、HLS のプロジェクトを作成する。
710864ac.png


Name and Location 画面
component name に median_reg を入力した。
5cbbc0ac.png


Configuration File 画面
デフォルトのままとした。
312133ae.png


Source File 画面
デフォルトのままとした。
7861f542.png


Part 画面
図のように設定し、xczu1cg-sbva484-1-e を選択した。
36b0db6c.png


Edit Settings 画面
clock に 10ns 、clock_uncertainty に 27% を入力した。clock_uncertainty に値を入力しないとプロジェクト作成時にバグるので、設定すること。
b7876eb7.png


Summary 画面
Finish ボタンをクリックした。
51c8a6f7.png


median_reg プロジェクトが生成された。
e2b8bfc4.png

Vitis Unified IDE 2023.2 でエッジ強調フィルタの edge_enhancement_axis_RGB24 を実装する2”の続き。

Vitis Unified IDE 2023.2 でエッジ強調フィルタの edge_enhancement_axis_RGB24 を実装するということで、前回は、C シミュレーション、C コードの合成を行った。今回は、C/RTL 協調シミュレーション、Package 、Implementation を行った。

C/RTL 協調シミュレーションを行う。
VITIS COMPONETENTS -> edge_enhancement_axis_RGB24 -> Settings -> hls_config.cfg をクリックして、設定画面を表示した。
C/RTL Cosimulationldflags

-L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_imgproc

を指定した。
C/RTL Cosimulation の trace_levelport にした。
C/RTL Cosimulation の wave_debug にチェックを入れた。

FLOW -> C/RTL COSIMULATION -> Run をクリックして、C/RTL 協調シミュレーションを行った。
Vivado が起動して、RTL シミュレーションを行って終了した。
cb1a830a.png


edge_enhancement_axis_RGB24.wcfg タブをクリックし、波形を表示した。
全体波形を示す。
f0192cae.png


C/RTL 協調シミュレーションが終了し、成功した。
9e96a091.png


Cosimulation をクリックした。
レイテンシは 480013 クロックだった。問題無さそうだ。
de59139c.png


Package を行う。
FLOW -> PACKAGE -> Run をクリックして、Package を行って成功した。
bf33cc54.png


edge_enhancement_axis_RGB24/edge_enhancement_axis_RGB24/hls/impl/ip が生成されて、その中に ZIP ファイルとして、xilinx_com_hls_edge_enhancement_axis_RGB24_1_0.zip が生成された。
70ac36e0.png


Implementation を行う。
FLOW -> IMPLEMENTATION -> Run をクリックした。
Implementation が終了し、成功した。
b16acd96.png


Place and Route をクリックした。
CP achieved post-implementation も 5.325 ns で問題無さそうだ。
6e56ebe7.png

Vitis Unified IDE 2023.2 でエッジ強調フィルタの edge_enhancement_axis_RGB24 を実装する1”の続き。

Vitis Unified IDE 2023.2 でエッジ強調フィルタの edge_enhancement_axis_RGB24 を実装するということで、前回は、、Vitis Unified IDE 2023.2 で ZUBoard 1CG 用のエッジ強調フィルタの edge_enhancement_axis_RGB24 プロジェクトと作成し、ソースコードとテストベンチを書いた。今回は、C シミュレーション、C コードの合成を行った。

FLOW の C SIMULATION -> Run をクリックすると C Simulation が実行され、成功した。
62d90336.png


edge_enhancement_axis_RGB24 プロジェクトのディレクトリの下に edge_enhancement_axis_RGB24 ディレクトリが生成され、その下の hls ディレクトリの下に csim ディレクトリが生成されている。
csim/build ディレクトリを見ると、edge_enhancement.jpg と org_image.jpg が生成されていた。
73ae9a74.png


画像ソフトの Pinta で 2.0 のガウスぼかしを掛けた test2.jpg とエッジ強調フィルタ処理後の edge_enhancement.jpg を示す。
edge_enhancement.jpg はボケがある程度戻っている。
d6999ddf.jpg


アンシャープマスキング・フィルタと比べてみよう。
エッジ強調フィルタと k = 4.0 のアンシャープマスキング・フィルタの出力を比較してみた。
入力画像は、画像ソフトの Pinta で 2.0 のガウスぼかしを掛けた test2.jpg で同一だ。
9d60d600.jpg


双方の違いがよく分からないので、323 % に拡大した。
アンシャープマスキング・フィルタの方がややブロック・ノイズが目立つ気がする?
7aabee0e.png


FLOW の C SYNTHESIS -> Run をクリックして、C コードの合成を行って成功した。
6e8c45b3.png


FLOW の C SYNTHESIS -> REPORTS -> Synthesis を表示した。
4c4b4cfb.png

976101f7.png


レイテンシは 2073612 クロックで問題無さそうだ。

↑このページのトップヘ