【FPGA开发】ZYNQ中PS与PL交互操作总结、BRAM,DMA原理浅析、仿真操作

news2025/1/4 11:57:11

文章目录

  • PL与PS交互综述
  • 交互端口性能&特点(选择方案的凭据)
    • GPIO-AXI_GP
    • DMA-DMAC
    • HP-AXI_HP
    • ACP-AXI_ACP
  • 数据交互实验
    • GP通过BRAM
      • PS为主机,读写BRAM
      • PL作为主机,读写BRAM
    • DMA方式交互

PL与PS交互综述

网络上关于PS PL交互的教程非常多,无论是做开发板的机构出教程还是个人博客。但是该部分内容看起来较为分散,大概一搜,有各种各样的情景:PS和PL谁做主机?需要交互的数据有什么特性?使用哪个总线?不同的场景选用的交互方式也是不尽相同。

那么在进行知识信息筛选、总结的时候,怎样才能尽快过滤冗余信息,提取自己所需的核心内容呢?本文旨在从全局认识PS与PL的数据交互方法,同时也进行一些具体的实操,既对全局有认识,又不钻牛角尖。

图1-1来自UG585,展示了ZYNQ的系统框架,清晰明了,信息密度大。
在这里插入图片描述

PS部分被单独框起来,和PL部分泾渭分明,从左往右看处于PS PL交界处的结构:

  • XADC:内置的ADC,和数据交互没关系。

  • GPIO:注意总线颜色是AXI 32bit总线,PS和PL之间,共4个GP接口,每个方向各有两个,能实现双向的数据传输,和数据交互有关。

  • DMA Sync:DMA同步,看到这是单向的自定义总线,从PL直指PS端的DMA 8 Channel,和数据传输有关。

  • IRQ:中断,PL端可以直指PS端的GIC,也就是PL端可以产生中断信号,和数据交互无关。

  • AES/SHA:可配置的加密有关的接口,和数据传输无关。

  • HP接口:4个AXI接口,PS只能作为从机,该部分直接连接到存储:DDR或者片上存储。

  • ACP:加速器一致性端口,PL端可以直接访问PS的缓存,提供缓存一致性访问,实现低延迟数据传输,和数据交互有关。

PS和PL的交互,无外乎就是用上面加粗的总线,网上一般总结的用DDR、BRAM、DMA、VDMA等,都是这些总线实现的具体手段。只要结合知识点、实操过程,反复的看图1-1,会有数据交互方面的收获的。

交互端口性能&特点(选择方案的凭据)

了解了总体框架后,可以对筛选出的,和数据交互有关的总线进行进一步学习,到这一步,就可以借鉴一些网络分享的琐碎知识点(当然也要结合UG585)

GPIO-AXI_GP

这里给出AXI_GP接口的一些特性,主要和AXI的参数有关,详见下图。
在这里插入图片描述

还有该接口的参数性能,详见下图。

该接口没有任何额外的FIFO缓冲,不像AXI_HP接口有精心设计的FIFO缓冲来提高性能和吞吐量。
这些接口仅用于一般用途,如寄存器的配置,指令等,不适用于高性能、大数据量传输。

注意!:在PL逻辑通信发生之前,必须通过LVL_SHFTR_EN使能PL电平移位器!
在这里插入图片描述

DMA-DMAC

The DMA controller (DMAC),直接内存访问控制器,是控制数据搬运的,其进行数据交互时,还需要和存储介质进行配合。

DMAC使用64bit-AXI主接口,以CPU_2x时钟速率运行,执行DMA数据传输到系统存储器和PL外设,有一个DMA指令集,控制DMA的传输。

这里搬运的内容比较多,详见下图9-3。
在这里插入图片描述

HP-AXI_HP

这四个AXI_HP接口为PL到DDR和OCM存储器提供了高带宽数据路径。

每个接口包括两个FIFO缓冲器,用于读写流量。

在这里插入图片描述
在这里插入图片描述

ACP-AXI_ACP

该接口和cache一致性有关,互联框图如下。
在这里插入图片描述

数据交互实验

GP通过BRAM

PS为主机,读写BRAM

先简单进行一个测试,实现PS往PL写10个数据,用Block Design简单搭建一个仿真环境。

这个结构暂时不需要写一行代码,验证起来十分方便。
在这里插入图片描述
自动分配了4K的地址,如下图。
在这里插入图片描述
到SDK中就可以开始最简单的操作了。

XBram_WriteReg函数是官方的API接口,可以往BRAM中写入数据。
BaseAddress是BRAM的基地址,这个是Block Design地址分配页面决定的,本文的实例中,为0x40000000

RegOffset是地址偏移量,也就是在基地址的肩膀上,偏移多少个寄存器,注意,AXI总线是字节寻址的,映射地址时,按照4字节寻址。

Data:往里写的数据,32bit无符号整型

在这里插入图片描述
掌握这一个函数,就可以进行写数据操作了,这里SDK开Debug,ILA那面也抓信号。

下图为代码抓取结果,可以看到,PS端向PL端的写操作成功,地址间隔为4,数据为0~9共10个数据。
在这里插入图片描述

下面使用类似的方法,把写进去的数据再一个个读出来。

在这里插入图片描述

使用的函数为XBram_ReadReg,在内存中看读取出的数值。

PL作为主机,读写BRAM

这里需要对BD进行修改,之前是通过真双端口RAM的A口进行读写,实际上一直是PS在通过bram_ctrl进行控制,现在要写一点逻辑,让PL也参与其中。

先给出更改后的BD框图如下,bram_0是要自己写逻辑的模块,封装成了IP核,这里关于模块封装IP的步骤,放在另一个文章中:
【FPGA开发】Vivado自定义封装IP核,绑定总线

最终的bd文件如下所示。
在这里插入图片描述
下面编辑 bram_0中的逻辑,想要实现的效果是,通过B端口往里写10个数,让PS通过A端口去读。

自编的小PL逻辑

module bram(
    input          i_clk            ,
    input          i_rst            ,
    input          i_trig     ,

    output [31:0]  addr_b           ,
    output         clk_b            ,
    output [31:0]  din_b            ,
    input  [31:0]  dout_b           ,
    output         en_b             ,
    output         rst_b            ,
    output [3:0]   we_b  

);
//*****REG*****//
reg [31:0]  r_addr_b  ;            
reg [31:0]  r_din_b   ;            
reg         r_en_b    ;            
reg [3:0]   r_we_b    ;

//*****ASSIGN*****//
assign addr_b = r_addr_b ;
assign din_b  = r_din_b  ;
assign en_b   = r_en_b   ;
assign we_b   = r_we_b   ;

assign rst_b = i_rst ;
assign clk_b = i_clk ;

reg [7:0] r_cnt;

localparam P_DATA_NUM = 10;

//*****ALWAYS*****//

always @(posedge i_clk , posedge i_rst) begin
    if(i_rst)
        r_cnt <= 'd0;
    else if(r_cnt == P_DATA_NUM)
        r_cnt <= r_cnt;
    else if(i_trig || r_cnt)
        r_cnt <= r_cnt + 1;
end

always @(posedge i_clk , posedge i_rst) begin
    if(i_rst)
        r_addr_b <= 'd0;
    else if (r_cnt == P_DATA_NUM)
        r_addr_b <= r_addr_b;
    else if(r_cnt >= 1)
        r_addr_b <= r_addr_b + 4;
end

always @(posedge i_clk , posedge i_rst) begin
    if(i_rst)
        r_din_b <= 'd0;
       else if(r_cnt == P_DATA_NUM)
        r_din_b <= r_din_b; 
    else if(r_cnt >= 1)
        r_din_b <= r_din_b+1;
end

always @(posedge i_clk , posedge i_rst) begin
    if(i_rst)
        r_en_b <= 'd0;
    else if(r_cnt == P_DATA_NUM)
        r_en_b <= 'd0;
    else if(i_trig)
        r_en_b <= 'd1;
end

always @(posedge i_clk , posedge i_rst) begin
    if(i_rst)
        r_we_b <= 'd0;
    else if(r_cnt == P_DATA_NUM )
        r_we_b <= 'd0;
    else if(i_trig)
        r_we_b <= 4'hf;
end
endmodule

为了方便观察,加Vio和ILA
在这里插入图片描述
Vio触发PL端通过B口想BRAM中写入数据,PS端单步Debug,挨个读数据。

这里联调时,需要让PS的Debug先跑起来,再把PL部分跑起来,要不然不对

第一个状态:PS端已经跑起来了,PL端等待Vio触发
在这里插入图片描述
第二个状态:Vio已经触发PL的写数据操作,写了10个数据,地址增加间隔为4,数据0~9连续
在这里插入图片描述
第三个状态:在SDK中单步走,把PL的十个数据读出来
在这里插入图片描述
可以看到0~9成功的读出来了。

PS端核心代码:

for(i=0;i<=9;i+=1) {
    recv_data[i] = XBram_ReadReg(0x40000000, 4*i);
}

DMA方式交互

BRAM的方式适合数据量较少,地址不连续、长度规则的传输,而高速率、数据量大、数据连续的情景适合DMA传输。

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

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

相关文章

构建全志 T113 Tina SDK

1、环境配置&#xff1a; 准备一个 Ubuntu 系统&#xff0c;可以是 WSL&#xff0c;虚拟机等&#xff0c;建议版本是 20.04。 1.1、安装必要的软件 进入系统后&#xff0c;输入下方命令安装需要的工具 &#xff1a; sudo apt update -y sudo apt full-upgrade -y sudo apt i…

Linux 搭建 nginx+keepalived 高可用 | Nginx反向代理

注意&#xff1a;本文为 “Linux 搭建 nginxkeepalived (主备双主模式) 高可用 | Nginx反向代理” 相关文章合辑。 KeepalivedNginx实现高可用&#xff08;HA&#xff09; xyang0917 于 2016-09-17 00:24:15 发布 keepalived 的 HA 分为抢占模式和非抢占模式&#xff0c;抢占…

RDFS—RDF模型属性扩展解析

目录 前言1. 什么是RDFS&#xff1f;1.1 RDFS的核心概念1.2 RDFS与RDF的区别 2. RDFS的基础概念2.1 类&#xff08;Class&#xff09;2.2 属性&#xff08;Property&#xff09;2.3 关系&#xff08;Relation&#xff09;2.4 定义域&#xff08;Domain&#xff09;2.5 值域&…

rust windwos 两个edit框

use winapi::shared::minwindef::LOWORD; use windows::{core::*,Win32::{Foundation::*,Graphics::Gdi::{BeginPaint, EndPaint, PAINTSTRUCT},System::LibraryLoader::GetModuleHandleA,UI::WindowsAndMessaging::*,}, };// 两个全局静态变量&#xff0c;用于保存 Edit 控件的…

Python Polars快速入门指南:LazyFrames

前文已经介绍了Polars的Dataframe, Contexts 和 Expressions&#xff0c;本文继续介绍Polars的惰性API。惰性API是该库最强大的功能之一&#xff0c;使用惰性API可以设定一系列操作&#xff0c;而无需立即运行它们。相反&#xff0c;这些操作被保存为计算图&#xff0c;只在必要…

常见CMS漏洞(wordpress,DedeCms,ASPCMS,PHPMyAdmin)

练习一:wordpress漏洞测试 1.上传包含木马的主题 安装网站 登陆网站 上传主题处测试漏洞注入 在上传主题模板压缩包中写入一句话木马 网站上传含有木马的zip压缩包 上传成功 wordpress主题目录 wp-content/themes 访问上传木马测试 2.修改主题的配置文件为含有木马的文件 练习…

【Java数据结构】LinkedList与链表

认识LinkedList LinkedList就是一个链表&#xff0c;它也是实现List接口的一个类。LinkedList就是通过next引用将所有的结点链接起来&#xff0c;所以不需要数组。LinkedList也是以泛型的方法实现的&#xff0c;所以使用这个类都需要实例化对象。 链表分为很多种&#xff0c;比…

基于 Ragflow 搭建知识库-初步实践

基于 Ragflow 搭建知识库-初步实践 一、简介 Ragflow 是一个强大的工具&#xff0c;可用于构建知识库&#xff0c;实现高效的知识检索和查询功能。本文介绍如何利用 Ragflow 搭建知识库&#xff0c;包括环境准备、安装步骤、配置过程以及基本使用方法。 二、环境准备 硬件要…

【我的 PWN 学习手札】IO_FILE 之 stdout任意地址读

上一篇文章学会了stdin任意地址写【我的 PWN 学习手札】IO_FILE 之 stdin任意地址写-CSDN博客 本篇关注stdout利用手法&#xff0c;和上篇提及的手法有着异曲同工之妙 文章目录 前言 一、_IO_2_1_stdout_输出链&#xff0c;及利用思路 &#xff08;一&#xff09;_IO_2_1_std…

一网多平面

“一网多平面”是一种网络架构概念&#xff0c;具体指的是在一张物理网络之上&#xff0c;逻辑划分出“1N”个平面。以下是对“一网多平面”的详细解释&#xff1a; 定义与构成 01一网多平面 指的是在统一的物理网络基础设施上&#xff0c;通过逻辑划分形成多个独立的网络平面…

设计模式之状态模式:自动售货机的喜怒哀乐

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 一、状态模式概述 \quad 在我们的日常生活中&#xff0c;很多事物都具有不同的状态。比如我们经常使用的自动售货机&#xff0c;它就具有多种状态…

信息系统管理工程第8章思维导图

软考信管第8章的思维导图也实在是太长了&#xff0c;制作的耗时远超过之前的预计。给你看看思维导图的全貌如下&#xff0c;看看你能够在手机上滚动多少个屏幕 当你看到这段文字的时候&#xff0c;证明你把思维导图从上到下看完了&#xff0c;的确很长吧&#xff0c;第8章的教程…

Excel无法插入新单元格怎么办?有解决方法吗?

在使用Excel时&#xff0c;有时会遇到无法插入新单元格的困扰。这可能是由于多种原因导致的&#xff0c;比如单元格被保护、冻结窗格、合并单元格等。本文将详细介绍3种可能的解决方案&#xff0c;帮助你顺利插入新单元格。 一、消冻结窗格 冻结窗格功能有助于在滚动工作表时保…

深度学习笔记(12)——深度学习概论

深度学习概论 深度学习关系&#xff1a; 为什么机器人有一部分不在人工智能里面&#xff1a;机器人技术是一个跨学科的领域&#xff0c;它结合了机械工程、电子工程、计算机科学以及人工智能&#xff08;AI&#xff09;等多个领域的知识。 并不是所有的机器人都依赖于人工智能…

HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?

在 iPhone 拍摄照片时&#xff0c;默认的图片格式为 HEIC。虽然 HEIC 格式具有高压缩比、高画质等优点&#xff0c;但在某些设备或软件上可能存在兼容性问题。因此&#xff0c;将 HEIC 格式转换为更为通用的 JPG 格式就显得很有必要。本教程将介绍如何使用简鹿格式工厂&#xf…

flask后端开发(11):User模型创建+注册页面模板渲染

目录 一、数据库创建和配置信息1.新建数据库2.数据库配置信息3.User表4.ORM迁移 二、注册页面模板渲染1.导入静态文件2.蓝图注册路由 一、数据库创建和配置信息 1.新建数据库 终端中 CREATE DATABASE zhiliaooa DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;2…

【Next.js】001-项目初始化

【Next.js】001-项目初始化 文章目录 【Next.js】001-项目初始化一、前言二、自动创建项目1、环境要求2、创建项目创建命令创建演示生成的项目目录如果你不使用 npx 命令 3、运行项目脚本说明在开发环境运行项目查看页面 4、示例代码说明创建项目查看示例项目创建项目命令创建过…

系统安全——可信计算

可信计算 可信计算的起源 上世纪八十年代&#xff0c;TCSEC标准将系统中所有安全机制的总和定义为可信计算基 &#xff08;Trusted Computing Base TCB) TCB的要求是&#xff1a; 独立的&#xff08;independent&#xff09; 具有抗篡改性 tempering proof 不可旁路(无法窃…

Python学生管理系统(MySQL)

上篇文章介绍的Python学生管理系统GUI有不少同学觉得不错来找博主要源码&#xff0c;也有同学提到老师要增加数据库管理数据的功能&#xff0c;本篇文章就来介绍下python操作数据库&#xff0c;同时也对上次分享的学生管理系统进行了改进了&#xff0c;增加了数据库&#xff0c…

【Sentinel】流控效果与热点参数限流

目录 1.流控效果 1.1.warm up 2.2.排队等待 1.3.总结 2.热点参数限流 2.1.全局参数限流 2.2.热点参数限流 2.3.案例 1.流控效果 在流控的高级选项中&#xff0c;还有一个流控效果选项&#xff1a; 流控效果是指请求达到流控阈值时应该采取的措施&#xff0c;包括三种&…