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

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

FPGAの部屋

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

square root を Vivado HLS で実装する1

square root を Vivado HLS で実装しようと思う。厳密な square root ではなく、結果が 8 ビットの整数で表されればよい。つまり、 Sobel フィルタを実装したいので、x と y を 2 乗して足して、square Root したいので、RGB の値の範囲で square root できれば十分なのだ。

アルゴリズムを考えていたら、ちょうど逐次比較型ADコンバータが思い浮かんだ。これは、MSB からビットを立てながら、入力値と比較して、大きい場合はビットをクリアし、まだ小さい値ならばビットをそのままにする。そして、その下のビットを立てながら同じことをやっていく。
square root もそれが使えるんじゃないだろうか?ということで、逐次比較型ADコンバータと同様に square root を計算するように作ったソースコードの square_root.cpp を示す。

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

#include <stdint.h>

int square_root(int64_t val, int32_t *result, int32_t bit_len){
    int64_t temp = 0;
    int64_t square;

    for(int i=(bit_len-1); i>=0; --i){
#pragma HLS LOOP_TRIPCOUNT min=1 max=16 avg=7
        temp += (1 << i);
        square = temp * temp;

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

    return(0);
}


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

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

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

int square_root(int64_t val, int32_t *result, int32_t bit_len);

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

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

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

    return(0);
}


Vivado HLS 2019.2 で ZYBO Z7-10 用に square_root プロジェクトを作成した。
square_root_1_200123.png

C シミュレーションを行った。うまく行っているようだ。
square_root_2_200123.png

すべての結果を示す。

INFO: [SIM 2] *************** CSIM start ***************
INFO: [SIM 4] CSIM will launch GCC as the compiler.
   Compiling ../../../square_root_tb.cpp in debug mode
   Generating csim.exe
i = 0, result = 0
i = 1, result = 1
i = 2, result = 1
i = 3, result = 1
i = 4, result = 2
i = 5, result = 2
i = 6, result = 2
i = 7, result = 2
i = 8, result = 2
i = 9, result = 3
i = 10, result = 3
i = 11, result = 3
i = 12, result = 3
i = 13, result = 3
i = 14, result = 3
i = 15, result = 3
i = 16, result = 4
i = 17, result = 4
i = 18, result = 4
i = 19, result = 4
i = 20, result = 4
i = 21, result = 4
i = 22, result = 4
i = 23, result = 4
i = 24, result = 4
i = 25, result = 5
i = 26, result = 5
i = 27, result = 5
i = 28, result = 5
i = 29, result = 5
i = 30, result = 5
i = 31, result = 5
i = 32, result = 5
i = 33, result = 5
i = 34, result = 5
i = 35, result = 5
i = 36, result = 6
i = 37, result = 6
i = 38, result = 6
i = 39, result = 6
i = 40, result = 6
i = 41, result = 6
i = 42, result = 6
i = 43, result = 6
i = 44, result = 6
i = 45, result = 6
i = 46, result = 6
i = 47, result = 6
i = 48, result = 6
i = 49, result = 7
i = 50, result = 7
i = 51, result = 7
i = 52, result = 7
i = 53, result = 7
i = 54, result = 7
i = 55, result = 7
i = 56, result = 7
i = 57, result = 7
i = 58, result = 7
i = 59, result = 7
i = 60, result = 7
i = 61, result = 7
i = 62, result = 7
i = 63, result = 7
i = 64, result = 8
i = 65, result = 8
i = 66, result = 8
i = 67, result = 8
i = 68, result = 8
i = 69, result = 8
i = 70, result = 8
i = 71, result = 8
i = 72, result = 8
i = 73, result = 8
i = 74, result = 8
i = 75, result = 8
i = 76, result = 8
i = 77, result = 8
i = 78, result = 8
i = 79, result = 8
i = 80, result = 8
i = 81, result = 9
i = 82, result = 9
i = 83, result = 9
i = 84, result = 9
i = 85, result = 9
i = 86, result = 9
i = 87, result = 9
i = 88, result = 9
i = 89, result = 9
i = 90, result = 9
i = 91, result = 9
i = 92, result = 9
i = 93, result = 9
i = 94, result = 9
i = 95, result = 9
i = 96, result = 9
i = 97, result = 9
i = 98, result = 9
i = 99, result = 9
i = 100, result = 10
i = 101, result = 10
i = 102, result = 10
i = 103, result = 10
i = 104, result = 10
i = 105, result = 10
i = 106, result = 10
i = 107, result = 10
i = 108, result = 10
i = 109, result = 10
i = 110, result = 10
i = 111, result = 10
i = 112, result = 10
i = 113, result = 10
i = 114, result = 10
i = 115, result = 10
i = 116, result = 10
i = 117, result = 10
i = 118, result = 10
i = 119, result = 10
i = 120, result = 10
i = 121, result = 11
i = 122, result = 11
i = 123, result = 11
i = 124, result = 11
i = 125, result = 11
i = 126, result = 11
i = 127, result = 11
i = 128, result = 11
i = 129, result = 11
i = 130, result = 11
i = 131, result = 11
i = 132, result = 11
i = 133, result = 11
i = 134, result = 11
i = 135, result = 11
i = 136, result = 11
i = 137, result = 11
i = 138, result = 11
i = 139, result = 11
i = 140, result = 11
i = 141, result = 11
i = 142, result = 11
i = 143, result = 11
i = 144, result = 12
i = 145, result = 12
i = 146, result = 12
i = 147, result = 12
i = 148, result = 12
i = 149, result = 12
i = 150, result = 12
i = 151, result = 12
i = 152, result = 12
i = 153, result = 12
i = 154, result = 12
i = 155, result = 12
i = 156, result = 12
i = 157, result = 12
i = 158, result = 12
i = 159, result = 12
i = 160, result = 12
i = 161, result = 12
i = 162, result = 12
i = 163, result = 12
i = 164, result = 12
i = 165, result = 12
i = 166, result = 12
i = 167, result = 12
i = 168, result = 12
i = 169, result = 13
i = 170, result = 13
i = 171, result = 13
i = 172, result = 13
i = 173, result = 13
i = 174, result = 13
i = 175, result = 13
i = 176, result = 13
i = 177, result = 13
i = 178, result = 13
i = 179, result = 13
i = 180, result = 13
i = 181, result = 13
i = 182, result = 13
i = 183, result = 13
i = 184, result = 13
i = 185, result = 13
i = 186, result = 13
i = 187, result = 13
i = 188, result = 13
i = 189, result = 13
i = 190, result = 13
i = 191, result = 13
i = 192, result = 13
i = 193, result = 13
i = 194, result = 13
i = 195, result = 13
i = 196, result = 14
i = 197, result = 14
i = 198, result = 14
i = 199, result = 14
i = 200, result = 14
i = 201, result = 14
i = 202, result = 14
i = 203, result = 14
i = 204, result = 14
i = 205, result = 14
i = 206, result = 14
i = 207, result = 14
i = 208, result = 14
i = 209, result = 14
i = 210, result = 14
i = 211, result = 14
i = 212, result = 14
i = 213, result = 14
i = 214, result = 14
i = 215, result = 14
i = 216, result = 14
i = 217, result = 14
i = 218, result = 14
i = 219, result = 14
i = 220, result = 14
i = 221, result = 14
i = 222, result = 14
i = 223, result = 14
i = 224, result = 14
i = 225, result = 15
i = 226, result = 15
i = 227, result = 15
i = 228, result = 15
i = 229, result = 15
i = 230, result = 15
i = 231, result = 15
i = 232, result = 15
i = 233, result = 15
i = 234, result = 15
i = 235, result = 15
i = 236, result = 15
i = 237, result = 15
i = 238, result = 15
i = 239, result = 15
i = 240, result = 15
i = 241, result = 15
i = 242, result = 15
i = 243, result = 15
i = 244, result = 15
i = 245, result = 15
i = 246, result = 15
i = 247, result = 15
i = 248, result = 15
i = 249, result = 15
i = 250, result = 15
i = 251, result = 15
i = 252, result = 15
i = 253, result = 15
i = 254, result = 15
i = 255, result = 15
i = 65026, result = 255
INFO: [SIM 1] CSim done with 0 errors.
INFO: [SIM 3] *************** CSIM finish ***************

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

コメント

コメントの投稿


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

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