AXI4总线中BVALID与BREADY中的关系

本文介绍了AXI4总线突发式写时序中BVALID和BREADY信号的理解误区,以及如何修正Verilog代码以确保与官方例程保持一致,以实现更通用的信号处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AXI4总线突发式写时序图:
这里写图片描述
根据资料提供的时序图误认为BVALID信号在WLAST拉高后会立刻拉高一个时钟周期,BREADY信号应该在AWVALID与AWREADY同时拉高后立即拉高,与BVALID信号同时拉低,所以用Verilog描述为(axi_bready即为BVALID信号):
always @(posedge M_AXI_ACLK)
if(M_AXI_ARESETN == 0)
axi_bready <= 1’b0;
else if(M_AXI_BVALID==1’b1&&axi_bready==1’b1)
axi_bready <= 1’b0;
else if(axi_awvalid==1’b1&&M_AXI_AWREADY==1’b1)
axi_bready <= 1’b1;
但是通过ila抓取信号发现BVALID信号并不是在WLAST拉高后就立刻也拉高,所以上述写法并不适用所有情况。后根据官方提供的例程,修改为:
always @(posedge M_AXI_ACLK)
begin
if (M_AXI_ARESETN == 0)
begin
axi_bready <= 1’b0;
end
// accept/acknowledge bresp with axi_bready by the master
// when M_AXI_BVALID is asserted

### AXI4 总线协议时序特性 AXI4 协议定义了管理器和从属设备之间点对点连接的信号时序[^1]。具体来说,AXI4 的时序特性主要体现在各个通道的操作上。 #### 读操作时序 对于读地址通道 (AR),当 `ARVALID` 被置高表示发起者准备好发送读请求,而目标端通过拉高 `ARREADY` 表明可以接收该请求。一旦双方都处于有效状态,则完成一次握手并传输相应的地址信息给目标方。 在读数据通道 (R) 中,`RVALID` 和 `RREADY` 构成另一组握手机制来确认数据的有效性和准备情况。每当这两个信号都被激活时即意味着一个有效的读响应被成功传递回发起者处[^2]。 ```python def axi_read_timing(): """ Simulate a simplified version of AXI read operation timing. This function demonstrates how ARVALID/ARREADY and RVALID/RREADY interact during an AXI read transaction. """ arvalid = True # Initiator sets this high to indicate it has valid address information rready = False # Subordinate initially not ready while not(arvalid and rready): pass # Wait until both sides agree on the transfer print("Read Address Handshake Completed") rvalid = True # Subordinate now sends back data with this signal set rready = True # And initiator acknowledges readiness for receiving data if rvalid and rready: print("Data Transfer Complete") ``` #### 写操作时序 写入过程涉及两个独立但相互关联的部分——写地址 (`AW`) 及其对应的写数据 (`W`) 渠道。类似于读取流程,在这里也是利用 `AWVALID/AWREADY` 来同步地址传送;而对于实际的数据交换则依靠于 `WVALID/WREADY` 对来进行协调。最后,为了确保写入动作已完成,还需要依赖写回应(`B`)信道上的 `BVALID/BREADY` 握手机制以通知源节点写事务已经结束。 ```python def axi_write_timing(): """ Illustrate the basic concept behind AXI write transactions using Python pseudocode. The code snippet shows interactions among AW, W channels as well as acknowledgment via B channel. """ awvalid = wvalid = bready = True # Assume all parties are prepared at start awready = wready = bvalid = False # First phase: Write Address Channel handshake while not(awvalid and awready): pass # Waiting... print("Write Address Acknowledged.") # Second Phase: Data Transmission through Write Data Channel while not(wvalid and wready): pass print("Write Data Transferred.") # Final Step: Confirmation from Slave Device over Write Response Channel while not(bvalid and bready): continue print("Write Operation Confirmed by Target.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值