http://verilog.blog.shinobi.jp/impulsec/impulsec-codeveloper%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%20-2-ImPulseC/CoDeveloperを使ってみる (2)
CoDeveloper Tutoriaの2番目のGenerating Hardwareでは、
DesignWave 2008年2月号の記事でも紹介されていたエッジ検出回路が題材です。
ソフトウェアをコンパイルして実行すると、七五三の女の子(なぜ七五三?)の画像の輪郭を検出したBMPファイルResult1.bmpが作成されます。
このチュートリアルでは、さらに踏み込んで、生成されるHDLが最適化されるような記述方法を紹介しています。
たとえば、下記のようなコードの場合、ABSは4回計算されていますが、引数は異なるので並列に計算できます。
しかし、4回とも同じ変数pixeldiffに結果を代入しているので、コンパイラは逐次処理と判断してしまいます。
pixelMag = 0;
pixeldiff = ABS(pixelSE - pixelNW);
if (pixeldiff > pixelMag)
pixelMag = pixeldiff;
pixeldiff = ABS(pixelNE - pixelSW);
if (pixeldiff > pixelMag)
pixelMag = pixeldiff;
pixeldiff = ABS(pixelS - pixelN);
if (pixeldiff > pixelMag)
pixelMag = pixeldiff;
pixeldiff = ABS(pixelE - pixelW);
if (pixeldiff > pixelMag)
pixelMag = pixeldiff;
そこで、下記のように書き換えることで、ABS計算を並列に行わせることができます。
pixeldiff1 = ABS(pixelSE - pixelNW);
pixeldiff2 = ABS(pixelNE - pixelSW);
pixeldiff3 = ABS(pixelS - pixelN);
pixeldiff4 = ABS(pixelE - pixelW);
pixelMag = (co_uint8) MAX4(pixeldiff1,pixeldiff2,pixeldiff3,pixeldiff4);
もう一つの例として、R/G/Bを1つのプロセスで逐次処理していたものを、3つの独立したプロセスを生成して、R/G/Bを並列に処理されるように変更したものが紹介されています。
上記の並列性を利用するように書き換えられたプロジェクトも
EdgeDetect_2として提供されています。
ライセンスがないので、HDLはまだ生成できないのが残念なところです。
[0回]
PR