最近在书上看到这样一道题,由于知识缺乏导致很难对这道题完全理解和运算,因此在这里分享出来供大家参考。
题目如下:
wire signed [4:0] a;
wire unsigned [4:0] b;
wire signed [5:0] c;
assign a= -5;
assign b = 5;
assgin c =a-b;
c的输出值为多少
在计算的过程中一共遇到以下几个问题:
1.如何表示有符号数的负数
起初由于对符号位的错误不全,认为-5用二进制表示是10101,最高位bit5是符号位,为1代表为负数,剩下的4bit0101表示5,因此5’b10101为-5。
这是一个很大的误区,实际上有符号负数的表示不仅仅在符号位体现了其是负数,符号位之外的其余bit通过补码外加上符号位的1共同表示了有符号负数的二进制数。4’b0101的补码为4’b1011,因此本题中-5应该表示为5’b11011。
2.何时扩充高位,高位如何填充
首先第一个问题是何时扩充高位,因为最后的计算结果c是6bit,而两个操作数均为5bit,那么是先计算出结果,再填充符号位(因为结果c被定义为有符号数)还是先扩充再进行计算呢?
按照自己的想法先进行扩充,再进行计算试一试。
第二个问题是对于有符号数,认为将其变为6bit时扩充位填充其符号位1,因此变为6’b111011,对无符号数,为了方便计算将-b看为一个整体,将其当作-5那么为5’b11011,然后扩充为6’b111011。
然后通过加法如下:
111011
111011
= 1110110
最终得到这样一个结果,由于只有6bit于是最终结果为6’b110110。
由于对这里不明表,先通过modelsim进行仿真得到了输出结果c为6’b010110。
最终发现结果不一致,难道是先计算再扩充吗,按照这样的思路通过下面的加法:
11011
11011
=110110
发现结果还是不对,后来我将过程插接,先在代码里定义一个6bit的有符号数a_1,6bit的无符号数b_1,然后将a,b分别赋值给他们再进行进行仿真,结果还是不对。
之后通过百度,终于找到了一种说法:
当无符号数和有符号数进行运算时,将有符号数当作无符号数进行处理。
3.正确计算方法
首先a=5’b11011,b=00101。
首先对其进行扩充(这是必须的,先进行扩充再进行运算)a变为6’b011011,b变为6’b000101。之后因为是减法,所以取补码得到-b=6’b111011。然后进行下面的运算:
011011
111011
= 1010110
由于只有6bit,所以最终结果为6’b010110,与仿真结果一致。
那这里最高位bit6的1被去掉合理吗,答案是合理的。
在计算两个正数的减法时,我们通常减数与减号看成一体,将其表示成补码形式进行相加,其实这里最终就变为被减数+(2n-减数)-2n。被去除的最高位就是这里的-2n,而取补码则是(2n-减数)。