2016-04-24 14 views
1

私は、累積ヒストグラム法を使用してメディアンフィルタのためのVerilogでいくつかのコードを書いています。ザイリンクスでコードを合成しようとすると、最大1時間処理され、最後に「プログラムがメモリ不足になりました」というエラーが表示されます。コードを改善して合成時間を短縮するにはどうすればよいですか?

私のコードは次のとおりです。

//***** MEDIAN FILTER BY USING CUMULATIVE HISTOGRAM METHOD******// 

module medianfilter(median_out,clk,a1,a2,a3,a4,a5,a6,a7,a8,a9); 
output median_out; 
input [7:0]a1,a2,a3,a4,a5,a6,a7,a8,a9; 
integer i,j; 
reg[7:0]b[255:0]; 
reg [7:0]buff[0:8]; 
input clk; 
reg [7:0]median_out; 
[email protected](negedge clk) 
begin 
    //**************************************************************************// 
    for(i=0;i<256;i=i+1) // initilize the memory bins with zeros 
    b[i]=0; 
    //*************************************************************************// 

    buff[0]=a1; 
    buff[1]=a2; 
    buff[2]=a3; 
    buff[3]=a4; 
    buff[4]=a5; 
    buff[5]=a6; 
    buff[6]=a7; 
    buff[7]=a8; 
    buff[8]=a9; 
    for(i=0;i<9;i=i+1) // this loop is for cumulative histogram method 
    begin 
     b[buff[i]]=b[buff[i]]+1; // incrementing the value in b[i]th memory address 
      for(j=0;j<256;j=j+1) 
       if(j>buff[i]) 
        b[j]=b[j]+1; // incrementing the bins below b[i]th bin 


    end 
//**************************************************************************// 
    for(i=0;i<256;i=i+1) // loop for finding the median 
    begin 
     if(b[i]>4) ///////// condition for checking median 
     begin 
      b[i]=1; 
      median_out=i; 
      i=256; // loop breaks here 
     end 
    end 
//*************************************************************************// 
end 

endmodule 

どのように私は、コードの論理合成を行うことができますか?

答えて

3

コードによっていくつの加算器が生成されますか?私は同じサイクルで働いている少なくとも2,100の8ビット加算器を見る。

アルゴリズムを再考する必要があります。中央値フィルタにはピクセル値の順序付きリストが必要です。そのため、まずFPGAで効率的な数値の順序付けを検討する必要があります。

  • 奇数偶数マージソートや
  • バイトニックソート:

    良いアプローチは次のようにソーティングネットワークされています。

9つの数字を1つのサイクルで並べ替えることはできませんので、パイプラインが必要です。

PoC-Library私たちのPoC-Libraryにはパイプラインsorting networksが含まれていますが、これらのネットワークを2つの入力サイズのパワーでテストしたことはありません。

+0

私は累積ヒストグラム法を使って入力ピクセルをソートする必要があります。私はforループ内のforループの代わりに考えています。どうすれば変更できますか? –

+0

[median filter](https://en.wikipedia.org/wiki/Median_filter)がどのように機能するのか、ヒストグラムや蓄積はありません。あなたの9入力値によると、私はあなたが2-D 3x3メジアンフィルターを使用していると仮定します。すべての9つの値がソートされ、リストの値4が出力として選択されます。平均フィルタを実装する場合、値を累積する必要があり、分割アルゴリズム=>これは大きな遅延があります。しかし、平均!=中央値。 – Paebbels

0

@Paebbelsがここで言うすべてに同意します。しかし、いくつかの追加の考慮事項があります。どのくらいの速さでデータが入っていますか?クロックサイクルごとにソートするために、新しい10個の値を取得しますか?そうでなければ、演算子をパイプライン化し、単一の加算器を使用してブロックRAMに結果を格納する点でも、加算器の数を減らし、レジスタ段数を減らすことができます(これははるかに遅くなります)。また、使用しているFPGAについては言及していません(私はこれが小さいと思いますが)。すべてのFPGA設計では、ターゲットデバイス上の利用可能なリソースを考慮する必要があります。 DSP48乗算器 - アキュムレータは、デザインの他の場所で使用されていない場合は加算器用に直接インスタンス化することもできます。必要な数とデバイスで使用可能な数に応じてもう一度使用します。

関連する問題