您的位置:首页 > 其它

verilog有符号数的计算

2018-01-14 15:25 148 查看
看了许多关于有符号数计算的文章,这里做一下总结。
首先看看有符号数是如何存储的,比如我们定义一个位宽为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这时无论是加法还是乘法计算结果都正确了。因此当遇到有符号数计算时,无论是有符号数还是无符号数都当成有符号数来处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: