自定义ZYNQ的PL端数据处理器,通过DMA等进行交互(附GitHub源码)

这篇具有很好参考价值的文章主要介绍了自定义ZYNQ的PL端数据处理器,通过DMA等进行交互(附GitHub源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ZYNQ_PLPS_LOOP

摘要:在ZYNQ中设计了自定义的PL端数据处理器,通过DMA连接到AXI总线,完成了PS和该PL端的数据交互等功能。

开发板型号:Zynq-7000 SoC XC7Z305 FPGA

开发平台:Vivado 2019.1; Vivado SDK 2019.1

Github源码:https://github.com/CY0807/Vivado_FIFO_Test.git

1 文件描述(文件见GitHub仓库)

(1)vivado_project存放了vivado和sdk原始工程文件

(2)c_project_demo存放了sdk工程中所用的核心代码

(3)image中存放了项目运行中间过程的重要截图

2 硬件设计

Block Design如图所示:

zynq pl dma,fpga开发

(1)例化了vivado库的AXI DMA挂在ZYNQ的AXI4 HP总线上,并将DMA的两个AXI4-Stream输入输入出接口引到Block Design的接口上,这两个接口在Block Design的上层模块中与自定义设计的PL端数据处理器连接,实现PS端与自定义PL端的大批量数据流交互。

(2)例化了自定义的AXI-Lite外设(图中为myip)含有4个32位寄存器,可供PS端寻址并进行读写,并将myip中的一个寄存器引出到Block Design的接口上,在上层模块中与PL端连接作为PL端的配置寄存器。此外,在PL端中也设置了中断输出intr可通过myip外设输入到PS中断。

(3)DMA的两路中断输出也连接到了PS的中断输入口,分别在DMA<搬数据从DDR到外设>、<搬数据从外设到DDR>完成时引发中断。

PS端通过配置寄存器控制着DMA的传输方向、坐标和开始,在AXI DMA的两个接口上例化了system ila用于观察波形,得到有PS到PL传输、PL到PS传输的波形图如下所示:

zynq pl dma,fpga开发

zynq pl dma,fpga开发

有意思的是,笔者发现无论怎么调试,PL到PS的传输中,即使PS端没有发起请求,DMA也会自动的发送从PL端接收数据的请求,且只接受4 Word的数据量,但这并不影响最终逻辑结果,个人猜测这4 Word存在DMA的buffer中,当PS发起请求时才会从DMA的buffer传输到DDR3中。

PL端外设的核心代码如下

module acc(
    input clk,

    input wire [31:0]M_AXIS_MM2S_0_tdata,
    input wire [3:0]M_AXIS_MM2S_0_tkeep,
    input wire M_AXIS_MM2S_0_tlast,
    output wire M_AXIS_MM2S_0_tready,
    input wire M_AXIS_MM2S_0_tvalid,
    
    output wire [31:0]S_AXIS_S2MM_0_tdata,
    output wire [3:0]S_AXIS_S2MM_0_tkeep,
    output wire S_AXIS_S2MM_0_tlast,
    input wire S_AXIS_S2MM_0_tready,
    output wire S_AXIS_S2MM_0_tvalid,
    
    input wire mm2s_prmry_reset_out_n_0,    
    input wire s2mm_prmry_reset_out_n_0,
    
    input wire [31:0]reg0_0
    );

wire empty, full, almost_empty, almost_full, valid, rd_en, wr_en, srst;
wire [31:0] din, dout;
wire [8:0] data_count;

// MM2S
assign S_AXIS_S2MM_0_tdata = dout;
assign S_AXIS_S2MM_0_tkeep = 4'b1111;
assign S_AXIS_S2MM_0_tvalid = valid;
assign S_AXIS_S2MM_0_tlast = almost_empty & (~empty);

// S2MM
assign M_AXIS_MM2S_0_tready = ~almost_full;

// FIFO
assign srst = ~(mm2s_prmry_reset_out_n_0 | s2mm_prmry_reset_out_n_0);
assign wr_en = M_AXIS_MM2S_0_tready & M_AXIS_MM2S_0_tvalid;
assign din = M_AXIS_MM2S_0_tdata;
assign rd_en = S_AXIS_S2MM_0_tready & S_AXIS_S2MM_0_tvalid;
    
fifo_generator_0 fifo0 (
  .clk(clk),                    // input wire clk
  .srst(srst),                  // input wire srst
  .din(din),                    // input wire [31 : 0] din
  .wr_en(wr_en),                // input wire wr_en
  .rd_en(rd_en),                // input wire rd_en
  .dout(dout),                  // output wire [31 : 0] dout
  .full(full),                  // output wire full
  .empty(empty),                // output wire empty
  .almost_empty(almost_empty),  // output wire almost_empty
  .almost_full(almost_full),
  .valid(valid),                // output wire valid
  .data_count(data_count)      // output wire [8 : 0] data_count
);    
    
endmodule

3 软件设计

在Vivado SDK中设计了C语言裸机程序,可以通过配置寄存器来控制DMA的传输长度、坐标、方向,同时也编写了DMA完成传输的中断函数,反映在main函数中为RxDone和TxDone变量,分别表示<外设到DDR>和<DDR到外设>传输的完成,主体部分如下所示。

//config the reg0 in pl processor
	//0:~, 1:+1, default:+0
	Xil_Out32(XPAR_MYIP_0_S00_AXI_BASEADDR, mode);

	// set TX data
	for(Index = 0; Index < Len; Index ++) {
		TxBufferPtr[Index] = Index;
	}
	xil_printf("TX data ready!\r\n");

	// TX data to DMA
	Xil_DCacheFlushRange((u32)TxBufferPtr, Len);
	Status = XAxiDma_SimpleTransfer(&AxiDma,(u32) TxBufferPtr,
			Len, XAXIDMA_DMA_TO_DEVICE);
	if (Status != XST_SUCCESS) {
		xil_printf("TX data to DMA Fail!\r\n");
		return XST_FAILURE;

	}
	// Wait util complete
	while(TxDone == 0);
	xil_printf("TX data to DMA OK!\r\n");

	// DMA data to RX
	Status = XAxiDma_SimpleTransfer(&AxiDma,(u32) RxBufferPtr,
				Len, XAXIDMA_DEVICE_TO_DMA);
	if (Status != XST_SUCCESS) {
		xil_printf("DMA data to RX Fail!\r\n");
		return XST_FAILURE;
	}	
#ifndef __aarch64__
	Xil_DCacheInvalidateRange((u32)RxBufferPtr, Len);
#endif
	// Wait util complete
	while(RxDone == 0);
	xil_printf("DMA data to RX OK!\r\n");

其中在DDR中TxBuffer和RxBuffer的地址分别是0x01100000和0x01300000,在SDK中观察两地址的Memory如下:

(1)传输开始前:这片地址的数据是随机未知的

zynq pl dma,fpga开发

(2)TX传输后:首先通过PS端对TxBuffer数据进行赋值,再通过DMA传输到PL端

zynq pl dma,fpga开发

(3)TX传输后:PL端接收到数据后,在PS端的控制下通过DMA将处理的结果传输到RxBuffer,本demo对数据处理的方式是保持不变

zynq pl dma,fpga开发文章来源地址https://www.toymoban.com/news/detail-812454.html

到了这里,关于自定义ZYNQ的PL端数据处理器,通过DMA等进行交互(附GitHub源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第三十二章 开发Productions - ObjectScript Productions - 定义警报处理器 - 使用路由警报处理器

    如果需要通过多种输出机制联系用户,警报处理器应该是一个业务流程,用于确定如何在消息中路由 Ens.AlertReques 。在这种情况下, Productions 必须为每个输出机制包含一个额外的业务操作,并且警报处理器将消息转发到这些业务操作。 要将警报处理器定义为路由流程,请创建

    2024年02月08日
    浏览(34)
  • Spring Boot 如何自定义异常处理器

    在Spring Boot应用程序中,异常处理是一个非常重要的方面。如果您不处理异常,应用程序可能会崩溃或出现不可预料的行为。默认情况下,Spring Boot将未捕获的异常返回给客户端。这通常不是期望的行为,因为客户端可能无法理解异常信息。在本文中,我们将介绍如何在Sprin

    2024年02月06日
    浏览(33)
  • Mybatis自定义枚举类处理器优雅地使用枚举

    在和前端开发对接接口过程中经常发现需要一些枚举类的字典参数,虽然可以通过swagger在线文档给前端开发,不过可以直接返回枚举的编码和字典值就可以更直观,所以在项目里怎么实现?可以通过Mybatis的一些接口,自定义枚举类的处理器实现 开发环境 JDK 1.8 SpringBoot2.2.1

    2024年02月04日
    浏览(28)
  • Springboot +spring security,自定义认证和授权异常处理器

    在Spring Security中异常分为两种: AuthenticationException 认证异常 AccessDeniedException 权限异常 我们先给大家演示下如何自定义异常处理器,然后再结合源码帮助大家进行分析 如何创建一个SpringSecurity项目,前面文章已经有说明了,这里就不重复写了。 3.1配置SecurityConfig 这里主要是

    2024年02月07日
    浏览(33)
  • Xilinx Zynq-7000系列XC7Z035/XC7Z045高性能SoC处理器评估板PS端ETH RJ45接口

    (数据手册见Datasheet目录) ZYNQ7035 PS端ETH RJ45接口 评估板XQ6657Z35-EVM ,ZYNQ XC7Z035/45的PS端 引出了1路千兆网口,其引脚定义如下图:

    2024年02月12日
    浏览(33)
  • ZYNQ使用AXI DMA(Scatter/Gather)模式进行PL与PS数据交互附源码(ps端移植freertos或者裸机)

    AXI DMA 操作需要先提供一个在内存中驻留的不变空间,用于存储需要进行的DMA操作。形容这“每一次操作”的东西叫做Buffer Descriptor,缩写叫BD,这些BD是连接成链表的形式的,因为BD会动态增加,而预先分配存储BD的空间是恒定的,因此BD被连成一个环(BD Ring),其实就是一个循

    2024年02月09日
    浏览(29)
  • 阿里云国际站:阿里云发布云数据中心专用处理器

    在6月13日举行的2022年阿里云峰会上,阿里云发布了云数据中心专用处理器CIPU。“如果我们定义好下一代云,中国云计算有超车机会。”阿里云智能事业群总裁张建锋表示,相比传统架构,此次发布的CIPU可以让算力虚拟化损耗降到0,让访问云端比访问本地硬盘更快,CIPU将替

    2024年01月25日
    浏览(30)
  • Verilog语法学习——LV6_多功能数据处理器

    题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page=1tab=Verilog篇topicId=301) 描述 根据指示信号select的不同,对输入信号a,b实现不同的运算。输入信号a,b为8bit有符号数,当select信号为0,输出a;当select信号为1,输出b;当select信号

    2024年02月15日
    浏览(25)
  • 深入理解图形处理器(GPU):加速人工智能和大数据计算的引擎

    前言: 图形处理器(GPU)不再仅仅是用于图形渲染的硬件设备。如今,GPU已经成为加速人工智能、大数据计算和科学研究的关键引擎。本文将深入探讨GPU的工作原理、应用领域以及它在当今技术领域中的重要性。 GPU(Graphics processing unit)是一种专门设计用于处理图形和图像

    2024年04月15日
    浏览(35)
  • 从零开始设计RISC-V处理器——五级流水线之数据通路的设计

    (一)从零开始设计RISC-V处理器——指令系统 (二)从零开始设计RISC-V处理器——单周期处理器的设计 (三)从零开始设计RISC-V处理器——单周期处理器的仿真 (四)从零开始设计RISC-V处理器——ALU的优化 (五)从零开始设计RISC-V处理器——五级流水线之数据通路的设计

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包