sorliran1 发表于 2012-4-27 10:48:24

求助!!关于verilog 里非阻塞赋值的理解偏差的问题!!

非阻塞赋值(如b <= a)书上讲解如下:
1、在语句块中,上面语句所赋的变量值不能立即就为下面的语句所用;
2、块结束后才能完成这次操作,而所赋的变量值是上一次赋值得到的;
3、在编写可综合德尔时序逻辑模块时,这是最常用的赋值方法

而在我实际运用中,可能是理解偏差,总是有些疑问,如下面的例子

exp1
   always @(posedge clk)
      begin
            b <= a;
            c<= b;
       end
always 块中用了非阻塞赋值方式,定义了两个reg型信号b和c,clk信号的上升沿到来时,b就等于a,c就等于b,这里用到了两个触发器。如若在此clk之前,a为1,b为0;经此clk到来后,b被赋值1,c等于b,但这个b是此clk到来前的b,为0,也就是在语句块中,上一条语句所赋的值不能立即被下面的语句所用,实际上就是先计算更新RHS的值,在此语句块结束后才更新LHS的值。。这些都能理解但是后面的一段代码我就有点理解上的问题了

exp2

always @(posedge clk or negedge rst_n)
if (!rst_n)begin
       num < = 4'd0;
       state<= A;
   end
else begin
       num <= num + 1 ;
      case (state)
            A:   begin
                      语句1;
                   end
            B:    begin
                      语句2;
                   end
         C:   begin
                      语句3;
                   end

   endcase

end
首先复位后,num为0,state = A;
当来一个clk时,执行else 后面的begin.....   end语句块
问题是,我觉得来第一个clk时,首先更新RHS的num+1;但在此clk中语句块中num的值仍应该为0,所以因为state=A,所以执行语句1时,num的值应为0,,!!
然而在实践中时发现在A中,num 是为1?!!
很不解,望高手指导!!!!

usingavr 发表于 2012-4-27 11:01:37

理解没错啊。是别的问题吧?

philoman 发表于 2012-4-27 11:01:45

数字电路里面有两种电路: 组合逻辑\时序逻辑,把这两个搞清楚了,基本就差不多了;

NJ8888 发表于 2012-4-27 11:02:44

不用理解,我做VHDL,设计中根本没用阻塞非阻塞概念

xtx 发表于 2012-4-27 14:48:32

理解没问题,把你的代码其他关于num的语句给一下。

zhangalex88 发表于 2012-4-27 16:38:12

在clk上升沿的这一刻,num就变成1了。而不是等什么语句块执行完才更新和变化的。
页: [1]
查看完整版本: 求助!!关于verilog 里非阻塞赋值的理解偏差的问题!!