|
发表于 2012-8-20 19:52:47
|
显示全部楼层
我不知道大家怎么计算的。我这边查了dc的user guide:“hdl compiler for verilog" 2011版。里面的介绍是有符号和无符号数字的相加是把有符号数转换成无符号数字做处理的,并且如果有符号数位宽比无符号数位宽低的话,高位添0!!!
我用vcs+v2k做了以下实验:
reg signed [3:0] a;
reg [7:0] b;
reg signed [7:0] c0;
reg signed [8:0] c1;
reg [7:0] d0;
reg [8:0] d1;
assign c0 = a + b;
assign c1 = a + b;
assign d0 = a + b;
assign d1 = a + b;
initial
begin
a = 4'sb1111;
b = 8'b1111_1111;
end
结果为: a=-1, b=255, c0=14, c1=-242, d0=14, d1=270.
也就是说: a被当成无符数处理了,并且是{4'd0, 4'b1111}。
然后我把上面代码"reg [7:0] b"改为"reg signed [7:0] b"(b的赋值改不改结果一样)。
结果为:a=-1, b=-1, c0=-2, c1=-2, d0=254, d1=510.
也就是说:a被当成有符号数处理了,并且是{4'b1111, 4'b1111},高位添1!
所以我觉得楼主的加法器直接用个正常的加法器就可以了。。。除非他表示虽然A是一个无符号数,但是希望当做有符号数做处理。也就是说,实现一个有符号位的加法器。 |
|