FPGA学习笔记---Verilog延迟语句分析比较(转)

版权声明:本文为CSDN博主「单片机学习经验交流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_20222919/article/details/107576195

在Verilog语言中经常要用到延时语句,延时语句添加的位置不同,输出的结果就会不同。今天就来分析比较一下延时语句在不同位置时,对赋值语句的影响。

一、阻塞式左延时赋值

文件代码:

`timescale 1ns/1ns
module delay(
    a,
    b,
    sum
);
    input [3:0] a;
    input [3:0] b;
    output reg [4:0] sum;   
    //阻塞式左延时赋值语句
    always @(*) begin
        #12 sum = a + b;
    end
endmodule

测试代码

`timescale 1ns/1ns
module delay_tb;
    reg [3:0] a;
    reg [3:0] b;
    wire [4:0] sum; 
 
    delay delay(
        .a(a),
        .b(b),
        .sum(sum)
    );
    initial begin
    a = 0; b = 0;
    #5;
    a = 1; b = 1;
    #5;
    a = 2; b = 2;
    #5;
    a = 3; b = 3;
    #5;
    a = 4; b = 4;
    #5;
    a = 5; b = 5;
    #5;
    a = 6; b = 6;
    #5;
    a = 7; b = 7;
    #5;
    a = 8; b = 8;
    #5;
    a = 9; b = 9;
    #5;
    a = 10; b = 10;
    #5;
    
    #30;    
    $stop;
    end
endmodule

a、b的值5ns改变一次,通过阻塞式语句读取a、b的和,延时语句加在左侧。

仿真波形如下:


20200725113704354.jpg

通过波形可以看到初始化之后,a、b的值每5ns变化一次,在第12ns时,sum输出a+b的和为4,说明在延时时间到了之后,才取a和b的值计算,然后更新给sum。执行完阻塞赋值语句后,程序退出always块,等待下一次数据变化。在第15ns时,a、b的值又发生了变化,延时等待12ns后,在第27ns取出a和b的值并计算,然后更新给sum。也就是说延时语句在阻塞赋值左侧时,在延时时候到了之后,系统更新右值同时赋值给左值。sum总是为a和b最新值的和。

二、阻塞式右延时赋值

代码修改如下:

`timescale 1ns/1ns
module delay(
    a,
    b,
    sum
);
    input [3:0] a;
    input [3:0] b;
    output reg [4:0] sum;   
    //阻塞式右延时赋值语句
    always @(*) begin
        sum = #12 a + b;
    end
endmodule

测试代码保持不变,仿真波形如下:


20200725134011501.jpg

通过仿真波形可以看出,在第12ns的时候,sum输出值为0,说明初始化之后,程序进入always块中计算a+b值,延时等待12ns之后,再将值更新给sum。虽然此时a和b的值都变为了2。但是计算的依然是12ns之前的值。计算完成之后推出always块,当第15ns时,a、b的值发生了变化,又进入always块中计算此时a+b的值,等待12ns之后,也就是在第27ns时将结果6赋值给sum。由此可以看出,当延时语句在阻塞赋值右边时,更新的是延时之前的值。在延时等待过程中数据发生变化时将会被忽略。

三、非阻塞式左延时赋值

修改代码如下:

`timescale 1ns/1ns
module delay(
    a,
    b,
    sum
);
    input [3:0] a;
    input [3:0] b;
    output reg [4:0] sum;
    //非阻塞式左延时赋值语句
    always @(*) begin
        #12 sum <= a + b;
    end
endmodule

测试代码不变,仿真波形如下:


20200725135035930.jpg

通过波形可以看到,系统初始化之后a、b的值5ns变化一次,在第12ns时sum结果为4。说明计算的是a、b的最新值。在第15ns时,a、b的值发生了更新,延时12ns后,也就是第27ns,读取a、b当前最新值,计算累加和赋值给sum输出。由此可看到延时加在非阻塞赋值左侧时,在延时时间到了之后,读取a、b最新值并计算累加和。

四、非阻塞式右延时赋值

修改代码如下:

`timescale 1ns/1ns
module delay(
    a,
    b,
    sum
);
    input [3:0] a;
    input [3:0] b;
    output reg [4:0] sum;   
    //非阻塞式右延时赋值语句
    always @(*) begin
        sum <= #12 a + b;
    end
endmodule

测试代码不变,仿真波形如下:


20200725135950940.jpg

通过波形可以看出,初始化之后a、b的值每5ns更新一次,在第12ns时sum值为0,说明计算的是0ns时a、b的值。在第17ns时,sum值为2,说明计算的是第5ns时,a、b的值。后面的值以此类推,说明sum的值统一延迟的12ns。但是每次a、b的变化都被捕捉到了。说明延时加在非阻塞赋值的右侧时,输出结果会统一延迟。但是不会漏掉任何一次数据变化。

五、连续赋值

修改代码如下:

`timescale 1ns/1ns
module delay(
    a,
    b,
    sum
);
    input [3:0] a;
    input [3:0] b;
    output [4:0] sum;
    assign #12 sum =  a + b;
endmodule

测试不变,仿真波形如下:


20200725144520441.jpg

由波形图可以看出,当a、b停止变化后12ns,sum才会输出最后一次a+b的值。

通过上面几种延时方法比较,可以看出,延时在不同语句中不同位置,输出结果也不相同。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 1.数据类型 VerilogHDL中有2种变量类型:wire和reg,这两种变量是4值类型的(即有四种状态)。 S...
    一条摸水鱼阅读 14,433评论 0 3
  • (注:本系列用于自己开始自学Verilog HDL语言时做备忘梳理使用)1.基础概念2.描述方式3.第一个示例——...
    燃梦祝歌_焚诗祭酒阅读 1,592评论 0 0
  • 致谢:本笔记基于龚黎明的系列讲解视频。 1 Verilog简介(Verilog语法学习者可跳过该节) Verilo...
    shawn233阅读 94,444评论 1 55
  • testbench 1. 激励的产生 对于testbench而言,端口应当和被测试的module一一对应。端口分为...
    Michael_Johnson阅读 2,649评论 0 1
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,520评论 28 53