FC2カウンター FPGAの部屋 Vivado HLS 2014.4 で合成したラプラシアンフィルタIPの高速化4(tu1978さんのCソースコード)
fc2ブログ

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

FPGAの部屋

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

Vivado HLS 2014.4 で合成したラプラシアンフィルタIPの高速化4(tu1978さんのCソースコード)

Vivado HLS 2014.4 で合成したラプラシアンフィルタIPの高速化3(PIPELINEディレクティブを実機テスト)”の続き。

ZedBoard の時に、tu1978 さんにラプラシアンフィルタを高速化して頂いた。下にその時の記事を示す。

Vivado HLS 2014.1でラプラシアン・フィルタ関数をaxi masterモジュールにする5(Cソースのフィルタ処理をパイプライン化)
Vivado HLS 2014.1でラプラシアン・フィルタ関数をaxi masterモジュールにする6(パイプライン化ソースを実機テスト1)
Vivado HLS 2014.1でラプラシアン・フィルタ関数をaxi masterモジュールにする7(パイプライン化ソースを実機テスト2)
Vivado HLS 2014.1でラプラシアン・フィルタ関数をaxi masterモジュールにする8(パイプライン化ソースを実機テスト3)
Vivado HLS 2014.1でラプラシアン・フィルタ関数をaxi masterモジュールにする9(単体シミュレーション)

tu1978 さんにラプラシアンフィルタの高速化を改めて見てみると、私のようにline_buf(ピクセルのラインバッファ)の2次元配列の内の3つのラインから3つのピクセルを取り出すと、どうしてもポート数が足りなくなると思う。line_bufはBlockRAMにアサインされていると思うので、ポート数が精々2つである。そこから3つを取り出すので、少なくとも2クロック掛かる。もしかして、何も指定していないと3クロック掛けて3 ピクセルを取り出しているかもしれない?

tu1978さんの高速化ラプラシアンフィルタでは、line_bufのピクセルを3つの配列に入れ直して、pragma の array_partition の complete を指定している。これは、配列がその個別エレメ ントにパーティシ ョンされる pragma で個別のレジスタになるはずである。9つの個別レジスタにマップされ、9つのポートできるので、動作周波数が許せば1クロックで演算を行うことができるはずだ。

考えてみれば、HDLで書く時はBlockRAM に保存されているデータをポート数が足りないのでシフトレジスタに入れ替えて、そのデータでフィルタを演算する。それと同じ構造になっている訳だ。ここまで来るとFPGAの内部がわかっていないとチューニングをすることはできない。

さて、その tu1978 さんの高速化ラプラシアンフィルタのIP化を行った。
IP化をする際に、割り算をカウンタに置き換えた。
lap_fil_hls_14_4_52_150329.png

高位合成を行った。やはり、遅延が大きい。
lap_fil_hls_14_4_53_150329.png

IP 化をして、シミュレーションを行った。
lap_fil_hls_14_4_54_150330.png

シミュレーション波形を示す。
lap_fil_hls_14_4_55_150330.png

このシミュレーションから、DMA Write の間隔は32.7 us に短縮された。
高速化を何もしていない時のDMA Write の間隔が 131.95 us だった。
PIPELINEディレクティブを入れた時のDMA Write の間隔が 91.86 us だった。
tu1978 さんの高速化ラプラシアンフィルタは、プレーンの状態の 25% 程度の処理時間であるということが言える。つまり 4倍高速化されたわけだ。

DMA Write の間に、800ピクセルの次のラインの画像データを DMA Read して、以前の2つのラインの画像データを使って800ピクセル分のラプラシアンフィルタ処理を行い、その結果をDMA Write している。つまり、DMA Write の間隔の間に800ピクセルのラプラシアンフィルタ処理を行っている。依って、1ピクセル分の処理時間を計算してみよう。800で割ればよいはずだ。
高速化を何もしていない時の1ピクセルの処理時間は、131.95 us / 800 ≒ 165 ns 動作周波数は100MHzなので、16.5 クロックだ。
PIPELINEディレクティブを入れた時の1ピクセルの処理時間は、91.86 us / 800 ≒ 165 ns 動作周波数は100MHzなので、11.5 クロックだ。
tu1978 さんの高速化ラプラシアンフィルタの1ピクセルの処理時間は、32.7 us / 800 ≒ 41 ns 動作周波数は100MHzなので、4.1 クロックだ。これは、DMA Read を1クロック、DMA Write を1クロックとすると、ラプラシアンフィルタ処理は2クロックで行われていることになる。多分、AXI4 Master (memcopy()) を使っている状態ではこれが最速だと思う。

tu1978 さんの高速化ラプラシアンフィルタ(改) (lap_filter_axi_tu.cpp) のCソースコードを貼っておく。

// lap_filter_axi_tu.cpp
// lap_filter_axim()

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

#define HORIZONTAL_PIXEL_WIDTH    800
#define VERTICAL_PIXEL_WIDTH    600
#define ALL_PIXEL_VALUE    (HORIZONTAL_PIXEL_WIDTH*VERTICAL_PIXEL_WIDTH)

int laplacian_fil(int x0y0, int x1y0, int x2y0, int x0y1, int x1y1, int x2y1, int x0y2, int x1y2, int x2y2);
int conv_rgb2y(int rgb);

void conv_line(unsigned int* buf){
    for (int b=0; b<HORIZONTAL_PIXEL_WIDTH; b++){
#pragma HLS pipeline
        buf[b] = conv_rgb2y(buf[b]);    // カラーから白黒へ
    }
}

void filter_line(unsigned int* lap_buf, unsigned int* fl, unsigned int* sl, unsigned int* tl){
    int lap_fil_val;
    ap_uint<8> prev[3],current[3],next[3];    // 0->1ライン目, 1->2ライン目, 2->3ライン目, prev->1pixel前, current->現在, next->次pixel
#pragma HLS array_partition variable=prev complete dim=0
#pragma HLS array_partition variable=current complete dim=0
#pragma HLS array_partition variable=next complete dim=0

    next[0] = fl[0] & 0xFF;
    next[1] = sl[0] & 0xFF;
    next[2] = sl[0] & 0xFF;

    for (int x = 0; x < HORIZONTAL_PIXEL_WIDTH; x++){
#pragma HLS pipeline
        if (x == 0 || x == HORIZONTAL_PIXEL_WIDTH-1){
            lap_fil_val = 0;

            current[0] = next[0];
            next[0] = fl[1];

            current[1] = next[1];
            next[1] = sl[1];

            current[2] = next[2];
            next[2] = tl[1];
        }else{
            prev[0] = current[0];
            current[0] = next[0];
            next[0] = fl[x+1];

            prev[1] = current[1];
            current[1] = next[1];
            next[1] = sl[x+1];

            prev[2] = current[2];
            current[2] = next[2];
            next[2] = tl[x+1];
            lap_fil_val = laplacian_fil(prev[0], current[0], next[0],
                                        prev[1], current[1], next[1],
                                        prev[2], current[2], next[2]);
        }
        lap_buf[x] = (lap_fil_val<<16)+(lap_fil_val<<8)+lap_fil_val; // RGB同じ値を入れる
    }
}

int lap_filter_axim(int cam_addr, int lap_addr, volatile int *cam_fb, volatile int *lap_fb)
{
    #pragma HLS INTERFACE s_axilite port=cam_addr bundle=BUS_AXI4LS
    #pragma HLS INTERFACE s_axilite port=lap_addr bundle=BUS_AXI4LS
    #pragma HLS INTERFACE s_axilite port=return bundle=BUS_AXI4LS
    #pragma HLS INTERFACE ap_none port=cam_addr
    #pragma HLS INTERFACE ap_none port=lap_addr

    #pragma HLS INTERFACE m_axi port=cam_fb depth=1920
    #pragma HLS INTERFACE m_axi port=lap_fb depth=1920

    unsigned int line_buf[3][HORIZONTAL_PIXEL_WIDTH];
#pragma HLS array_partition variable line_buf block factor=3 dim=1
#pragma HLS resource variable=line_buf core=RAM_2P

    unsigned int lap_buf[HORIZONTAL_PIXEL_WIDTH];
    int x, y;
    int lap_fil_val;
    int a, b;
    int fl, sl, tl;
    unsigned int offset_cam_addr, offset_lap_addr;
    int *cam_fb_addr, *lap_fb_addr;
    int line_sel;

    offset_cam_addr = cam_addr/sizeof(int);
    offset_lap_addr = lap_addr/sizeof(int);

    // RGB値をY(輝度成分)のみに変換し、ラプラシアンフィルタを掛けた。
    for (y=1, line_sel=0; y<VERTICAL_PIXEL_WIDTH-1; y++){
        // 最初のライン, y=1 012, y=2 120, y=3 201, y=4 012
        switch(line_sel){
            case 1 :
                fl = 0; sl = 1; tl = 2;
                break;
            case 2 :
                fl = 1; sl = 2; tl = 0;
                break;
            case 3 :
                fl = 2; sl = 0; tl = 1;
                break;
            default :
                fl = 0; sl = 1; tl = 2;
        }

        if (y == 1){
#ifndef __SYNTHESIS__
            printf("copy 3 lines\n");
#endif
            for (a=0; a<3; a++){
 // 3ライン分
                cam_fb_addr = (int*)(cam_fb+offset_cam_addr+(a*(HORIZONTAL_PIXEL_WIDTH)));
                memcpy(line_buf[a], (unsigned int*)cam_fb_addr, HORIZONTAL_PIXEL_WIDTH*sizeof(int));
                conv_line(line_buf[a]);
            }
        }else// 最初のラインではないので、1ラインだけ読み込む。すでに他の2ラインは読み込まれている
            cam_fb_addr = (int*)(cam_fb+offset_cam_addr+((y+1)*(HORIZONTAL_PIXEL_WIDTH)));
            memcpy(line_buf[tl], (unsigned int*)cam_fb_addr, HORIZONTAL_PIXEL_WIDTH*sizeof(int));
            conv_line(line_buf[tl]);
        }
        filter_line(lap_buf, line_buf[fl], line_buf[sl], line_buf[tl]);
        lap_fb_addr = (int *)(lap_fb+offset_lap_addr+(y*(HORIZONTAL_PIXEL_WIDTH)));
#ifndef __SYNTHESIS__
        printf("write back:%d\n", y);
#endif
        memcpy((unsigned int*)lap_fb_addr, (unsigned int*)lap_buf, HORIZONTAL_PIXEL_WIDTH*sizeof(int));

        line_sel++;
        if (line_sel > 3){
            line_sel = 1;
        }
    }

    // 最初と最後のラインは0にする
    for (x = 0; x < HORIZONTAL_PIXEL_WIDTH; x++)
        lap_buf[x] = 0;
    lap_fb_addr = (int *)(lap_fb+offset_lap_addr+(0*(HORIZONTAL_PIXEL_WIDTH)));
    memcpy((unsigned int*)lap_fb_addr, (unsigned int*)lap_buf, HORIZONTAL_PIXEL_WIDTH*sizeof(int));
    lap_fb_addr = (int *)(lap_fb+offset_lap_addr+(VERTICAL_PIXEL_WIDTH-1)*HORIZONTAL_PIXEL_WIDTH);
    memcpy((unsigned int*)lap_fb_addr, (unsigned int*)lap_buf, HORIZONTAL_PIXEL_WIDTH*sizeof(int));

    return(1);
}

// RGBからYへの変換
// RGBのフォーマットは、{8'd0, R(8bits), G(8bits), B(8bits)}, 1pixel = 32bits
// 輝度信号Yのみに変換する。変換式は、Y =  0.299R + 0.587G + 0.114B
// "YUVフォーマット及び YUV<->RGB変換"を参考にした。http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html
// 2013/09/27 : float を止めて、すべてint にした
int conv_rgb2y(int rgb){
    int r, g, b, y_f;
    int y;

    b = rgb & 0xff;
    g = (rgb>>8) & 0xff;
    r = (rgb>>16) & 0xff;

    y_f = 77*r + 150*g + 29*b; //y_f = 0.299*r + 0.587*g + 0.114*b;の係数に256倍した
    y = y_f >> 8// 256で割る

    return(y);
}

// ラプラシアンフィルタ
// x0y0 x1y0 x2y0 -1 -1 -1
// x0y1 x1y1 x2y1 -1  8 -1
// x0y2 x1y2 x2y2 -1 -1 -1
int laplacian_fil(int x0y0, int x1y0, int x2y0, int x0y1, int x1y1, int x2y1, int x0y2, int x1y2, int x2y2)
{
    int y;

    y = -x0y0 -x1y0 -x2y0 -x0y1 +8*x1y1 -x2y1 -x0y2 -x1y2 -x2y2;
    if (y<0)
        y = 0;
    else if (y>255)
        y = 255;
    return(y);
}


高位合成時のレポートファイル lap_filter_axim_csynth.rpt を貼っておく。


================================================================
== Vivado HLS Report for 'lap_filter_axim'
================================================================
* Date: Sun Mar 29 15:36:13 2015

* Version: 2014.4 (Build 1071461 on Tue Nov 18 16:42:57 PM 2014)
* Project: lap_filter_axim_tu_2014_4
* Solution: solution1
* Product family: zynq
* Target device: xc7z010clg400-1


================================================================
== Performance Estimates
================================================================
+ Timing (ns):
* Summary:
+---------+-------+----------+------------+
| Clock | Target| Estimated| Uncertainty|
+---------+-------+----------+------------+
|default | 10.00| 9.63| 1.25|
+---------+-------+----------+------------+

+ Latency (clock cycles):
* Summary:
+---------+---------+---------+---------+---------+
| Latency | Interval | Pipeline|
| min | max | min | max | Type |
+---------+---------+---------+---------+---------+
| 1942922| 3893598| 1942923| 3893599| none |
+---------+---------+---------+---------+---------+

+ Detail:
* Instance:
+----------------------------------------+-----------------------------+-----+-----+-----+-----+---------+
| | | Latency | Interval | Pipeline|
| Instance | Module | min | max | min | max | Type |
+----------------------------------------+-----------------------------+-----+-----+-----+-----+---------+
|grp_lap_filter_axim_filter_line_fu_420 |lap_filter_axim_filter_line | 807| 807| 807| 807| none |
|grp_lap_filter_axim_conv_line_fu_431 |lap_filter_axim_conv_line | 806| 806| 806| 806| none |
+----------------------------------------+-----------------------------+-----+-----+-----+-----+---------+

* Loop:
+-------------------------------+---------+---------+-------------+-----------+-----------+------+----------+
| | Latency | Iteration | Initiation Interval | Trip | |
| Loop Name | min | max | Latency | achieved | target | Count| Pipelined|
+-------------------------------+---------+---------+-------------+-----------+-----------+------+----------+
|- Loop 1 | 1940510| 3891186| 3245 ~ 6507 | -| -| 598| no |
| + Loop 1.1 | 4890| 4890| 1630| -| -| 3| no |
| ++ memcpy..cam_fb | 814| 814| 16| 1| 1| 800| yes |
| + memcpy..cam_fb | 814| 814| 16| 1| 1| 800| yes |
| + memcpy.lap_fb.lap_buf.gep8 | 801| 801| 3| 1| 1| 800| yes |
|- Loop 2 | 800| 800| 1| -| -| 800| no |
|- memcpy.lap_fb.lap_buf.gep7 | 801| 801| 3| 1| 1| 800| yes |
|- memcpy.lap_fb.lap_buf.gep | 801| 801| 3| 1| 1| 800| yes |
+-------------------------------+---------+---------+-------------+-----------+-----------+------+----------+



================================================================
== Utilization Estimates
================================================================
* Summary:
+-----------------+---------+-------+-------+-------+
| Name | BRAM_18K| DSP48E| FF | LUT |
+-----------------+---------+-------+-------+-------+
|Expression | -| 5| 0| 573|
|FIFO | -| -| -| -|
|Instance | 0| 4| 2244| 2804|
|Memory | 8| -| 0| 0|
|Multiplexer | -| -| -| 493|
|Register | -| -| 626| 4|
+-----------------+---------+-------+-------+-------+
|Total | 8| 9| 2870| 3874|
+-----------------+---------+-------+-------+-------+
|Available | 120| 80| 35200| 17600|
+-----------------+---------+-------+-------+-------+
|Utilization (%) | 6| 11| 8| 22|
+-----------------+---------+-------+-------+-------+

+ Detail:
* Instance:
+------------------------------------------+--------------------------------------+---------+-------+-----+-----+
| Instance | Module | BRAM_18K| DSP48E| FF | LUT |
+------------------------------------------+--------------------------------------+---------+-------+-----+-----+
|lap_filter_axim_BUS_AXI4LS_s_axi_U |lap_filter_axim_BUS_AXI4LS_s_axi | 0| 0| 144| 232|
|lap_filter_axim_cam_fb_m_axi_U |lap_filter_axim_cam_fb_m_axi | 0| 0| 512| 580|
|grp_lap_filter_axim_conv_line_fu_431 |lap_filter_axim_conv_line | 0| 3| 122| 139|
|grp_lap_filter_axim_filter_line_fu_420 |lap_filter_axim_filter_line | 0| 1| 204| 523|
|lap_filter_axim_lap_fb_m_axi_U |lap_filter_axim_lap_fb_m_axi | 0| 0| 512| 580|
|lap_filter_axim_urem_12ns_11ns_12_16_U11 |lap_filter_axim_urem_12ns_11ns_12_16 | 0| 0| 375| 375|
|lap_filter_axim_urem_12ns_11ns_12_16_U12 |lap_filter_axim_urem_12ns_11ns_12_16 | 0| 0| 375| 375|
+------------------------------------------+--------------------------------------+---------+-------+-----+-----+
|Total | | 0| 4| 2244| 2804|
+------------------------------------------+--------------------------------------+---------+-------+-----+-----+

* Memory:
+--------------+----------------------------+---------+---+----+------+-----+------+-------------+
| Memory | Module | BRAM_18K| FF| LUT| Words| Bits| Banks| W*Bits*Banks|
+--------------+----------------------------+---------+---+----+------+-----+------+-------------+
|lap_buf_U |lap_filter_axim_lap_buf | 2| 0| 0| 800| 28| 1| 22400|
|line_buf_0_U |lap_filter_axim_line_buf_0 | 2| 0| 0| 800| 32| 1| 25600|
|line_buf_1_U |lap_filter_axim_line_buf_0 | 2| 0| 0| 800| 32| 1| 25600|
|line_buf_2_U |lap_filter_axim_line_buf_0 | 2| 0| 0| 800| 32| 1| 25600|
+--------------+----------------------------+---------+---+----+------+-----+------+-------------+
|Total | | 8| 0| 0| 3200| 124| 4| 99200|
+--------------+----------------------------+---------+---+----+------+-----+------+-------------+

* FIFO:
N/A

* Expression:
+------------------------+----------+-------+---+----+------------+------------+
| Variable Name | Operation| DSP48E| FF| LUT| Bitwidth P0| Bitwidth P1|
+------------------------+----------+-------+---+----+------------+------------+
|mul2_fu_668_p2 | * | 1| 0| 0| 12| 13|
|mul_fu_778_p2 | * | 1| 0| 0| 12| 13|
|tmp_15_fu_691_p2 | * | 1| 0| 0| 10| 10|
|tmp_4_cast_fu_609_p2 | * | 1| 0| 0| 10| 10|
|tmp_4_fu_633_p2 | * | 1| 0| 0| 2| 10|
|a_1_fu_727_p2 | + | 0| 0| 2| 2| 1|
|grp_fu_659_p0 | + | 0| 0| 12| 12| 12|
|indvar_next1_fu_898_p2 | + | 0| 0| 10| 10| 1|
|indvar_next2_fu_648_p2 | + | 0| 0| 10| 10| 1|
|indvar_next3_fu_935_p2 | + | 0| 0| 10| 10| 1|
|indvar_next4_fu_813_p2 | + | 0| 0| 10| 10| 1|
|indvar_next_fu_762_p2 | + | 0| 0| 10| 10| 1|
|line_sel_1_fu_829_p2 | + | 0| 0| 32| 32| 1|
|next_mul_fu_715_p2 | + | 0| 0| 12| 12| 10|
|tmp2_fu_914_p2 | + | 0| 0| 31| 31| 19|
|tmp_10_fu_618_p2 | + | 0| 0| 31| 31| 31|
|tmp_16_fu_737_p2 | + | 0| 0| 31| 31| 31|
|tmp_17_fu_768_p2 | + | 0| 0| 12| 12| 12|
|tmp_fu_479_p2 | + | 0| 0| 31| 31| 10|
|x_1_fu_871_p2 | + | 0| 0| 10| 10| 1|
|y_1_fu_859_p2 | + | 0| 0| 10| 10| 1|
|newSel1_fu_537_p3 | Select | 0| 0| 2| 1| 2|
|newSel2_fu_545_p3 | Select | 0| 0| 3| 1| 1|
|newSel3_fu_563_p3 | Select | 0| 0| 2| 1| 2|
|newSel_fu_529_p3 | Select | 0| 0| 3| 1| 3|
|p_s_fu_851_p3 | Select | 0| 0| 32| 1| 1|
|sel_tmp1_fu_571_p3 | Select | 0| 0| 3| 1| 1|
|sel_tmp3_fu_579_p3 | Select | 0| 0| 3| 1| 3|
|tl_fu_587_p3 | Select | 0| 0| 2| 1| 2|
|ap_sig_bdd_1064 | and | 0| 0| 1| 1| 1|
|ap_sig_bdd_1086 | and | 0| 0| 1| 1| 1|
|ap_sig_bdd_1093 | and | 0| 0| 1| 1| 1|
|ap_sig_bdd_1107 | and | 0| 0| 1| 1| 1|
|ap_sig_bdd_1117 | and | 0| 0| 1| 1| 1|
|ap_sig_bdd_1123 | and | 0| 0| 1| 1| 1|
|exitcond1_fu_892_p2 | icmp | 0| 0| 11| 10| 9|
|exitcond2_fu_642_p2 | icmp | 0| 0| 11| 10| 9|
|exitcond3_fu_929_p2 | icmp | 0| 0| 11| 10| 9|
|exitcond4_fu_721_p2 | icmp | 0| 0| 2| 2| 2|
|exitcond5_fu_489_p2 | icmp | 0| 0| 11| 10| 10|
|exitcond6_fu_807_p2 | icmp | 0| 0| 11| 10| 9|
|exitcond9_fu_756_p2 | icmp | 0| 0| 11| 10| 9|
|exitcond_fu_865_p2 | icmp | 0| 0| 11| 10| 9|
|icmp_fu_845_p2 | icmp | 0| 0| 38| 30| 1|
|sel_tmp2_fu_501_p2 | icmp | 0| 0| 40| 32| 2|
|sel_tmp4_fu_507_p2 | icmp | 0| 0| 40| 32| 1|
|sel_tmp_fu_495_p2 | icmp | 0| 0| 40| 32| 2|
|tmp_7_fu_599_p2 | icmp | 0| 0| 11| 10| 1|
|or_cond_fu_523_p2 | or | 0| 0| 1| 1| 1|
|not_sel_tmp4_fu_513_p2 | xor | 0| 0| 2| 1| 2|
|not_sel_tmp_fu_553_p2 | xor | 0| 0| 2| 1| 2|
+------------------------+----------+-------+---+----+------------+------------+
|Total | | 5| 0| 573| 535| 289|
+------------------------+----------+-------+---+----+------------+------------+

* Multiplexer:
+---------------------------------------------+----+-----------+-----+-----------+
| Name | LUT| Input Size| Bits| Total Bits|
+---------------------------------------------+----+-----------+-----+-----------+
|a_reg_340 | 2| 2| 2| 4|
|ap_NS_fsm | 66| 38| 1| 38|
|ap_reg_ppiten_pp0_it15 | 1| 2| 1| 2|
|ap_reg_ppiten_pp1_it15 | 1| 2| 1| 2|
|ap_reg_ppiten_pp2_it2 | 1| 2| 1| 2|
|ap_reg_ppiten_pp3_it2 | 1| 2| 1| 2|
|ap_reg_ppiten_pp4_it2 | 1| 2| 1| 2|
|ap_sig_ioackin_cam_fb_ARREADY | 1| 2| 1| 2|
|ap_sig_ioackin_lap_fb_AWREADY | 1| 2| 1| 2|
|ap_sig_ioackin_lap_fb_WREADY | 1| 2| 1| 2|
|cam_fb_ARADDR | 32| 3| 32| 96|
|grp_lap_filter_axim_conv_line_fu_431_tmp_20 | 2| 3| 2| 6|
|indvar1_reg_397 | 10| 2| 10| 20|
|indvar2_reg_329 | 10| 2| 10| 20|
|indvar3_reg_408 | 10| 2| 10| 20|
|indvar4_reg_375 | 10| 2| 10| 20|
|indvar_reg_364 | 10| 2| 10| 20|
|lap_buf_address0 | 10| 6| 10| 60|
|lap_buf_ce0 | 1| 3| 1| 3|
|lap_buf_d0 | 28| 3| 28| 84|
|lap_buf_we0 | 1| 3| 1| 3|
|lap_fb_AWADDR | 32| 4| 32| 128|
|lap_fb_WDATA | 32| 4| 32| 128|
|line_buf_0_address0 | 10| 3| 10| 30|
|line_buf_0_address1 | 10| 5| 10| 50|
|line_buf_0_ce0 | 1| 3| 1| 3|
|line_buf_0_ce1 | 1| 4| 1| 4|
|line_buf_0_d1 | 32| 3| 32| 96|
|line_buf_0_we1 | 1| 3| 1| 3|
|line_buf_1_address0 | 10| 3| 10| 30|
|line_buf_1_address1 | 10| 5| 10| 50|
|line_buf_1_ce0 | 1| 3| 1| 3|
|line_buf_1_ce1 | 1| 4| 1| 4|
|line_buf_1_d1 | 32| 3| 32| 96|
|line_buf_1_we1 | 1| 3| 1| 3|
|line_buf_2_address0 | 10| 3| 10| 30|
|line_buf_2_address1 | 10| 5| 10| 50|
|line_buf_2_ce0 | 1| 3| 1| 3|
|line_buf_2_ce1 | 1| 4| 1| 4|
|line_buf_2_d1 | 32| 3| 32| 96|
|line_buf_2_we1 | 1| 3| 1| 3|
|line_sel_reg_317 | 32| 2| 32| 64|
|phi_mul_reg_352 | 12| 2| 12| 24|
|x_reg_386 | 10| 2| 10| 20|
|y_reg_305 | 10| 2| 10| 20|
+---------------------------------------------+----+-----------+-----+-----------+
|Total | 493| 166| 428| 1352|
+---------------------------------------------+----+-----------+-----+-----------+

* Register:
+--------------------------------------------------------------+----+----+-----+-----------+
| Name | FF | LUT| Bits| Const Bits|
+--------------------------------------------------------------+----+----+-----+-----------+
|a_1_reg_1059 | 2| 0| 2| 0|
|a_reg_340 | 2| 0| 2| 0|
|ap_CS_fsm | 37| 0| 37| 0|
|ap_reg_ioackin_cam_fb_ARREADY | 1| 0| 1| 0|
|ap_reg_ioackin_lap_fb_AWREADY | 1| 0| 1| 0|
|ap_reg_ioackin_lap_fb_WREADY | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it0 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it1 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it10 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it11 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it12 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it13 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it14 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it15 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it2 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it3 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it4 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it5 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it6 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it7 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it8 | 1| 0| 1| 0|
|ap_reg_ppiten_pp0_it9 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it0 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it1 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it10 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it11 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it12 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it13 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it14 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it15 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it2 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it3 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it4 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it5 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it6 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it7 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it8 | 1| 0| 1| 0|
|ap_reg_ppiten_pp1_it9 | 1| 0| 1| 0|
|ap_reg_ppiten_pp2_it0 | 1| 0| 1| 0|
|ap_reg_ppiten_pp2_it1 | 1| 0| 1| 0|
|ap_reg_ppiten_pp2_it2 | 1| 0| 1| 0|
|ap_reg_ppiten_pp3_it0 | 1| 0| 1| 0|
|ap_reg_ppiten_pp3_it1 | 1| 0| 1| 0|
|ap_reg_ppiten_pp3_it2 | 1| 0| 1| 0|
|ap_reg_ppiten_pp4_it0 | 1| 0| 1| 0|
|ap_reg_ppiten_pp4_it1 | 1| 0| 1| 0|
|ap_reg_ppiten_pp4_it2 | 1| 0| 1| 0|
|ap_reg_ppstg_exitcond1_reg_1131_pp3_it1 | 1| 0| 1| 0|
|ap_reg_ppstg_exitcond3_reg_1155_pp4_it1 | 1| 0| 1| 0|
|ap_reg_ppstg_exitcond6_reg_1093_pp2_it1 | 1| 0| 1| 0|
|exitcond1_reg_1131 | 1| 0| 1| 0|
|exitcond3_reg_1155 | 1| 0| 1| 0|
|exitcond4_reg_1055 | 1| 0| 1| 0|
|exitcond6_reg_1093 | 1| 0| 1| 0|
|grp_lap_filter_axim_conv_line_fu_431_ap_start_ap_start_reg | 1| 0| 1| 0|
|grp_lap_filter_axim_filter_line_fu_420_ap_start_ap_start_reg | 1| 0| 1| 0|
|indvar1_reg_397 | 10| 0| 10| 0|
|indvar2_reg_329 | 10| 0| 10| 0|
|indvar3_reg_408 | 10| 0| 10| 0|
|indvar4_reg_375 | 10| 0| 10| 0|
|indvar_reg_364 | 10| 0| 10| 0|
|lap_fb_addr_2_reg_1045 | 32| 0| 32| 0|
|line_sel_reg_317 | 32| 0| 32| 0|
|newSel1_reg_980 | 2| 0| 2| 0|
|newSel3_reg_985 | 2| 0| 2| 0|
|next_mul_reg_1050 | 12| 0| 12| 0|
|offset_cam_addr_cast_reg_951 | 31| 0| 31| 0|
|offset_lap_addr_cast_reg_961 | 31| 0| 31| 0|
|p_s_reg_1107 | 32| 0| 32| 0|
|phi_mul_reg_352 | 12| 0| 12| 0|
|reg_440 | 32| 0| 32| 0|
|reg_447 | 28| 0| 28| 0|
|tl_cast47_cast_reg_996 | 2| 0| 12| 10|
|tl_reg_990 | 2| 0| 2| 0|
|tmp2_reg_1145 | 31| 0| 31| 0|
|tmp_10_reg_1010 | 31| 0| 31| 0|
|tmp_12_reg_1035 | 12| 0| 12| 0|
|tmp_16_reg_1064 | 31| 0| 31| 0|
|tmp_29_t_reg_1041 | 2| 0| 2| 0|
|tmp_3_reg_956 | 30| 0| 30| 0|
|tmp_41_t_reg_1089 | 2| 0| 2| 0|
|tmp_4_cast_reg_1005 | 14| 0| 19| 5|
|tmp_4_reg_1021 | 7| 0| 12| 5|
|tmp_7_reg_1001 | 1| 0| 1| 0|
|tmp_reg_967 | 31| 0| 31| 0|
|x_reg_386 | 10| 0| 10| 0|
|y_1_reg_1112 | 10| 0| 10| 0|
|y_cast48_cast_reg_972 | 10| 0| 21| 11|
|y_reg_305 | 10| 0| 10| 0|
|tmp_29_t_reg_1041 | 0| 2| 2| 0|
|tmp_41_t_reg_1089 | 0| 2| 2| 0|
+--------------------------------------------------------------+----+----+-----+-----------+
|Total | 626| 4| 661| 31|
+--------------------------------------------------------------+----+----+-----+-----------+



================================================================
== Interface
================================================================
* Summary:
+--------------------------+-----+-----+------------+-----------------+--------------+
| RTL Ports | Dir | Bits| Protocol | Source Object | C Type |
+--------------------------+-----+-----+------------+-----------------+--------------+
|s_axi_BUS_AXI4LS_AWVALID | in | 1| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_AWREADY | out | 1| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_AWADDR | in | 6| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_WVALID | in | 1| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_WREADY | out | 1| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_WDATA | in | 32| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_WSTRB | in | 4| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_ARVALID | in | 1| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_ARREADY | out | 1| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_ARADDR | in | 6| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_RVALID | out | 1| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_RREADY | in | 1| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_RDATA | out | 32| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_RRESP | out | 2| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_BVALID | out | 1| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_BREADY | in | 1| s_axi | BUS_AXI4LS | scalar |
|s_axi_BUS_AXI4LS_BRESP | out | 2| s_axi | BUS_AXI4LS | scalar |
|ap_clk | in | 1| ap_ctrl_hs | lap_filter_axim | return value |
|ap_rst_n | in | 1| ap_ctrl_hs | lap_filter_axim | return value |
|interrupt | out | 1| ap_ctrl_hs | lap_filter_axim | return value |
|m_axi_cam_fb_AWVALID | out | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_AWREADY | in | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_AWADDR | out | 32| m_axi | cam_fb | pointer |
|m_axi_cam_fb_AWID | out | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_AWLEN | out | 8| m_axi | cam_fb | pointer |
|m_axi_cam_fb_AWSIZE | out | 3| m_axi | cam_fb | pointer |
|m_axi_cam_fb_AWBURST | out | 2| m_axi | cam_fb | pointer |
|m_axi_cam_fb_AWLOCK | out | 2| m_axi | cam_fb | pointer |
|m_axi_cam_fb_AWCACHE | out | 4| m_axi | cam_fb | pointer |
|m_axi_cam_fb_AWPROT | out | 3| m_axi | cam_fb | pointer |
|m_axi_cam_fb_AWQOS | out | 4| m_axi | cam_fb | pointer |
|m_axi_cam_fb_AWREGION | out | 4| m_axi | cam_fb | pointer |
|m_axi_cam_fb_AWUSER | out | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_WVALID | out | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_WREADY | in | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_WDATA | out | 32| m_axi | cam_fb | pointer |
|m_axi_cam_fb_WSTRB | out | 4| m_axi | cam_fb | pointer |
|m_axi_cam_fb_WLAST | out | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_WID | out | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_WUSER | out | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_ARVALID | out | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_ARREADY | in | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_ARADDR | out | 32| m_axi | cam_fb | pointer |
|m_axi_cam_fb_ARID | out | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_ARLEN | out | 8| m_axi | cam_fb | pointer |
|m_axi_cam_fb_ARSIZE | out | 3| m_axi | cam_fb | pointer |
|m_axi_cam_fb_ARBURST | out | 2| m_axi | cam_fb | pointer |
|m_axi_cam_fb_ARLOCK | out | 2| m_axi | cam_fb | pointer |
|m_axi_cam_fb_ARCACHE | out | 4| m_axi | cam_fb | pointer |
|m_axi_cam_fb_ARPROT | out | 3| m_axi | cam_fb | pointer |
|m_axi_cam_fb_ARQOS | out | 4| m_axi | cam_fb | pointer |
|m_axi_cam_fb_ARREGION | out | 4| m_axi | cam_fb | pointer |
|m_axi_cam_fb_ARUSER | out | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_RVALID | in | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_RREADY | out | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_RDATA | in | 32| m_axi | cam_fb | pointer |
|m_axi_cam_fb_RLAST | in | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_RID | in | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_RUSER | in | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_RRESP | in | 2| m_axi | cam_fb | pointer |
|m_axi_cam_fb_BVALID | in | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_BREADY | out | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_BRESP | in | 2| m_axi | cam_fb | pointer |
|m_axi_cam_fb_BID | in | 1| m_axi | cam_fb | pointer |
|m_axi_cam_fb_BUSER | in | 1| m_axi | cam_fb | pointer |
|m_axi_lap_fb_AWVALID | out | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_AWREADY | in | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_AWADDR | out | 32| m_axi | lap_fb | pointer |
|m_axi_lap_fb_AWID | out | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_AWLEN | out | 8| m_axi | lap_fb | pointer |
|m_axi_lap_fb_AWSIZE | out | 3| m_axi | lap_fb | pointer |
|m_axi_lap_fb_AWBURST | out | 2| m_axi | lap_fb | pointer |
|m_axi_lap_fb_AWLOCK | out | 2| m_axi | lap_fb | pointer |
|m_axi_lap_fb_AWCACHE | out | 4| m_axi | lap_fb | pointer |
|m_axi_lap_fb_AWPROT | out | 3| m_axi | lap_fb | pointer |
|m_axi_lap_fb_AWQOS | out | 4| m_axi | lap_fb | pointer |
|m_axi_lap_fb_AWREGION | out | 4| m_axi | lap_fb | pointer |
|m_axi_lap_fb_AWUSER | out | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_WVALID | out | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_WREADY | in | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_WDATA | out | 32| m_axi | lap_fb | pointer |
|m_axi_lap_fb_WSTRB | out | 4| m_axi | lap_fb | pointer |
|m_axi_lap_fb_WLAST | out | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_WID | out | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_WUSER | out | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_ARVALID | out | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_ARREADY | in | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_ARADDR | out | 32| m_axi | lap_fb | pointer |
|m_axi_lap_fb_ARID | out | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_ARLEN | out | 8| m_axi | lap_fb | pointer |
|m_axi_lap_fb_ARSIZE | out | 3| m_axi | lap_fb | pointer |
|m_axi_lap_fb_ARBURST | out | 2| m_axi | lap_fb | pointer |
|m_axi_lap_fb_ARLOCK | out | 2| m_axi | lap_fb | pointer |
|m_axi_lap_fb_ARCACHE | out | 4| m_axi | lap_fb | pointer |
|m_axi_lap_fb_ARPROT | out | 3| m_axi | lap_fb | pointer |
|m_axi_lap_fb_ARQOS | out | 4| m_axi | lap_fb | pointer |
|m_axi_lap_fb_ARREGION | out | 4| m_axi | lap_fb | pointer |
|m_axi_lap_fb_ARUSER | out | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_RVALID | in | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_RREADY | out | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_RDATA | in | 32| m_axi | lap_fb | pointer |
|m_axi_lap_fb_RLAST | in | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_RID | in | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_RUSER | in | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_RRESP | in | 2| m_axi | lap_fb | pointer |
|m_axi_lap_fb_BVALID | in | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_BREADY | out | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_BRESP | in | 2| m_axi | lap_fb | pointer |
|m_axi_lap_fb_BID | in | 1| m_axi | lap_fb | pointer |
|m_axi_lap_fb_BUSER | in | 1| m_axi | lap_fb | pointer |
+--------------------------+-----+-----+------------+-----------------+--------------+


  1. 2015年03月30日 05:05 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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