前几天是问了我一个小问题,我总结关键点如下:
情形一:

always@(posedge clk) beginif(ce == 1'b1 && ready == 1'b1)w_en <= 1'b1;elsew_en <= 1'b0;
end

情形二:

always@(posedge clk) beginif(ce == 1'b1 && ready == 1'b1)if(data <= 8'b1111_1111)data <= data_in;else data <= data; //data_in是上一个模块的时序输出
end

他的问题是:为什么情形一中的w_en在条件满足的时候立马发生变化,也就是在本周期改变;而在情形二中当条件满足的时候,data的值不是立马发生变化,而是在下一周期发生变化?
可以用波形表示如下:

这个问题我当时也没注意过,写程序的时候我大多时候是看着时序图对了就行了,被这一问难倒了!!!

通过分析我明白了。
分析:

情形一:
首先,进入这个过程块的条件是在时序的上升沿,如果满足if条件就会执行 w_en <= 1'b1;
赋值过程是这样的,首先统一计算表达式右边的值,然后在统一的赋给左边的变量,改变是几乎
是立即发生的,也就是在本周期改变。w_en <= 1'b1 语句右边的值可以看做是一个组合逻辑
信号,所以改变是立即发生的。情形二:
首先,进入这个过程块的条件也是在时序的上升沿,如果满足if条件就会进入到data<=
data_in,否则保持不变。赋值的过程也是先统一计算表达式右边的值,然后在一次性赋给表达
左边的变量data,改变也几乎是立即的,即也是在本周期进行更新。由于data_in是有外部的模
块传输进来的,所以需要看一下data_in是否经过时序驱动,如果经过时序驱动,那data_in就
相当于一个时序逻辑信号,所以data肯定会比data_in晚一个周期。如果data_in是一个组合逻辑信号,那么data和data_in的波形在条件满足之后就会完全对齐。
请看下面的这个式子:
always@(posedge clk)beginif(条件满足) beginb <= a;endelse begin……end
end如果把 a换成data_in,把b换成data可能会更好理解一点。

附录:

顶层模块:

module non_block(
input                   clk,
input                   rst,
input                   ce,
input                   ready,
input    [7:0]      data_in,
output  reg             w_en,
output  reg [7:0]       data);reg           [7:0]   data_reg = 8'b01010101;always@(posedge clk)beginif(!rst)beginw_en <= 1'b0;data    <= 8'b0;endelse if(ce ==1'b1 && ready ==1'b1) beginif(data<=8'b11111111)beginw_en <= 1'b1;data  <= data_in;endendendendmodule

tb1:

module tb_non_block();reg                        clk;reg                     rst;reg                     ce;reg                      ready;reg       [7:0]           data_in;wire                    w_en;wire    [7:0]          data;initial beginclk = 1;forever #10 beginclk = ~clk;endendinitial beginrst = 0;ce =0;ready = 0;#60;rst = 1;#20;ce = 1'b1;ready = 1'b1;end//data_in是一个时序逻辑信号always@(posedge clk)beginif(!rst)data_in <=0;else if(data_in<=8'b11111111)data_in <= data_in +1;endnon_block non_block0(.clk(clk),.rst(rst),.ce(ce),.ready(ready),.data_in(data_in),.w_en(w_en),.data(data));
endmodule

对应的波形如下:

tb2:

module tb_non_block();reg                        clk;reg                     rst;reg                     ce;reg                      ready;reg       [7:0]           data_in;wire                    w_en;wire    [7:0]          data;initial beginclk = 1;forever #10 beginclk = ~clk;endendinitial beginrst = 0;ce =0;ready = 0;data_in = 8'b0;#60;rst = 1;#20;ce = 1'b1;ready = 1'b1;data_in = 8'b00010001; //data_in是一个组合逻辑信号endnon_block non_block0(.clk(clk),.rst(rst),.ce(ce),.ready(ready),.data_in(data_in),.w_en(w_en),.data(data));
endmodule

对应的波形:

always@(posedge clk)时序赋值延迟一个周期相关推荐

  1. Verilog之非阻塞赋值(三)—— 赋值延后一个周期

    总结:(一.二为一组,不延后:三.四为一组,延后1周期) 在Verilog之非阻塞赋值(二)中,相关说法不全面,因为文本编辑器不支持更改,故完善之后,将此文作为第三部分 前提:always块描述的时序 ...

  2. Verilog之非阻塞赋值(二)——赋值延后一个周期

    阻塞与非阻塞赋值,当在always块中的每一个条件分支中,仅有一条赋值语句(不管是阻塞与非阻塞,且要满足条件中的条件判断式不含有在本模块中定义并赋值的reg变量(采用非阻塞赋值)),那么阻塞和非阻塞都 ...

  3. EDA技术与Verilog设计 实现输入一个周期的高电平,会有一个5个周期的高电平信号产生

    实现输入一个周期的高电平,会有一个5个周期的高电平信号产生 module kount5(clk,rst,inp,outp,tmp); input clk,rst,inp; output outp,tm ...

  4. 【verilog】设计一个测试文件,产生一个周期为2微秒,占空比为3:1的时钟信号

    〇.前情提要 帮可爱的涛涛看题,顺便复习一下verilog. 参考: Verilog测试:TestBench结构 https://blog.csdn.net/qq_26652069/article/d ...

  5. 关于@(posedge clk)和@(itf.cb)的区别

    一.采样region区别 @(posedge clk)采样是在active region,这里会采样最新的值,这是因为 @(posedge clk)它是RTL代码,它执行的在前面: @(itf.cb) ...

  6. verilog中关于always语句嵌套task执行顺序和@(posedge clk)执行方式的问题

    首先明确一个事实 always@(posedge clk)中的任务没有执行完的情况下是不会在下一个时钟上升沿到来的时候再次重复执行的 再明确另一个事实 在前面不带always的情况下,@(posedg ...

  7. 智能车竞赛开启了新的一个周期,让我聚焦十六届赛题吧

    智能车竞赛开启了新的一个周期,让我聚焦下一届赛题吧. ■ 相关链接文档 聚沙成塔 : 第十六届智能车竞赛规则你一言,我一语 第十六届全国大学生智能汽车竞赛设想 第十五届全国大学生智能车线上比赛流程规范 ...

  8. Go中的函数也是一种数据类型,可以赋值给一个变量

    在Go中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了.通过该变量可以对函数调用. 这种概念类似于scala中的高阶函数 package main import &quo ...

  9. 将一个对象相同的属性(不区分大小写)赋值给一个新对象 DataTable的一个简单的扩展...

    将一个对象相同的属性(不区分大小写)赋值给一个新对象 1 public static T Mapper<S, T>(S source)2 {3 T t = Activator.Create ...

最新文章

  1. 2021年大数据Spark(九):Spark On Yarn两种模式总结
  2. 土壤微生态文献包免费领取 | 150篇近两年高影响因子土壤微生态相关文章
  3. .NET 中的对象序列化 (转载)
  4. 6间房,把评论添加到视频的metadata.
  5. 电器缺水保护控制介绍
  6. HBase权威指南中文版pdf
  7. 计算机常用压缩软件有哪些,电脑压缩软件哪个好推荐
  8. excel中的相对引用、绝对引用和混合引用
  9. 什么是 DNS,有什么作用?为什么需要更换公共DNS服务器?
  10. 线性代数中的符号记录
  11. IT大学生成长周报 | 第 5 期
  12. Linux之网络设置
  13. AutoFlowLayout的报错处理
  14. 【前端】HTML详细教程(下篇)
  15. android h5调用百度地图,h5页面如何调用百度地图获取当前位置(代码)
  16. 《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》中文分享(12)
  17. 【LaTeX图像】tikz画图案例,结构图
  18. 基于Java的宿舍管理系统
  19. R语言COX-STUART趋势检验
  20. Autodesk CAD2007的下载资源

热门文章

  1. Python面向对象—面向对象高级
  2. js input type file onchange
  3. IOS 第三方开源库汇总
  4. 天津平面设计培训机构选哪家好?
  5. TSM泛读【TSM: Temporal Shift Module for Efficient Video Understanding】
  6. 千呼万唤的奥运会主题曲太让人失望了
  7. 管理类联考——英语——趣味篇——阅读——考题的来源
  8. 【龙芯1B例程】:串口中断实验
  9. 3D建模师要学什么专业?
  10. 继续解决adsl猫的驱动问题!