Xilinx 实用IP推荐之“AXI-MCDMA”
接着上一篇文章今天继续给大家推荐一个挺好用的IPAXI-MCDMA下面我依旧是将会从它是啥他能干啥怎么使用这几个方面去介绍它能让你对这个IP有个清晰的了解。一.IP介绍1.1什么是AXI-MCDMAAXI MCDMA多通道直接内存访问是 AMD/Xilinx 提供的一款软核 IP用于在基于 AXI 总线的高性能系统中高效管理数据搬运。其主要特性与作用可归纳为以下三点1作为物理桥梁MCDMA 是连接 AXI 内存映射子系统如 DDR 内存与 AXI 流式子系统如以太网 MAC、ADC/DAC 等外设之间的关键媒介承担两者之间的数据传输任务。2作为多通道引擎与传统单通道或双通道 DMA 不同MCDMA 支持最多双向各 16 个独立通道并具备全双工及分散-聚集功能可同时处理多路数据流显著提升系统的并发传输能力。3作为硬件卸载器MCDMA 的核心目标是接管原本由 CPU 负责的大规模、重复性数据搬运工作从而大幅减轻 CPU 负载使其能够更专注于上层业务逻辑与计算任务。综上AXI MCDMA 通过其多通道与分散-聚集机制为高速流式外设提供了高带宽、低开销的数据传输解决方案有效提升了系统整体效率与实时性。1.2 它的主要作用是什么多路数据并发与调度MCDMA内置通道调度器可依据用户配置采用严格优先级或加权轮询机制灵活分配带宽保障关键数据的优先传输。非连续内存的高效搬运借助内置的分散-聚集引擎MCDMA能够自动解析内存中的描述符链表。该机制允许数据在非连续的内存空间中存储硬件可依据描述符将分散的数据块聚合为连续数据流或将数据流拆分写入多个离散的内存区域。基于标识的路由机制在通过AXI4-Stream接口接收或发送数据时MCDMA可识别数据包中的TDEST信号。结合外部包过滤逻辑可实现将不同通道的数据准确路由至指定的内存缓冲区。灵活的时钟与中断管理MCDMA支持同步与异步时钟域设计适应复杂系统芯片架构同时提供通道级独立中断功能便于软件进行精细化的任务响应与管理。1.3使用范围与应用场景AXI网络交换/路由利用 TDEST 字段将不同流的数据包路由到不同的内存缓冲区。替代多实例 AXI DMA在需要大量数据通道的系统中使用单个 MCDMA 实例比使用多个 AXI DMA 实例更节省资源且管理更方便。高性能计算在需要频繁搬运不连续内存数据块的场景中利用 Scatter/Gather 功能提高效率二、IP使用实操2.1IP详细介绍1:MM2S 通道的配置选项也就是数据从 DDR 读取数据并通过 AXI4-Stream发送到PL侧Number of Channels: 通道数量,设置 MM2S 方向的独立通道数范围 1-16.Memory Map Data Width:内存映射数据宽度,设置 AXI4 读数据总线的位宽Stream Data Width: STREAM流数据宽度,设置 AXI4-Stream 主接口的数据位宽.Max Burst Size: 最大突发大小这是AXI数据传输中的概念,设置 AXI4 侧突发传输的粒度即每次突发传输的最大数据量2:同1只不过方向是S2MM。3:这是AXI4协议里的非对齐传输也就是起始地址与突发传输位宽对齐这个对齐与否取决于突发传输的宽度而不是总线的位宽即主机会补充相关吴小伟使得数据对齐地址。4队列调度多通道仲裁种类当通道数 1 时决定多通道数据发送的优先级和顺序。Strict Priority(严格优先级)通道 0 优先级最高依次递减。高优先级通道有数据时低优先级通道必须等待。WRR(加权轮询)按设定的权重比例发送数据包很多互联桥都是默认使用该模式比较通用的仲裁方式。WRR-FD(加权轮询-公平分布)类似 WRR但分布更均匀。Programmable(可编程)可在运行时通过寄存器动态切换上述模式。5启用异步时钟:是否允许各接口使用不同时钟异步模式MM2S、S2MM、SG Scatter Gather和 Lite 接口可以各自独立时钟。适合高性能设计但需注意跨时钟域问题。6增加额外的 AXI4-Stream 接口用于传输用于自定义数据启用该选项后IP会新增两个端口分别是Control Stream在 MM2S 方向随数据包发送用户定义的控制信息如视频包头。Control Stream在 MM2S 方向随数据包发送用户定义的控制信息如视频包头。7在状态流中使用接收长度需先启用 Control/Status Stream这个选项允许接收端S2MM通过状态流告知 IP 核数据包的确切长度。8缓冲区长度寄存器宽度设置描述符BD中长度字段的有效位数这个选项决定了单次传输的最大字节数。例如设为 26最大支持约 64MB 的单描述符传输。9设置物理地址总线的宽度DDR内存根据系统DDR大小选择。32 位地址支持 4GB若DDR更大或使用高端地址需选择 64 位。1:启用单 AXI4 数据接口合并 MM2S 和 S2MM 的 AXI4 接口勾选后IP 核对外只呈现一个 AXI4 数据接口读写复用也就是与DDR连接只有一个AXI4的接口没有对内存的S2MM和M2SS的接口了但是对用户侧的S2MM和M2SS还是存在的这个选项简化了与内存控制器的连接。2:将 16 个通道分配给 6 个不同的组在多核系统如 ARM MPSOC中将特定通道分配给特定 CPU 核监控。例如Group 1 分配给 CPU0 监控通道 0-7Group 2 分配给 CPU1 监控通道 8-15。这个功能是MCDMA比较重要的功能在这里需要详细说明一下当你启用通道分组后MCDMA 的寄存器空间会发生变化:MM2S 侧在偏移地址 0x440 到 0x454 处会出现 MM2S Channel Observer 1 到 6 的寄存器。S2MM 侧在偏移地址 0x940 到 0x954 处会出现 S2MM Channel Observer 1 到 6 的寄存器。如果你的 PL 逻辑需要读取这些寄存器来判断“是否有数据包到达”你必须知道这些寄存器只反映特定组内通道的状态而不是所有 16 个通道。你可以将 Group 1 的完成状态连接到 CPU0 的中断线将 Group 2 的状态连接到 CPU1 的中断线。这样PL 侧的逻辑实际上起到了一个“中断过滤器”的作用只有属于该组的通道事件才会触发对应的 CPU 中断。分组前分组后简单点说你可以把 Channel Grouping 想象成一个 “对讲机频道分配”16个通道 就像是 16 个人在说话。6个组 就像是 6 个不同的频道频道 A、频道 B...。PL 侧的逻辑M2SS/CPUS2MM 就像是监听者。如果没有分组监听者PL Logic必须听所有 16 个人的对话然后自己在脑子里过滤出“哪些是找我的”。有了分组你可以把特定的几个人通道分配到特定的频道Group。监听者PL Logic只需要调到自己负责的那个频道读取对应的 Observer Register就只能听到这几个人的声音完全忽略了其他人。2.2IP使用方法由于进行的是demo测试因此在ps侧选择了xilinx的Sdk的例程xmcdma_polled_example下面对example的ps代码进行一下解析图 1 xmcdma_polled_example主函数截图整套SDK的流程展示了一个标准的 Scatter-Gather (SG) Interrupt 模式的 MCDMA 完整生命周期读硬件参数 - 建 TX 链表 - 建 RX 链表并启动硬件 - 发数据 - 等中断完成校验数据。读硬件参数:这是ps对设备常用的初始化方式属于xilinx比较通用的步骤通过设备 ID 查找 Vivado 生成的硬件配置信息如基地址、通道数、是否支持 DRE 等并初始化软件控制结构体 AxiMcdma。同时读取硬件实际配置的通道数量 num_channels为后续的多通道配置做准备。建 TX\RX链表1)调用 TxSetup 函数为所有发送通道执行以下操作A:屏蔽中断调用 XMcDma_ChanBdCreate 在内存中构建发送 BD 环形链表。B:循环调用 XMcDma_ChanSubmit 将发送缓冲区挂载到 BD 上并处理 64 字节内存对齐。C:配置中断合并机制Coalesce Delay。D:注册发送完成/错误回调函数初始化 GIC 中断控制器并开启中断。(注发送通道在此阶段只准备 BD 链不立即触发硬件发送)2)调用 RxSetup 函数流程与 TX 类似但有一个最关键的差异A:构建接收 BD 环形链表挂载接收缓冲区处理对齐和 Cache Invalidate。B:注册接收完成/错误回调函数配置并开启中断。C:调用 XMcDma_ChanToHw这一步会将 Tail Descriptor 写入 MCDMA 硬件寄存器真正触发 S2MM 引擎启动使其开始抓取 BD 并等待 PL 侧发来的数据。发数据在接收端已经准备就绪处于 Idle/Running 等待状态后调用 SendPacket。该函数会将实际要发送的数据写入 TX_BUFFER_BASE刷新 Cache然后调用底层的提交函数将数据推给 MCDMA 硬件触发 MM2S 引擎开始向 PL 侧发送数据.轮询等待中断完成进入主循环等待。由于前面配置了中断当 MCDMA 完成数据搬运后会触发中断服务函数ISR在 ISR 中会更新全局标志位如 RxDone 和 Error。主循环通过检查这些标志位确认所有通道的数据是否都已成功接收且无错误。如果条件满足则退出循环测试通过。在本次测试框架中使用的芯片是ZYNQ7100工程的BD框图如下图最终测试是对数据进行打印结果是顺序数符合测试结果由于xilinx的例程是要求把S2MM和M2SS直连便于对数据进行校验但是我把S2MM用自己写的数据源模块进行数据填充并在数据校验阶段加入了数据打印三、总结这个IP是AMD生态中用于高性能数据搬运的核心 IP单个MCDMA 最多可支持 16 个独立的 MM2S和 16 个独立的 S2MM通道。它能在单一 IP 实例内处理多个数据流的路由和描述符分发完美替代了传统设计中需要例化多个 AXI DMA 实例的方案大幅节省了 FPGA 逻辑资源。但是在使用中还是要注意TDEST和TLAST信号的重要性。这个IP在大带宽多数据流的场景中使用的是比较频繁的特别是在高速数据存储信号采集高速网络数据分析等不同场景中都有比较精彩的发挥

相关新闻