FC2カウンター FPGAの部屋 2014年06月09日
FC2ブログ

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

FPGAの部屋

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

Vivado HLS 2014.1でラプラシアン・フィルタ関数をaxi masterモジュールにする9(単体シミュレーション)

Vivado HLS 2014.1でラプラシアン・フィルタ関数をaxi masterモジュールにする8(パイプライン化ソースを実機テスト3)”の続き。

今回は、単体シミュレーションを行った。

まずは、tu1978 さんに教えて頂いたラプラシアンフィルタ処理をパイプライン化したCソースをVivado HLS 2014.1 でIPにしたものを単体シミュレーションする。単体シミュレーションは、AXI4 Slaveメモリか、もしくはAXI4 Slave として動作するBFM(Bus Functional Model)を使用している。BFMは自作でこのブログにVHDLソースが載っている。(単体シミュレーションについては、”Vivado HLS 2013.4でラプラシアン・フィルタ関数をaxi masterモジュールにする5(単体シミュレーション)”を参照のこと)

・ラプラシアンフィルタ処理をパイプライン化したVivado HLS 2014.1 のIP用のProject Navigator のプロジェクトを下に示す。
Vivado_HLS_2014_1_48_140609.png

・Project Navigator プロジェクトの中のXPSプロジェクトを下に示す。
Vivado_HLS_2014_1_49_140609.png

・次に、HDLで自作したIPの単体シミュレーション用のProject Navigator プロジェクトを下に示す。
Vivado_HLS_2014_1_50_140609.png

・ラプラシアンフィルタ処理をパイプライン化したVivado HLS 2014.1 のIPの単体シミュレーション結果を下に示す。20 ms 程度の所でラプラシアンフィルタ処理が終了して、AXI4 Lite Slave モジュールの ap_done が 1 になっている。
Vivado_HLS_2014_1_51_140609.png

但し、この単体シミュレーションのクロックは100MHz を使用している。今回のラプラシアンフィルタ処理をパイプライン化したVivado HLS 2014.1 のIPの動作クロックは90MHzなので、処理終了時間は、20 ms /9 * 10 ≒ 22 ms となる。

・この単体シミュレーションの1ラインごとの処理を見ていこう。カーソル間を拡大する。
Vivado_HLS_2014_1_52_140609.png

m_axi_cam_fb_RVALID と m_axi_lap_fg_WVALID に注目して欲しい。m_axi_cam_fb_RVALID はAXIバスのReadのValid信号だ。これは、画面の横の800ピクセルの画像の値を4つのバーストに分けてReadしている。その後、ラプラシアンフィルタ処理を行う。最後に、ラプラシアンフィルタ処理の結果を AXI4 バスを使ってメモリにWriteしている。そのWriteしている時にアサートするのが m_axi_lap_fg_WVALID だ。なお、この単体シミュレーションではAXIバスのデータ・チャネルの転送にWait を入れていない。
m_axi_cam_fb_RVALID のアサートの最初と次のアサートの最初の間は、33.8 us となった。これが画像1ライン分のラプラシアンフィルタの処理時間だ。しかし、この単体シミュレーションは100MHzで行っていることを忘れてはならない。実機での動作クロックは 90MHz なので、10/9 する必要がある。
よって、33.8 us * 10 / 9 ≒ 37.6 ms となった。
全体の処理時間を計算すると、画面は、800 x 600 のSVGAなので、37.6 us x 600 ライン = 22.6 ms となった。
実機で、ラプラシアンフィルタ処理IPの動作時間のみを測定してみると 21.9 ms となって、大体合っていることがわかった。

ラプラシアンフィルタのパイプライン化する前のVivado HLS 2014.1 によるIPの性能を単体シミュレーションで見ると、1ラインの処理時間は約141us となった。単純に 600ラインとすると、141us x 600ライン = 84.6ms となった。(”Vivado HLS 2014.1でラプラシアン・フィルタ関数をaxi masterモジュールにする3(単体シミュレーション)”参照)
Vivado_HLS_2014_1_15_140424.png

次に、HDLで自作したIPの単体シミュレーション波形を見ていこう。
・まずは、14 ms シミュレーションした結果を示す。約 10 ms でラプラシアンフィルタ処理が終了している。
Vivado_HLS_2014_1_53_140609.png

・単体シミュレーションの1ラインごとの処理を見ていこう。カーソル間を拡大する。
Vivado_HLS_2014_1_54_140609.png

M_AXI_RVALID と M_AXI_WVALID に注目して欲しい。先ほどの m_axi_cam_fb_RVALID と m_axi_lap_fg_WVALID と同様の信号なので、説明は省略する。
1ラインの処理時間は、約16.5 us だった。
全画面での処理時間は、16.5 us x 600 ライン = 9.90 ms となった。

こちらのM_AXI_RVALID と M_AXI_WVALID を見ると、M_AXI_RVALID のアサート終了から M_AXI_WVALID のアサート開始までの間隔がないのに気が付くと思う。これは、Readするのと同時に、つまり1クロックでラプラシアンフィルタ処理が終了しているからだ。ハードウェアなので、1クロックでラプラシアンフィルタ処理することが出来る、というかこれが普通だ。
もっとチューニングするとしたら、Readバーストで画像のピクセル値を読んでいる途中に、Writeバーストでラプラシアンフィルタ処理結果を書き込むことも可能だ。その場合は、DDR3 SDRAMのコントローラで、アービトレーションを行い、Read, Writeのうちのどちらをやるのかを決定することになる。DDR3 SRAMのバス帯域が十分に大きくて、DDR3 SDRAMのコントローラが十分に賢い場合は、更に2倍程度の性能向上をすることが可能かもしれない?
  1. 2014年06月09日 05:20 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0