2017-07-19 29 views
0

2つの符号なし数値を掛け合わせたときの乗算結果と2つの符号付き数値を掛け合わせた結果の違いは何ですか?符号付き2進数と符号付き2進数除算

2つの符号付き数値を2つの符号なし数値に分割するときの剰余と商の差は何ですか?

答えて

0

例が点灯している可能性があります。

module top; 

reg [3:0] a; 
reg [3:0] b; 

reg [7:0] r1; 
reg [7:0] r2; 

initial begin 
    a = 4'hc; 
    b = 4'h5; 
    r1 = a * b; // 12 * 5 
    r2 = $signed(a) * $signed(b); //-4 * 5 
    $display("r1 = %b", r1); 
    $display("r2 = %b", r2); 
end 


endmodule 

結果:

r1 = 00111100 (60) 
r2 = 11101100 (-20) 

差が符号付きの数が表現できる数値の範囲をシフト符号の指標としてベクトルのMSBを(ない実際、本を読んでいない、hereを参照)を利用することです

    [0..2^n-1]から注意すべき点がいくつ

    [-2^(n-1)..2^(n-1)-1]
  1. Verilogは奇数であり、の両方が のオペランドに署名されている場合にのみ、符号付きの結果を生成します。
  2. reg/wireにはreg signed [3:0] fooのように、または$signedのシステムタスクにマークを付けることができます。後者は、あなたが署名されたものとして扱いたいサブ式を持っている場合にしばしば役に立ちます。例えば、元のvarが署名されていても、ベクトルのスライスを取ることは常に符号なしです。
  3. 私が提供したリンクは、符号付き量を掛けるときに正しい答えを得るために必要なメカニックスのわずかな変更についてもカバーしています。

2の厳密な出力を扱うのが通常合成可能でない限り、Verilogの動作区分は基本的に同じです。 Verilogで符号なしの算術対署名付き

0

ブライアンの例に基づいて少しだけ異なるビュー

は符号伝播と関係演算の違いを引き起こします。 2の補数データに対する正規の算術演算は、符号拡張が含まれていない場合に符号付きおよび符号なしの場合と同じ結果をもたらします。

この場合、r1とr2がサイズ4の場合(オペランドとして)同じ結果:

r1 = 1100 was (60) 
r2 = 1100 was (-20) 

ブライアンの場合、式の結果のサイズは8です。 Verilogは、8ビット空間を占有するようにオペランドを拡張します。署名の場合、「」それはそれを拡張歌いますと、これは違いを生むだろう。だから、

unsigned a[3:0] <1100> --> tmp[7:0] --> 00001100 
signed a[3:0] <1100> --> tmp[7:0] --> 11111100 

、[3]「1」、それは記号とみなされているとに昇格は符号入った場合左。今、あなたの算術は、次のようになります。

unsigned: tmpa(00001100) * tmpb(00000101) --> 00111100 
signed: tmpa(11111100) * tmpb(00000101) --> 11101100 

あなたは整数として2番目の結果を表示すると、それはまだサインは32ビットに拡張され、(-20)

として表示されます
関連する問題