搜索
bottom↓
回复: 18

请教高手if(c)和if(b-a)为什么会不同?(其中c=b-a)

[复制链接]

出0入0汤圆

发表于 2011-8-9 23:28:52 | 显示全部楼层 |阅读模式
……      
        reg [3:0] a, b;
        reg  flag;

        wire [3:0] c;

        assign c = b - a;

        always@(posedge rst or posedge clk)
                if(rst)
                        begin
                                a <= 0;
                                b <= 0;
                                flag <= 0;
                        end
                else
                        begin
                                if(b-a==8)/////////////////////////////////////////////////////////////////////////////
                                        flag <= 1;
                                else
                                        begin
                                                a <= a + 1;
                                                b <= b + 2;
                                        end
                        end

endmodule
关键在if(b-a==8)这一句
上面写法的仿真结果显示flag无法按照设计发生跳变。
如果写成if(b-a==4'b1000),则flag可以正常按设计跳变
或者另外指定一个变量 assign c=b-a ,再写成if(c==8),也可以

请问为什么会出现上述结果?b-a的数据类型变化了么?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-8-9 23:41:50 | 显示全部楼层
"关键在if(b-a==8)这一句 "

when in doubt, always use brackets.

出0入0汤圆

发表于 2011-8-9 23:45:01 | 显示全部楼层
这是C++吗?看上去不像C啊

出0入0汤圆

发表于 2011-8-9 23:49:51 | 显示全部楼层
顶一楼,改掉坏习惯。二楼很幽默。

出0入0汤圆

发表于 2011-8-10 00:02:34 | 显示全部楼层
回复【2楼】.........  
-----------------------------------------------------------------------
VerilogHDL FPGA用到。。C变来的。。。

出0入0汤圆

发表于 2011-8-10 00:49:39 | 显示全部楼层
回复【4楼】myqiang1990  小松鼠
-----------------------------------------------------------------------
呵呵,这是第一次见到VerilogHDL的代码啊.以前据说这是天书级的,不过看上去还好啊.

出0入0汤圆

 楼主| 发表于 2011-8-10 08:20:59 | 显示全部楼层
回复【2楼】.........  
这是c++吗?看上去不像c啊
-----------------------------------------------------------------------

verilog

出0入0汤圆

 楼主| 发表于 2011-8-10 08:22:55 | 显示全部楼层
回复【1楼】millwood0  
"关键在if(b-a==8)这一句 "
when in doubt, always use brackets.
-----------------------------------------------------------------------

用了

if((b-a)==8)

一样的

出0入0汤圆

发表于 2011-8-10 09:31:10 | 显示全部楼层
回复【7楼】lanpad  
-----------------------------------------------------------------------

我也很好奇到底是为什么。。。。。囧

出0入0汤圆

发表于 2011-8-10 09:40:39 | 显示全部楼层
还是不太明白,谁能解释一下!!

出0入0汤圆

发表于 2011-8-10 09:43:41 | 显示全部楼层
谈一个问题,a <= a + 1; b <= b + 2;两句,执行到(b-a==8)的时候是b=16,a=8;而lz的程序中a和b都是4位的reg,b=16已经溢出了吧?

出0入0汤圆

发表于 2011-8-10 11:06:07 | 显示全部楼层
将flag在另一个always进程中赋值,没有此类问题

出0入0汤圆

发表于 2011-8-10 13:32:07 | 显示全部楼层
11L说得很好,一般1个always里面最好只给一个变量赋值。
我奇怪的是,reg [3:0] a, b;b <= b + 2;
b最大是14然后溢出,要做到b-a == 8,这不太好吧..

出0入0汤圆

 楼主| 发表于 2011-8-10 14:27:49 | 显示全部楼层
回复【11楼】p.nicholas  
将flag在另一个always进程中赋值,没有此类问题
-----------------------------------------------------------------------
没用的
试了一下,还是不行


        always@(posedge rst or posedge clk)
                if(rst)
                        begin
                                a <= 0;
                                b <= 0;
                        end
                else
                        begin
                                a <= a + 1;
                                b <= b + 2;
                        end

          always@(posedge rst or posedge clk)
                if(rst)
                        begin
                                flag <= 0;
                        end
                else
                        begin
                                if(b-a==4'b1010)
                                        flag <= 1;
                                else
                                        flag <= 0;
                        end

出500入0汤圆

发表于 2011-8-10 14:57:42 | 显示全部楼层
if(b-a==4'b1010)

括号呢?有没有问题
if((b-a)==4'b1010)

出0入0汤圆

发表于 2011-8-10 21:58:58 | 显示全部楼层
回复【13楼】lanpad  
回复【11楼】p.nicholas  
将flag在另一个always进程中赋值,没有此类问题
-----------------------------------------------------------------------
没用的
试了一下,还是不行
        always@(posedge rst or posedge clk)
                if(rst)
                        begin
                                a <= 0;
                                b <= 0;
                        end
                else
                        begin
                                a <= a + 1;
                                b <= b + 2;
                        end
          always@(posedge rst or posedge clk)
                if(rst)
                        begin
                                flag <= 0;
                        end
                else
                        begin
                                if(b-a==4......
-----------------------------------------------------------------------

我仿过,没任何问题
点击此处下载 ourdev_666341FRG1M9.rar(文件大小:319字节) (原文件名:AAA.rar)

出0入0汤圆

发表于 2011-8-10 22:43:48 | 显示全部楼层
这简单的语法有问题,只能跟你的综合器与仿真器有关了。请问你的开发环境是什么

出0入0汤圆

发表于 2011-8-11 12:01:12 | 显示全部楼层
路过看看 学习了~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 13:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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