集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1611|回复: 3

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

[复制链接]
lanpad 发表于 2012-3-9 11:08:58 | 显示全部楼层 |阅读模式
module plus_sub(
                                                a,
                                                b,
                                                c,
                                                d1,
                                                d2
                                               
    );
         
         input  [3:0] a;
         input  [3:0] b;
         output  [3:0] c;
         output  [4:0] d1;
         output  [4:0] 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



   
高手!
多谢了!
太需要这样的经典了
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-25 12:45 , Processed in 0.070858 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表