在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 begina = 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的和,延时语句加在左侧。

仿真波形如下:

通过波形可以看到初始化之后,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 @(*) beginsum = #12 a + b;
end
endmodule

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

通过仿真波形可以看出,在第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

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

通过波形可以看到,系统初始化之后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 @(*) beginsum <= #12 a + b;
end
endmodule

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

通过波形可以看出,初始化之后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

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

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

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

FPGA学习笔记---Verilog延迟语句分析比较相关推荐

  1. FPGA学习笔记---Verilog HDL 可综合语句和不可综合语句汇总

    作为HDL语言,有两种基本的用途:系统仿真和设计实现.所有的HDL描述都可用于仿真,但并非所有的HDL描述都可综合. 一般综合工具支持的Verilog HDL结构 Verilog HDL结构 可综合性 ...

  2. FPGA学习笔记(八)同步/异步信号的打拍分析处理及亚稳态分析

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  3. FPGA学习笔记(十二)IP核之FIFO的学习总结

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  4. FPGA学习笔记_ROM核调用与调试

    FPGA学习笔记 ROM核调用与调试 1. ROM存储器IP核的使用 2. 创建.mif文件 3. In system memory content editor内存查看工具的使用 4. Signal ...

  5. FPGA学习笔记——分频电路设计

    FPGA学习笔记--分频电路设计 发布时间:2015-10-3023:29:52 分频就是用一个时钟信号通过一定的电路结构变成不同频率的时钟信号,这里介绍一下整数分频电路的设计方法.整数分频电路有偶数 ...

  6. 小梅哥FPGA学习笔记

    小梅哥FPGA学习笔记 一.38译码器 功能: 译码器其任一时刻的稳态输出,仅仅与该时刻的输入变量的取值有关,它是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等).38 ...

  7. FPGA学习笔记(五)Testbench(测试平台)文件编写进行Modelsim仿真

    系列文章目录 一.FPGA学习笔记(一)入门背景.软件及时钟约束 二.FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三.FPGA学习笔记(三) 流水灯入门FPGA设计流程 四.FPGA ...

  8. FPGA学习: Verilog刷题记录(10)

    FPGA学习: Verilog刷题记录(10) 刷题网站 : HDLBits 第三章 : Circuits 第二节 :Sequential Logic 第一节:Latches and Flip-Flo ...

  9. FPGA学习笔记(1)简单的时序逻辑电路——流水灯

    FPGA学习笔记(1)简单的时序逻辑电路--流水灯 编程语言为Verilog HDL 原理 (1)设计一个计数器,使开发板上的4个LED状态每500ms翻转一次.开发板上的晶振输出时钟频率为50MHz ...

最新文章

  1. java游戏开发--连连看-让程序运行更稳定、更高效
  2. 【硬件基础】振荡(时钟)周期、状态周期、机械周期、指令周期
  3. CentOS yum源的配置与使用
  4. 记录自己的学习和经验
  5. 关于 PHP 与 MYSQL的链接
  6. [SHOI2017]组合数问题
  7. linux安装mysql5.6.14_(四)Zabbix_linux安装mysql5.6
  8. html中显示shell脚本的输出,网页从shell脚本中输入并显示结果
  9. hadoop源码解析---INodeReference机制
  10. [转载]梯度下降小结
  11. 如何让Vue在同一局域网内能访问?
  12. PTA 7-3 【循环】【--打印图形B--】
  13. Spring aop报错:com.sun.proxy.$Proxyxxx cannot be cast to yyy
  14. 拉普拉斯变换与闭环系统稳定探讨
  15. 微信小程序showToast在真机中显示时间不可控制,显示时间短
  16. 【Niagara Vykon N4 】物联网学习 03照明控制及照明时间表
  17. 男生如何正确的识别绿茶婊
  18. matlab fourier变换反变换
  19. 26个英语单词起源(百度百科+巴士英语)
  20. Linux下编写一个C语言程序

热门文章

  1. CI如何接受POST请求中的JSON数据
  2. Windows 10 Build 9879 新变化(内含ISO下载)
  3. Java高级面试题解析(二):百度Java面试题前200页(精选)
  4. vue指令02---自动获取焦点(全局自定义指令Vue.directive())和全局过滤器Vue.filter() 的学习...
  5. P1103 书本整理
  6. java-Hyper-V
  7. Nginx启动报错误unlink() “nginx.pid” failed (2: No such file or directory)
  8. AWR Report and session_cached_cursor
  9. Qt C/C++统计运行时间
  10. JavaScript常用开发框架总结