首页 > 其他 > 详细

Verilog中阻塞(=)与非阻塞语句(<=)

时间:2020-02-03 18:52:34      阅读:78      评论:0      收藏:0      [点我收藏+]

阻塞赋值语句(=)与非阻塞赋值语句(<=)
区别叙述如下:
       1、在串行语句中,阻塞赋值语句按照排列顺序依次执行;非阻塞赋值语句没有先后之分,并行执行,排在前面语句不影响后面语句(实质是通过每级之间加一个D触发器实现)。
       2、赋值语句执行时,阻塞的先计算右端表达式的值,然后立刻将值赋给左边变量;非阻塞的也是先计算右端表达式的值,但是要等待延时后再将值赋给左边(同样因为D触发器)。文字叙述起来不直观,我们看例子。
例:下面代码实现一个寄存器
**********************************************************
module resist(din,clk,out1,out2,out3);
  input din,clk;
  output out1,out2,out3;
  reg out1,out2,out3;
  always@(posedge clk)   //上升沿触发
    begin
      out1=din;                   // 使用阻塞赋值语句
      out2=out1;
      out3=out2;
    end
endmodule
**********************************************************
测试代码如下:
**********************************************************
module resist_tb;
  reg din,clk;
  wire out1,out2,out3;
  resist U1(din,clk,out1,out2,out3);
  always #100 clk=~clk;    //时钟周期为200
  initial
  begin
    clk=0;              // clk开始为0
    din=1;
    #350 din=0;    // 传递的数据
    #400 din=1;
    #400 din=0;
    #2000 $finish;
  end
endmodule
**********************************************************
仿真wave图像:
       我们从wave图形上看到out1、out2、out3是完全相同的。
所以实际电路是:
明显电路为一寄存器,不过可以同时输出到out1、out2、out3。
而如若将模型中阻塞赋值语句改为非阻塞赋值语句:
out1=din;                          out1<=din; 
out2=out1;      ---->        out2<=out1;
out3=out2;                      out3<=out2;
测试代码不变,仿真后wave图形为:

       我们发现out3落后out2一个时钟周期,out2落后out1一个时钟周期;这正是因为非阻塞赋值语句要等待时钟的效果。具体是在一个上升沿到来时,数据din,out1‘,out2‘(‘表示上个时钟时的数据),数据平行(并行)向右移动,out2得到的并不是当前out1,而是上个时钟D触发器存储out1‘(=d‘),当前out1=d,这样out2要得到din就比out1落后一个时钟周期,同样out3与out2相比,这其中就是由于各个D触发器的作用。
      实际电路即为:
      这两个实质差别就在于非阻塞会引入D触发器,各个数据必须按时钟节拍从左向右传递,而阻塞赋值语句代码从左往右顺序写不会引入多级D触发器。
————————————————
版权声明:本文为CSDN博主「ChunyuY19」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/c_ycy/article/details/53883794

Verilog中阻塞(=)与非阻塞语句(<=)

原文:https://www.cnblogs.com/hegangben/p/12256579.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!