2016-07-06 18 views
0

2進数を含む配列Aがあるとします。 [0 0 1 0 1 1]。ここで、配列Aの最初の '1'の位置を特定できるエンコーダを作成します。たとえば、その配列の最初の要素にインデックス1を渡すと、ロジックは配列Aに対して3を出力します。それを行うためのエレガントな方法はありますか?私はそれを行う1つの方法は、ROMを使用していると思いますが、どのようにVerilogでそれを書くのですか?ルックアップテーブルを使用していますか?Verilogの最初の非ゼロ要素エンコーダ

答えて

1

あなたはどんなエンコーディングのために組み合わせ論理の構築を自動化するgenerateを使用することができることが望まれます。次の例では、最も高いセットビットのインデックスを返します。セットビットがない場合は-1を返します。

generateステートメントは、ループのアンロールに使用されます。ループの各段階は、ループインデックスおよび入力ベクトルビットのいくつかの任意の関数を生成することができる。第1段階の出力は次の入力への入力であるため、これは次第に複雑な組み合わせ論理を形成する。合成ツールは、最も効率的な方法で、多くの段階の組み合わせロジックを最小化、パック化、および結合するために使用されます。

たとえば、ザイリンクスVivadoでは、次の例では、16個のカスケード接続された2:1マルチプレクサではなく、16ビット入力の2つの入力LUTステージが2つに削減されています。

module highbit #(
    parameter OUT_WIDTH = 4, // out uses one extra bit for not-found 
    parameter IN_WIDTH = 1<<(OUT_WIDTH-1) 
) (
    input [IN_WIDTH-1:0]in, 
    output [OUT_WIDTH-1:0]out 
); 

wire [OUT_WIDTH-1:0]out_stage[0:IN_WIDTH]; 
assign out_stage[0] = ~0; // desired default output if no bits set 
generate genvar i; 
    for(i=0; i<IN_WIDTH; i=i+1) 
     assign out_stage[i+1] = in[i] ? i : out_stage[i]; 
endgenerate 
assign out = out_stage[IN_WIDTH]; 

endmodule 
1

casexで問題を解決できます。

function [2:0] prienc6; 
input [5:0] select; 
reg [2:0] out; 
begin 
    casex(select) 
    6'b000001: out = 3'b101; 
    6'b00001x: out = 3'b100; 
    6'b0001xx: out = 3'b011; 
    6'b001xxx: out = 3'b010; 
    6'b01xxxx: out = 3'b001; 
    6'b1xxxxx: out = 3'b000; 
    endcase 
    prienc6 = out ; 
end 
endfunction 
関連する問題