大数加减法的符号位判断

未考虑溢出

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;

posted on 2012-05-23 10:29  好记性不如烂笔头  阅读(1071)  评论(0编辑  收藏  举报

导航