AXI数据快递:aw_addr, aw_len, aw_size 的“物流”密码
把AXI数据传输想象成一场高效的快递服务。`aw_addr`是包裹的目的地地址,`aw_len`是本次快递需要运送的连续包裹数量,而`aw_size`则决定了每个包裹的尺寸。本文将通过生动的比喻,让你轻松理解这三大信号在AXI写地址通道中如何协同,确保数据“包裹”准确、高效地送达目的地。
支持通配符SSL证书、多域名证书、IP证书。适配ACME接口, 支持Zerossl、Let's Encrypt和Google等渠道
2026-05-26 18:15:33 AXI 总线协议 写地址通道 数字IC
AXI 的写地址通道有三个信号你基本绕不开:aw_addr、aw_len、aw_size。
每次配突发传输的时候都得摆弄它们,单独看协议描述挺清楚,真到上手写配置或者看波形的时候,有些细节还是会愣一下。
先看 aw_addr。它就是写操作的起始地址,主机发出来,从机用它定位要写的内存位置。位宽跟系统地址总线走,32 位或 64 位。
这个信号本身没什么歧义,但后面跟 aw_len 和 aw_size 配合的时候,地址对齐的问题才会冒出来,这个等会再说。
aw_len 是突发长度。注意这里有个小坑——协议里 aw_len 的值加 1 才是实际传输的数据单元数。比如你写 3,实际传 4 个 beat。
刚开始看波形的时候我老下意识直接读数,后来被波形打脸几次就记住了。
aw_size 是每个 beat 的数据宽度,用 2 的幂次编码:0 是 1 字节,1 是 2 字节,2 是 4 字节,往上以此类推。
这个不复杂,但跟 aw_len 乘起来算总字节数的时候容易算错,尤其赶工期代码写快了。
这三个信号在实际传输里是一起用的。
主机把 aw_addr 设好,aw_len 指定 beat 数,aw_size 指定每 beat 字节数,从机那边收到之后就知道这次写操作要占多少空间、传多少数据。
举个具体点的例子。假设要写 16 字节,数据总线是 32 位宽,也就是 4 字节。那 aw_size 设成 2,表示每 beat 4 字节。16 字节总共需要 4 个 beat,所以 aw_len 设成 3。
aw_addr 就填目标起始地址。从机这边看到 aw_len=3、aw_size=2,算出总共 4×4=16 字节,准备好收数就行了。
这个地方很多人会绕进去:总字节数不是直接写 aw_len,是 (aw_len+1) × (2^aw_size)。初看协议觉得啰嗦,等你自己写 slave 端接收逻辑的时候就知道为什么要这样定义了,对齐检查和 FIFO 深度计算都跟这个有关系。
另外,aw_addr 跟 aw_size 之间也有对齐的要求。如果 aw_size 是 2,也就是 4 字节宽度,那 aw_addr 的低 2 位按理应该是 0,不然从机会回一个 slave error。这个在协议里属于对齐检查的部分,实际做设计的时候别忘了在地址通道上加这层判断,不然乱序写进去的数据很难查。
总结一下就是,这三个信号本身定义不复杂,但放一起算传输总长度、做地址对齐校验的时候,细节容易漏。
线上出问题往往不是大方向错了,就是哪个信号多算 1 或者少算 1 的事。
上一篇: Pandas 索引赋值踩坑:ValueError: Length mismatch
下一篇: MySQL里用LEFT截取字符串前几位
把AXI数据传输想象成一场高效的快递服务。`aw_addr`是包裹的目的地地址,`aw_len`是本次快递需要运送的连续包裹数量,而`aw_size`则决定了每个包裹的尺寸。本文将通过生动的比喻,让你轻松理解这三大信号在AXI写地址通道中如何协同,确保数据“包裹”准确、高效地送达目的地。