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回]
[0回]
PR