【Vivado HLS】平均計算を高位合成する(HLSストリーム)

前回は配列のポートレベルI/Fとしてap_fifoを使用しました。

【Vivado HLS】平均計算を高位合成する(ap_fifo/PIPELINE/rewind)

上の記事中ではHLSストリームの使い方が分からないと書いていました。今回、HLSストリームを使用してみたいと思います。

HLSストリームライブラリ

特徴としては、ユーザーガイドにもある通り無限長のFIFOのような動作をします。配列のように長さを指定する必要はありません。FIFOなのでライトした順番にリードされ、一度リードされたデータは破棄されます。

前回ap_fifoを試すために作成したプロジェクトを元に、HLSストリームを試してみました。ソースコード、ディレクティブ指定、シミュレーション波形を一気に記載します。

  • ソースコード
  • #define N 4
    #include "hls_stream.h"	// HLSストリームライブラリヘッダ
    // 配列をHLSテンプレートクラスに置き換える
    void average(hls::stream<int>& data, int* ave);
    #include "average.h"
    void average(hls::stream<int>& data, int* ave)
    {
    	int temp = 0;
    
    	average_label0:for (int i = 0; i < N; i++) {
    		temp += data.read();	// ストリームからのリード
    	}
    
    	*ave = temp / N;
    }
    #include <stdio.h>
    #include <stdlib.h>
    #include "average.h"
    
    int main()
    {
    	int testData;
    	int testAve;
    	int cmpAve;
    	hls::stream<int> streamData;	// HLSストリームクラスインスタンス
    
    	srand(10);
    
    	for (int j = 0; j < 4; j++) {
    		testAve = 0;
    		cmpAve = 0;
    
    		for (int i = 0; i < N; i++) {
    			testData = rand() % 256;
    			cmpAve += testData;
    			streamData.write(testData);	// ストリームへのライト
    		}
    
    		cmpAve /= N;
    
    		average(streamData, &testAve);
    
    		if (testAve != cmpAve) {
    			printf("Test Error!\n");
    		}
    		else {
    			printf("Test OK!\n");
    		}
    	}
    
    	return 0;
    }
  • ディレクティブ指定
  • Vivado HLS 高位合成 HLSストリーム ディレクティブ

  • シミュレーション波形
  • Vivado HLS 高位合成 HLSストリーム シミュレーション波形

    長さを指定しないという点以外ではまだ配列使用に対するメリットが分かっていませんが、ひとまずはこちらを使用していこうと考えています。

    シェアする

    • このエントリーをはてなブックマークに追加

    フォローする