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-stream
    output [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) begin
    if(~resetn) begin
        trans_start_0 <= 1'd0;
        trans_start_1 <= 1'd0;
    end
    else begin
        trans_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) begin
    if(!resetn) begin
        state <= IDLE;
        r_tdata <= 32'd0;
        r_tvalid <= 1'b0;
    end
    else begin
        r_tdata <= 32'd0;
        r_tvalid <= 1'b0;
        case(state)
            IDLE: begin
                if(pos_trans_start && m_axis_tready) begin
                    state <= TRANS;
                end
                else begin
                    state <= IDLE;
                end
            end
            TRANS: begin
                if(trans_cnt < TRANS_NUM) begin
                    state <= TRANS;
                    r_tvalid <= 1'b1;
                    r_tdata <= trans_cnt;
                end
                else begin
                    state <= DONE;
                end
            end
            DONE: begin
                state <= IDLE;
            end
            default: begin
                state <= IDLE;
            end
        endcase
    end
end
always @(posedge clk or negedge resetn) begin
    if(!resetn) begin
        r_tlast <= 1'b0;
    end
    else begin
        if(state == TRANS && trans_cnt == TRANS_NUM-1) begin
            r_tlast <= 1'b1;
        end
        else begin
            r_tlast <= 1'b0;
        end
    end
end
always @(posedge clk or negedge resetn) begin
    if(!resetn) begin
        trans_cnt <= 0;
    end
    else begin
        if(state == TRANS) begin
            trans_cnt <= trans_cnt + 1;
        end
        else begin
            trans_cnt <= 32'd0;
        end
    end
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);
	// interrupt
	XScuGic_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 Cache
	while(!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 端口的写通道波形如下图所示。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

facebook分享-错误记录

无法拉起分享 "code":30000,"msg":"fail:API_ERROR: API_ERROR" 1.确认facebook的app_id是否一致 2.确认是否在app_id应用的白名单里&#xff0c;注册meta开发者&#xff0c;然后把主页的user_id给管理员加 A ContentProvider for this app was…

dapp技术开发

随着区块链技术的普及和应用&#xff0c;DApp&#xff08;去中心化应用&#xff09;逐渐成为了区块链领域中备受关注的核心部分。DApp是一种运行在去中心化网络上的应用程序&#xff0c;其开发、部署和运行都不依赖于任何中心化的实体或中介机构。这种应用程序的兴起和发展&…

详解机器学习最优化算法

前言 对于几乎所有机器学习算法&#xff0c;无论是有监督学习、无监督学习&#xff0c;还是强化学习&#xff0c;最后一般都归结为求解最优化问题。因此&#xff0c;最优化方法在机器学习算法的推导与实现中占据中心地位。在这篇文章中&#xff0c;小编将对机器学习中所使用的…

赛宁网安入选国家工业信息安全漏洞库(CICSVD)2023年度技术组成员单

近日&#xff0c;由国家工业信息安全发展研究中心、工业信息安全产业发展联盟主办的“2023工业信息安全大会”在北京成功举行。 会上&#xff0c;国家工业信息安全发展研究中心对为国家工业信息安全漏洞库&#xff08;CICSVD&#xff09;提供技术支持的单位授牌表彰。北京赛宁…

Qt 自定义按钮 区分点按与长按信号,适配触摸事件

Qt 自定义按钮 区分点按与长按信号 适配触摸事件 效果 使用示例 // 点按connect(ui.btnLeft, &JogButton::stepclicked, this, &MainWindow::btnLeft_clicked);// 长按开始connect(ui.btnLeft, &JogButton::continueOn, this, &MainWindow::slotJogLeftOn);//…

通配符匹配

题目链接 通配符匹配 题目描述 注意点 s 仅由小写英文字母组成p 仅由小写英文字母、‘?’ 或 ‘*’ 组成‘?’ 可以匹配任何单个字符‘*’ 可以匹配任意字符序列&#xff08;包括空字符序列&#xff09; 解答思路 最初想到的是dfs 剪枝&#xff0c;但是用例超时了参照题…

React的refs和表单组件总结

React的refs和表单组件 react中refs的使用字符串形式的ref react核心就在于虚拟DOM&#xff0c;也就是React中不总是直接操页面的真实DOM元素&#xff0c;并且结合Diffing算法&#xff0c;可以做到最小化页面重绘&#xff0c;但有些时候不可避免我们需要一种方法可以操作我们定…

禅道项目信息通知到钉钉群配置步骤

禅道是我们常用的项目进度管理工具&#xff0c;禅道集成了webhook功能&#xff0c;可以通过发送 JSON 格式的数据到第三方hook地址&#xff0c;进行消息集成&#xff0c;包括钉钉、企业微信以及飞书。可以考虑将禅道和钉钉两者可以结合起来&#xff0c;将项目信息发送到钉钉群&…

SAP 10策略测试及简介

从今天开始将把PP模块中常用的一些策略进行一个测试,编写成系统的文档,有点策略经常不用自己都忘了一些策略的特性。所以还是有必须形成文档的形式记录下来 1、首先准备好物料 成品物料为AB0,在MRP3视图中维护对应的策略组的10 同时选择消耗模式为2.消耗期间都是999 2、其他…

软件安全测试怎么做?如何确保软件授权安全

在数字化不断演进的今天&#xff0c;软件安全测试变得至关重要。它验证了软件是否容易受到网络攻击&#xff0c;并检验恶意或意外输入对操作的影响。安全测试的目标是保障系统和信息的安全性和可靠性&#xff0c;确保它们不接受未授权的输入。 一、安全测试准备 开发者必须认识…

长安链可验证数据库,保证数据完整性的可信存证方案

近日&#xff0c;长安链发布“可验证数据库”实现了链上链下协同存储及数据完整性保证&#xff0c;显著提升长安链存储能力的可扩展性。 可信存证是联盟链最典型的应用场景&#xff0c;被广泛应用在司法、工业、农业、贸易等领域。联盟链的存证应用主要分为两个阶段&#xff1…

【Cheat Engine7.5】基础教程第三关(步骤4)

文章目录 一、简介二、操作步骤2.1、加载进程2.2、查找健康数据2.2.1、首次扫描(单浮点数100)2.2.2、点击打我&#xff0c;再次扫描数值97.112.2.3、修改数据值为50002.2.4、测试正常 2.3、查找弹药数据2.3.1、双浮点数1002.3.2、点击开火2.3.3、修改数据2.3.4、测试 2.4、通关…

福布斯:Salesforce和ZohoCRM,哪个更适合你?

上周&#xff0c;福布斯发布了《CRM软件指南》&#xff0c;从企业的实际需求出发&#xff0c;通过性价比、功能、可用性、第三方集成、分析工具等多个维度进行比较&#xff0c;最终推选出7家代表厂商。本周&#xff0c;福布斯就其中呼声较高的两家企业Salesforce、Zoho CRM做进…

Java 设计模式——享元模式

目录 1.概述2.结构3.实现3.1.抽象享元3.2.具体享元3.3.享元工厂3.4.测试 4.优缺点5.使用场景6.JDK 源码解析——Integer 类 1.概述 &#xff08;1&#xff09;享元模式 (Flyweight Pattern) 是一种结构型设计模式&#xff0c;主要通过共享对象来减少系统中的对象数量&#xff…

振南技术干货集:C语言的一些“骚操作”及其深层理解(3)

注解目录 第二章《c语言的一些“操作”及其深层理解》 一、字符串的实质就是指针 &#xff08;如何将 35 转为对应的十六进制字符串”0X23”&#xff1f;&#xff09; 二 、转义符\ &#xff08;打入字符串内部的“奸细”。&#xff09; 三、字符串常量的连接 &#xff…

一文了解Nginx及其基本配置

一、关于Nginx Nginx是一个开源的高性能HTTP和反向代理服务器。 Nginx可以用于处理静态资源、负载均衡、反向代理和缓存等任务。 Nginx被广泛用于构建高可用性、高性能的Web应用程序和网站。 Nginx具有低内存消耗、高并发能力和良好的稳定性&#xff0c;因此在互联网领域非常受…

泛微E-Mobile 6.0命令执行漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、漏洞原理 泛微E-Mobile 6.0存在命令执行漏洞的问题&#xff0c;在…

202205(第13届)蓝桥杯Scratch图形化编程青少组(国赛_中级)真题

202205(第13届)蓝桥杯Scratch图形化编程青少组(国赛_中级)真题 第 1 题 以下程序&#xff0c;小猫在移动完成后不能回到初始位置的是&#xff1f;&#xff08; &#xff09; A&#xff1a; B&#xff1a; C&#xff1a; D&#xff1a; 第 2 题 以下程序&#xff0c;询问…

基于SSM的社区生鲜电商平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…