在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5939|回复: 17

[求助] 关于非阻塞赋值和begin end块的问题

[复制链接]
发表于 2014-9-20 22:13:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
一直被这个问题困惑,还请各位指导,多谢。
begin end是个顺序块,语句是一条一条执行的,而非阻塞赋值是先计算RHS的值,再将RHS的值赋给LHS,那么在begin end当中的非阻塞赋值的执行顺序是怎样的呢?也就是说它计算RHS是同时的吗?赋值给LHS是同时的吗?还是都按顺序执行呢?


比如说下面这个例子:
always @(posedge clk)
begin
  if(!rst)
   cnt<=0;
  else
   begin
     cnt<=cnt+1;
     if(cnt==2)
       cnt<=0;
     else;
   end
end
当cnt==2的时候,cnt+1也执行啊,为什么最后的结果会使cnt==0?

不知道问题有没有表达清楚,烦请各位指教,感激不尽!
发表于 2014-9-21 09:21:08 | 显示全部楼层
呵呵,我也一直有这样的困惑
发表于 2014-9-21 10:38:48 | 显示全部楼层
cnt <= cnt + 1;
if(cnt==2)
    cnt <= 0;
else;

这段代码等于
if(cnt==2)
   cnt <= 0;
else
   cnt <= cnt + 1;


类似的编码风格也适用于case语句:
rst = 0;
case(sel)
1: rst = 1;
2: rst = 2;
endcase

等于

case(sel)
1: rst = 1;
2: rst = 2;
default: rst = 0;
endcase
 楼主| 发表于 2014-9-21 11:41:05 | 显示全部楼层
回复 3# jxk304

感谢回答,不过你说的这个我知道。我的困惑在于begin end是个顺序块,而非阻塞赋值是非顺序的,这个计算RHS和赋值LHS的过程是顺序的还是并行的?
发表于 2014-9-21 14:03:07 | 显示全部楼层
要从软件思维转变到硬件思维。用时钟上升沿同步的电路,if(cnt==2)判断的是上个周期的cnt值,而不是加1后的cnt值。
发表于 2014-9-21 15:01:32 | 显示全部楼层
cnt+1执行了,但是cnt<=cnt+1没有执行赋值!
 楼主| 发表于 2014-9-21 21:31:40 | 显示全部楼层
回复 6# cutfor

为什么呢?
发表于 2014-9-22 13:22:59 | 显示全部楼层
0 ---------|

cnt + 1 --|
发表于 2014-9-22 13:33:07 | 显示全部楼层
语句是并行的,但注意两点,语句执行后,其结果要在下一个触发时钟才有效,第二,你这个写法会导致重复赋值,这时候最后一个赋值才是最终输出。正确的写法:
if(cnt == 2)
    cnt <= 0;
else
    cnt <= cnt+1;
发表于 2014-9-22 13:34:44 | 显示全部楼层
_       __
  0 ---------->| \     |  |
                    | |----|  |----> cnt
|->  cnt+1-->| /     |>|       |
|                            |_|       |
|--------<------------------<-|

如上图所示,(cnt + 1)是一个纯组合电路,它永远都在执行;中间是一个MUX选择器,他从0 和 (cnt+1) 中二选一,选择信号是(cnt==2). 最后一级是寄存器,他锁存选择器的结果。

楼主要从硬件电路的角度去理解verilog, 其实阻塞,非阻塞等只是一些名词,帮助你理解代码的。只要你理解了实际电路的实现,这些词不必太在意.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-6 23:51 , Processed in 0.030775 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表