ZYNQ笔记(十五):PL读写PS DDR(自定义IP核-AXI4接口)

版本:Vivado2020.2(Vitis)

任务:PL 端自定义一个 AXI4 接口的 IP 核,通过 AXI_HP 接口对 PS 端 DDR3 进行读写 测试,读写的内存大小是 4K 字节,

目录

一、介绍    

(1)AXI

(2)AXI SmartConnect 与 AXI Interconnect IP核

(3)ZYNQ AXI GP/HP 接口

二、硬件设计

三、软件设计

四、效果


一、介绍    

(1)AXI

        AXI:高级可扩展接口(Advanced eXtensible Interface)是 ARM 公司提出的 高性能、高带宽、低延迟 的片上总线协议,属于 AMBA:高级微控制器总线架构(Advanced Microcontroller Bus Architecture)协议家族的一部分,广泛应用于 FPGA 和 SoC 设计中。

AXI 协议目前主要有 3 种版本

  1. AXI4(AXI4-Full):支持高带宽数据传输,适用于内存映射(Memory-Mapped)设备。

  2. AXI4-Lite:简化版,适用于低复杂度外设(如寄存器配置)。

  3. AXI4-Stream:无地址协议,用于高速流数据传输(如视频、网络数据)。

AXI4 (Full)AXI4-LiteAXI4-Stream
地址支持✔️ ✔️ ❌ (无地址)
突发传输✔️ ❌ (但本身流数据连续,且不限制长度)
乱序支持✔️
适用场景DDR访问、DMA寄存器配置流数据传输:视频流、网络数据

(2)AXI SmartConnect 与 AXI Interconnect IP核

        两者都是 Xilinx 提供的基础互联 IP,用于管理多个AXI主设备(Master)和从设备(Slave)之间的通信,支持地址路由、仲裁和基础QoS(服务质量)。AXI SmartConnect 为更高性能互联IP,在AXI Interconnect 基础上优化了 延迟、吞吐量和资源利用率,支持更复杂的系统拓扑。

AXI InterconnectAXI SmartConnect
协议支持AXI4, AXI4-LiteAXI4, AXI4-Lite, AXI4-Stream
QoS 能力基础轮询仲裁权重仲裁、优先级抢占
数据宽度转换需手动配置自动适配
延迟优化中等更低延迟
适用场景简单到中等复杂度系统高性能复杂系统(如Versal)
资源占用较少较多(但更高效)

(3)ZYNQ AXI GP/HP 接口

        Zynq 的 PS 与 PL 端之间通过多种AXI接口连接,其中 GP(通用)接口和 HP(高性能)接口是最常用的两类,主要区别在于带宽、用途和连接对象。以下是核心对比与使用指南:

特性GP(General Purpose)接口HP(High Performance)接口
AXI版本AXI4(32位数据位宽)AXI3/AXI4(32/64位数据位宽)
数据带宽较低
主要用途控制寄存器访问、低速数据传输高速数据流(如DMA、视频处理)
连接对象

PS 作为主设备访问 PL 外设、

进行一般性的数据传输交互

PL 作为主设备访问 PS 端 DDR 或 OCM
典型应用配置IP核寄存器、传感器数据读取视频帧缓冲、高速ADC/DAC数据交互

二、硬件设计

        整体系统框图如图所示,ZYNQ 配置用到了UART、AXI HP接口(PL端访问 PS端 DDR)、DDR、以及提供给PL端的时钟、复位信号:

        (1)自定义 IP 核创建流程之前有介绍,参考:ZYNQ笔记(六):自定义IP核-LED呼吸灯。此外本次 IP 要实现 PL 端读写 PS 端 DDR,因此接口类型需要选FULL(AXI4-FULL)接口模式为Master。如图所示:

        (2)所创建的自定义 IP 核 Vivado 提供了实现 AXI-Full 接口的读写功能的模板(顶层模块下的.v文件):不用对代码作任 何修改,即可实现本次例程对 DDR 的读写测试功能

模板代码设计了一个状态机实现读写功能(模板代码分析可参考正点原子视频教程):

状态机流程
1. 系统复位后,状态机处于IDLE 初始状态,等待外部输入的启动传输脉冲 init_txn_pulse。
2. IDLE 状态下检测到 init_txn_pulse 为高电平,状态机跳转到 INIT_WRITE 状态。
3. INIT_WRITE 状态下,状态机拉高 start_single_burst_write 信号,来不断地启动 AXI4 Master 接口对 Slave 端大小为 4KB 的存储空间进行突发写操作。写操作完成后,write_done 信号会拉高,状态机进入 INIT_READ 状态。
4. INIT_READ 状态下,状态机拉高 start_single_burst_read 信号,不断地启动 AXI4 Master 接口对 Slave 端同一存储空间进行突发读操作,同时将读出的数据与写入的数据进行对比。读操作完成后,read_done 信号拉高,状态机进入 INIT_COMPARE 状态。
5. INIT_COMPARE 状态下,判断 AXI4 接口在读写过程中的是否发生错误,并将错误状态赋值给 ERROR 信号,然后将 compare_done 信号拉高,表示一次读写测试完成。最后跳转到 IDLE 状态,等待下一次读写操作的启动信号。

        (3)直接封装打包IP核,不用对内部代码进行修改,直接使用生成的模板实现读写操作。再将自定义IP核添加到BD设计中,双击进行配置,将变量C M AXI TARGET SLAVE BASE ADDR 的值修改为0x1000_0000,它位于DDR3存储器的地址空间,是axi4_rw_test IP核进行读写操作的起始地址,约为中间位置(不同板卡的ddr大小可能不一样)。将该地址之前约DDR一半的存储空间预留下来,用于运行PS中的软件程序:

        写满这些配置参数用于 AXI4 总线 的 用户侧扩展信号,允许在 AXI4 事务中添加额外的用户自定义信息,没有使用全部设置0。

        (4)PL通过按键输入一个启动信号,因此需要添加一个按键消抖模块key_filter,实现按键按下输出一个时钟周期的高电平脉冲,模块时钟周期为50MHz,正好是zynq配置提供给PL的时钟频率。新建key_filter.v源文件并完成verilog设计后,在 BD 界面空白处右键选择“Add Module”,添加源文件,将按键消抖模块 key_filter.v 添加进来,如图所示:

        (5)最后整体 bd 设计部分如图所示:设计检查、Generate Output Products、 Create HDL Wrapper、管脚约束、Gnerate Bitstream、Export Hardware(包含比特流文件)、启动Vitis

三、软件设计

#include "stdio.h"
#include "xil_printf.h"
#include "xil_cache.h"
#include "xil_io.h"   //用于访问内存映射的寄存器或外设:包含读写内存数据函数#define DDR3_DATA_BASEADDR   0x10000000  //宏定义DDR3数据存储的起始地址(对应硬件设计中的配置)int main()
{int i;int data;int c;//关闭数据缓存Data Cache以免从缓存中读取数据。因为对同一地址进行读操作时,读出的有可能是 Data Cache中缓存数据,而非 DDR中真正数据Xil_DCacheDisable();while(1){xil_printf("Enter 1 to start read data in DDR \r\n");scanf("%d",&c);if(c==1){//for循环从地址 0x1000_0000读取 DDR3存储器中的数据,读取的存储空间大小为 4KB。for(i=0; i<4096; i+=4)//i每次累加 4,因为调用Xil_In32()读取内存数据,每次读取 32bit。而内存地址以字节为单位,一次读操作后地址应加 4。{//通过地址读取32位数据data = Xil_In32(DDR3_DATA_BASEADDR + i);//打印地址和数据xil_printf("Address:%d	Data:%d \r\n",(DDR3_DATA_BASEADDR+i), data);}}}return 0;
}

四、效果

1.不按按键(没有向DDR写数据)直接读取DDR,可以看到打印的数据为随机数。

2.按下按键后,仅指示读写操作结束的LED灯亮起(DDR数据读写成功),这时PS再读取DDR,可以看到打印的数据为1到1024(一个数据32位,一共刚好 4Byte×1K=4KB数据),正是自定义IP写入DDR的数据。

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

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

相关文章

Redis 小记

Redis 命令小记 Redis 是一个文本/二进制数据库&#xff08;textual/binary database&#xff09; CLI 命令 redis-cli, redis-server, redis-benchmark, redis-check-dump, redis-check-aof redis-cli 执行命令 # 方式 1 redis-cli -h 127.0.0.1 -p 6379 > 127.0.0.1:63…

如何在idea中编写spark程序

在 IntelliJ IDEA 中编写 Spark 程序的详细指南 在大数据处理领域&#xff0c;Apache Spark 凭借其强大的分布式计算能力&#xff0c;成为了众多开发者的首选工具。而 IntelliJ IDEA 作为一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;为编写 Spark 程序…

各类神经网络学习:(十一)注意力机制(第3/4集),位置编码

上一篇下一篇注意力机制&#xff08;2/4集&#xff09;注意力机制&#xff08;4/4集&#xff09; 位置编码 R N N RNN RNN 和 L S T M LSTM LSTM 这些网络都是串行执行的&#xff0c;在潜移默化中&#xff0c;就包含了顺序关系&#xff0c;也就是词序关系。而注意力机制是并行…

《Python Web部署应知应会》Flask网站隐藏或改变浏览器URL:从Nginx反向代理到URL重写技术

Flask网站隐藏或改变浏览器显示URL地址的实现方案&#xff1a;从Nginx反向代理到URL重写技术 引言 在Web应用开发中&#xff0c;URL路径的安全性往往被忽视&#xff0c;这可能导致网站结构和后端逻辑被攻击者轻易推断。对于Flask框架开发的网站&#xff0c;如何隐藏或改变浏览…

elementui里的el-tabs的内置样式修改失效?

1.问题图 红框里的是组件的内置样式&#xff0c;红框下的是自定义样式 2.分析 2.1scoped vue模板编译器在编译有scoped的stye标签时&#xff0c;会生成对应的postCSS插件&#xff0c;该插件会给每个scoped标记的style标签模块&#xff0c;生成唯一一个对应的 data-v-xxxhash…

大数据测试集群环境部署

Hadoop大数据集群搭建&#xff08;超详细&#xff09;_hadoop_小飞飞519-GitCode 开源社区 hadoop集群一之虚拟机安装(mac)_hadoop_皮皮虾不皮呀-华为开发者空间 hadoop集群二之hadoop安装_hadoop_皮皮虾不皮呀-华为开发者空间 虚拟机如何查看gateway | PingCode智库

Nginx 核心功能笔记

目录 一、Nginx 简介 二、核心功能详解 三、关键指令解析 四、性能优化要点 五、常见应用场景 一、Nginx 简介 定位 高性能的 HTTP/反向代理服务器&#xff0c;同时支持邮件协议代理&#xff08;IMAP/POP3/SMTP&#xff09;。采用 事件驱动、异步非阻塞 架构&#xff0c;…

强化学习(二)马尔科夫决策过程(MDP)

1. 简介 马尔可夫决策过程正式地描述了强化学习的环境其中环境是完全可观测的即当前状态完全表征了这个过程几乎所有的强化学习问题都可以形式化为马尔可夫决策过程&#xff0c;例如&#xff1a; 最优控制主要处理连续的马尔可夫决策过程部分可观察的问题可以转化为马尔可夫决…

Day16(贪心算法)——LeetCode45.跳跃游戏II763.划分字母区间

1 LeetCode45.跳跃游戏II 1.1 题目描述 与跳跃游戏类似&#xff0c;跳跃游戏II给定长为n的从0开始索引的整数数组nums&#xff0c;nums[i]是你在i处能向右跳跃的最大步数&#xff0c;求到达数组最后一个索引处需要跳跃的最少次数。   一个示例&#xff1a;nums[2,3,1,1,4]&a…

告别碎片化!两大先进分块技术如何提升RAG的语义连贯性?

研究动机 论文核心问题及研究背景分析 1. 研究领域及其重要性 研究领域&#xff1a;检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;系统&#xff0c;结合自然语言处理&#xff08;NLP&#xff09;与信息检索技术。重要性&#xff1a; RAG通过动态…

leetcode day37 474

474 一和零 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 示例 1&#xff1a; 输入&#xff1a;s…

二、信息时代社会结构的转变

到了信息时代,以及在核武器的前提下,上述的社会结构的逻辑,就有了一个根 本性的转变,就是暴力的成本和收益,都在下降。 暴力的成本在降低。比如说枪支,它的制造和分发都变得非常容易。现在我们都 知道有 3D 打印,它就好像工业时代的印刷机,印刷圣经或者书籍,使知识更加 普及和容…

Elasticsearch 堆内存使用情况和 JVM 垃圾回收

作者&#xff1a;来自 Elastic Kofi Bartlett 探索 Elasticsearch 堆内存使用情况和 JVM 垃圾回收&#xff0c;包括最佳实践以及在堆内存使用过高或 JVM 性能不佳时的解决方法。 堆内存大小是分配给 Elasticsearch 节点中 Java 虚拟机的 RAM 数量。 从 7.11 版本开始&#xff…

C++之类和对象:构造函数,析构函数,拷贝构造,赋值运算符重载

前提&#xff1a;如果一个类是空类&#xff0c;C中空类中真的什么都没有吗&#xff0c;不是的&#xff0c;编译器会自动生成6个默认成员函数。默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的成员函数称为默认成员函数。 默认成员函数&#xff1a;构造函…

【专题五】位运算(1):常见位运算操作总结

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…

小草GrassRouter多卡聚合路由器聚合卫星、MESH网络应用解决方案

一、多网融合解决方案 卫星网络融合‌ 支持接入卫星通信模块&#xff0c;在无地面网络覆盖的极端场景&#xff08;如偏远山区、海洋救援&#xff09;下&#xff0c;形成“5G卫星”双链路冗余传输&#xff0c;卫星链路可作为核心通信备份&#xff0c;确保关键指令和视频数据实…

【Mybatis】Mybatis基础

文章目录 前言一、搭建MyBatis1.1 创建maven工程1.2 加入log4j日志功能1.3 MyBatis的增删改查1.4 核心配置文件详解 二、MyBatis获取参数值的两种方式2.1 单个字面量类型的参数2.2 多个字面量类型的参数2.3 map集合类型的参数2.4 实体类类型的参数2.5 使用Param标识参数 三、 M…

AI四大边界

大模型训练的边界并非由单一因素决定&#xff0c;而是技术、伦理、法律及实际应用需求共同作用的结果。以下从四个维度解析其边界来源&#xff1a; 一、技术边界&#xff1a;资源与能力的双重限制 计算资源瓶颈 成本与算力&#xff1a;大模型训练依赖海量GPU/TPU资源&#xff…

Twitter 工作原理|架构解析|社交APP逻辑

这是对Twitter 工作原理&#xff5c;架构解析&#xff5c;社交APP逻辑_哔哩哔哩_bilibili的学习&#xff0c;感谢up小凡生一 在两年半前&#xff0c;埃隆马斯克收购了Twitter&#xff0c;并且进行了一系列重大改革。今天我们来解析一下这个全球知名社交平台的架构。首先&#x…

Java基础学习内容大纲

Java基础学习内容大纲 第一阶段:建立编程思想 ​ Java概述:如何快速学习Java技术、Java历史、Java特点、Sublime、Java运行机制、JDK、转义字符、Java开发规范、Java API ​ 变量:数据类型、变量基本使用、数据类型转换 ​ 运算符:运算符介绍、算数运算符、关系运算符、…