Verilogで数値を2の補数に変換するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/238894

  •  04-07-2019
  •  | 
  •  

質問

Verilogで4ビット加算減算器を設計しようとしています。これは私がverilogで書いた2番目のことであり、正しい構文のすべてがまだわかりません。これは私がこれまでに持っているモジュールです:

module Question3(carryin, X, Y, Z, S, carryout, overflow);
    parameter n = 4;
    input carryin, Z;
    input [n-1:0]X, Y;
    output reg [n-1:0]S;
    output reg carryout, overflow;

    if(Z==0)
    begin
        Y = not(y) + 4'b0001;
    end

    always @(X, Y, carryin)
        begin
            {carryout, S} = X + Y + carryin;
            overflow = carryout ^ X[n-1]^Y[n-1]^S[n-1];
        end

endmodule

私のコンパイラ(xilinx 10.1)では、「if if near。引数としてYを取り、すべての可能な4ビットの組み合わせをチェックし、それらを2の補数に変換するCaseを使用するなど、変換を行うさまざまな方法を試しました。

Zは、加算器が減算または加算を行うかどうかを決定するものです。 0の場合、減算を意味し、yを2の補数に変換してから、通常の加算を行います。加算器の残りの部分は正しいと確信しています。変換しようとしている部分の何が問題なのかわかりません。

役に立ちましたか?

解決

reg [n-1:0] Y_compl;

always @( Z, Y, X, carryin ) begin
  Y_ = ( ~Y + 4'b0001 );
  if ( Z == 1'b0 ) begin
    {carryout, S} = X + Y_compl + carryin;
    overflow = carryout ^ X[n-1] ^ Y_compl[n-1] ^ S[n-1];
  end
  else begin
    {carryout, S} = X + Y + carryin;
    overflow = carryout ^ X[n-1] ^ Y[n-1] ^ S[n-1];
  end

end

いくつかの重要なポイント。

  1. 常にブロック内にifステートメントを配置します。常に2つのブロックを使用しないでください。シミュレーターで競合状態を作成します。
  2. 新しい変数Y_を作成しました。入力のYを使用すると、割り当ての左側でラッチを推測したり、合成時に厄介なことをしたりする可能性があります。
  3. ビット反転演算子「〜」を使用して、「not」の場合は代わりにYを反転することをお勧めします プリミティブ。合成ツールは、この方法でコードを最適化する自由度があります。
  4. 正しい結果を再確認します。加算器を作成してからしばらく経ちました。

他のヒント

小文字の「y」を使用しています。 in" Y = not(y)+ 4'b0001;"

また、必要以上の追加を使用しています。 X-YはNOT(NOT(X)+ Y)と同じものです。

初期ブロック内にifステートメントを配置
http://www.asic-world.com/verilog/vbehave1.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top