verilog有符號數的計算

2021-08-14 15:14:04 字數 1495 閱讀 9185

看了許多關於有符號數計算的文章,這裡做一下總結。

首先看看有符號數是如何儲存的,比如我們定義乙個位寬為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位二進位制表示法所對應正負數。進一步觀察,我們發現兩種型別數的加減法是一樣的,做加...