FC2カウンター FPGAの部屋 hls::LineBufferとhls::Windowでラプラシアンフィルタを実装する7

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

FPGAの部屋

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

hls::LineBufferとhls::Windowでラプラシアンフィルタを実装する7

”hls::LineBufferとhls::Windowでラプラシアンフィルタを実装する6”の続き。

前回は、 memcpy() の代わりに for 文で1行分 Read, Write を行う実装を試してみた。今回は、2 つの実装を実際に使用する 800 x 600 ピクセルの解像度に変更して、どの位リソースを使うかと、今までは 100 MHz で合成してきたが、どの位の動作周波数で合成できるかを探ってみた。

最初は、”hls::LineBufferとhls::Windowでラプラシアンフィルタを実装する3”の conv_rgb2y() のインスタンス数を削減したバージョンの内側の for ループに PIPELINE II=1 ディレクティブを挿入した場合とする。
LineBuffer_Window_21_160317.png

ただし、冒頭にも書いたとおりに、800 x 600 ピクセルの画像を処理できるようにラプラシアンフィルタ処理領域を変更してある。
LineBuffer_Window_89_160324.png

HDL への合成結果を示す。
LineBuffer_Window_90_160324.png
Latency は、480022 クロックだった。800 x 600 ピクセルの総ピクセル数は 480000 なので、1 ピクセルを 1 クロックで処理できている。

リソース使用量を示す。左側が 64 x 48 ピクセルの時のリソース使用量で、右側が今回の 800 x 600 ピクセルの時のリソース使用量だ。BRAMは 800 x 600 ピクセルの時に 2 つ使用するようになっている。
LineBuffer_Window_23_160317.pngLineBuffer_Window_91_160324.png

Analysis 表示を示す。
LineBuffer_Window_92_160324.png

次に、動作周波数を 250 MHz ( 4 ns) に設定した。これで、合成を行った。
LineBuffer_Window_93_160324.png
Estimated は 5.28 (ns) だった。動作周波数にすると、189 MHz となった。
Latency は 480033 クロックなので、1 ピクセルを 5.28 ns で処理できるとすると、2.53 ms で処理が完了する。前回のC/RTL コシミュレーションから 2 倍のクロックがかかるだろうということが予測できるので、5.06 ms になる。でも、すべてシングル転送と言うことを考えるとどうだろうか?

リソース使用量を下に示す。Target を 10 (ns) に設定した方を左に、Target を 4 (ns) に設定した方を右に表示する。
LineBuffer_Window_91_160324.pngLineBuffer_Window_94_160324.png
やはり、FFが顕著に増えている。

Analysis 表示を示す。
LineBuffer_Window_95_160324.png
C33 までステートがあった。前はC22 までだと思うが記録が残っていない。。。

リソース表示を示す。
LineBuffer_Window_96_160324.png

次に、単純にmemcpy() を内側の for ループの外に置く、”hls::LineBufferとhls::Windowでラプラシアンフィルタを実装する5”で動作周波数の限界に挑戦してみよう。ただし、こちらも、内側の for ループに PIPELINE II=1 ディレクティブを挿入し、800 x 600 ピクセルの解像度に変更した場合とする。

HDL への合成結果を示す。
LineBuffer_Window_97_160324.png
Latency は、1456201 クロックだった。800 x 600 ピクセルの総ピクセル数は 480000 なので、1 ピクセルの処理に 3 クロックかかっていると思われる。これで 1 クロック当たり、10 ns で計算すると、約 14.56 ms となる。60 fps の 16.67 ms を超えているので、これで十分かもしれない。

リソース使用量を示す。
LineBuffer_Window_98_160324.png
BRAM が 2 から 6 に増えている。

Analysis 表示を示す。
LineBuffer_Window_99_160324.png
C22 までだった。

次に、Target を 2.50 (ns) にしてみた。そうしたところ、Estimated は 3.44 (ns) だった。約 291 MHz で動作する。
LineBuffer_Window_100_160324.png
Latency は、1468201 クロックで増えている。 1468201 クロック x 3.44 ns = 5.05 ms で処理が完了することになる。かなり速い。

リソース使用量を示す。リソース使用量を下に示す。Target を 10 (ns) に設定した方を左に、Target を 2.5 (ns) に設定した方を右に表示する。
LineBuffer_Window_98_160324.pngLineBuffer_Window_101_160324.png
FFが顕著に増えていて、LUT も少し増えていた。

LineBuffer_Window_102_160324.png
ステートもTarget を 10 (ns) に設定した時は、C22 までだったが、Target を 2.5 (ns) に設定した時は、C36 までになった。

結構、hls::LineBufferとhls::Window を使った実装は、結構、速くて実際に 60 fps で動作できるのでは?と思った。
  1. 2016年03月24日 05:19 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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