非阻塞赋值的内部延时和外部延时

学习verilog有一段时间了,从字面上理解,阻塞和非阻塞的区别很直白。 前者是串行,主要用于描述组合逻辑,和软件中的赋值类似;后者是并行,主要用于描述时序逻辑。

但是和内部延时、外部延时混用在一起的时候,各种意想不到的情况就会发生。

下面将介绍,对于非阻塞赋值,内部延迟和外部延迟造成的结果就截然不同。

例1:  假设在5ns时刻pclock上出现一个正跳变沿;而current_state在正跳变出现之前的值为5,正跳变出现3ns后变为7, 下面两个always语句中next_state_h和next_state_l的值将会是多少?

always @(posedge pclock)
    #7 next_state_h <= current_state;

always @(posedge pclock)
     next_state_l <= #7 current_state;

经分析,next_state_l <= #7 current_state 能分解为两句话: 1)  temp <= next_state_l;  2) #7 next_state_l <= temp; 所以尽管有7ns的delay,但next_state_l得到的还是pclock正跳变时所对应的current_state的值(5)。具体仿真结果如下

例2:根据已知的master_clock产生phase delay的slave_clock。

`timescale 1ns/1ps

module clock_shift(master_clk, slave_clk);

output reg master_clk;

output reg slave_clk;

parameter tON = 2, tOFF = 3, tDELAY = 5;

always

begin

#tON  master_clk = 0;

#tOFF master_clk = 1;

end

always @(master_clk)

slave_clk <= #tDELAY master_clk;

endmodule

其仿真波形图如下

但是如果将#tDELAY防止外部,如 #tDELAY slave_clk <= master_clk;则仿真图形就会变成如下:



版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 22:37:49

非阻塞赋值的内部延时和外部延时的相关文章

阻塞赋值与非阻塞赋值

     过程赋值:用于对reg型变量赋值,改变寄存器的值或为以后排定改变.      语法 {阻塞性(blocking)赋值} RegisterLValue = [ TimingControl] Expression; {非阻塞性(non-blocking)赋值} RegisterLValue <= [ TimingControl] Expression; 阻塞:在本语句中"右式计算"和"左式更新"完全完成之后,才开始执行下一条语句: 非阻塞:当前语句的执行

Verilog之阻塞赋值非阻塞赋值

verilog设计进阶 时间:2014年5月6日星期二 主要收获: 1. 阻塞赋值与非阻塞赋值: 2. 代码测试: 3. 组合逻辑电路和时序逻辑电路. 阻塞赋值与非阻塞赋值: 1. 阻塞赋值"="(组合逻辑电路),非阻塞赋值"<="(时序逻辑电路): 2. Verilog模块编程的8个原则: (1) 时序电路建模时,用非阻塞赋值. (2) 锁存器电路建模时,用非阻塞赋值. (3) 用always块建立组合逻辑模型时,用阻塞赋值. (4) 在同一个always块

关于verilog阻塞赋值与非阻塞赋值的一些浅见

最近学到了关于verilog的阻塞赋值与非阻塞赋值的一些区别,经过网上查阅与仿真实验,有了一些理解.希望能够记下来. 说到verilog的阻塞与非阻塞赋值,不得不说的就是verilog的事件表,如下: 阻塞赋值,属于活跃事件,计算完RHS(Right Hand Side)立即更新左值.期间同一块内其他语句不能执行,即阻塞其他语句执行. 而非阻塞右值计算属于活跃事件,非阻塞左值更新属于非活跃事件,即计算完RHS,不能立即更新左值,而要等所有活跃事件完成,才能完成左值更新,出事件队列.   然后说说

用一个例子来学习阻塞赋值和非阻塞赋值

阻塞赋值与非阻塞赋值 阻塞赋值的一般表达式为:目标变量名=驱动表达式  阻塞赋值是一种理想化的数据传输,赋值立即发生,不存在延时行为 非阻塞赋值一般表达式为:目标变量名<=驱动表达式   非阻塞赋值比较接近真实的电路工作状态,应为他从综合的角度考虑到了延时和并行性. 在过程启动中,非阻塞赋值使三条语句同时运行,而阻塞赋值是按顺序方式完成更新的数据的. 新建工程,编写示例代码 module block_nonblock(clk,rst_n,a,b,c,out ); input clk,rst_n,

verilog 阻塞赋值和非阻塞赋值

1 module main(); 2 reg clk=0; 3 reg [11:0] a=0; 4 reg [11:0] b=0; 5 always #50 clk=~clk; 6 always@(clk) 7 begin 8 a=a+4; 9 b<=a/4; 10 end 11 endmodule 如果把always中的两句顺序倒一下输出结果会改变是为什么? 上面的程序0~50s时,b=1:改成下面情形后b=0; 1 module main(); 2 reg clk=0; 3 reg [11:

Verilog阻塞赋值与非阻塞赋值

今天又个兄弟求助,数据库里一个表有数据如下: no  name 1    a 2    b 3    c 4    d 如何用一个sql显示如下结果: ab ac ad bc bd cd 对于这种构造数据,是分析函数的强项,下面来做个试验: create table t (no number,name varchar(2)); insert into t values(1,'a'); insert into t values(2,'b'); insert into t values(3,'c')

阻塞赋值与非阻塞赋值(转载)

 前言:阻塞与非阻塞赋值是Verilog语言中最基本的部分,也是让大部分Verilog新手最困惑的地方.关于阻塞与非阻塞的著作文章可谓汗牛充栋,这些文章对阻塞与非阻塞赋值的原理进行了非常详细的讲解,但新手读了之后依然有种似懂非懂的感觉,编码过程中一如既往的犯错.所以,本文的目的立足于提供一种实用化的解决方案,用最简单的语言和形象的类比让新手能够一目了然的明白正确的编码方式以及相应的电路行为逻辑,关于仿真细节的讲解不是本文重点,需要了解更多细节的朋友可以参考文后列举的参考文献. 本文共分为三部分,

07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线--普利斯队长精心奉献 ? 实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理: ????阻塞赋值,操作符为"=","阻塞"是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行.而且阻塞赋值可以看成是一步完成的,即:计算等号右边的值并同时赋给左边变量. ????非阻塞赋值,操作符为"<=","非阻塞"是指在进程语句(

FPGA之阻塞赋值与非阻塞赋值

Verilog语言中讲的阻塞赋值与非阻塞赋值,但从字面意思来看,阻塞就是执行的时候在某个地方卡住了,等这个操作执行完在继续执行下面的语句,而非阻塞就是不管执行完没有,我不管执行的结果是什么,反正我继续下面的事情.而Verilog中的阻塞赋值与非阻塞赋值正好也是这个意思,通过执行一个例子,就可以简单地明白了:1.阻塞赋值可以理解为语句的顺序执行,因此语句的执行顺序很重要2.非阻塞赋值可以理解为语句的并行执行,所以语句的执行不考虑顺序3.在assign的结构中,必须使用的是阻塞赋值 //阻塞modu