FC2カウンター FPGAの部屋 2019年09月15日
FC2ブログ

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

FPGAの部屋

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

同じ Vivado HLS IP を複数個インスタンスした場合、Vivado 2018.3 でハードウェアをエクスポートしてSDKを立ち上げたときにその他のVivado HLS のIPのドライバがSDKのハードウェア・プラットフォームに入らない

Vivado 2018.3 でハードウェアをエクスポートしてSDKを立ち上げたときに、同じ Vivado HLS IP を複数個インスタンスした場合、その他のVivado HLS のIPのドライバが入らないという問題があったので、ブログに書いておく。多分バグじゃないのかな?

Vivado 2018.3 の sums_ex4 プロジェクトを示す。このプロジェクトはZybo Z7-10 用のプロジェクトだ。
SDK_bug_1_190914.png

sums_bd ブロックデザインを示す。
SDK_bug_2_190914.png

ブロックデザインを見ると DMA2axis8 IP が 2 つあるのが分かる。これらは、DDRメモリからDMA Read を行って、s_squares_axis IP にAIX4-Stream でデータを供給し、平方数の和を取って、axis2DMA IP にAIX4-Stream でデータを送る。axis2DMA IP はAXI4-Stream で送られてきたデータをDMA Write するというような回路になっている。
s_squares_axis IP のソースコードは”2つのAXI4 Stream 入力データを演算してAXI4 Stream 出力1”だ。
DMA2axis8.cpp を貼っておく。

// DMA2axis8.cpp (2019/09/10 by marsee)

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

int DMA2axis8(volatile ap_int<8> *in, hls::stream<ap_axis<8,1,1,1> >& outs){
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE axis register both port=outs
#pragma HLS INTERFACE m_axi depth=10 port=in offset=slave
    ap_axis<8,1,1,1> out_val;

    for(int i=0; i<10; i++){
#pragma HLS PIPELINE II=1
        out_val.data = in[i];
        if(i == 0)
            out_val.user = 1;
        else
            out_val.user = 0;
        if(i==9)
            out_val.last = 1;
        else
            out_val.last = 0;
        outs << out_val;
    }
    return(0);
}


axis2DMA.cpp を貼っておく。

// axis2DMA.cpp (2018/05/18 by marsee)

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

int axis2DMA(hls::stream<ap_axis<32,1,1,1> >& ins, volatile ap_int<32> *out){
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE m_axi depth=10 port=out offset=slave
#pragma HLS INTERFACE axis register both port=ins
    ap_axis<32,1,1,1> in_val;

    for(int i=0; i<10; i++){
#pragma HLS PIPELINE II=1
        ins >> in_val;
        out[i] = in_val.data;
    }
    return(0);
}


論理合成、インプリメンテーション、ビットストリームの生成を行った。レポートを示す。
SDK_bug_3_190914.png
SDK_bug_4_190914.png

ハードウェアをエクスポートしてSDKを立ち上げた。
SDK_bug_5_190914.png

axis2DMA, DMA2axis8, s_squares_axis が入っているのは見えるが、ハードウェア・プラットフォームの drivers には、DMA2axis8 しか入っていないのが分かる。これだと他のVivado HLS IP のドライバ関数が使用できなかった。

次に Vivado 2018.3 で sums_ex4_temp プロジェクトを作成した。
SDK_bug_6_190914.png

sums_bd ブロックデザインを示す。
SDK_bug_7_190914.png

DMA2axis8 を 1 個のみインスタンスして、他は Constant で代用した。
これで論理合成、インプリメンテーション、ビットストリームの生成を行った。レポートを示す。
SDK_bug_8_190914.png
SDK_bug_9_190914.png

これでハードウェアをエクスポートしてSDKを立ち上げたところ、ハードウェア・プラットフォームには、3 個のVivado HLS で作成したIP のドライバが入っている。
SDK_bug_10_190914.png

やはり、Vivado 2018.3 のブロックデザインでVivado HLS で作成したIP を複数個入れているとSDK のハードウェア・プラットフォーム上に他のVivado HLS IP のドライバがロードされないようだ。バグじゃないだろうか?

なお、Vivado HLS IP のドライバがハードウェア・プラットフォームに入っていないことの回避方法としては、”SDKにVivado HLSで作製したIPのドライバをインポートする”がある。
この方法で、local Repositories か Global Repositories にIP のフォルダを追加しておけばよい。今回は、Global Repositories にIP のフォルダを追加した。これでVivado HLS で作成した IP のドライバを使えるようになる。
  1. 2019年09月15日 04:50 |
  2. Vivado
  3. | トラックバック:0
  4. | コメント:0