FC2カウンター FPGAの部屋 Vivado HLSで作ったラプラシアン・フィルタIPを使ってみる5
FC2ブログ

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

FPGAの部屋

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

Vivado HLSで作ったラプラシアン・フィルタIPを使ってみる5

Vivado HLSで作ったラプラシアン・フィルタIPを使ってみる4”の続き。

前回はCソースコードをブログに貼った。今回は、ChipScope を使用して、AXI4 Lite Slave バスのバス・トランザクションを見ていこう。

最初に、大事な、chipscope_icon_0 の control0, control1, control2 の割り当てから確認する。下に図に示す順番だ。
HLS_lap_filter_24_131009.png

ChipScope Pro を立ちあげて、CDCファイルをインポートした。3つ分インポート。
HLS_lap_filter_25_131009.png

HLS_lap_filter_26_131009.png

HLS_lap_filter_27_131009.png

ラプラシアン・フィルタIPのAXI4 Lite Slave バスを見た。
HLS_lap_filter_28_131009.png

Oカーソルの時点で、x0y0のデータがラプラシアン・フィルタIPのレジスタにWriteされている。9個のデータがWriteされ、その次に、vld 信号を1にするレジスタWrite がやはり9回続く。その後、ap_done の状態を見るReadが1回(1回で済んでいるようだ)。その後のRead はラプラシアン・フィルタの結果をReadしている。1回のラプラシアン・フィルタIPのアクセスが終了してから、次のx0y0のデータWrite までに 396クロックかかっている。1クロックは100MHzで10nsec なので、3.96usec かかっていることになる。

次に、IOアクセス(メモリ・マップされているので、メモリ・マップドIO)全体を見てみよう。
HLS_lap_filter_29_131009.png

IOアクセス全体では、307クロック、3.07usec だった。ソフトウェアを含めた。1回のラプラシアン・フィルタIPのアクセスが終了時間は、3.96usec だったので、IOアクセスの割合は、3.07 / 3.96 = 77.5%となった。

次に、IOアクセスを拡大してみてみることにする。
HLS_lap_filter_30_131009.png

1つのAXI4 Lite Slave Write アクセスから、次のそれまでは、15クロック、つまり、150nsec 掛かっている。
その内の実際のAXI4 Slave Write アクセスは3クロックのみだ。間隔が開きすぎている。ARMプロセッサのIOアクセスが遅いのか?

Oカーソルの位置が、ap_done を読んでいるAXI4 Lite Slave のRead アクセスで、Xカーソルの位置が、ラプラシアン・フィルタの結果を読んでいるAXI4 Lite Slave のRead アクセスだ。やはり、間隔は 150nsec だ。
HLS_lap_filter_31_131009.png

Vivado HLSで作ったラプラシアン・フィルタIPを使ってみる4”の lap_filter_uty.c の

//x0y0_read = *(volatile int *)((unsigned int)lap_fil_hw_addr + (unsigned int)XLAPLACIAN_FILTER_BUS_A_ADDR_X0Y0_DATA);

のコメントを外して実行した時のChipScope の結果を下に示す。ピンクの四角で囲ったのが、上のRead アクセスとなる。
HLS_lap_filter_32_131009.png

これならば、特に遅くなる要素はないはず。。。なぜ、0.9秒も遅くなってしまうのだろうか?
  1. 2013年10月09日 05:34 |
  2. Co-design
  3. | トラックバック:0
  4. | コメント:2

コメント

なんだか時代の進み具合を、日めくりのように見られて楽しんでます。
シフト演算でカリカリ作っていたような回路が、プログラム書くだけで作れちゃうんですね。
ただ、最適化までは無理なようなので、まだまだ人間の出番はありそうです。

ここから考察という名の思いつき

3×3のピクセルデータを、バースト3回×バンク3回でやっているんですかね?
15クロックも、3+4+4(バス調停/バンク切り替え/バースト転送)くらいで考えると合いそうです。
CPUと違ってキャッシュが効かない(CPUだと1回アクセスすると、ブロックでキャッシュに転送のはず)のでI/Oアクセスはきつそうです。
最終的には、I/O読み出し、画像処理、I/O書き出しを分離して記述する必要がありそうですが、SystemCって並行動作も記述できるんでしたっけ?
(これもあって、ブロック処理を提案してみたのですが)
  1. 2013/10/09(水) 09:14:03 |
  2. URL |
  3. おる #qbIq4rIg
  4. [ 編集 ]

9個のピクセルデータを1個ずつAXI4 Lite Slaveで転送しています。更に、後9個、バリッド信号をを1個ずつAXI4 Lite Slaveで転送しています。その後、ap_done をReadしてから結果をReadしているので、合計20回、AXI4 Lite Slaveでアクセスしています。とっても無駄が多いです。
  1. 2013/10/09(水) 20:00:58 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


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

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