FC2カウンター FPGAの部屋 2つのHLSストリームを同時に入力して演算してHLSストリーム出力2
FC2ブログ

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

FPGAの部屋

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

2つのHLSストリームを同時に入力して演算してHLSストリーム出力2

2つのHLSストリームを同時に入力して演算してHLSストリーム出力”の続き。

前回は、2つのHLSストリームを同時に入力して演算してHLSストリーム出力したいということで、コードを書いてみたが、スタート部分がシリアライズされていた。今回は、そこも並列動作させてみよう。

今回のソースコード two_hls_stream2.cpp を示す。

// two_hls_streams2.cpp
// 2018/08/07 by marsee
//

#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>

int ins_hls_stream(hls::stream<ap_axis<32,1,1,1> >& ins,
        hls::stream<ap_axis<32,1,1,1> >& outs);

int two_hls_streams(hls::stream<ap_axis<32,1,1,1> >& ins0,
        hls::stream<ap_axis<32,1,1,1> >& ins1,
        hls::stream<ap_axis<32,1,1,1> >& outs){
#pragma HLS DATAFLOW
    hls::stream<ap_axis<32,1,1,1> > out0;
    hls::stream<ap_axis<32,1,1,1> > out1;
    ap_axis<32,1,1,1> in_val0;
    ap_axis<32,1,1,1> in_val1;
    ap_axis<32,1,1,1> out_val;

    ins_hls_stream(ins0, out0);
    ins_hls_stream(ins1, out1);

    Loop1 : for(int i=0; i<10; i++){
#pragma HLS PIPELINE II=1
        out0 >> in_val0;
        out1 >> in_val1;

        out_val.data = in_val0.data * in_val1.data;
        out_val.user = in_val0.user;
        out_val.last = in_val0.last;
        outs << out_val;
    }
    return(0);
}

int ins_hls_stream(hls::stream<ap_axis<32,1,1,1> >& ins,
    hls::stream<ap_axis<32,1,1,1> >& outs){
    ap_axis<32,1,1,1> in_val;
    ap_axis<32,1,1,1> out_val;

    Loop1 : do {    // user が 1になった時にスタートする
#pragma HLS LOOP_TRIPCOUNT min=1 max=1 avg=1
        ins >> in_val;
    } while(in_val.user == 0);

    Loop2 : for(int i=0; i<10; i++){
#pragma HLS PIPELINE II=1
        if(i != 0){
            ins >> in_val;
        }
        out_val.data = in_val.data;
        out_val.user = in_val.user;
        out_val.last = in_val.last;
        outs << out_val;
    }
    return(0);

}


つまり、スタート部分を関数にして、2つの入力に対してそれぞれ関数をコールする。そして、その関数をDATAFLOW 指示子で並列動作されるというコンセプトだ。

まずは、この two_hls_stream2 プロジェクトを示す。
two_hls_streams_8_180808.png

これで C シミュレーションを行った。
two_hls_streams_9_180808.png

問題無い様だ。

C コードの合成を行った。
two_hls_streams_10_180808.png

Latency は 17 クロック、Interval は 15 クロックだった。前回のLatency は 16 クロックだった。
リソース使用量は、DSP48E は変わらないが、FF と LUT が増えている。特にLUT は 375 個だったところが、1185 個に増えた。

C/RTL 協調シミュレーションを行った。
two_hls_streams_11_180808.png

20 クロックだった。前回は 21 クロックだった。

C/RTL 協調シミュレーションの波形を示す。
two_hls_streams_12_180808.png
two_hls_streams_13_180808.png
two_hls_streams_14_180808.png

スタート部分もシリアライズされていないで、並列動作しているようだ。
  1. 2018年08月09日 05:08 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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