关于Verilog HDL中阻塞与非阻塞赋值形象理解

原创 2016年08月30日 22:38:41

关于Verilog 中阻塞与非阻塞赋值的几点理解

相信很多刚开始学习Verilog的童鞋对阻塞、非阻塞赋值理解得不是很明白,或者说是一头雾水。确实,Verilog中阻塞、非阻塞一直就是一个难点,很多具备很久开发经验的工程师仍是不得要领,在分析代码,看仿真时还是迷迷糊糊。我自己在学习语法的时候感觉理解了,但是在自己写代码,看仿真时仍然会出现不理解的波形,所以,就从头开始再看了遍语法。

阻塞赋值

阻塞赋值,顾名思义,即在一个always块中,后面的语句会受到前语句的影响,具体来说,在同一个always中,一条阻塞赋值语句如果没有执行结束,那么该语句后面的语句就不能被执行,即被“阻塞”。也就是说always块内的语句是一种顺序关系,这里和C语言很类似,比如,在C语言中,b= a;c=b;执行的时候就是先执行第一句b= a,然后执行下一句c=b,最后结果是a=c。同样,在时钟沿触发下,always块内,阻塞赋值是同样顺序执行,如下代码:

always@(posedge clk)
    begin 
        b = a;
        c = b;
    end

在时钟上升沿来的时候,a赋给b,执行完成后,b在赋给c,整个代码执行完时,a=c,效果与C语言同。
其过程下图所示
图1
a的值先给b,然后才能给到c,这都是在一个时钟沿上完成的。

非阻塞赋值

在说非阻塞赋值之前,我们要先知道触发器的工作原理。即在时钟到来时,触发器会将输入端的数据打到输出端,这是受时钟节拍控制的。其实,非阻塞赋值更能体现出硬件电路工作时的实际情况。那么非阻塞赋值具体是怎么回事呢?
继续用上面的例子:

always@(posedge clk)
    begin
        b <= a;
        c <= b;
    end 

在时钟上升沿到来时,该always块就不同于阻塞赋值的最终输出结果a=c,而是a传递到c需要间隔两个时钟,怎么理解呢?
直接看图吧
这里写图片描述
非阻塞赋值是由时钟节拍决定,在时钟上升到来时,执行赋值语句右边,然后将begin-end之间的所有赋值语句同时赋值到赋值语句的左边,注意:是begin—end之间的所有语句,一起执行,且一个时钟只执行一次。对于上面例子,在第一个时钟上升沿到来时,a把值赋给b,b把值赋给c,而此时b的值还没有被更新(即a的值还没有被触发器打给b),只是将b0(b前一次的值)打给c,所以第一个时钟结束后,b的当前值是a,c的当前值是b0(图中的c0)。第二个时钟上升沿到来时,才当前的b赋给c,由触发器输出,所以此时c的值才更新为a,故a和c相差2个时钟。
若a为 1,b为0,c为1的话,那么在非阻塞语句的always块中,一个时钟沿到来,由于他们之间是同时执行的,所以把a的1赋给了b,把b的0赋给了c,但是在阻塞语句里面,a的1先给了b,然后b把新赋值的1又给了c,那么c在一个时钟之后即变成了1。
通过上面的描述,阻塞、非阻塞赋值应该有了比较清晰的了解,但是什么时候用阻塞,什么时候用非阻塞赋值呢?在同一个always块中是否可以混合赋值呢?
对于第一个问题,夏宇闻老师书中直接给出了建议:

1、时序逻辑,使用“非阻塞赋值”。

2、 锁存器(latch)建模,使用“非阻塞赋值”。

3、组合逻辑,使用“阻塞赋值”

4、 当在同一个always块里面既为组合逻辑又为时序逻辑时,使用“非阻塞赋值”。

5、组合逻辑输出时,为消除毛刺会在输出端加一个触发器,即使用非阻塞赋值

对于第二个问题,不建议在同一个always块中使用混合赋值,在quartusII 中直接会报错,综合无法通过。同时同一个变量也不能在多个always块中被赋值,会报错。

制作爆炸效果

制作爆炸效果制作爆炸效果  爆炸效果是各种游戏中不可或缺的。产生这种效果的方法多种多样,本文介绍一种较为简单的算法,以期抛砖引玉:)这里仅给出必要代码,请理解后自己编程。如果你有更好的算法,也请...
  • ghj1976
  • ghj1976
  • 2000-08-25 09:24:00
  • 1413

深入分析 verilog 阻塞和非阻塞赋值

1、学verilog 一个月了,在开发板上面写了很多代码,但是始终对一些问题理解的不够透彻,这里我们来写几个例子仿真出阻塞和非阻塞的区别,我们先上代码   module LED   (  ...
  • ywhfdl
  • ywhfdl
  • 2012-04-24 22:13:04
  • 11269

Verilog中阻塞(=)与非阻塞语句(&lt;=)…

阻塞赋值语句(=)与非阻塞赋值语句( 区别叙述如下:        1、在串行语句中,阻塞赋值语句按照排列顺序依次执行;非阻塞赋值语句没有先后之分,并行执行,排在前面语句不影响后面语句(实质是通过每级...
  • c_ycy
  • c_ycy
  • 2016-12-26 09:57:26
  • 1185

Verilog阻塞赋值与非阻塞赋值

verilog设计进阶 时间:2014年5月6日星期二   主要收获: 1.阻塞赋值与非阻塞赋值; 2.代码测试; 3.组合逻辑电路和时序逻辑电路。   阻塞赋值与非阻塞赋值: 1....
  • u012373020
  • u012373020
  • 2014-05-06 09:05:14
  • 5051

阻塞赋值和非阻塞赋值

在always语句块中,verilog语言支持两种类型的赋值:阻塞赋值和非阻塞赋值。阻塞赋值使用“=”语句;非阻塞赋值使用“       位于begin/end块内的多条阻塞赋值语句是串行执行的,这...
  • yuan1164345228
  • yuan1164345228
  • 2015-05-29 09:06:09
  • 8135

verilog中的阻塞赋值与非阻塞赋值详解

组合逻辑的always模块中使用阻塞赋值; 时序逻辑的always模块中使用非阻塞赋值; --------------------------------------------------- ...
  • u010277881
  • u010277881
  • 2014-07-31 15:38:18
  • 3923

深入理解阻塞和非阻塞赋值的区别

阻塞与非阻塞赋值的语言结构是Verilog语言中最难理解的概念之一。 有这样的两个要点: (1)在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构; *...
  • Pieces_thinking
  • Pieces_thinking
  • 2017-07-26 10:14:47
  • 1825

阻塞赋值和非阻塞赋值的区别

  • 2011年03月14日 11:17
  • 43KB
  • 下载

关于阻塞赋值和非阻塞赋值的…

原文地址:关于阻塞赋值和非阻塞赋值的浅析作者:SUN_403阻塞和非阻塞语句作为verilog HDL语言的最大难点之一,一直困扰着FPGA设计者,即使是一个颇富经验的设计工程师,也很容易在这个点上犯...
  • Sun19910114
  • Sun19910114
  • 2014-08-19 16:27:31
  • 2606

verilog中阻塞赋值和非阻塞赋值的区别

1、阻塞赋值操作符用等号(即 = )表示。“阻塞”是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行。而且阻塞赋...
  • avrmcu1
  • avrmcu1
  • 2014-03-19 00:17:35
  • 2102
收藏助手
不良信息举报
您举报文章:关于Verilog HDL中阻塞与非阻塞赋值形象理解
举报原因:
原因补充:

(最多只允许输入30个字)