FC2カウンター FPGAの部屋 Vivado HLSで幅の異なる ap_int の演算結果を検証してみた

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

FPGAの部屋

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

Vivado HLSで幅の異なる ap_int の演算結果を検証してみた

Vivado HLS で幅の異なる ap_int の演算結果を検証してみた。

まずは、ハードウェア化されるC++ 言語の関数の apint_test.cpp を下に示す。

// apint_test.cpp
// 2015/12/12 by marsee
//

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

int apint_test(ap_uint<8> inx[2], ap_int<12> wt[2], ap_int<25> *outy){

    *outy = inx[0]*wt[0] + inx[1]*wt[1];

    return(0);
}


次に、テストベンチの apint_test_tb.cpp を下に示す。

// apint_test_tb.cpp
// 2015/12/12 by marsee
//

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ap_int.h>

#define DECIMAL_DIGITS    6    // 小数部の桁

int apint_test(ap_uint<8> inx[2], ap_int<12> wt[2], ap_int<25> *outy);

int main(){
    ap_uint<8> inx[2];
    ap_int<12> wt[2]; // 小数部 DECIMAL_DIGITS ビット
    ap_int<25> outy; // 小数部 DECIMAL_DIGITS ビット
    int outy_temp;
    int retval;

    inx[0] = 2;
    inx[1] = 1;

    wt[0] = (ap_int<12>)((float)(1.75)*(float)(pow(2,DECIMAL_DIGITS)));
    wt[1] = (ap_int<12>)((float)(-2.0)*(float)(pow(2,DECIMAL_DIGITS)));
    printf("wt[0] = %d\n", (int)wt[0]);
    printf("wt[1] = %d\n", (int)wt[1]);

    retval = apint_test(inx, wt, &outy);

    printf("outy(hex) = %x\n", (int)outy);
    printf("outy = %f\n", (float)outy/(float)pow(2,DECIMAL_DIGITS));

    return(retval);
}


つまり、1番目のap_uint<8> と 1番目のap_int<12> を掛け算して、2番目のap_uint<8> と 2番目のap_int<12> を掛け算して、それらを足し算して ap_int<25> に入れると正しく演算できるのか?、演算結果がマイナスでも正しく符号拡張してくれるのか?を確認したかった。
ap_int<12> は固定小数点数で、小数部が 6 ビット設定してあるので、整数部は7 ビット目からとなる。
演算結果の ap_int<25> も小数部が 6 ビットの固定小数点数となる。
まずは、2 * 1.75 + (-2) * 1 = 1.5 でやってみた。下に結果を示す。
apint_test_1_151212.png

正しく、

outy = 1.500000

と出力されている。

次に、2 * 1.75 + (-2) * 3 = -2.5 でやってみた。下に結果を示す。
apint_test_2_151212.png

正しく、

outy = -2.500000

と出力されている。

高位合成を行った。使用するFPGAは、ZYBOの xc7z010clg400-1 とした。
apint_test_3_151212.png

apint_test_4_151212.png

Latency は3 クロックだった。DSP48E を 2 個と FF を使用している。

Analysis 画面を示す。
apint_test_5_151212.png

C/RTL コシミュレーションをやってみた。
apint_test_6_151212.png

正しく、

outy = -2.500000

と出力されている。

Open Wave Viewer... ボタンをクリックすると、Vivado を立ちあげて波形を表示する。
apint_test_7_151212.png

波形を拡大した。
apint_test_8_151212.png

最後から 4 クロック前が演算スタートで、最後のクロックで、outy_V[24:0] に 0x1ffff60 が出力されている。

ap_uint、ap_int 同士のビット幅の異なる演算も問題なく処理されるようだ。
  1. 2015年12月12日 05:07 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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