Vivado HLSでラプラシアン・フィルタをAXI Master で構成するC言語のソースを書いて、IPとしてZedBoardのLinux用ハードウェアに実装してみたが、動作しなかった。そこで、Vivado HLSが出力したIPのトップファイルのポート構成はそのままで、自分でHDLを書いて、ラプラシアン・フィルタのAXI4 Master IPを完成させてみることにした。
関連するブログ記事を列挙する。
Vivado HLSでラプラシアン・フィルタ関数をaxi masterモジュールにする1
Vivado HLSでラプラシアン・フィルタ関数をaxi masterモジュールにする2(Vivado HLSの出力したIPのトップファイルのポート構成はここに書いてあります)
Vivado HLSで作ったラプラシアン・フィルタAXI4 Master IPを使う1
Vivado HLSで作ったラプラシアン・フィルタAXI4 Master IPを使う2
Vivado HLSで作ったラプラシアン・フィルタAXI4 Master IPを使う3
通常では、ビットマップ・ディスプレイ・コントローラのピクセルクロック、もしくはカメラ側ですでにラプラシアン・フィルタを掛ける時は、カメラ・コントローラのピクセルクロックでラプラシアン・フィルタをリアルタイムに掛けるのが通常だと思う。今回は、あくまでC言語から高位合成で合成されたHDLをイメージして、現在の動作周波数が100MHzのAXI4バスクロックの元にシーケンシャルに実行するHDLを作製して、その性能を見てみようと思う。
通常のHDLで実装する時は、1ピクセル画像データが来たら、今までためてきた2ラインのピクセルデータと現在のラインの前の2つのピクセルデータを使って、ラプラシアン・フィルタの値を計算して保存する。現在のピクセルデータはラインバッファに格納する。このように1クロックごとにいろいろな処理を並列して行う。
ラプラシアン・フィルタのハードウェア構成のブロック図を下に示す。

さて、上のブロック図はカメラから来たピクセルデータを直接受け取って、ラプラシアン・フィルタを掛けている。通常ハードウェアとして実行する場合には、厳密にピクセルデータを変換するフィルタとして書くことができる。それは、時間を制御することができるからだ。それでは、時間軸を書くことが出来ない通常のC言語でハードウェアを書く場合は、一旦メモリ(BRAMを含む)から読んできたデータを処理する以外にないだろう?と思う。
今回はハードウェアでもそれに習って書くことにする。つまり、
1.フレーム・バッファから1ラインRead
2.Readしたピクセルデータを使ってラプラシアン・フィルタを掛けてラインバッファに格納する
3.ラプラシアン・フィルタの値が入ったラインバッファを異なるフレーム・バッファにWrite
この3つをシーケンシャルに実行してみようと思う。
このように実装しても、現在のAXIバスの動作周波数は100MHzで、SVGAのピクセルクロックの40MHzよりも十分に高いので、フレームレートは結構行くのではないだろうか?と思う。
これができたら、今度は、1.2.3.を3つをスレッドとみなして、スレッドの並列化を行ってみよう。これはC言語で記述できる1ポートのRAMを使ってもReadで使用するラインバッファを4つにして、ラプラシアン・フィルタの結果を格納するラインバッファを2つ使えば問題無いと思う。それぞれの処理の終了時にバリア同期を掛ける。この様な実装がHLSのハードウェア化記述としては、より正しいのでは?と思っている。
(注)”
画像のフレームバッファ2(ライフサイクルをシミュレーション)”に示すように、動画に乱れが出ないかどうかは別問題です。あくまで静止画に於いて、フレームレートで変換できるのを目指しています。動画で画像の乱れが無いように実装するにはあくまでHDLで実装する必要があると思います。
- 2013年10月23日 05:43 |
- IP
-
| トラックバック:0
-
| コメント:0