ZYNQ通过AXI DMA实现PL发送连续大量数据到PS DDR

硬件:ZYNQ7100
软件:Vivado 2017.4、Xilinx SDK 2017.4
  ZYNQ PL 和 PS 的通信方式有 AXI GPIO、BRAM、DDR等。对于数据量较少、地址不连续、长度规则的情况,BROM 比较适用。而对于传输速度要求高、数据量大、地址连续的情况,比如 ADC,可以通过 AXI DMA 来完成。

1、硬件设计

1.1 ZYNQ7 Processing System IP核

  选中 M AXI GP0 和 S AXI HP0
在这里插入图片描述  选中 PL 到 PS 的中断端口
在这里插入图片描述其他按开发板要求配置。

1.2 AXI Direct Memory Access IP核

  AXI Direct Memory Access IP核配置如下图所示。由于只需要 PL 向 PS 的 DDR写数据,所以只使能了写通道。
在这里插入图片描述

1.3 AXI4-Stream Data FIFO IP核

  AXI4-Stream Data FIFO IP核用于缓存数据,它的接口按照 AXI4-Stream 协议通信,它的配置如下图所示。
在这里插入图片描述

1.4 连续数据生成模块

   编写一个生成连续数据的模块,它在接收到一个触发信号上升沿后,按 AXI4-Stream 协议输出连续数据。

module dma_frame_gen #(parameter TRANS_NUM = 32'd1550336 //1514*1024)(input resetn,input clk,input trans_start,// axi-streamoutput [31:0] m_axis_tdata,output [3:0] m_axis_tkeep,output m_axis_tlast,output m_axis_tvalid,input m_axis_tready);assign m_axis_tkeep = 4'b1111;
reg trans_start_0, trans_start_1;
wire pos_trans_start;
assign pos_trans_start = trans_start_0 & (~trans_start_1);
always @(posedge clk or negedge resetn) beginif(~resetn) begintrans_start_0 <= 1'd0;trans_start_1 <= 1'd0;endelse begintrans_start_0 <= trans_start;trans_start_1 <= trans_start_0;end
end
localparam IDLE = 2'b00;
localparam TRANS = 2'b01;
localparam DONE = 2'b10;
reg [1:0] state;
reg [31:0] trans_cnt;
reg [31:0] r_tdata;
reg r_tvalid, r_tlast;
always @(posedge clk or negedge resetn) beginif(!resetn) beginstate <= IDLE;r_tdata <= 32'd0;r_tvalid <= 1'b0;endelse beginr_tdata <= 32'd0;r_tvalid <= 1'b0;case(state)IDLE: beginif(pos_trans_start && m_axis_tready) beginstate <= TRANS;endelse beginstate <= IDLE;endendTRANS: beginif(trans_cnt < TRANS_NUM) beginstate <= TRANS;r_tvalid <= 1'b1;r_tdata <= trans_cnt;endelse beginstate <= DONE;endendDONE: beginstate <= IDLE;enddefault: beginstate <= IDLE;endendcaseend
end
always @(posedge clk or negedge resetn) beginif(!resetn) beginr_tlast <= 1'b0;endelse beginif(state == TRANS && trans_cnt == TRANS_NUM-1) beginr_tlast <= 1'b1;endelse beginr_tlast <= 1'b0;endend
end
always @(posedge clk or negedge resetn) beginif(!resetn) begintrans_cnt <= 0;endelse beginif(state == TRANS) begintrans_cnt <= trans_cnt + 1;endelse begintrans_cnt <= 32'd0;endend
end
assign m_axis_tdata = r_tdata;
assign m_axis_tlast = r_tlast;
assign m_axis_tvalid = r_tvalid;
endmodule

   把此模块添加到 block design 里,软件能自动识别 AXI4-Stream 端口。
在这里插入图片描述

1.5 block design整体设计

  block design整体设计如下图所示,主要的数据通路用橙色线表示。dma_frame_gen 的 m_axis 端口连接 AXI4-Stream Data FIFO 的 S_AXIS 端口,AXI4-Stream Data FIFO 的 M_AXIS 端口连接 AXI DMA Memory Access 的 S_AXIS_S2MM 端口,AXI DMA Memory Access 的 M_AXI_S2MM 端口连接 AXI SmartConnect 的 S00_AXI 端口,AXI SmartConnect 的 M00_AXI 端口连接 ZYNQ7 Processing System 的 S_AXI_HP0 端口。
在这里插入图片描述

2、软件设计

2.1 AXI DMA 初始化和 DMA 中断函数
void axi_dma_init()
{XAxiDma_Config *axi_dma_cfg_ptr;axi_dma_cfg_ptr = XAxiDma_LookupConfig(XPAR_AXIDMA_0_DEVICE_ID);XAxiDma_CfgInitialize(&axi_dma_0_inst, axi_dma_cfg_ptr);// interruptXScuGic_SetPriorityTriggerType(&scugic_inst, XPAR_FABRIC_AXIDMA_0_VEC_ID, 0xA0, 0x3);XScuGic_Connect(&scugic_inst, XPAR_FABRIC_AXIDMA_0_VEC_ID, (Xil_InterruptHandler) axi_dma_rx_intr_handler, &axi_dma_0_inst);XScuGic_Enable(&scugic_inst, XPAR_FABRIC_AXIDMA_0_VEC_ID);XAxiDma_IntrEnable(&axi_dma_0_inst, XAXIDMA_IRQ_ALL_MASK, XAXIDMA_DEVICE_TO_DMA);
}
void axi_dma_rx_intr_handler(void *CallBackRef)
{int timeout;u32 irq_status;XAxiDma *axidma_inst = (XAxiDma *)CallBackRef;irq_status = XAxiDma_IntrGetIrq(axidma_inst, XAXIDMA_DEVICE_TO_DMA);XAxiDma_IntrAckIrq(axidma_inst, irq_status, XAXIDMA_DEVICE_TO_DMA);if ((irq_status & XAXIDMA_IRQ_ERROR_MASK)){
//		error = 1;XAxiDma_Reset(axidma_inst);timeout = 10000;while(timeout){if (XAxiDma_ResetIsDone(axidma_inst)) break;timeout--;}return;}if ((irq_status & XAXIDMA_IRQ_IOC_MASK)){dma_rx_done = 1;}
}
2.2 初始化中断
void interrupt_init()
{XScuGic_Config *intc_cfg_ptr;intc_cfg_ptr = XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID);XScuGic_CfgInitialize(&scugic_inst, intc_cfg_ptr, intc_cfg_ptr->CpuBaseAddress);Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, &scugic_inst);Xil_ExceptionEnable();
}
2.3 初始化 AXI GPIO
void axi_gpio_init()
{XGpio_Initialize(&axi_gpio_0_inst, XPAR_GPIO_0_DEVICE_ID);XGpio_SetDataDirection(&axi_gpio_0_inst, 1, 0x01);
}
2.4 main 函数

  在 main 函数中先执行中断、AXI GPIO 和 AXI DMA 的初始化函数,然后 AXI GPIO 输出一个信号上升沿触发 dma_frame_gen 模块输出连续数据,XAxiDma_SimpleTransfer 函数触发一次 DMA 传输,Xil_DCacheFlushRange 函数刷新 Data Cache。DMA 传输完成后触发 DMA 中断,如果 DMA 传输成功,dma_rx_done 在 DMA 中断中置 1。

int main()
{int status;FIL fil;volatile int rec_data[BUF_SIZE] = {0};interrupt_init();axi_gpio_init();axi_dma_init();XGpio_DiscreteWrite(&axi_gpio_0_inst, 1, 0x01);XAxiDma_SimpleTransfer(&axi_dma_0_inst, (UINTPTR) rec_data, BUF_SIZE*sizeof(int), XAXIDMA_DEVICE_TO_DMA);XGpio_DiscreteClear(&axi_gpio_0_inst, 1, 0x01);Xil_DCacheFlushRange((UINTPTR) rec_data, BUF_SIZE*sizeof(int)); //刷新Data Cachewhile(!dma_rx_done);return 0;
}

3、上板验证

  用 Debug 模式运行程序,在 main 函数的 return 0; 行放断点,当程序运行到断点处时,看 rec_data 中存的是从 0 到 BUF_SIZE-1 的连续数值,实验成功。
在这里插入图片描述在这里插入图片描述
  dma_frame_gen 的 m_axis 端口输出波形如下图所示。
在这里插入图片描述

  AXI4-Stream Data FIFO 的 M_AXIS 端口输出波形如下图所示。
在这里插入图片描述

  AXI DMA Memory Access 的 M_AXI_S2MM 端口的写通道波形如下图所示。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/137896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Azure 机器学习 - 使用自动化机器学习训练计算机视觉模型的数据架构

目录 一、用于训练的数据架构图像分类&#xff08;二进制/多类&#xff09;多标签图像分类对象检测实例分段 二、用于联机评分的数据架构输入格式输出格式图像分类&#xff08;二进制/多类&#xff09;多标签图像分类对象检测实例分段 在线评分和可解释性 (XAI) 的数据格式支持…

传输层中的TCP和UPD协议

一)应用层协议简介:根据需求明确要传输的信息&#xff0c;明确要传输的数据格式&#xff1b; 应用层协议:这个协议&#xff0c;实际上是和程序员打交道最多的协议了 1)其它四层都是操作系统&#xff0c;驱动&#xff0c;硬件实现好了的&#xff0c;咱们是不需要管 2)应用层:当我…

动态通讯录及程序保存在文件中

目录 一、结构体改造及增容函数 1.结构体部分 2.初始化函数及增容函数 二、信息添加及销毁和排序 1.信息添加函数&#xff08;Add&#xff09; 2.销毁函数&#xff08;Destroy&#xff09; 3.排序部分&#xff08;qsort&#xff09; 三、通讯录信息保存 1.保存在文件中…

Flutter笔记:光影动画按钮、滚动图标卡片组等

Flutter笔记 scale_design更新&#xff1a;光影动画按钮、滚动图标卡片组 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263…

SpringData、SparkStreaming和Flink集成Elasticsearch

本文代码链接&#xff1a;https://download.csdn.net/download/shangjg03/88522188 1 Spring Data框架集成 1.1 Spring Data框架介绍 Spring Data是一个用于简化数据库、非关系型数据库、索引库访问&#xff0c;并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快…

成集云 | 英克对接零售O2O+线上商城 | 解决方案

方案介绍 零售O2O线上商城是一种新型的商业模式&#xff0c;它通过线上和线下的融合&#xff0c;提供更加便捷的购物体验。其中&#xff0c;O2O指的是线上与线下的结合&#xff0c;通过互联网平台与实体店面的结合&#xff0c;实现线上线下的互动和协同。线上商城则是指通过互…

Git的进阶操作,在idea中部署gie

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《git》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这…

[工业自动化-9]:西门子S7-15xxx编程 - PLC主站 - 信号量:模拟量

目录 前言&#xff1a; 一、模拟量模块 1.1 概述 1.2 安装 1.3 模拟量链接线 二、模拟量常见问题 2.1 两线制、四线制&#xff08;电流&#xff09; 2.2 模拟量模块的参数 2.3 差分信号与单端信号 三、如何防止电磁干扰 3.1 概述 3.2 工业现场的电磁干扰源来源 3.…

Hive3 on Spark3配置

1、软件环境 1.1 大数据组件环境 大数据组件版本Hive3.1.2Sparkspark-3.0.0-bin-hadoop3.2 1.2 操作系统环境 OS版本MacOSMonterey 12.1Linux - CentOS7.6 2、大数据组件搭建 2.1 Hive环境搭建 1&#xff09;Hive on Spark说明 Hive引擎包括&#xff1a;默认 mr、spark、…

IP行业API助力于网络分析和数据挖掘

引言 在当今数字化时代&#xff0c;数据成为了企业、科研机构和政府决策者的重要资源&#xff0c;而IP行业API则成为了数据分析及挖掘的工具之一。IP行业API是一种能够查询IP地址所属的行业分类信息的应用程序接口&#xff0c;它能够提供在网络分析、用户行为分析及大数据挖掘…

ChatRule:基于知识图推理的大语言模型逻辑规则挖掘11.10

ChatRule&#xff1a;基于知识图推理的大语言模型逻辑规则挖掘 摘要引言相关工作初始化和问题定义方法实验 摘要 逻辑规则对于揭示关系之间的逻辑联系至关重要&#xff0c;这可以提高推理性能并在知识图谱&#xff08;KG&#xff09;上提供可解释的结果。虽然已经有许多努力&a…

【LeetCode刷题笔记】堆和优先级队列

358. K 距离间隔重排字符串 解题思路: 大根堆 + 队列 , 1)首先 计数数组 统计 每个字符出现的次数 ,然后将 计数 > 0 的 字符 和 次数 一起放入 大根堆 ,大根堆中

高阶组件和Hooks

目录 1. 高阶组件&#xff08;Higher-Order Components&#xff09; 1.1 创建高阶组件 1.2 使用高阶组件 2. Hooks 2.1 使用useState Hook管理状态 2.2 创建自定义Hook 结论 1. 高阶组件&#xff08;Higher-Order Components&#xff09; 高阶组件是一个接受一个组件作为…

【Bug】Python利用matplotlib绘图无法显示中文解决办法

一&#xff0c;问题描述 当利用matplotlib进行图形绘制时&#xff0c;图表标题&#xff0c;坐标轴&#xff0c;标签中文无法显示&#xff0c;显示为方框&#xff0c;并报错 运行窗口报错&#xff1a; 这是中文字体格式未导入的缘故。 二&#xff0c;解决方案 在代码import部…

在 Arduino IDE 2.0 中安装 ESP32 板(Windows、Mac OS X、Linux)

有一个新的 Arduino IDE——Arduino IDE 2.0&#xff08;测试版&#xff09;。在本教程中&#xff0c;您将学习如何在 Arduino IDE 2.0 中安装 ESP32 板并将代码上传到板。本教程与 Windows、Mac OS X 和 Linux 操作系统兼容。 据 Arduino 网站称&#xff1a;“ Arduino IDE 2.…

vscode调试react 最初的源码

如果直接在react项目中打点调试, 调试的是 react-dom.development.js, 而源码里这些逻辑是分散在不同的包里的,如何才能够调试 React 最初的源码呢&#xff1f; JS 代码经过编译&#xff0c;会产生目标代码&#xff0c;但同时也会产生 sourcemap。sourcemap 的作用就是映射目…

DAY50 309.最佳买卖股票时机含冷冻期 + 714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 题目要求&#xff1a;给定一个整数数组&#xff0c;其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;: 你不…

HCIP---VRRP

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一. VRRP概述 VRRP---虚拟路由器冗余协议 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;是一种用于在多个路由器之间创建虚拟路由器的协议。 VRRP使用了一系列协议来实现路…

新零售时代,传统便利店如何转型?

在零售批发业&#xff0c;如何降低各环节成本、提高业务运转效率、更科学地了解客户服务客户&#xff0c;是每家企业在激烈竞争中需要思考的课题。 对零售批发企业来说&#xff0c;这些问题或许由来已久&#xff1a; &#xff08;1&#xff09;如何对各岗位的员工进行科学的考…

嵌入式系统中,输入网址之后,发生了什么?

让我们一步一步地来看这个过程。 步骤1&#xff1a; 用户在浏览器中输入一个URL&#xff08;比如www.bytebytego.com&#xff09;&#xff0c;然后按下回车键。首先&#xff0c;我们需要将这个URL转换成一个IP地址。通常&#xff0c;这个映射关系会被存储在缓存中&#xff0c…