[求助] Verilog过程赋值语句提问

shaorc   2017-9-20 15:12 楼主
悬赏 8 分 芯积分已解决
在书上看到的,讲解阻塞型赋值语句时,举了一个例子

说的是,本想采用触发器的方式,
设计一个延时来使得dreg的输出比areg慢3个时钟节拍,
但是结果是dreg的输出只比areg慢一个时钟节拍输出

程序和逻辑电路图,在下图给出
在分析中(如上图),既然已经说了,是顺序执行,
那么每天语句执行时间为一个时钟周期,
三个语句执行完不就是延时3个周期了吗?
即使后一句的右边是前一句更新后的结果,
到程序执行完时,dreg还是变成了areg
这样不就是延时3个时钟周期了吗?为什么不是这样呢?

另外,
阻塞型赋值语句,规定是,顺序执行语句,每种状态一个接一个执行,
非阻塞型赋值语句,规定是,并行赋值语句,当执行语句时同事计算右边的表达式,
而不会立刻把值赋给左边的变量,过一段时间才会赋值

那在下图中,是把第一个例子中的功能用非阻塞语句实现了
这里说的过一段时间,是指的是CLK信号来到时,才会赋值到左边吗?如果可以把阻塞和非阻塞赋值语句简单化的讲解一下就更好了,谢!



  • 1.jpg
  • IMG_20170920_145413.jpg
  • 回复评论 (2)

    书里边解释已经挺明白了呀,在begin和end之间是clk上升沿到来时要做的事情。

    如果使用阻塞赋值是顺序执行,要先把a给b,再把b给c,再把c给d,三个过程是先后进行的,但肯定在下一个clk上升沿到来前就执行完了,所以只延迟了一拍。

    如果使用非阻塞赋值,clk上升沿到来时,实际上也要把a给b,把b给c,把c给d。但是这三个过程是同时发生的!也就是a的值给b的同时,b是把自己上一个值给c。比如a把1给b,但b此前是0,在相同的时间内b只能把0给c,不可能把1给c,于是一个clk内,1只能从a到b,下一个clk上升沿到来才能b到c,第三个clk上升沿到来才能c到d。

    不知道这样说算不算清楚。
    点赞  2017-9-20 16:13
    对于非阻塞赋值。三条语句。同时计算右值。经过短暂的延时,同时更新左值。电路上。你就认为,时钟沿到来,三个触发器,同时得到各自当前的输入,经过短暂延时,同时更新输出端的状态。 这个过程清楚了。给一个初始状态。经过几次时钟触发。看看每次都有什么变化。列个表。
    点赞  2017-9-22 15:46
    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
      写回复