看了許多關於有符號數計算的文章,這裡做一下總結。
首先看看有符號數是如何儲存的,比如我們定義乙個位寬為8位的 a=-10,通過**軟體可以看到它的表示為1111 0110,最高位是1代表有符號數,大小是它的反碼加1。接下來我們會分別做一下四個實驗:有符號數與無符號數的乘加計算和全是有符號數的乘加計算。
1.有符號數+無符號數
module mult(
input [7:0] a ,
input signed [7:0] b,
output signed [15:0]c
);assign c = a + b;
endmodule
這裡 a = 10;b=-20。我們可以看到此時的二進位製碼
a 0000 1010
b 1110 1100
然而計算後的結果c = 0000 0000 1111 0110 雖然c確實等於a+b,但這顯然是個錯誤的結果。
2.有符號數+有符號數
module mult(
input signed [7:0] a,
input signed [7:0] b,
output signed [15:0]c
);assign c = a + b;
endmodule
這裡 a = -10;b=-20。我們可以看到此時的二進位製碼
a 1111 0110
b 1110 1100
然而計算後的結果c = 1111 1111 1110 0010 這時計算結果就正確了。
3.有符號數*無符號數
module mult(
input [7:0] a ,
input signed [7:0] b,
output signed [15:0]c
);assign c = a * b;
endmodule
這裡 a = 10;b=-20。我們可以看到此時的二進位製碼
a 0000 1010
b 1110 1100
然而計算後的結果c = 0000 1001 0011 1000 雖然c確實等於a*b,但這顯然是個錯誤的結果。
4.有符號數*有符號數
module mult(
input signed [7:0] a,
input signed [7:0] b,
output signed [15:0]c
);assign c = a * b;
endmodule
這裡 a = -10;b=-20。我們可以看到此時的二進位製碼
a 1111 0110
b 1110 1100
然而計算後的結果c = 0000 0000 1100 1000 這時計算結果就正確了。
我們可以發現規律,當有符號數與無符號數進行運算的時候把無符號數也定義為signed
這時無論是加法還是乘法計算結果都正確了。
因此當遇到有符號數計算時,無論是有符號數還是無符號數都當成有符號數來處理。
Verilog有符號數運算
在數位電路中,出於應用的需要,我們可以使用無符號數,即包括0及整數的集合 也可以使用有符號數,即包括0和正負數的集合。在更加複雜的系統中,也許這兩種型別的數,我們都會用到。有符號數通常以2的補碼形式來表示。圖1列出了4位二進位制表示法所對應正負數。進一步觀察,我們發現兩種型別數的加減法是一樣的,做加...
Verilog 有符號數與無符號數運算
無符號數運算,左值位寬不夠,發生截斷的現象 2.兩個無符號數運算,賦值給乙個有符號的數。可以看出,右側先按照無符號數進行運算,取得的運算結果按照左側的符號進行資料顯示。3.兩個無符號數運算,無符號數賦負值 補碼 按照該補碼對應的正值進行處理。結果同上。4.有符號數和無符號數運算,賦值給有符號數。補碼...
verilog 中使用有符號數
在數位電路中,出於應用的需要,我們可以使用無符號數,即包括0及整數的集合 也可以使用有符號數,即包括0和正負數的集合。在更加複雜的系統中,也許這兩種型別的數,我們都會用到。有符號數通常以2的補碼形式來表示。圖1列出了4位二進位制表示法所對應正負數。進一步觀察,我們發現兩種型別數的加減法是一樣的,做加...