FC2カウンター FPGAの部屋 2019年08月27日
FC2ブログ

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

FPGAの部屋

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

Ultra96用ガボールフィルタIP の作成2

Ultra96用ガボールフィルタIP の作成1”の続き。

Ultra96-V2 にガボールフィルタを実装しようということで、以前、ZYBO 用に作っていたガボールフィルタIP をUltra96用に変更することにした。
前回は、ガボールフィルタをかけるフィルタ・サイズを row と col を引数に入れて設定できるように変更したソースコード、テストベンチなどを貼った。今回は、C シミュレーション、Cコードの合成を行った。

早速、C シミュレーションを行った。
Gabor_filter_lh_2_2_190825.png

固定小数点演算と浮動小数点演算の値の差が出てしまっている。ログを貼っておく。

INFO: [SIM 2] *************** CSIM start ***************
INFO: [SIM 4] CSIM will launch GCC as the compiler.
   Compiling ../../../Gabor_filter_lh_2_tb.cpp in debug mode
   Compiling ../../../Gabor_filter_lh_2.cpp in debug mode
   Generating csim.exe

outs
ERROR HW and SW results mismatch i = 532, j = 85, HW = 00a2a2a2, SW = 009f9f9f
ERROR HW and SW results mismatch i = 727, j = 91, HW = 002b2b2b, SW = 00282828
ERROR HW and SW results mismatch i = 751, j = 95, HW = 000f0f0f, SW = 000c0c0c
ERROR HW and SW results mismatch i = 531, j = 140, HW = 00040404, SW = 00010101
ERROR HW and SW results mismatch i = 213, j = 144, HW = 00797979, SW = 00767676
ERROR HW and SW results mismatch i = 550, j = 147, HW = 00050505, SW = 00020202
ERROR HW and SW results mismatch i = 550, j = 150, HW = 00121212, SW = 000f0f0f
ERROR HW and SW results mismatch i = 313, j = 164, HW = 00515151, SW = 004e4e4e
ERROR HW and SW results mismatch i = 314, j = 164, HW = 001d1d1d, SW = 001a1a1a
ERROR HW and SW results mismatch i = 314, j = 165, HW = 00d0d0d0, SW = 00cdcdcd
ERROR HW and SW results mismatch i = 315, j = 165, HW = 00a1a1a1, SW = 009e9e9e
ERROR HW and SW results mismatch i = 369, j = 176, HW = 00161616, SW = 00131313
ERROR HW and SW results mismatch i = 174, j = 196, HW = 00919191, SW = 008e8e8e
ERROR HW and SW results mismatch i = 43, j = 200, HW = 00272727, SW = 00242424
ERROR HW and SW results mismatch i = 46, j = 200, HW = 00555555, SW = 00525252
ERROR HW and SW results mismatch i = 48, j = 200, HW = 00727272, SW = 006f6f6f
ERROR HW and SW results mismatch i = 49, j = 200, HW = 00666666, SW = 00636363
ERROR HW and SW results mismatch i = 50, j = 200, HW = 00606060, SW = 005d5d5d
ERROR HW and SW results mismatch i = 51, j = 200, HW = 00686868, SW = 00656565
ERROR HW and SW results mismatch i = 55, j = 200, HW = 00727272, SW = 006f6f6f
ERROR HW and SW results mismatch i = 59, j = 200, HW = 00b7b7b7, SW = 00b4b4b4
ERROR HW and SW results mismatch i = 63, j = 200, HW = 00b5b5b5, SW = 00b2b2b2
ERROR HW and SW results mismatch i = 65, j = 200, HW = 00a7a7a7, SW = 00a4a4a4
ERROR HW and SW results mismatch i = 66, j = 200, HW = 008c8c8c, SW = 00898989
ERROR HW and SW results mismatch i = 67, j = 200, HW = 00747474, SW = 00717171
ERROR HW and SW results mismatch i = 70, j = 200, HW = 00121212, SW = 000f0f0f
ERROR HW and SW results mismatch i = 74, j = 201, HW = 00e7e7e7, SW = 00e4e4e4
Success HW and SW results match

WARNING: Hls::stream 'hls::stream<ap_axis<32, 1, 1, 1> >.2' contains leftover data, which may result in RTL simulation hanging.
WARNING: Hls::stream 'hls::stream<ap_axis<32, 1, 1, 1> >.1' contains leftover data, which may result in RTL simulation hanging.
INFO: [SIM 1] CSim done with 0 errors.
INFO: [SIM 3] *************** CSIM finish ***************


2乗誤差が 4 よりも大きい誤差になるとエラーにしているが、全部 3 違っているだけのようなので大丈夫だろうと思う。
ガボールフィルタの元の画像は、家の前の道路のBMP ファイルだ。写真を示す。
Gabor_filter_lh_2_3_190825.jpg

ハードウェアとする固定小数点演算でガボールフィルタをかけた画層を示す。まずは左白線用の画像から示す。
Gabor_filter_lh_2_4_190825.jpg

同じく、右白線用のガボールフィルタ画像を示す。
Gabor_filter_lh_2_5_190825.jpg

浮動小数点演算のガボールフィルタ画像を示す。左白線用画像だ。
Gabor_filter_lh_2_6_190825.jpg

同じく、右白線用画像を示す。
Gabor_filter_lh_2_7_190825.jpg

固定小数点演算と浮動小数点演算で似たようなガボールフィルタ画像になっていることが分かると思う。

C コードの合成を行った。220 MHz で動作するようにするために、ターゲットの周期は、4.5 ns とした。合成結果を示す。
Gabor_filter_lh_2_8_190827.png

Estimated が 4.758 ns で 4.5 ns を超過している。

Uncertainty を 1 ns にして、もう一度C コードの合成を行った。
Gabor_filter_lh_2_10_190827.png

リソース使用量は増えたが、Estimated が 4.758 ns で変化がない。どうやらクリティカル・パスが変わっていないのだろう?

Analysis の結果を見てみよう。
レポートをTiming Violation に変えると、クリティカル・パスが見えた。
Gabor_filter_lh_2_12_190827.png

Gabor_filter_lh_2_13_190827.png

row の for ループから最初のピクセルは取り込み済みだから、最初のピクセルはAXI4 Stream から取り込まないようにする if 文がクリティカル・パスのようだ。
これは仕方ないので、タイミング制約の方を変更することにした。
ターゲットの動作周波数を 5 ns とした。
Gabor_filter_lh_2_14_190827.png

これで C コードの合成を行った。
Gabor_filter_lh_2_15_190827.png

一応、タイミング制約は満たしたが、Estimated は 4.758 ns で同じだった。クリティカル・パスなので、このままだ。Uncertainty が 0.62 ns なので、Estimated + Uncertainty は 5 ns を超えてしまうのだが、良いのだろうか?この辺のコンセプトが見えない気がする。
Latency の評価をしよう。min では、64 ピクセル x 48 行なので、総ピクセル数は 3072 ピクセルだ。それを左白線検出、右白線検出するので、 x 2 となっているので、合計 6144 ピクセルとなる。Latency の min は 6149 クロックなので、
6149 クロック / 6144 ピクセル ≒ 1.00 クロック/ピクセルとなって、1 ピクセルを 1 クロックで処理できていることになる。
  1. 2019年08月27日 04:51 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0