0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么使用DMA在FPGA中的HDL和嵌入式C之间传输数据?

OpenFPGA 来源:OpenFPGA 2023-11-27 09:12 次阅读

该项目介绍了如何在 PL 中的 HDL 与 FPGA 中的处理器上运行的嵌入式 C 之间传输数据的基本结构。

08f4d728-8cbd-11ee-939d-92fbcf53809c.png

介绍

鉴于机器学习人工智能等应用的 FPGA 设计中硬件加速的兴起,现在是剥开几层“云雾”并讨论 HDL 之间来回传递数据(主要指FPGA 的可编程逻辑 (PL) 中运行的代码以及 FPGA 中的硬核或软核处理器上运行的相应软件之间传输数据)的基础知识的好时机。

硬件加速可以总结为在硬件(也称为 FPGA 的可编程逻辑)中实现某些功能的基本思想,这些功能之前在位于主机 PC 上或在 FPGA 上处理器(软核或者硬核)运行的软件。因此,要成为一名高效的设计人员,就必须掌握如何在硬件和软件之间来回传递数据的技巧。

在本例中,使用的是 Zynq SoC(片上系统)FPGA,它具有硬核 ARM 处理器。该 ARM 核心和外设称为处理系统或 PS。

虽然有几种不同的方法可以完成 PL 和 PS 之间的数据传输,包括编写自己的自定义接口,但我认为最常见的机制是通过直接内存访问 (DMA) 传输。这是因为 DMA 允许 ARM 内核的 CPU 简单地启动自身与 DDR 之间的数据传输,而 CPU 无需等待传输完成后再执行任何其他任务。DMA 还允许 CPU 启动外部设备和 DDR 之间的传输。

在此项目中,将通过使用 Xilinx DMA IP 演示 DMA 的功能,该IP可通过 AXIS 总线将内存映射接口转换为stream接口。将 32 字节写入嵌入式 C 中的内存,然后通过内存映射将其传输到 PL 到流 (MM2S) AXIS,通过寄存器处理每个值,然后通过流将数据传输回内存DMA IP 的内存映射 (S2MM) 端口

虽然这个示例对于重型硬件加速应用来说过于简单,但当刚接触 FPGA 时,这种高速数据传输水平可能会变得非常复杂/难以学习。该项目重点介绍 DMA 的使用及其行为。虽然打算让这个项目更多地关注数据处理方面,但在 DMA 事务实现中发现了很多小“陷阱”,因此不得不将数据处理重点留给另一个项目。

0918b17a-8cbd-11ee-939d-92fbcf53809c.png

使用 AXI DMA 控制 PL 中的 HDL 与 PS 中的 C 代码之间的数据传输有两个主要层:

Memory Map to Stream (MM2S) 和 Stream to Memory Map (S2MM) 通道上 PL 的 HDL 代码中的 AXI 流握手信号(DMA 的控制通道是使用普通 AXI 写入的,但这就是全部由 Vivado 自动处理,因此在这里只关注 AXI stream接口)。

PS 的 C 代码中寄存器读/写 DMA 的顺序。

Verilog 中的 AXI-Stream握手

AXI stream接口使用一组简单的握手信号机制,用于嵌入式设计中的数据交换。AXI stream接口中有许多可选信号,但与 DMA MM2S 和 S2MM 数据交换相关且必需的信号是 tdata、tvalid、tready、tlast 和 tkeep。AXI stream中发送数据为主接口,接收数据为从接口。

tdata:数据总线

tvalid:当放置在 tdata 总线上的数据有效时,由主接口置位

tredy:当从机处于准备接收 tdata 总线上的数据的状态时,由从机置位

tlast:由主设备在 tdata 总线上流中最后一个数据包的持续时间内断言,以告诉从设备该数据包之后不会有数据

tkeep:由主设备设置的 tdata 总线上数据包的二次验证,指示数据包是否是流的一部分

AXI DMA IP 究竟如何实现此握手接口将数据传输出内存 (MM2S) 并传输到内存 (S2MM),这一点非常变化无常,尤其是在 S2MM 方面……

然而,我们首先需要了解的是有关 AXI DMA 的 S2MM 事务的信息,大部分可以总结为一句话:必须设置 S2MM 事务,并且在尝试向 DMA 发送任何数据之前,以适当的顺序写入 DMA 中的适当控制寄存器来启动事务,一旦 S2MM 通道看到 tlast 信号,它就会停止事务。

数据传输发生在每个时钟周期的 S2MM 和 MM2S 事务中的 tdata 总线上,其中tready 和 tvalid 均被置位(true)。因此,当负责断言 tvalid 时,在 AXI 接口的主端必须小心,当从从机传入的 trety 信号也为 tvalid 断言时,不要让 tvalid 断言超过一个时钟周期。否则,从设备将在同一个数据包计时两次,作为两个单独的数据包。并且因为必须在控制寄存器中指定传输中有多少字节,所以 DMA 通道(在本例中为 S2MM)会在看到提供 tlast 信号之前认为交换已结束,因为计数已关闭。

092c285e-8cbd-11ee-939d-92fbcf53809c.png

我用 Verilog 编写了一个简单的状态机,它实现了一个从 AXI stream接口来从 DMA 的 MM2S 通道接收数据,通过寄存器传递stream中的每个数据包,然后实现一个主 AXI strean接口来将数据流发回到S2MM通道。来自 tdata 总线的数据通过的寄存器旨在充当占位符,用于为硬件加速进行任何自定义数据处理。

从 Vivado 中的 ILA 中截取了一张屏幕截图,显示使用状态机实现的时序图。顶部是 MM2S 侧,底部是 S2MM 侧。

这是 Verilog 状态机的流程图,实际文件附在本文末尾。值得注意的是,流程图中的主/从接口是从 Verilog 状态机的角度来看的。

0947dc20-8cbd-11ee-939d-92fbcf53809c.png

对于 DMA IP 的具体设置,因为在直接寄存器模式下使用 DMA,所以未选中分散收集选项。然后,将其他所有设置保留为默认设置,并选中允许未对齐传输的选项,我发现在将自定义 AXI 流接口写入 DMA 时,这给了更多的自由空间。

09588b88-8cbd-11ee-939d-92fbcf53809c.png

为了将 Verilog 状态机添加到模块设计中,我右键单击模块设计的空白区域,然后选择“添加模块...”选项,该选项将显示 Vivado 可以在设计源中找到的所有有效 Verilog 模块在BD中使用的文件。

09759c28-8cbd-11ee-939d-92fbcf53809c.png

值得注意的是,信号命名约定分别遵循从接口和主接口的“s_axis”和“m_axis”标准。

0996099a-8cbd-11ee-939d-92fbcf53809c.png

DMA 寄存器读/写控制序列

以下是裸机使用 DMA 时更简单的顺序:

1.通过将 1 写入 MM2S(偏移量 0x00)和 S2MM(偏移量 0x30)控制寄存器的位 2 来复位 DMA。

2.将 S2MM 通道要写入数据的 DDR 中位置的目标地址写入 S2MM DMA 目标地址寄存器(偏移量 0x48)。

3.通过将 1 写入 S2MM 控制寄存器(偏移量 0x30)的位 0 来启动 DMA S2MM 通道。

4.通过将 S2MM 通道上要读入内存的总字节数值写入 S2MM 缓冲区长度寄存器(偏移量 0x58),写入 S2MM 通道缓冲区的长度。这将启动 S2MM 传输,以便 DMA 准备好从 FPGA 逻辑中的设备接收数据流(直到实际馈送数据并且 AXI 流总线上的 tvalid 由 FPGA 逻辑中的设备断言后,该过程才会真正启动)逻辑)。

5.将 MM2S 通道要读取的数据的 DDR 中的源地址写入 MM2S DMA 源地址寄存器(偏移量 0x18)。

6.通过将 1 写入 MM2S 控制寄存器的位 0(偏移量 0x00)来启动 DMA MM2S 通道。

7.通过将要发送的总字节数值写入 MM2S 传输长度寄存器(偏移量 0x28),写入 MM2S 通道的传输长度。这将启动从 DMA 到 FPGA 逻辑中的接收设备的 MM2S 传输。

还记得之前提到过,在 PL 中的设备尝试向 S2MM 通道发送数据之前,必须启动并运行 S2MM 通道吗?嗯,这就是为什么要按顺序执行上述步骤。步骤 2 - 4 配置并启动 S2MM 通道,步骤 5 - 7 配置并启动 MM2S 通道。

在步骤 4 和 5 之间发生一些其他进程是可以的,但步骤 2 - 4 必须在步骤 5 - 7 之前发生。执行步骤 4 后,S2MM AXI 流通道将断言其 Tready 信号,此时 HDL 代码可以开始向其发送数据。

这也解释了当我第一次开始使用 DMA 时,在 SDK/Vitis 中的示例 DMA 项目中注意到的一些事情。总是认为示例代码似乎是在使用 MM2S - XAXIDMA_DMA_TO_DEVICE 传输从 DDR 中写入任何内容之前尝试将数据拉入 DDR(通过首先执行 S2MM - XAXIDMA_DEVICE_TO_DMA 传输)。然而,S2MM 通道必须准备好并等待接收数据才能正常工作并且不会锁定。

在 FPGA 设计中,DMA 似乎是一种棘手的入门方法,但一旦你弄清楚它就会非常有帮助。







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21331

    浏览量

    593307
  • 嵌入式
    +关注

    关注

    4984

    文章

    18300

    浏览量

    288656
  • HDL
    HDL
    +关注

    关注

    8

    文章

    324

    浏览量

    47107
  • 片上系统
    +关注

    关注

    0

    文章

    160

    浏览量

    26412
  • dma
    dma
    +关注

    关注

    3

    文章

    536

    浏览量

    99076

原文标题:使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之间传输数据

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于 DSP-dMAX 的嵌入式 FIFO 数据传输系统设计

    大量的CPU开销,很多高速的数据采集和处理,将降低系统的整体性能。为此,采用dMAX实现嵌入式FIFO数据传输克服异步
    发表于 07-25 09:13

    FPGA嵌入式系统的区别

    ,都要了解基础的原件的构造。那就从这几个方面来说吧.代码:FPGA要的是HDL语言,(本人用的是verilog)以前学习嵌入式的时候用的是C语言,刚开始发现这两种语言还是挺像的,在网上
    发表于 10-12 20:18

    嵌入式开发,你是如何理解嵌入式C编程的?

    `本文来探讨嵌入式开发嵌入式C编程,看看跟您理解的一样吗?一、新手常常问的一个问题:C语言和嵌入式
    发表于 03-22 09:38

    FPGA嵌入式系统设计的理想选择

    /C++语言实现嵌入式系统软硬件功能开发,SDAccel则是一款基于OpenCL开发框架的设计工具。由此可见FPGA/SoC供应商已经花费大量的精力来优化器件并且完善开发工具,使它们更易于应用到
    发表于 07-30 18:38

    为什么说嵌入式系统设计采用FPGA是理想的选择?

    作者:Steve Leibson ,编译:stark随着消费电子、物联网等领域的不断发展,用户需求也越来越复杂和多样,因此我们嵌入式系统设计必须选择合适的处理器(SoC)系统,当然我们也需要考虑
    发表于 07-31 09:59

    基于FPGA嵌入式以太网接口硬件设计

    FPGA芯片EP2C35嵌入了32位的NIOS II处理器。由于LAN91C111是专为嵌入式
    发表于 06-04 05:00

    一种嵌入式系统用于多媒体实时数据的网络传输设计

    (内存管理单元),很适合于许多低端的、没有MMU的嵌入式处理器。本文设计了一种嵌入式系统用于多媒体实时数据的网络传输。ARM内核处理器与嵌入式
    发表于 06-19 05:00

    FPGA嵌入式系统设计

    Hezi SaarFPGA是今天许多要求最严苛的嵌入式系统设计的重要元件。由于FPGA器件的价格大幅下跌,加上为设计人员带来的便利性和灵活性,FPGA
    发表于 07-04 06:22

    如何设计嵌入式FIFO数据传输系统?

    嵌入式设备由于具有硬件可在线配置,实现灵活等特点,使得其应用越来越广泛。尤其基于FPGA的硬件系统应用较多,目前许多产品
    发表于 08-08 07:03

    FPGA嵌入式测试系统的利与弊

    FPGA嵌入式测试系统的优势是什么?FPGA嵌入式
    发表于 05-06 07:19

    工作职业是选择嵌入式还是FPGA

    的一部分,它是一个控制程序存储ROM嵌入式处理器控制板。事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些
    发表于 09-22 14:38

    浅析MATLAB和Simulink嵌入式视觉应用

    中选择一种,快速开始 MATLAB 和 Simulink 之间接收和发送真实数据,并从您的算法自动生成可执行文件,嵌入式硬件平台上运行。
    发表于 12-04 08:00

    浅析嵌入式FPGAHDL硬件描述语言

    嵌入式FPGA (现场可编程逻辑门阵列)FPGA(Field Programmable Gate Array)是PAL、GAL等可编程器件的基础上进一步发展的产物。它是作为专用集成电
    发表于 12-22 07:39

    tftp嵌入式设备和主机之间传输文件的方法

    tftp嵌入式设备和主机之间传输文件的方法
    发表于 12-23 07:14

    DMA2D嵌入式图形开发的可以发挥的作用是什么

    DMA2D嵌入式图形开发的可以发挥的作用是什么
    发表于 02-09 07:48