Verilogで数値を2の補数に変換するにはどうすればよいですか?
質問
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
いくつかの重要なポイント。
- 常にブロック内にifステートメントを配置します。常に2つのブロックを使用しないでください。シミュレーターで競合状態を作成します。
- 新しい変数Y_を作成しました。入力のYを使用すると、割り当ての左側でラッチを推測したり、合成時に厄介なことをしたりする可能性があります。
- ビット反転演算子「〜」を使用して、「not」の場合は代わりにYを反転することをお勧めします プリミティブ。合成ツールは、この方法でコードを最適化する自由度があります。
- 正しい結果を再確認します。加算器を作成してからしばらく経ちました。
他のヒント
小文字の「y」を使用しています。 in" Y = not(y)+ 4'b0001;"
また、必要以上の追加を使用しています。 X-YはNOT(NOT(X)+ Y)と同じものです。
初期ブロック内にifステートメントを配置
http://www.asic-world.com/verilog/vbehave1.html
所属していません StackOverflow