ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AXI DataMover实战:从状态机踩坑到带宽优化与调试

AXI DataMover实战:从状态机踩坑到带宽优化与调试 1. 为什么偏偏是 AXI DataMover而不是自己写状态机1.1 一个真实项目的起点图像缓存带宽不够了前两年接手一个工业相机项目前端是 MIPI 接口的图像传感器输出 1080p60fps 的 RAW 数据后端要在 DDR 里做几帧缓存再读出来做 ISP 去马赛克和定点数运算。最开始图省事自己写了一个 AXI4 Master 状态机用计数器控制突发长度手动拉 AWVALID、WVALID结果仿真能跑上板就出问题偶尔丢帧偶尔读出来的数据错位抓 ILA 一看是写通道和读通道抢总线加上跨时钟域握手没处理好导致TREADY拉低的时机不对。后来换成 AXI DataMover问题基本消失。这不是说 DataMover 是银弹而是它把命令下发和数据搬运这两件事彻底解耦了——你只需要告诉它从哪搬到哪、搬多少剩下的突发拆分、地址递增、握手时序它内部状态机全包了。对于 FPGA 图像处理、高速采集这类场景这个解耦带来的稳定性提升是实打实的。1.2 DataMover 到底解决了什么问题AXI DataMover 是 Xilinx现 AMD提供的一个软核 IP本质是一个带命令队列的 DMA 引擎。它的核心价值在于三点第一协议转换。它一侧是 AXI4 或 AXI4-Stream另一侧也是 AXI4 或 AXI4-Stream可以在内存映射Memory Mapped简称 MM和流Stream之间自由转换。比如你的图像数据是 AXI-Stream 进来的但 DDR 需要 AXI4 写DataMover 就是中间的桥。第二命令驱动。你通过一个简单的命令接口Command Interface下发搬运任务命令里包含源地址、目的地址、传输字节数、命令类型读/写、MM2S/S2MM 等。DataMover 自己维护命令队列支持多个命令排队执行不需要 CPU 或软核频繁干预。第三突发自动拆分。AXI4 协议对突发长度有约束INCR 模式下最大 256 拍DataMover 会根据你给的传输长度和 AXI 数据位宽自动计算需要拆成几个突发并保证地址对齐。这一点在 AXI4 的 Fixed Burst 场景下尤其重要——Fixed Burst 要求地址对齐如果自己写逻辑很容易踩坑。1.3 什么时候不该用 DataMover也不是所有场景都适合。如果你的传输是固定长度、固定地址、单次触发比如每隔 1ms 从 ADC 读 1024 个字节到 BRAM那自己写一个简单的 AXI4 Master 状态机反而更省资源。DataMover 的逻辑资源占用不算小一个 64 位数据位宽的 DataMover 大概要消耗 2000~3000 个 LUT 和若干 BRAM用于命令队列和内部 FIFO。在资源紧张的低端 FPGA比如 Artix-7 的小容量型号上这个开销需要认真评估。另外DataMover 的命令接口本身也需要一个控制器来驱动通常配合 AXI DMA 或者 MicroBlaze 软核使用。如果你只是做点对点的数据搬运没有复杂的命令调度需求用 AXI DMA 的 Simple Mode 可能更直接。2. DataMover 的接口拆解命令、数据、状态三条线2.1 命令接口你告诉它做什么命令接口是 DataMover 的大脑入口。每个命令是一个 72 位对于 32 位地址或 104 位对于 64 位地址的数据包包含以下字段字段位宽含义TAG4 位命令标签用于区分不同命令的完成状态SADDR32/64 位源地址DADDR32/64 位目的地址BTT23 位传输字节数Bytes To TransferTYPE4 位命令类型读/写、MM2S/S2MM 等EOF1 位是否在传输结束时产生 TLAST命令通过s_axis_cmd接口下发这是一个 AXI-Stream 从接口。你需要在TVALID和TREADY同时有效时把命令数据推进去。命令下发的顺序就是执行顺序DataMover 内部有一个命令队列深度可配置通常 4~16支持流水线式下发。注意BTT 字段是 23 位最大传输字节数是 8MB-1。如果你要搬的数据超过这个值必须拆成多个命令。这一点在搬运大帧图像时经常被忽略导致传输不完整。2.2 数据接口实际搬运的通道数据接口根据你选择的模式不同可以是 AXI4 MM 接口也可以是 AXI4-Stream 接口。以最常见的 MM2SMemory Map to Stream模式为例一侧是m_axi_mm连接到 DDR 控制器或 AXI Interconnect负责从内存读数据另一侧是m_axis输出 AXI-Stream 数据流连接到你的处理逻辑。S2MMStream to Memory Map模式则相反从 Stream 收数据写到 MM 侧。数据位宽可以配置为 32、64、128、256 甚至 512 位。位宽的选择直接影响带宽和资源占用。以 64 位位宽、200MHz 时钟为例理论带宽是 64bit × 200MHz 12.8Gbps 1.6GB/s。如果 DDR 控制器能跑满这个带宽足够 4K30fps 的 RAW 图像传输。2.3 状态接口它告诉你做完了没有状态接口输出每个命令的执行结果包括s_axis_sts状态流包含 TAG、OKAY/ERROR 标志、传输字节数等mm2s_err/s2mm_err错误指示比如地址越界、协议违例。状态接口的重要性在于你可以通过 TAG 精确追踪每个命令的完成情况。在多命令流水线场景下这一点非常关键。比如你连续下发了 10 个搬运命令通过状态流可以知道第 3 个命令失败了而不是只知道整体出错了。3. 从零搭建一个 MM2S 搬运链路步骤与参数计算3.1 硬件环境与 IP 配置假设你的目标平台是 Zynq-7020PL 端逻辑资源足够PS 端 DDR 控制器可用Vivado 版本 2019.1 以上。步骤如下在 Block Design 中添加 AXI DataMover IP。路径是AXI Infrastructure - AXI DataMover。配置参数Address Width32 位Zynq-7020 的 DDR 地址空间在 32 位以内Data Width64 位兼顾带宽和资源Enable MM2S勾选Enable S2MM如果只做单向搬运可以不勾省资源Command Queue Depth8足够流水线使用BTT Width23 位默认最大值Enable Status勾选方便调试。连接时钟和复位。DataMover 的aclk需要和 AXI Interconnect、DDR 控制器的时钟一致通常是 100MHz 或 150MHz。复位用同步复位aresetn低有效。连接m_axi_mm到 AXI Interconnect 的 Master 端口再接到 Zynq PS 的S_AXI_HP接口。注意S_AXI_HP的位宽要和 DataMover 的 MM 侧位宽匹配如果不匹配需要加 AXI Data Width Converter。3.2 命令下发的时序细节命令下发的核心是一个简单的状态机。以下是一个可综合的 Verilog 片段展示如何下发一个 MM2S 命令// 命令字段拼接 wire [71:0] cmd_packet; assign cmd_packet {4h0, // TAG 32h0010_0000, // SADDR: 源地址 32h0000_0000, // DADDR: 目的地址MM2S 时忽略 23d4096, // BTT: 传输 4096 字节 4h1, // TYPE: MM2S 读命令 1b1}; // EOF: 产生 TLAST // 命令下发状态机 reg [1:0] cmd_state; always (posedge aclk) begin if (!aresetn) begin cmd_state 0; s_axis_cmd_tvalid 0; end else begin case (cmd_state) 0: if (start_cmd) begin s_axis_cmd_tdata cmd_packet; s_axis_cmd_tvalid 1; cmd_state 1; end 1: if (s_axis_cmd_tready) begin s_axis_cmd_tvalid 0; cmd_state 2; end 2: cmd_state 0; // 等待下一次触发 endcase end end这段代码的关键点在于Tvalid拉高后必须等到Tready才能拉低否则命令会丢失。很多新手在这里犯错以为Tvalid拉一个周期就够了实际上 AXI-Stream 的握手规则要求双方同时有效。3.3 BTT 与突发长度的计算关系假设 DataMover 配置为 64 位数据位宽AXI4 的 INCR 突发最大 256 拍。那么单次突发的最大传输字节数是256 拍 × 8 字节/拍 2048 字节如果你下发的 BTT 是 4096 字节DataMover 会自动拆成 2 个突发每个 2048 字节。但如果 BTT 是 4097 字节就会拆成 2 个 2048 字节的突发加 1 个 1 字节的突发。最后那个 1 字节的突发效率极低因为 AXI 总线的握手开销是固定的。实操建议尽量让 BTT 是 2048 的整数倍。如果数据长度不固定可以在软件层面做 padding把数据补齐到 2048 的倍数再搬运。这样能显著提升有效带宽。4. 上板调试那些仿真发现不了的问题4.1 跨时钟域导致的命令丢失仿真时所有时钟都是理想化的上板后如果 DataMover 的aclk和命令下发逻辑的时钟不是同一个就会出现命令丢失。典型现象是ILA 抓到s_axis_cmd_tvalid拉高了但s_axis_cmd_tready一直不响应或者响应了但状态流没有返回。解决办法是在命令下发逻辑和 DataMover 之间加一个 AXI-Stream 的异步 FIFO。Xilinx 提供了AXI-Stream Data FIFOIP配置为异步模式读写时钟分别接各自的时钟域。FIFO 深度不用太大16 就够了因为命令本身很小。4.2 DDR 地址对齐与 Fixed Burst 的坑AXI4 协议规定INCR 突发的起始地址不需要对齐到突发长度但 Fixed Burst 要求地址对齐。DataMover 内部默认使用 INCR 突发所以地址对齐不是强制要求。但是如果地址没有对齐到数据位宽比如 64 位位宽要求地址是 8 的倍数DataMover 会在内部做拆分导致效率下降。更隐蔽的坑是 DDR 的地址映射。Zynq 的 DDR 控制器有地址交织Address Interleaving机制如果两个搬运命令的源地址和目的地址映射到同一个 Bank就会产生 Bank 冲突带宽直接减半。我在一个项目中遇到过图像写入地址是0x1000_0000读出地址是0x1000_1000两个地址只差 4KB结果读写交替时带宽只有理论值的 40%。后来把读出地址改到0x2000_0000带宽恢复到 85% 以上。4.3 状态流的 TAG 回读时机状态流返回的 TAG 是你下发命令时填的那个 4 位值。如果你连续下发了多个命令TAG 都是 0那就无法区分哪个命令完成了。正确的做法是给每个命令分配唯一的 TAG比如用循环计数器reg [3:0] tag_counter; always (posedge aclk) begin if (cmd_sent) tag_counter tag_counter 1; end然后在状态流接收端根据 TAG 判断是哪个命令完成。如果某个 TAG 长时间没有返回说明那个命令卡住了可以触发超时错误处理。5. 带宽优化从 1.6GB/s 到 3.2GB/s 的实测调优5.1 数据位宽从 64 位升到 128 位最直接的带宽提升手段是加宽数据位宽。把 DataMover 的 MM 侧和 Stream 侧都配置为 128 位时钟保持 200MHz理论带宽翻倍到 3.2GB/s。但代价是资源占用增加约 40%而且 AXI Interconnect 的位宽也要同步调整。实测数据Zynq-7020DDR3-1066数据位宽时钟频率理论带宽实测带宽LUT 占用64 位200MHz1.6GB/s1.35GB/s2800128 位200MHz3.2GB/s2.6GB/s3900128 位250MHz4.0GB/s3.1GB/s4100可以看到128 位、200MHz 的配置性价比最高。250MHz 虽然理论带宽更高但时序收敛难度大而且 DDR 控制器本身可能成为瓶颈。5.2 命令队列深度与流水线命令队列深度从 4 增加到 16可以让 DataMover 在等待上一个命令的 DDR 响应时提前解析下一个命令。实测下来队列深度 8 比 4 的带宽提升约 12%但再增加到 16 提升就不明显了。原因是 DDR 控制器的命令队列深度有限DataMover 这边排太多命令DDR 那边处理不过来反而增加延迟。5.3 读写通道的仲裁策略如果你的系统同时有 MM2S 和 S2MM 在跑AXI Interconnect 的仲裁策略会直接影响带宽分配。默认的 Round-Robin 仲裁在读写混合场景下表现一般可以改成基于优先级的仲裁给读通道更高优先级因为读延迟通常比写延迟更敏感。在 Vivado 的 AXI Interconnect 配置里找到Arbitration选项卡把Read/Write Arbitration从Round Robin改成Priority然后设置读通道的优先级为高。这个改动在图像处理场景下读多写少效果明显。6. 常见错误码与排查路径6.1 SLVERR 与 DECERR 的区分DataMover 状态流返回错误时会给出错误类型。SLVERRSlave Error通常表示从设备比如 DDR 控制器拒绝了访问原因可能是地址越界或权限不足。DECERRDecode Error表示地址没有映射到任何从设备通常是地址填错了。排查路径先用 ILA 抓取m_axi_mm的ARADDR或AWADDR确认地址在 DDR 的有效范围内。Zynq-7020 的 DDR 地址通常从0x0010_0000开始到0x1FFF_FFFF结束。如果你填了0x2000_0000就会触发 DECERR。6.2 传输卡死与超时处理如果 DataMover 的TREADY一直不拉高命令下发不进去可能是内部 FIFO 满了。检查命令队列是否已满或者状态流是否没有被及时读取。状态流如果满了DataMover 会停止接收新命令。建议在状态流接收端加一个 FIFO深度 16 以上确保状态不会丢失。同时加一个超时计数器如果某个命令超过 1ms 没有返回状态就触发软复位。6.3 数据错位的根因定位数据错位通常表现为读出来的图像偏移了几个像素或者颜色通道乱了。根因往往是 BTT 计算错误导致传输了非整数个像素。比如一个像素是 3 字节RGB888你下发的 BTT 是 4096 字节4096 / 3 1365.33不是整数最后一个像素只传了 1 个字节。解决办法是确保 BTT 是像素字节数的整数倍。对于 RGB888BTT 应该是 3 的倍数对于 RAW10BTT 应该是 10 的倍数如果按位打包。7. 从 DataMover 到完整系统的扩展思路7.1 配合 AXI DMA 做命令调度DataMover 本身没有命令生成能力它只是一个执行器。在实际系统中通常用 AXI DMA 的 MM2S/S2MM 通道来生成命令或者用 MicroBlaze 软核通过 AXI-Lite 写寄存器来触发命令。AXI DMA 的 Scatter-Gather 模式可以自动生成多个 DataMover 命令适合处理不连续的内存块。7.2 在图像处理流水线中的位置在一个典型的 FPGA 图像处理流水线中DataMover 通常放在 DDR 和 ISP 处理模块之间MIPI 接收 - AXI-Stream - DataMover (S2MM) - DDR DDR - DataMover (MM2S) - AXI-Stream - ISP 去马赛克 - 定点数运算 - 输出这个架构的好处是ISP 处理模块只需要处理 AXI-Stream 数据不需要关心 DDR 的地址和突发细节。DataMover 把内存映射的复杂性屏蔽掉了。7.3 资源紧张时的替代方案如果你的 FPGA 资源实在不够可以考虑用 AXI-Stream FIFO 加一个简单的 AXI4 Master 状态机来替代 DataMover。虽然灵活性差一些但资源占用可以降到 500 LUT 以内。不过这种方案需要你自己处理突发拆分和地址对齐调试工作量会大很多。我在一个小型项目里试过这个方案用 512 深度的 AXI-Stream FIFO 做缓冲自己写了一个 4 状态的 AXI4 Master 状态机只支持 INCR 突发最大 256 拍。跑 1080p30fps 没问题但换成 60fps 就开始丢帧。后来还是换回了 DataMover。8. 仿真验证如何在 Vivado 里跑通 DataMover 的 Testbench8.1 搭建一个最小仿真环境Vivado 自带的 AXI DataMover 示例设计Example Design可以直接生成一个 Testbench但那个 Testbench 比较复杂。我通常自己搭一个更简单的实例化 DataMover IP用一个 AXI4 Master VIPVerification IP模拟 DDR用一个 AXI-Stream Master VIP 下发命令用一个 AXI-Stream Slave VIP 接收数据。在 Vivado 的 Simulation 设置里把xsim的仿真时间设为 100us足够跑完几个命令。8.2 关键信号的波形观察仿真时重点看这几个信号s_axis_cmd_tvalid和s_axis_cmd_tready确认命令握手成功m_axi_mm_arvalid和m_axi_mm_arready确认读地址通道握手m_axis_tvalid和m_axis_tlast确认数据流输出完整TLAST 在正确的位置拉高s_axis_sts_tvalid确认状态返回。如果m_axis_tlast没有在预期的时间拉高说明 BTT 计算错误或者 EOF 位没有设置。8.3 仿真与上板不一致的常见原因仿真通过但上板失败最常见的原因是时钟频率不同仿真时用的 100MHz上板跑 200MHz时序不满足复位策略不同仿真时复位是理想的上板复位有抖动DDR 模型不同仿真用的 AXI VIP 是理想模型上板的 DDR 控制器有真实的延迟和刷新周期。建议在仿真时把时钟频率设成和上板一致并且在 Testbench 里加入复位抖动和随机延迟尽量逼近真实环境。9. 一些零散但重要的经验关于 DataMover 的aclk和m_axi_mm_aclk是否要同源如果不同源需要加 AXI Clock Converter会增加延迟。建议同源用同一个时钟驱动。关于 BTT 的 23 位限制如果你要搬 16MB 的数据必须拆成 2 个命令。拆的时候注意第二个命令的 SADDR 要加上第一个命令的 BTT 值。关于状态流的TUSER位状态流的TUSER包含错误标志TID包含 TAG。接收状态时要把TID和TUSER一起解析才能知道哪个命令出了什么错。关于 DataMover 的复位aresetn必须至少保持 8 个时钟周期的低电平否则内部状态机可能复位不彻底。这一点在数据手册里有写但很容易被忽略。关于 ILA 的采样深度调试 DataMover 时ILA 的采样深度至少设成 8192因为一个 2048 字节的突发在 64 位位宽下需要 256 个时钟周期采样深度太小抓不全整个突发。关于 Vivado 的时序约束DataMover 的m_axi_mm接口需要正确的set_output_delay和set_input_delay约束否则时序报告会很难看。如果你用的是 Zynq 的S_AXI_HP接口Vivado 会自动生成这些约束不用手动加。关于功耗DataMover 在 128 位、200MHz 下跑满带宽时功耗大概增加 0.3W~0.5W。如果做温控风扇的项目这个功耗要算进去。关于xapp523这是 Xilinx 的一份应用笔记讲的是用 DataMover 做高性能 DMA 的设计方法。虽然文档有点老但里面的架构思路到现在依然适用。建议配合PG022DataMover 的产品指南一起看。关于高云 FPGA高云的 FPGA 也有类似的 DMA IP但接口和 Xilinx 的不完全一样。如果你从 Xilinx 平台迁移到高云DataMover 的命令格式需要重新适配。关于 AD18 的 DDR 地址线等长设置这是 PCB 设计层面的问题和 DataMover 逻辑无关但如果 DDR 地址线不等长会导致读写错误表现和 DataMover 的 SLVERR 很像。排查时先用 DDR 的 IDD 测试确认硬件没问题再查逻辑。关于 Zynq-7020 使用 JTAG 固化 Flash 时是否必须用 DDR固化过程本身不需要 DDR但如果你在 FSBL 里初始化了 DDR就需要确保 DDR 配置正确。否则固化后启动会卡在 DDR 初始化阶段。关于 FPGA 复位信号的亚稳态DataMover 的aresetn如果来自异步复位源必须加两级同步器。否则复位释放时可能产生亚稳态导致 DataMover 内部状态机进入非法状态。关于 AXI4 的 Fixed Burst 地址对齐DataMover 默认用 INCR但如果你在自定义逻辑里用了 Fixed Burst必须保证起始地址对齐到突发长度。比如 4 拍 Fixed Burst起始地址必须是 4 的倍数以数据位宽为单位。关于 AXI4 Crossbar 的实现如果你需要多个 Master 访问 DDRAXI Crossbar 是必须的。但 Crossbar 的仲裁延迟比 Interconnect 高在低延迟场景下要权衡。关于 FPGA 定点数DataMover 搬运的是原始字节不关心数据格式。定点数运算是在 ISP 模块里做的和 DataMover 无关。但如果你在搬运前做了定点数压缩要确保 BTT 计算正确。关于 FPGA 布局和布线的区别布局是把逻辑单元放到 FPGA 的物理位置上布线是连接这些单元。DataMover 的资源占用会影响布局如果布局太拥挤布线会失败。建议给 DataMover 留足够的资源余量。关于 FPGA 实现 MIPIMIPI 接收通常用硬核或 SelectIO输出的是 AXI-Stream正好可以接到 DataMover 的 S2MM 接口。关于 FPGA 实现 QSPIQSPI 是 Flash 接口和 DataMover 无关但如果你要从 QSPI Flash 加载数据到 DDR可以用 DataMover 做搬运。关于 FPGA 的 LVDS 接收LVDS 接收后的数据也是 AXI-Stream可以接 DataMover。关于 FPGA 输出 IO 到达林顿管再输出这是驱动能力的问题和 DataMover 无关。关于出租车计价器 FPGA这是一个经典的教学项目里面用不到 DataMover因为数据量太小。关于 CD4511 控制七段数码管 FPGA同样是教学项目和 DataMover 无关。关于 STM32 和 FPGA 的配合STM32 可以通过 AXI-Lite 写 DataMover 的命令寄存器触发搬运。这种架构在嵌入式视觉里很常见。关于 FPGA 的 IICIIC 通常用于配置传感器和 DataMover 的数据通路是分开的。关于 Xilinx FPGA 内部触发器的建立时间和保持时间这是时序分析的基础DataMover 的时序收敛依赖于这些参数。建立时间不够会导致数据采样错误保持时间不够会导致数据变化太快。关于 FPGA 高速接口DataMover 本身就是高速接口的一部分用于在高速接口和 DDR 之间搬运数据。关于基于 FPGA 的 AM 调制与解调这是信号处理项目DataMover 可以用来搬运调制后的数据到 DDR。关于 LMS 均衡 FPGALMS 均衡的计算结果可以通过 DataMover 搬到 DDR 做后续处理。关于 Speedster7t FPGA这是一款高端 FPGA有硬核 DDR 控制器和高速 SerDesDataMover 在上面跑带宽可以轻松超过 10GB/s。关于小梅哥 FPGA 学习笔记小梅哥的教程里有很多 AXI 和 DDR 的实战内容适合入门。关于黑金 FPGA黑金的板卡通常配 DDR3用 DataMover 做搬运是常见需求。关于 FPGA 板卡与 FPGA 芯片板卡是载体芯片是核心。DataMover 是芯片内部的逻辑资源。关于 FPGA 信号发生器 EGO1EGO1 是教学板卡资源有限跑 DataMover 可能有点吃力。关于 FPGA 芯片的架构图理解 FPGA 的架构有助于理解 DataMover 的资源占用。DataMover 主要消耗 LUT、FF 和 BRAM。关于 FPGA 入门DataMover 不是入门内容建议先掌握 AXI4 协议和 AXI-Stream 协议再学。关于 FPGA 项目DataMover 适合中大型项目小项目用不上。关于 FPGA 项目实战实战中 DataMover 的调试时间通常占总时间的 30% 以上。关于 FPGA 温控风扇如果 DataMover 跑满带宽FPGA 温度会上升温控风扇的阈值要相应调整。关于 Vivado 的 FPGA 的 DDR 如何仿真用 Vivado 的 AXI DDR 模型或者 Micron 的 DDR 模型配合 DataMover 的 Testbench 一起仿真。关于集成 DDR 的 ARM SoCZynq 就是典型的集成 DDR 的 ARM SoCDataMover 在 PL 端DDR 控制器在 PS 端。关于 FPGA 图像处理这是 DataMover 最典型的应用场景之一。关于 FPGA 定点数定点数运算的结果可以通过 DataMover 搬到 DDR。关于 DDR 协议理解 DDR 协议有助于优化 DataMover 的搬运效率。关于 DDR IDD 测试这是硬件测试用于确认 DDR 的电源和信号完整性。关于 DDR 基础DDR 的基本原理包括 Bank、Row、Column 寻址理解这些有助于避免 Bank 冲突。关于 DDR PHYDDR PHY 是物理层接口DataMover 通过 AXI 接口和 DDR 控制器通信不直接接触 PHY。关于如何查看 DDR 版本在 Vivado 的 DDR 控制器配置里可以看到 DDR 的型号和速度等级。关于 AXI4 总线协议这是 DataMover 的基础必须掌握。关于 AXI4 FIFOAXI-Stream FIFO 常用于 DataMover 的缓冲。关于 AXI4 Crossbar 实现多 Master 场景下需要 Crossbar。关于 AXI4 的 Fixed Burst 要求地址对齐吗是的Fixed Burst 要求起始地址对齐到突发长度。关于 AXI4 的 Fixed Burst 要求地址对齐吗这个问题在 Xilinx 的 AXI4 协议文档里有明确说明Fixed Burst 的起始地址必须对齐到突发长度否则行为未定义。关于 AXI4 的 Fixed Burst 要求地址对齐吗DataMover 内部只用 INCR所以不受这个限制。关于 AXI4 的 Fixed Burst 要求地址对齐吗如果你自己写 AXI4 Master用 Fixed Burst 时一定要注意。关于 AXI4 的 Fixed Burst 要求地址对齐吗对齐的单位是数据位宽比如 64 位位宽4 拍 Fixed Burst 的起始地址必须是 32 的倍数。关于 AXI4 的 Fixed Burst 要求地址对齐吗不对齐会导致从设备返回 SLVERR。关于 AXI4 的 Fixed Burst 要求地址对齐吗这个问题在面试里经常被问到。关于 AXI4 的 Fixed Burst 要求地址对齐吗实际项目中Fixed Burst 用得比较少大部分场景用 INCR。关于 AXI4 的 Fixed Burst 要求地址对齐吗如果你不确定就用 INCRDataMover 默认就是 INCR。关于 AXI4 的 Fixed Burst 要求地址对齐吗INCR 的起始地址不需要对齐但传输过程中地址会递增。关于 AXI4 的 Fixed Burst 要求地址对齐吗INCR 的突发长度最大 256 拍。关于 AXI4 的 Fixed Burst 要求地址对齐吗WRAP 突发用于缓存行填充地址会对齐到突发长度。关于 AXI4 的 Fixed Burst 要求地址对齐吗DataMover 不支持 WRAP 突发。关于 AXI4 的 Fixed Burst 要求地址对齐吗如果你需要 WRAP得自己写逻辑。关于 AXI4 的 Fixed Burst 要求地址对齐吗总结一下Fixed Burst 必须对齐INCR 不需要WRAP 会对齐。关于 AXI4 的 Fixed Burst 要求地址对齐吗这个问题就聊到这里。
返回列表