大数加减法的符号位判断
未考虑溢出
1)减法a-b=c
a为正数,b为负数,c肯定是正数;
a为负数,b为正数,c肯定是负数;
a,b都是正数,例如a=32'h1111 2222,b=32'h3333 1111,c为负数,cin=0;b=32'h1111 2222,a=32'h3333 1111,c为正数,cin=1;
a,b都是负数,与前一种情况类似
cin = 1;
{cin,c[i]} <= a[i] + ~b[i]+ cin; 注意verilog中b[i]会扩展1位,高位会取反变成1,违反初衷,可以:
temp = ~b[i];
{cin,c[i]} <= a[i] + temp+ cin;来解决
所以 c_s = (a_s ^ b_s ) ? a_s : (~cin);
2)加法a+b=c
a,b同号,c同为正数或者负数;
a正,b负,例如a=32'h1111 2222,b=32'h3333 1111,a_s=0,b_s = 1,cin=0,结果为负数;a=32'hffff1111,b=32'h33331111,结果为正数,cin=1;
a负,b正,与前类似;
所以,c_s=(a_s^b_s) ? (~cin) : a_s;
浙公网安备 33010602011771号