炼狱传奇-赋值语句之战

发布时间:2015-3-22 10:23    发布者:zxopen09
关键词: fpga , led
Verilog HDL语言中存在两种赋值语言:
● 非阻塞型赋值语句
● 阻塞型赋值语句

1.       非阻塞型语句
以赋值操作符“<=”来标识的赋值操作称为“非阻塞型过程赋值(NonblockingAssignment)”。非阻塞型过程赋值语句的特点是:
(1) 在begin-end串行语句块中,一条非阻塞过程语句的执行不会阻塞下一条语句的执行,也就是说在本条非阻塞型过程赋值语句对应的赋值操作执行完之前,下一条语句也可以开始执行。

(2) 仿真过程在遇到非阻塞型过程赋值语句后首先计算其右端赋值表达式的值,然后等到仿真时间步结束时再将该计算结果赋值变量。也就是说,这种情况下的赋值操作是在同一仿真时刻上的其他普通操作结束后才得到执行的。

如以下语句的程序1:
     Initial
          begin
             A<=B;//语句S1
             B<=A; //语句S2
          end

      上述语句中包含了两条非阻塞型过程赋值语句S1和S2,当仿真进程遇到Initial过程块后(0时刻),语句S1首先开始执行,赋值表达式“B”的值得到计算(但是对被赋值变量A的赋值操作要等到当前时间步结束才执行),同时由于S1是一条非阻塞型赋值语句,所以S1的执行不会阻塞S2的执行;由于S2也随即开始执行,其对应的赋值表达式“A”的值得到计算,由于这时S1对A的赋值操作还没有执行,所以此时计算得到的赋值表达式取值是A的初值。由于S2也是一条非阻塞型赋值语句,它对应的为变量B进行赋值操作也要等到当前时间步结束时才会得到执行;所以在当前时间步结束时,S1、S2两条语句对应的赋值操作同时执行,分别将计算得到的A和B初值赋给变量B和A,这样就交换了A与B的取值。

例程1:


仿真图:


从仿真图我们可以看出,使用非阻塞型过程赋值语句,把a的初值给b,b的初值给a。所以,从图可以看出它的结果和前面分析的一样。

1. 阻塞型语句
  以赋值操作符“=”来标识的赋值操作称为“阻塞型过程赋值(blocking Assignment)”。非阻塞型过程赋值语句的特点是:
(1)串行块(begin-end)中的各条阻塞型过程赋值语句将以它们在顺序块后排列次序依次得到执行。
(2)阻塞型过程赋值语句的执行过程是:首先计算右端赋值表达式的值,然后立即将计算结果赋值给“=”左端的被赋值变量。

阻塞型过程赋值语句的这两个特点表明:仿真进程在遇到阻塞型过程赋值语句时将计算表达式的值并立即将其结果赋给等式左边的被赋值变量;在串行语句块中,下一条语句的执行会被本条阻塞型过程赋值语句所阻塞,只有在当前这条阻塞型过程赋值语句所对应的赋值操作执行完后下一条语句才能开始执行。

例如语句程序2:
    initial
    begin
     a=0;//语句S1
     a=1;//语句s2
    end

   在这段语句中包含两条阻塞型过程赋值语句S1和S2,它们都是在仿真零时刻得到执行的,其对应的赋值操作也都是在0时刻进行的。但由于它们是阻塞型赋值语句,所以在执行S1语句是S2被阻塞而不能得到执行;只有在S1执行完,a被赋值0之后,S2才能开始执行。而S2的执行将使a被重新赋值1,所以上面这个过程块执行后变量a的值终取值为1.


例程2:

仿真图:


可以看出,只是把赋值方式换成了阻塞型,结果就和非阻塞型的不同。

本文地址:https://www.eechina.com/thread-147199-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

相关在线工具

相关视频

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表