FC2カウンター FPGAの部屋 square root を Vivado HLS で実装する3
FC2ブログ

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

FPGAの部屋

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

square root を Vivado HLS で実装する3

square root を Vivado HLS で実装する2”の続き。

前回は、square root を Vivado HLS で実装しようということで、逐次比較型ADコンバータのやり方を真似したsquare root を求めるソースコードを作って、C コードの合成とExport RTL を行った。しかし、使い物にならないということが分かった。前回までの square root ソースコードは、square root するビット長を可変にしていた。しかし、実際は、Sobel フィルタで使用するので、高々、結果が 8 ビット長なので、ビット長を 8 ビットに決め打ちにした。Vivado HLS もループ長を固定値にしたほうが最適化しやすいので、これでやってみよう。

ビット長を 8 ビットにした square_root8.cpp を示す。

// square_root8.cpp
// 2020/01/22 by marsee

#include <stdint.h>

int square_root8(int32_t val, int32_t *result){
#pragma HLS PIPELINE II=1
    int32_t temp = 0;
    int32_t square;

    for(int i=7; i>=0; --i){
        temp += (1 << i);
        square = temp * temp;

        if(square > val){
            temp -= (1 << i);
        }
    }
    *result = int32_t(temp);

    return(0);
}


テストベンチの square_root8_tb.cpp を示す。

// square_root8_tb.cpp
// 2020/01/22 by marsee

#include <stdio.h>
#include <stdint.h>

int square_root8(int32_t val, int32_t *result);

int main(){
    int64_t val;
    int32_t result;
    int32_t bit_len;

    for(int i=0; i<256; i++){
        square_root8(i, &result);
        printf("i = %d, result = %d\n", i, result);
    }

    int i = 255*255+1;
    square_root8(i, &result);
    printf("i = %d, result = %d\n", i, result);

    return(0);
}


Vivado HLS 2019.2 の square_root8 プロジェクトを作成した。
square_root_7_200124.png

C シミュレーションを行った。
square_root_8_200124.png

問題ない。前回と同じだ。

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

Interval を見ると 1 クロックになっている。パイプラインはこうじゃないと。。。

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

C/RTL 協調シミュレーションの波形を示す。まずは全体の波形から。。。
square_root_11_200124.png

result_ap_vld が途中からずっと 1 なのが良いですね。切れ目なくデータ出ている。

最初の部分を拡大してみたが、result の値も問題ない。C シミュレーションで確認しているが。。。
square_root_12_200124.png

Export RTL を行った。タイミング的にも問題なかった。
square_root_13_200124.png

このように、結果のビット長を 8 ビット決め打ちにすれば、問題なくなった。このように、Vivado HLS でソースコードを作る時にいろいろなパラメータを可変にしていると、Vivado HLS のコンパイラの制約が厳しくなって、性能が取れないことがある。その場合は、決め打ちにできるパラメータを決定してコンパイラの制約をゆるくしてみると結果が改善することがある。

パラメータを変更したくなったら、またVivado HLS でコンパイルすれば良いじゃない。。。

(追加)
ソースコードをもう一例書いてみましたが、結果は上のソースコードと全く一緒でした。

// square_root8.cpp
// 2020/01/22 by marsee

#include <stdint.h>

int square_root8(int32_t val, int32_t *result){
#pragma HLS PIPELINE II=1
    int32_t temp = 0;
    int32_t tempn = 0;
    int32_t square;

    for(int i=7; i>=0; --i){
        tempn = temp + (1 << i);
        square = tempn * tempn;

        if(square <= val){
            temp = tempn ;
        }
    }
    *result = int32_t(temp);

    return(0);
}

  1. 2020年01月25日 04:31 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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