lanpad 发表于 2012-3-9 11:08:58

邪门了!请问运算中的符号问题?

module plus_sub(
                                                a,
                                                b,
                                                c,
                                                d1,
                                                d2
                                               
    );
       
       input a;
       input b;
       output c;
       output d1;
       output d2;
       

        assign c = ~b+1;
        assign d1 = a + (~b+1);
        assign d2 = a + c;

endmodule


请问在程序中的d1、d2有什么区别?

为什么运算结果不一样?

仿真显示:
当a=4‘b1001,b=4’b0011时,d1=00110,d2=10110

bear0514 发表于 2012-3-9 17:47:49

应该是由于仿真器的原因,因为是硬件语言,事实上三条语句谁先执行是不确定的,所以才会有其他的答案,如果先执行c再执行后面的都对,但是如果先执行D1,再执行C,再执行D2,那么D2就正确了。所以要避免这样写,最好用非阻塞

zombes 发表于 2012-3-11 18:02:13

回复 1# lanpad
我找到原因了,不是楼上说的仿真器的问题,是运算符的问题。

c的定义为4位,d为5位

c=~b+1,我记得在c语言里就这么条规定,对b取反,先把b转成与c相同的位数,因为双方都是4位的,所以不变,c=~(0011)+1=1100+1=1101;
d1 =a + (~b+1) = 01001 + (~(00011)+1) = 01001 + (11100+1)=01001+11101=00110;
d2 = a + c = 01001 + 01101 = 10110

OK,完毕

lanpad 发表于 2012-3-17 16:36:32

回复lanpad
我找到原因了,不是楼上说的仿真器的问题,是运算符的问题。

c的定义为4位,d为5位

c ...
zombes 发表于 2012-3-11 18:02 http://www.fpgaw.com/images/common/back.gif


   
高手!
多谢了!
太需要这样的经典了
页: [1]
查看完整版本: 邪门了!请问运算中的符号问题?