您的位置:技术中心首页 > 硬件语言 >> Verilog HDL >> verilog HDL 的阻塞和非阻塞语句分析

verilog HDL 的阻塞和非阻塞语句分析

作者:e人   时间:2007-09-29 12:45:43  来自:网上转载  浏览次数:0  文字大小:【】【】【

        在FPGA设计中完全透视verilog HDL 的阻塞和非阻塞语句,是个人在verilog HDL运用中的一些心得体会。
        阻塞和非阻塞语句作为verilog HDL语言的最大难点之一,一直困扰着FPGA设计者,即使是一个颇富经验的设计工程师,也很容易在这个点上犯下一些不必要的错误。阻塞和非阻塞可以说是血脉相连,但是又有着本质的差别。理解不清或运用不当,都往往会导致设计工程达不到预期的效果,而其中的错误又很隐晦。下面我给大家谈谈阻塞和非阻塞语句的本质区别和在FPGA设计中的不同运用。

阻塞语句
       
顾名思义,即本条语句具有影响下一条语句的作用,在同一个进程always中,一条阻塞赋值语句的执行是立刻影响着下条语句的执行情况和结果。如果该条语句没有执行完,那么下条语句不可能进入执行状态的,因此,从字面层上理解,该条语句阻塞了下面语句的执行。阻塞语句最能体现verilog HDL和C语言之间的血缘关系,比如,在时钟沿触发的always进程里,若先执行b=c,再执行a=b,那么本质上,在一个时钟沿触发里面,a=c成立,即是说,不要b变量,直接在进程里赋值a=c,结果是一样的。这和c语言中b=c,a=b性质相同。

非阻塞语句
       非阻塞语句应该来说,更能体现硬件电路的特点。这正是非阻塞语句广泛应用于时序逻辑电路的原因。接上面的例子,如果在一个时钟沿触发的always进程里面,b<=c,a<=b那么就不可能直接在进程里面赋值a<=c.因为c的值要经过两个时钟延迟才传到a里面,即c若从0变为1,那么要经过两个clk上升沿才传到a,a的值才从0变为1。两次赋值正是体现了两个时钟延迟的特点。这种特点即是非阻塞语句非阻塞的的原因导致的,就是说,a<=b,不会因为b<=c没有执行完毕而不执行,只要时钟触发进程,那么a<=b,b<=c同时执行。所以,如果c为1,b为0,a为1的话,那么在在非阻塞语句的进程里面,一个时钟沿到来,由于他们之间是同时执行的,所以把c的1赋给了b,把b的0赋给了a,但是在阻塞语句里面,c的1先给了b,然后b把新赋值的1又给了a,那么a在一个时钟之后即变成了1。(在一次触发进程里,无论是阻塞和非阻塞语句,每条语句只能执行一次)
       所以从上面的介绍里面,可以看出,阻塞语句是顺序执行的,而非阻塞语句是同时执行的,那么,如何在设计里面运用好阻塞语句和非阻塞语句呢,总体上来讲,遵循大体原则:阻塞语句运用在组合逻辑电路设计里面,非阻塞语句运用在时序逻辑电路设计里面。但是一般来讲,一个设计往往包含着组合逻辑和时序逻辑。可以再细分为以下几个情况,并可以用阻塞语句和非阻塞语句不同的设计来区别讨论它们之间的优缺点,进一步理解清楚。。。。。。(

最直观的说法就是如下仿真一下:观察out1~out4的变化,就明白了!
`timescale 1ns/100ps
module test1();
reg clk;
reg sigin;
reg out1;
reg out2;
reg out3;
reg out4;

//assign #10 out3 = sigin;

always #10 clk=~clk;
always #70 sigin = ~sigin;

initial
begin
sigin = 1'b0;
clk= 1'b0;
out1 =1'b0;
out2 =1'b0;
end

always @(sigin)
begin
$display("%d",$time);
out1<=sigin;
out2<= out1;
out3 = sigin;
out4 = out3;
$display("%d",$time);
end
endmodule
 

#1: 当为时序逻辑建模,使用“非阻塞赋值”。
#2: 当为锁存器(latch)建模,使用“非阻塞赋值”。
#3: 当用always块为组合逻辑建模,使用“阻塞赋值”
#4: 当在同一个always块里面既为组合逻辑又为时序逻辑建模,使用“非阻塞赋值”。
#5: 不要在同一个always块里面混合使用“阻塞赋值”和“非阻塞赋值”。
#6: 不要在两个或两个以上always块里面对同一个变量进行赋值。
#7: 使用$strobe以显示已被“非阻塞赋值”的值。
#8: 不要使用#0延迟的赋值。

责任编辑:5life

更多相关 Verilog 阻塞 非阻塞 的文章

Verilog 非阻塞赋值的仿真/综合问题 [2007-09-29]
Verilog的键盘源码keypad—有去抖功能 [2007-09-29]
Verilog 脉冲发生器程序 [2007-09-29]
Verilog 电梯控制器设计 [2007-09-29]
Verilog学习心得 [2007-09-29]
Verilog交通灯控制器程序 [2007-09-29]
一种基于移位寄存器的CAM的Verilog HDL实现 [2007-09-29]
SPI串行总线接口的Verilog实现 [2007-09-29]
Verilog HDL代码描述对状态机综合的研究 [2007-09-29]
SDRAM控制器软核的Verilog设计 [2007-09-29]
本文共有0条评论,现在显示最新的5条。

栏目导航

电路基础
硬件语言
逻辑验证
电路综合
后端设计
可测设计
基本逻辑
制造工艺
书籍精选
说文解字
工具学习
数字滤波
趣闻逸事
数字锁相
设计杂项
低耗设计

站点最新

更多相关链接

  verilog HDL 的阻塞和非...
  Verilog 非阻塞赋值的仿...
  Verilog的键盘源码keypa...
  Verilog 脉冲发生器程序
  Verilog 电梯控制器设计
  Verilog学习心得
  Verilog交通灯控制器程序
  一种基于移位寄存器的CA...
  SPI串行总线接口的Veril...
  Verilog HDL代码描述对状...

栏目最新

更多相关链接

  verilog HDL 的阻塞和非...
  Verilog 非阻塞赋值的仿...
  Verilog的键盘源码keypa...
  Verilog 脉冲发生器程序
  Verilog 电梯控制器设计
  Verilog学习心得
  Verilog交通灯控制器程序
  一种基于移位寄存器的CA...
  SPI串行总线接口的Veril...
  Verilog HDL代码描述对状...

热点文章

更多相关链接

  中文版Verilog HDL简明教程
  Verilog HDL的基础知识
  Verilog学习笔记(More)
  Verilog 的些许经验
  verilog HDL笔记
  Verilog设计经验点滴
  阻塞式赋值与非阻塞式赋值
  硬件描述语言(HDL)的基础知识...
  SDRAM控制器软核的Verilog设计
  一种基于移位寄存器的CAM的V...