原创 于细微中见区别(1)---阻塞&非阻塞赋值(Verliog HDL)

2012-7-17 00:26 1923 22 24 分类: FPGA/CPLD

阻塞赋值——“=” <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

阻塞赋值——“〈=”

为了说明方便引入 RHS——表赋值符号右边的变量或者表达式

                 LHS——表赋值符号左边的变量或者表达式

1、入门以后始终搞不清楚的名词“”“非阻塞”?

  正解:对于阻塞赋值(“=”)来说,一旦出现该语句,在赋值时先计算RHS的值,且不允许(阻塞)其他赋值语句执行(我们知道Verilog语句执行的最大特点是“并行性”,如果这点不知道,请不要在往下看了,很费眼的!O(∩_∩)O~)。现行的赋值RHS完成,立即赋值给LHS(同一时刻,立即更新),然后才允许别的赋值语句执行。

    用书本上的有点“矛盾的话”一句话讲:“存在概念上的先后,而无实质上的延迟”。。。

      而对于非阻塞赋值(“<=”)来说,则是出现以后,赋值是也计算RHS的值,但其允许其他Verilog语句(也包括其他赋值非阻塞语句)进行操作,所有同时钟下的并行语句都操作结束以后,才更新LHS。

     我的理解是,“=”,RHS完成后马上赋值给LHS,优先权是最大的,别的都要退让。

               “<=”RHS完成后要等会才能赋值LHS,优先级是最小的,同级别的其他语句,可以都进行操作,不会阻塞!

2、两种赋值各有各的妙处,使用中要具体情况具体分析。不加区分的乱用,出现的麻烦会意想不到,请看:

 

20120717001534537002.png

 

20120717001524694001.png

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    上面是一个采用阻塞语句实现的反馈振荡器,其主要的逻辑含义,很简单咯,两个always块理论上并行执行的,若rst(复位信号)由高变低(以后不再发生变化),那么初始值y10y21。在同一有效时钟作用,进行相互赋值。(我一开始认为不就是简单的y101,同时y210,随着时钟上升沿,再同步反向变化一次。。。。。。。。。)

情况1:编写ModelSim进行RTL仿真,其结果如下:

20120717001539834003.png

   在复位初始化后,y1=y2=0;(好像块2失效了!)

 

情况2:若将2块放在1块前,在编译一次,进行RTL仿真:

20120717001543818004.png

   在复位初始化后,y1=y2=1;(好像块2失效了!)

为什么会造成这两种仿真情况呢?

正解:理论上的块1和块2都应该是同时刻执行,但是实际上,有效时钟沿到达两个块是有一定的时钟偏差的(毕竟使用的不是同一个逻辑单元构成的),皮秒级的延时使得触发时间就有先有后,比如:情况1,可能是先触发了块1,执行了块1中的y2=y1(y1初始化值为0),赋值期间不能进行y1=y2,那么y2为1,等块1完成阻塞赋值后在进行的y1=y2就使得y1一直为1了。情况2,便是先触发了块2造成的结果。

这种调换顺序,会不稳定的情况,实际上在综合以后会造成传说中的“冒险和竞争”。那么采用非阻塞赋值去实现,情况是怎么样的呢?

20120717001549943005.png

 无论块1和块2的位置如何,其RTL结果都是这样:

20120717001554782006.png

从仿真中可以,无论哪一个块先到,y1y2的更新赋值都是由上一个周期的时钟的有效沿确定的。

进一步可以得出  原则1:时序电路建模,尽可能采样用非阻塞赋值,减少仿真时可能出现的冒险和竞争。

    待续。。。。。。。。。。

文章评论2条评论)

登录后参与讨论

zaocaokun_970486327 2015-1-15 16:49

谢谢啊!我会坚持

用户403664 2015-1-14 17:16

年轻人加油

用户603678 2012-10-28 10:19

若rst(复位信号)由高变低(以后不再发生变化) 这句话应该是由低变高吧~

用户603678 2012-10-28 10:16

写得挺好~
相关推荐阅读
用户421530 2013-12-01 13:16
基于Altera FPGA的千兆以太网实现方案
  1 引言   在系统设备不断向小型化、集成化、网络化发展的今天,嵌入式开发成为新技术发展的最前沿,改变着系统的整体结构。FPGA由于其自身特点,成为嵌入式开发的最佳平台。Altera公司结合其最新...
用户421530 2013-07-26 22:58
不在执迷于过去,只为不断突破,寻找奋斗的归宿&价值
    好久好久,没有来到自己的博客,一切是陌生的亲切,这里面呼喊自己的回归,是奋斗与自信 ,是价值与积淀的回归,今天不是起点,只是一个开始,从大学的校园走出来,面对工作,我的选择也许不是自己的想...
用户421530 2012-08-27 22:56
常用电平标准汇编版(1)
现在常用的电平标准有TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232、RS485等,还有一些速度比较高的LVDS、GTL、PGTL、CML、HSTL、SSTL等。...
用户421530 2012-06-20 00:41
SOPC之软件编程学习--系统时钟API函数应用
利用sys/alt_alarm.h系统时钟服务头文件中的alt_alarm_start ()API 函数以及时钟回调函数进行精确定时。我的设计在现有源程序的基础上,添加三个时钟服务程序,分别利用不...
用户421530 2012-06-19 15:18
SOPC之软件编程学习---头文件(1)
在Altera FPGA里面的SOPC学习过程中,软件编程中遇到的第一个编程,往往是LED灯的控制,这几天断断续续的学习了些,总算了入了NIOS II 学习的门槛,开始我对FPG**上系统的探索。在软...
我要评论
2
22
关闭 站长推荐上一条 /2 下一条