2016-05-07 2 views
0

Verilogを初めて使用していますが、単純なコードを書き込もうとしていましたが、熟練した方法ではわかりません。 私は12ビットレジスタ "data"を持っています、そのレジスタの各ビットは特定の値を持っています。例えば有効ビット数に基づく値の合計Verilog

Bit 0 = 12; 
Bit 1 = 16; 
Bit 2 = 33; 
...... 
Bit 11 = 180; 

次に「データ」レジスタのいずれかのビットが1の場合は、結果はそのビット値にcoresponds全ての値の和であるべきです。例えば

data = 12'b100000000101 
result = 225 (180+33+12) 

現在、データの各ビットをチェックしています.1であれば、対応する値を登録して以前の登録値に追加します。このメソッドはサイクル数を必要とします。 どのように私はVerilogで高速に行うことができます。

あなたは

答えて

1

。おそらく時間を意味しますが、時間=サイクル/周波数を覚えておいてください。サイクル数を減らすと、回路が動作できる最大周波数が低下することがよくあります。

例えば、ここでは1サイクルで全体の追加を行う回路です:

[email protected](*) begin 
    tempsum = 0; 
    tempsum = tempsum + (data[0]? 12:0); 
    tempsum = tempsum + (data[1]? 16:0); 
    tempsum = tempsum + (data[2]? 33:0); 
    //... 
end 
[email protected](posedge clock) 
    result <= tempsum; 

あなたは、この回路を合成する場合は、加算器の長鎖を参照してくださいね。 Inは1サイクルで結果を計算できますが、長いクリティカルパスを持つため、fMaxが低くなります。これが「より速い」かどうかは、合成するまで知ることは不可能です(推測する要素が多すぎます)。

より良いマルチサイクル・アプローチは、ツリーを使用することができ

、すなわち:

reg [31:0] sum [29:0]; 
always @ (posedge clock) begin 
    // level 0 
    sum[0] <= (data[0]? 12:0) + (data[1]? 16:0); 
    sum[1] <= (data[2]? 33:0) + (data[3]? 40:0); 
    // ... 
    sum[15] <= (data[30]? 160:0) + (data[31]? 180:0); 
    // level 1 
    sum[16] <= sum [0] + sum [1]; 
    sum[17] <= sum [2] + sum [3]; 
    // ... 
    sum[23] <= sum [14] + sum [15]; 
    // level 2 
    sum[24] <= sum [16] + sum [17]; 
    sum[25] <= sum [18] + sum [19]; 
    // ... 
    // level 3 
    sum[28] <= sum [24] + sum [25]; 
    sum[29] <= sum [26] + sum [27]; 

    result <= sum [28] + sum [29]; 
end 

何」、最終的に「最速」のアプローチはまた、システムの他の要件に依存します、と述べているすべての

+0

私はあなたの最初の1つのサイクルのソリューションを確認し、はい、それは1つのサイクルとその大きなチェーンですべての追加をしています。 – user777304

+0

私はまたあなたの2番目のロジックをチェックして、私はそれに行くつもりです。私はスパルタン3で実装しています。 – user777304

0

あなたは以下のようなものを試すことができ感謝: - それはあなたが "速い" によって何を意味するかに依存し

reg [15:0] sum; 
    always @(*)begin  
     for (i=0;i<12;i++)begin 
     if (data[i]) 
     sum = sum+Bit[i]; 
     end //for 
    end //always 
    assign finalSum = |data ? finalSum: 'h0; 
+0

あなたの 'for'ループはある種の' always'ブロックの中にある必要があります。 – wilcroft

+0

ありがとう@wilcroft。以前、私は彼にそれについての一般的な考えを提供したかっただけです。私はあなたから提案されたように修正しました。 – Sourabh

+0

finalSumへの代入は機能しません。これは 'assign'ステートメントかブロック内にある必要があります。不完全な回答を投稿しないようにしてください。これには、構造の変更なしにコンパイル/合成されないソリューションが含まれます。 – wilcroft

関連する問題