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

always@(posedge clk)时序赋值延迟一个周期前几天是问了我一个小问题 我总结关键点如下 情形一 always posedgeclk begin if ce 1 b1 amp amp ready 1 b1 w en lt 1 b1 else w en lt 1 b0 end 情形二 always posedgeclk begin if ce 1 b1 amp amp a

always@(posedge clk) begin if(ce == 1'b1 && ready == 1'b1) w_en <= 1'b1; else w_en <= 1'b0; end 

情形二:

always@(posedge clk) begin if(ce == 1'b1 && ready == 1'b1) if(data <= 8'b1111_1111) data <= data_in; else data <= data; //data_in是上一个模块的时序输出 end 
情形一: 首先,进入这个过程块的条件是在时序的上升沿,如果满足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)begin if(条件满足) begin b <= a; end else 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'b0; always@(posedge clk)begin if(!rst)begin w_en <= 1'b0; data <= 8'b0; end else if(ce ==1'b1 && ready ==1'b1) begin if(data<=8'b)begin w_en <= 1'b1; data <= data_in; end end end endmodule 

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 begin clk = 1; forever #10 begin clk = ~clk; end end initial begin rst = 0; ce =0; ready = 0; #60; rst = 1; #20; ce = 1'b1; ready = 1'b1; end //data_in是一个时序逻辑信号 always@(posedge clk)begin if(!rst) data_in <=0; else if(data_in<=8'b) data_in <= data_in +1; end non_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 begin clk = 1; forever #10 begin clk = ~clk; end end initial begin rst = 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是一个组合逻辑信号 end non_block non_block0( .clk(clk), .rst(rst), .ce(ce), .ready(ready), .data_in(data_in), .w_en(w_en), .data(data) ); endmodule 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205166.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午6:39
下一篇 2026年3月19日 下午6:39


相关推荐

  • tar命令打包和压缩与解压

    tar命令打包和压缩与解压

    2021年6月14日
    178
  • Navicat for oracle创建数据库

    Navicat for oracle创建数据库前言其实在Oracle中的概念并不是创建数据库,而是创建一个表空间,然后再创建一个用户,设置该用户的默认表空间为我们新创建的表空间,这些操作之后,便和你之前用过的mysql数据库创建完数据库一模一样了(如果你用过mysql的话,当然如果Oracle是你用的第一个数据库系统,那上面这段话其实看不看并不重要)。但是,鉴于很多用过mysql的用户,在刚开始使用Oracle的时候都会不知道如何创建数据…

    2022年7月13日
    22
  • android中适配器的作用,适配器模式 在Android中的简单理解「建议收藏」

    android中适配器的作用,适配器模式 在Android中的简单理解「建议收藏」Android在Android上提到适配器模式就会想到最常用的ListView和BaseAdapter在这个功能的使用中,类似于适配器模式的对象适配器例如在ListView中想用一个getView()方法,但是不同的数据,不同的需求,会有不同的getView()结果,所以getView()不能写死了,那么可能就想到了用适配器模式所以ListView里面包含了一个ListAdapter的成员变量,实…

    2022年5月31日
    48
  • 效率极低人群的七大习惯你占了几项?

    效率极低人群的七大习惯你占了几项?

    2021年8月6日
    50
  • MMC卡SPI模式「建议收藏」

    MMC卡SPI模式「建议收藏」MMC/SD卡简单SPI模式驱动1. SPI模式下CRC检验无效的。 2. 命令格式是6个字节,采用大端法进行数据传输。3. 第一个是(命令号|0x40)。4. 第2-5个是有些命令需要地址,用来设置地址的,而其他的可以任意填充。5. 最后一个字节是CRC校验位,除了CMD0为95H外,其他可以任意填充。6.命令发送函数。1).片选拉低

    2022年6月2日
    38
  • plt.subplot()使用方法以及参数介绍

    plt.subplot()使用方法以及参数介绍plt.subplot()plt.subplot(nrows,ncols,index,**kwargs)第一个参数:*args(官网文档描述)Eithera3-digitintegerorthreeseparateintegersdescribingthepositionofthesubplot.Ifthethreeintegersarenr…

    2022年6月18日
    97

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号