4

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

私のコンパイラ (ザイリンクス 10.1) は、「if の近くで構文エラー」と言い続けます。Y を引数として取り、考えられるすべての 4 ビットの組み合わせをチェックして、それらを 2 の補数に変換する Case を使用するなど、さまざまな変換方法を試しました。

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

4

3 に答える 3

5
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 ステートメントを always ブロック内に配置します。2 つの always ブロックを使用しないでください。シミュレーターで競合状態が発生します。
  2. 新しい変数 Y_ を作成したのは、割り当ての左側で入力である Y を使用すると、おそらく合成時にラッチを推測したり、他の厄介なことを行ったりするためです。
  3. 「not」プリミティブの場合は、代わりにビットごとの反転演算子「~」を使用して Y を反転することをお勧めします。合成ツールでは、この方法でコードを最適化する自由度が高くなります。
  4. 正しい結果を再確認してください。加算器を作成してからしばらく経ちました。
于 2009-06-17T06:41:45.057 に答える
1

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

また、必要以上に多くの追加機能を使用しています。XYはNOT(NOT(X)+ Y)と同じです。

于 2008-10-27T01:56:21.230 に答える
0

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

于 2008-10-27T02:26:21.043 に答える