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

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

3天内不再提示

基于AXI DMA IP核的DDR数据存储与PS端读取

FPGA设计论坛 来源:FPGA设计论坛 2025-11-24 09:25 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Vivado工程搭建

1. 创建基础工程

新建Vivado项目,选择目标FPGA型号。

添加Zynq Processing System IP核,配置DDR控制器时钟。7000系列的Zynq可以参考正点原子DMA回环测试设置。

75e7bbd2-c750-11f0-8c8f-92fbcf53809c.png

764b10d8-c750-11f0-8c8f-92fbcf53809c.png

2. 添加AXI DMA IP核

配置AXI DMA为Simple模式。

设置数据位宽(如32/64位)和Width of Buffer Lenghth Register(26最大可以存2^26 bit)。

76ac756c-c750-11f0-8c8f-92fbcf53809c.png

3. 添加Stream Data FIFO

这里看需要设置FIFO 深度

7717e310-c750-11f0-8c8f-92fbcf53809c.png

4. 添加自定义ip用于产生数据

这里可以参考https://fpga.eetrend.com/blog/2023/100568155.html,由于工程需要,对ip进行修改,使得传输的数据位宽是16位,一共传输320*256个数据。修改位宽后re-package可能会出现报错,请自行查找解决办法。

77767cfe-c750-11f0-8c8f-92fbcf53809c.png

77d3b658-c750-11f0-8c8f-92fbcf53809c.png

5. 添加自定义ip用于产生dma_start信号

由于dma传输过程中会出现数据丢失情况,这里借鉴了以下博主的解决方法:ZYNQ踩坑日记:AXI_DMA传输问题详解——问题再续篇-物联沃-IOTWORD物联网对于vivado中使用DMA传输数据时会丢数据的解决办法_vivado dma-CSDN博客

782d02ee-c750-11f0-8c8f-92fbcf53809c.png

对数据产生ip进行了修改(右键ip->edit in packager),使得dma初始化之后再开始传输数据,避免数据丢失

788728f0-c750-11f0-8c8f-92fbcf53809c.png

在关键代码中进行如下修改:

78df97a6-c750-11f0-8c8f-92fbcf53809c.png

最后再Re-Package IP,可以参考https://cloud.tencent.com/developer/article/1813652创建并修改自定义ip。

6. 连接IP核与总线

总体block design如下

793beefc-c750-11f0-8c8f-92fbcf53809c.png

PS端软件设计(Vitis/SDK)

1. 初始化DMA

#include"xaxidma.h"#include"xparameters.h"#include"xil_cache.h"#include"xil_printf.h"#include"my_dma_start_s.h"#include"sleep.h"#defineDMA_DEV_ID   XPAR_AXIDMA_0_DEVICE_ID#defineDDR_BASE_ADDR  XPAR_PSU_DDR_0_S_AXI_BASEADDR#defineRX_BUFFER_BASE (DDR_BASE_ADDR + 0x01000000)#defineDATA_LENGTH   81920// 与 PL 端对应#defineMY_DMA_START_ADDR XPAR_MY_DMA_START_S_0_S00_AXI_BASEADDR#defineMY_DMA_OFFSET MY_DMA_START_S_S00_AXI_SLV_REG0_OFFSETintmain() {   XAxiDma AxiDma;   XAxiDma_Config *Config;  intstatus, i;   u16 *RxBufferPtr = (u16 *)RX_BUFFER_BASE;   xil_printf("---- Start DMA Receive Test ----
");   Config = XAxiDma_LookupConfig(DMA_DEV_ID);  if(!Config) {     xil_printf("No DMA config found!
");    returnXST_FAILURE;   }   status = XAxiDma_CfgInitialize(&AxiDma, Config);  if(status != XST_SUCCESS) {     xil_printf("DMA Init Failed
");    returnXST_FAILURE;   }  if(XAxiDma_HasSg(&AxiDma)) {     xil_printf("DMA configured as SG mode!
");    returnXST_FAILURE;   }  // 启动接收  status = XAxiDma_SimpleTransfer(&AxiDma, (UINTPTR)RxBufferPtr,                   DATA_LENGTH *sizeof(u16),                   XAXIDMA_DEVICE_TO_DMA);  if(status != XST_SUCCESS) {     xil_printf("DMA Receive Config Failed
");    returnXST_FAILURE;   }  //这里用于通知PL端开始发送数据  MY_DMA_START_S_mWriteReg(MY_DMA_START_ADDR,MY_DMA_OFFSET,1);   usleep(5);   MY_DMA_START_S_mWriteReg(MY_DMA_START_ADDR,MY_DMA_OFFSET,0);  // 等待DMA完成(这里简单用while轮询)while(XAxiDma_Busy(&AxiDma, XAXIDMA_DEVICE_TO_DMA));  // 失效 Cache,保证读到 DDR 最新数据  Xil_DCacheInvalidateRange((UINTPTR)RxBufferPtr, DATA_LENGTH *sizeof(u16));  // 打印接收数据for(i =0; i < DATA_LENGTH; i++) {         xil_printf("DDR[%d] = 0x%04x
", i, RxBufferPtr[i]);     }      xil_printf("---- DMA Receive Done ----
");    return XST_SUCCESS; }

2. 数据传输流程

启动debug,在return XST_SUCCESS处打断点,并查看memory中ddr的数据:

79907c60-c750-11f0-8c8f-92fbcf53809c.png

测试结果如下:

79e8dd6a-c750-11f0-8c8f-92fbcf53809c.png

ila信号如下:

7a3e6a0a-c750-11f0-8c8f-92fbcf53809c.png

可以看到结果符合要求。

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

    关注

    114

    文章

    17863

    浏览量

    195034
  • DDR
    DDR
    +关注

    关注

    11

    文章

    761

    浏览量

    69533
  • AXI
    AXI
    +关注

    关注

    1

    文章

    145

    浏览量

    18012
  • Vivado
    +关注

    关注

    19

    文章

    860

    浏览量

    71388

原文标题:基于AXI DMA IP核的DDR数据存储与PS端读取

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用AXI4接口IP进行DDR读写测试

    本章的实验任务是在 PL 自定义一个 AXI4 接口的 IP ,通过 AXI_HP 接口对 PS
    的头像 发表于 11-24 09:19 3910次阅读
    使用<b class='flag-5'>AXI</b>4接口<b class='flag-5'>IP</b><b class='flag-5'>核</b>进行<b class='flag-5'>DDR</b>读写测试

    ZYNQ SOC案例开发:AXI DMA使用解析及环路测试

    一、AXI DMA介绍 本篇博文讲述AXI DMA的一些使用总结,硬件IP子系统搭建与SDK C代码封装参考米联客ZYNQ教程。若想让ZYN
    的头像 发表于 12-31 09:52 1.1w次阅读
    ZYNQ SOC案例开发:<b class='flag-5'>AXI</b> <b class='flag-5'>DMA</b>使用解析及环路测试

    【ZYNQ Ultrascale+ MPSOC FPGA教程】第三十二章PL读写PSDDR数据

    麻烦,灵活性也比较差,本节课程讲解如何直接通过AXI总线来读写PSddr数据,这里面涉及到AXI
    的头像 发表于 01-30 09:54 1.7w次阅读
    【ZYNQ Ultrascale+ MPSOC FPGA教程】第三十二章PL读写<b class='flag-5'>PS</b><b class='flag-5'>端</b><b class='flag-5'>DDR</b><b class='flag-5'>数据</b>

    使用AXI-Full接口的IP进行DDR的读写测试

    首先对本次工程进行简要说明:本次工程使用AXI-Full接口的IP进行DDR的读写测试。在我们的DDR读写IP中,我们把读写完成和读写错误信
    的头像 发表于 07-18 09:53 7333次阅读
    使用<b class='flag-5'>AXI</b>-Full接口的<b class='flag-5'>IP</b>进行<b class='flag-5'>DDR</b>的读写测试

    一文详解AXI DMA技术

    AXI直接数值存取(Drect Memory Access,DMAIPAXI4内存映射和AXI
    的头像 发表于 04-03 09:32 2686次阅读
    一文详解<b class='flag-5'>AXI</b> <b class='flag-5'>DMA</b>技术

    有关PL利用AXI总线控制PSDDR进行读写(从机wready信号一直不拉高)

    一直拉高的。这与写数据通道好像有点区别。 我不清楚PS DDR到底发生了什么,但是和MIG就是有点不一样,通过仿真MIG核可以发现,P
    发表于 05-31 12:04

    基于E203的DMA ip的使用

    通过S00_AXI和M01_AXIDMA进行配置,而后DMA开始工作,通过M_AXI_MM2S、S00_
    发表于 10-22 06:00

    PCIE XDMA IP介绍

    结构图这是PCIE IP,主要用来发送数据,发送引擎主要负责将待发送数据按照PCIE协议组织成不同类型的TLP数据包,并发送给PCIE
    发表于 12-26 10:46

    AXI FIFO和AXI virtual FIFO这两个IP的使用方法

    DDR3 或 DDR3L。开发人员可以使用此存储器通过直接存储器访问 (DMA) 在 DDR
    发表于 11-04 11:03

    ZYNQ的ARM和FPGA数据交互——AXI交互最重要的细节

    使用AXI4_Lite)总线把数据写入RAM中,PS从RAM中读取数据。 3.PL
    发表于 11-03 10:51

    ZYNQ中DMAAXI4总线

    AXI-Lite或AXI4转接。PS与PL之间的物理接口有9个,包括4个AXI-GP接口和4个AXI-HP接口、1个
    的头像 发表于 11-02 11:27 5279次阅读
    ZYNQ中<b class='flag-5'>DMA</b>与<b class='flag-5'>AXI</b>4总线

    Xilinx FPGA里面的AXI DMA IP的简单用法

    本文以浮点数Floating-point IP将定点数转换为浮点数为例,详细讲解AXI DMA IP
    的头像 发表于 02-16 16:21 1.4w次阅读
    Xilinx FPGA里面的<b class='flag-5'>AXI</b> <b class='flag-5'>DMA</b> <b class='flag-5'>IP</b><b class='flag-5'>核</b>的简单用法

    浅析AXI DMA收发数据传输过程

    MAIP的M_AXI_MM2S接口接收到数据完成后通过mm2s_introut接口输出高电平告诉PSDMA接收
    发表于 10-11 15:16 3344次阅读

    基于AXI总线的DDR3读写测试

    本文开源一个FPGA项目:基于AXI总线的DDR3读写。之前的一篇文章介绍了DDR3简单用户接口的读写方式:《DDR3读写测试》,如果在某些项目中,我们需要把
    的头像 发表于 09-01 16:20 7778次阅读
    基于<b class='flag-5'>AXI</b>总线的<b class='flag-5'>DDR</b>3读写测试

    ZYNQ基础---AXI DMA使用

    前言 在ZYNQ中进行PL-PS数据交互的时候,经常会使用到DMA,其实在前面的ZYNQ学习当中,也有学习过DMA的使用,那就是通过使用自定义的IP
    的头像 发表于 01-06 11:13 4222次阅读
    ZYNQ基础---<b class='flag-5'>AXI</b> <b class='flag-5'>DMA</b>使用