久しぶりにブログ書くなぁ。
冬コミの原稿も書き終え、無事入稿を済ました。
あとは、大晦日を迎えるだけになった。
ある意味、肩の荷が降りた感じなので原稿書きをする前のやり残しを進めよう。
まずは、OpenCV H/Wライブラリ(FPGAモジュール)から。
四則演算と論理演算のうち、高速化が可能でかつ、画像処理で使いそうなものだけをピックアップして、それを高速処理化することを考えよう。
前にも書いたと思うけど、OpenCVの高速化はメモリ転送の高速化が肝になる。
まぁ、メモリの高速化に関してはOpenCVに限った話ではなく、画像処理全体で言える話だ。
実際にOpenCVをソフトで組んれみればわかるんだけど、何度も画像をソースからディスティネーションへ送る処理をする。
普通に考えれば、メモリに戻す前に関数をパイプライン化すればいいだけだよね。
その関数のパイプラインもアプリケーションによっては、関数の使う順番が違うから、どの順番でもパイプライン化できるようにすればいい。
この程度なら誰にだって考えられる、難しいレベルじゃない。
前提として、使う関数という風にしているので、だいたい四則演算で10種類ぐらいしかない。
そしたら、SIMD作ってパイプライン化できるようにモジュールを作ればいいだけ。
これだったらソフト屋さんでもFPGAの回路は組める。
#もう、FPGA屋なんて必要ないね。
#FPGA屋さんだったら、FPGAの専用機能を駆使できて回路を組めなきゃ、FPGA屋として存在意義はないね。
#汎用品を作らなきゃ意味がないというのならソフト屋に組ませればいい。
#そんなのFPGA屋のすることじゃないね。
#FPGAの回路書いてたらFPGA屋っていうのなら、そんなのFPGA屋じゃなくって、ただのロジック屋だ。
#FPGAなんて、ロジック屋でなくても回路作れるんだから、存在意義ないね。
#と、かなりの危機感を持っていたり・・・
四則演算についてなら、下記をサポートすれば画像処理で十分使える。
Add、AddS、AddWeight、Sub、SubS、SubRS、AbsDiff、AbsDiffS、Mul、And、Not、Set、SetZero
この中でもよく使うのはAddWeightじゃないだろうか?
これを実現するために下記の演算式にすれば良いだろう。
dst[i] = scale ( ( [~] src1 alpha ) [+,-,,&] ( src2[i] beta ) ) [+,-] [value,gamma]
これを単純にロジックで組んでしまうと大きなものになるけど、Xilinxの7Seriesなら1系統辺り、動的に演算方法を切り替えるようにしてDSP48E1を4つ使って、RGB処理するならDSP48E1が12個で作成することができる。
24bitだと、処理が面倒なので32bit単位で扱うようにすれば、Alphaデータも計算できるので良いかな?
これを一単位のSIMDとして、入出力をAXI Stream I/Fにする。
そして、このSIMDをAXI Stream S/Wで連結できるようにする。
各SIMDの演算式を動的に組み替えることができるのでいちいち、メモリに書き出しをしなくてもよくなる。
場合によってはダメだけど・・・
これにデータの入力にBlockRAMをFIFO36E1として使って、バースト転送処理するようにできれば、そこそこ高速でロジックを抑えたものになるんじゃないかな?
これ原稿書きながらほとんど、作っちゃったんだけど、まだ、検証してないんだよね。