Verilog 的减法之前一直认为用补码会方便一些,如果直接相减的结果是啥样呢?
写了一个简单的减法
module subtract(a,b,d);
input [3:0]a,b;//a为被减数,b为减数
output [3:0]d;//输出d
assign
d=a-b;
endmodule
直接减法的仿真结果如下
可见当a大于等于b时可以直接得到正确的值,如果a比b小会直接得到负值并以补码形式写出来。
但是由于a和b都是无符号数,如果得出来的是补码形式会很难理解,而且由于d只有4位
0001-1101会等于0100 其实应该是10100 是-12的补码 所以直接减会有错误
如果此时把a b都看成有符号数,
那么计算结果就是对的,所以有符号数是可以直接加减的
如果此时扩展b的位数,代码变为:
module subtract(a,b,d);
input [3:0]a,b;//a为被减数,b为减数
output [4:0]d;//输出d
assign
d=a-b;
endmodule
此时若a,b为无符号数
得出的d是正确结果的补码
但是若a,b为有符号数,则计算结果就是错误的
所以直接减法需要考虑补位的问题。