lanpad 发表于 2011-8-9 23:28:52

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

……      
      reg a, b;
      regflag;

      wire 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的数据类型变化了么?

millwood0 发表于 2011-8-9 23:41:50

"关键在if(b-a==8)这一句 "

when in doubt, always use brackets.

......... 发表于 2011-8-9 23:45:01

这是C++吗?看上去不像C啊

mzbhy 发表于 2011-8-9 23:49:51

顶一楼,改掉坏习惯。二楼很幽默。

myqiang1990 发表于 2011-8-10 00:02:34

回复【2楼】.........
-----------------------------------------------------------------------
VerilogHDL FPGA用到。。C变来的。。。

......... 发表于 2011-8-10 00:49:39

回复【4楼】myqiang1990小松鼠
-----------------------------------------------------------------------
呵呵,这是第一次见到VerilogHDL的代码啊.以前据说这是天书级的,不过看上去还好啊.

lanpad 发表于 2011-8-10 08:20:59

回复【2楼】.........
这是c++吗?看上去不像c啊
-----------------------------------------------------------------------

verilog

lanpad 发表于 2011-8-10 08:22:55

回复【1楼】millwood0
"关键在if(b-a==8)这一句 "
when in doubt, always use brackets.
-----------------------------------------------------------------------

用了

if((b-a)==8)

一样的

cozyzhang 发表于 2011-8-10 09:31:10

回复【7楼】lanpad
-----------------------------------------------------------------------

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

lrbdh 发表于 2011-8-10 09:40:39

还是不太明白,谁能解释一下!!

ydest 发表于 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已经溢出了吧?

p.nicholas 发表于 2011-8-10 11:06:07

将flag在另一个always进程中赋值,没有此类问题

billy_hr 发表于 2011-8-10 13:32:07

11L说得很好,一般1个always里面最好只给一个变量赋值。
我奇怪的是,reg a, b;b <= b + 2;
b最大是14然后溢出,要做到b-a == 8,这不太好吧..

lanpad 发表于 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

JamesErik 发表于 2011-8-10 14:57:42

if(b-a==4'b1010)

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

p.nicholas 发表于 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)

306468117 发表于 2011-8-10 22:43:48

这简单的语法有问题,只能跟你的综合器与仿真器有关了。请问你的开发环境是什么

tmkeepgood1 发表于 2011-8-11 12:01:12

路过看看 学习了~
页: [1]
查看完整版本: 请教高手if(c)和if(b-a)为什么会不同?(其中c=b-a)