2012-03-09 14 views
2

ワイヤの範囲を選択するために使用したいワンホットラインがあります。だから、例えば私のセレクタラインは、私はしかし、これは「doesnのそれは私がなど、それは私がsome_wire[8:6]を選択したい0100だ場合、some_wire[5:3]を選択したい0010だ場合は現在、私は巨大なcase文でこれをやっている、some_wire[2:0]を選択したい0001ある場合たとえばモジュールをパラメータ化する場合は、スケールを使用します。これを行うためのより簡潔な方法はありますか?ビットマスクに基づいてワイヤの範囲を選択する

答えて

4

バレルシフタを効率的に合成できるため、セレクタをバイナリエンコーディングに変換してシフトを使用するベースラインと比較する価値があります。 例えば、のようなもの:

また
shift = 0; 
for(i=0;i<N;i=i+1) 
begin 
    if (selector[i]) 
    begin 
    shift = i; 
    end 
end 

shifted_wire = some_wire >> shift; 
output = shifted_wire[2:0]; 

、あなたが経て独立し、各ビットを計算するforループを使用することができます

for(i=0;i<N;i=i+1) 
begin 
    output[i] = | ((some_wire>>i) & selector); 
end 
+0

は、Verilogで有効な文のためのそのタイプですか? – blcArmadillo

+0

Nに使用したいものに依存すると思う合成はNが定数またはパラメータに評価される限り動作するはずですが、Nにregまたはワイヤを使用しようとすると失敗します。 –

+0

Cool私はあなたがそれをすることができるとは気付かなかった。私はまだそれを試していないが、さらにグーグルができることを示唆している。ありがとう! – blcArmadillo

関連する問題