FC2カウンター FPGAの部屋 Vivado HLS によるアンシャープマスクキング・フィルタの作製8(C++ の任意精度固定小数点型2)

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

FPGAの部屋

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

Vivado HLS によるアンシャープマスクキング・フィルタの作製8(C++ の任意精度固定小数点型2)

Vivado HLS によるアンシャープマスクキング・フィルタの作製7(C++ の任意精度固定小数点型)”の続き。

前回はC++のソースコードを公開した。今回は、Cシミュレーションを行ってから、C++ から HDL への合成を行って、int 型でシフトを使って演算した実装と比較する。

(2015/10/13:全面的に修正)

まずは、Cシミュレーションを行った。int 型でシフトを使って演算のCシミュレーション結果よりも精度が良い。
unsharp_mask_42_151006.png

固定小数点型で書いた今回のC++ ソースコードを HDL へ合成した。下に結果を示す。
unsharp_mask_43_151006.png

unsharp_mask_44_151007.png
BRAM_18K は 4 個、DSP48E は 18 個、FF は 2304 個、LUT は 2835 個使用している。

次に、int 型でシフトを使ってアンシャープマスキング・フィルタの演算を行った例として”Vivado HLS によるアンシャープマスクキング・フィルタの作製3(固定小数点で実装してみた)”の unsharp_masking() を固定小数点型での実装と同様に、x1y1 をループの外に出した。
unsharp_masking() を示す。

// アンシャープマスキング・フィルタ
// x0y0 x1y0 x2y0 -k   -j  -k
// x0y1 x1y1 x2y1 -k  9+8k -k x 1/9
// x0y2 x1y2 x2y2 -k   -k  -k
//
// k : 鮮鋭化の強さ(固定小数点) , k != 0
// num_adec_k : Kの小数点の位置
// 2015/09/27 : 演算の小数部は num_adec_k*2 ビットとする。
//

#define PRECISION    6    // 小数点以下の桁数、精度(1以上)

int unsharp_masking(int pix_mat[3][3], int k, int num_adec_k)
{
    int y;
    int xy[3][3];
    int result=0;
    int z;

    int x1y1 = (9<<(PRECISION+num_adec_k))/k + (8<<PRECISION);

    for (int i=0; i<=16; i += 8){
        for (int j=0; j<3; j++){
            for (int k=0; k<3; k++){
                xy[j][k] = (pix_mat[j][k] >> i) & 0xff; // RGBのいずれかを抽出
            }
        }

        y = -(xy[0][0]<<PRECISION) -(xy[0][1]<<PRECISION) -(xy[0][2]<<PRECISION)
            -(xy[1][0]<<PRECISION) +x1y1*xy[1][1]         -(xy[1][2]<<PRECISION)
            -(xy[2][0]<<PRECISION) -(xy[2][1]<<PRECISION) -(xy[2][2]<<PRECISION);

        y = ((k * y)/9) >> num_adec_k; // k は num_adc_k だけ左シフトされているので戻す

        z = y + (1<<(PRECISION-1)); // 四捨五入 +0.5
        z = z >> PRECISION; // 小数点以下切り捨て

        if (z<0// 飽和演算
            z = 0;
        else if (z>255)
            z = 255;

        result += z<<i; // i=0 : blue, i=8 : green, i=16 : red
    }

    return(result);
}


これで、C++ からHDL への合成を行った。結果を示す。
unsharp_mask_45_151007.png

unsharp_mask_46_151007.png
BRAM_18K は 4 個、DSP48E は 18 個、FF は 1462 個、LUT は 1849 個使用している。

FF も LUT も、固定小数点の方が多い。
FF と LUT が固定小数点型の方が増えているのは、次に示すAnalysis の結果でもわかるが、パイプラインの段数が増えているからではないか?と思う。

固定小数点型での、Analysis 結果を示す。
unsharp_mask_47_151007.png

unsharp_mask_48_151007.png
C40 まである。

int 型でシフトを使ってアンシャープマスキング・フィルタの演算を行った例のAnalysis 結果を示す。
unsharp_mask_49_151007.png

unsharp_mask_50_151007.png

C31 までで、固定小数点型よりも 9 ステージ少ない。
  1. 2015年10月07日 04:17 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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