【ZYNQ入门】第五篇、AXI HP口读写数据原理

目录

第一部分、AXI总线的相关知识  

1、ZYNQ架构

2、AXI 总线和 AXI 接口以及 AXI 协议

3、AXI 总线与 ZYNQ 的关系

4、AXI 总线介绍

5、AXI 接口介绍

6、AXI 协议介绍

7、AXI高效传输的原因

8、常见总线汇总

9、HP接口写时序配置

10、HP DDR的地址分配

11、缓存一致性的问题

12、跨时钟域数据传输问题

12.1、单bit数据

慢到快:

快到慢:

12.2、多bit数据

第二部分、AXI HP接口的使用

1、HP口的封装

2、ZYNQ HP口的配置

3、IP核的调用以及连线

4、HP 口的读写时序

4.1、读时序

4.2、写时序

第三部分、总结

1、写在前面

2、工程链接


第一部分、AXI总线的相关知识  

        这里的知识部分来源于米联客实验手册部分来源于个人总结,想知道更多细节请参考这本书《ZYNQ 修炼秘籍裸机篇 2019 版》。     

1、ZYNQ架构

        ZYNQ 拥有 ARM+FPGA 这个神奇的架构, ARM 和 FPGA 通过 AXI4 总线进行通信。

2、AXI 总线和 AXI 接口以及 AXI 协议

        总线、接口和协议,这三个词经常被联系在一起, 但是三者有区别。

(1)、总线:是一组传输通道,是各种逻辑器件构成的传输数据的通道,一般由数据线、地址线、控制线等构成。

(2)、接口:是一种连接标准,又被称为物理接口。(AXI-GP 接口, AXI-HP 接口以及 AXI-ACP 接口)

(3)、总线协议:就是传输数据的规则(AXI4-LiteAXI4AXI4-Stream )。

        这里需要特别说明一下 AXI 总线和 AXI 接口的关系。在 ZYNQ 中,支持 AXI4-LiteAXI4AXI4-Stream 三种总线协议,需要注意的是 PS 与 PL 之间的接口(AXI-GP 接口, AXI-HP 接口以及 AXI-ACP 接口)只支持 AXI4-Lite和 AXI 4协议这两种总线协议。

        也就是说 PL 这边的 AXI-Stream 的接口是不能直接与 PS 对接的,需要经过 AXI4 或者 AXI4-Lite 的转换。比如后面将用到的 VDMA IP ,它就实现了在 PL 内部 AXI4 到 AXI-Stream 的转换, VDMA利用的接口就是 AXI-HP 接口。(区别于我的设计:我的设计没有调用VDMA 这个IP核,而是直接通过改写AXI HP接口的读写时序来实现的,但功能应该核VDMA类似)。

3、AXI 总线与 ZYNQ 的关系

        AXI(Advanced eXtensible Interface)本是由 ARM 公司提出的一种总线协议, Xilinx 从 6 系列的 FPGA 开始对 AXI 总线提供支持,此时 AXI 已经发展到了 AXI4 这个版本,所以当你用到 Xilinx 软件的时候看到的都是“AIX4” 的 IP,如 Vivado 打包一个 AXI IP 的时候,看到的都是 Create a new AXI4 peripheral。

4、AXI 总线介绍

        在 ZYNQ 中有支持三种 AXI 总线,拥有三种 AXI 接口,当然用的都是 AXI 协议。其中三种 AXI 总线分别为:

        AXI4总线:(For high-performance memory-mapped requirements.)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大 256 轮的数据突发传输

        AXI4-Lite总线:(For simple, low-throughput memory-mapped communication )是一个轻量级的地址映射单次传输接口,占用很少的逻辑单元。

        AXI4-Stream总线:(For high-speed streaming data.)面向高速流数据传输;去掉了地址项,允许无限制的数据突发传输规模。

5、AXI 接口介绍

        三种 AXI 接口分别是:

        AXI-GP 接口(4 个):是通用的 AXI 接口,包括两个 32 位主设备接口和两个 32 位从设备接口,使用该接口可以访问 PS 中的片内外设。

        AXI-HP 接口(4 个):是高性能/带宽的标准的接口, PL 模块作为主设备连接。主要用于 PL 访问 PS 上的存储器(DDR 和 On-Chip RAM)

        AXI-ACP 接口(1 个):是 ARM 多核架构下定义的一种接口,中文翻译为加速器一致性端口,用来管理DMA 之类的不带缓存的 AXI 外设, PS 端是 Slave 接口

6、AXI 协议介绍

        协议和总线关系密切,协议要在总线的结构上制定。虽然说 AXI4, AXI4-Lite, AXI4-Stream 都是 AXI4 协议, 但是各自细节上还是不同的

        总的来说, AXI 总线协议的两端可以分为分为主(master)、从(slave)两端,他们之间一般需要通过一个 AXI Interconnect 相连接,作用是提供将一个或多个 AXI 主设备连接到一个或多个 AXI 从设备的一种交换机制。当我们添加了 zynq 以及带 AXI 的 IP 后再进行自动连线时,vivado 会自动帮我们添加上这个 IP。

        AXI Interconnect的主要作用是当存在多个主机以及从机器时, AXI Interconnect负责将它们联系并管理起来。 由于 AXI 支持乱序发送,乱序发送需要主机的 ID 信号支撑,而不同的主机发送的 ID 可能相同,而 AXI Interconnect 解决了这一问题,他会对不同主机的 ID 信号进行处理让 ID 变得唯一。

7、AXI高效传输的原因

       (1)、AXI 协议将读地址通道,读数据通道,写地址通道,写数据通道,写响应通道分开,各自通道都有自己的握手 协议。每个通道互不干扰却又彼此依赖。

       (2)、支持乱序操作。

8、常见总线汇总

        AXI、AHB、APB(下面是嫖过来的截图)

9、HP接口写时序配置

        最大数据位宽:64bitByte

        最大同步时钟:250MHz

        最大突发长度:256

10、HP DDR的地址分配

        只有0008_0000to3fff_ffff才映射在DDR,而0000——0000to0003——ffff映射在OCM上。

1KB = 1024 Bytes = 0x400

1MB = 1024 KB = 0x10_0000

1GB = 1024MB = 0x4000_0000

        下图:AXI HP接口能访问DDR的大小为8_0000 - 3FFF_FFFF刚好是1GB

11、缓存一致性的问题

        提到缓存一致性,我就想到这篇文章:“不会被封的外挂”,为何使用FPGA作为FPS游戏的“DMA”桥梁 (qq.com)

        由上面ZYNQ的架构图可以知道,PL端的4个AXI HP接口直接连接着AMBA 总线,而AMBA又是直接连接着DDR3,这中间没有任何其他的存储设备。因此,PL端通过AXI的HP口可以直接访问DDR,而不需要经过CPU的约束。

 AMBA是由ARM公司研发的一种高级微控制器总线架构(Advanced Microcontroller Bus Architecture)。其中AMBA包含了四种不同的总线标准,分别是:AHB、ASB、APB、AXI

        而在多级存储器结构中,CPU 通过1级或多级 Cache 与 DDR 产生连接, CPU 本身不直接访问 DDR,而是通过 Cache 访问 DDR。 Cache 中始终会暂存一小部分(通常是几KB~几MB量级) CPU 最近访问的 DDR 某些地址区域中的数据。因此,在应用程序中对 DDR 进行读或写操作, 实际上都是 CPU 对 Cache进行读或写操作。

        因此缓存一致性的问题就是:当 DDR 中某个地址范围内的数据突然被除 CPU 以外的 Master(如 DMA)改变时, 若此时 Cache中保存了这些区域的数据,且这些数据在 Cache 中状态为有效时,当 CPU 需要再次读取 DDR 这片区域的数据时,就不会让 Cache 去读取 DDR 中此区域内最新的数据来更新 Cache, 再从 Cache 里读取最新的数据, 而是直接从 Cache中读取原来的旧数据, 显然这不是我们所期望的结果。

        ZYNQ 中存在 ICache 和 DCache, ICache 用于缓存可执行程序, DCache 用于缓存数据。 一般情况下, 用于保存可执行程序的 DDR 地址范围不会被除 CPU 以外的对象访问。 因此, 一般不存在 ICache 的一致性问题。 而 DCache在很多应用中却经常会被除 CPU 以外的对象访问,所以存在一致性问题。
        ZYNQ 中维护 DCache 一致性的方法有两种:

        第一种暴力的:直接把Cache关了,CPU不用Cache。

        第二种不暴力的: 刷新Cache,重新载入DDR数据。

12、跨时钟域数据传输问题

        在AXI总线的时钟一般都比较高,最高可到250MHz。因此在实际使用中都会存在慢速数据到快速数据的一个转换过程,因此这里简单介绍一下跨时钟域数据的传输问题。

12.1、单bit数据

        一般是一些标志信号或者使能信号。

慢到快:

        将慢速数据在快时钟域下打两拍。打两拍的目的是将慢时钟域信号同步到快时钟域。

快到慢:

        (展宽法) 跨时钟域传输和Verilog代码-CSDN博客

        将快脉冲在快时钟域下展宽,然后慢时钟去捕获,捕获四次,前两次的&输出慢脉冲,最后一次的高拉低展宽信号。

注意事项:

  • 结绳法适合采样数据少(信号脉冲间隔大)的信号;
  • 脉冲间隔应该大于3个慢时钟域时钟周期
  • 等待3拍后,才能完成复位,允许下一个输入脉冲同步。

        Verilog代码 

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : BigFartPeach
// CSDN   : 大屁桃 
// E-mail : 2624507313@qq.com
// File   : slow2fast.v
// Create : 2023-12-06 10:54:34
// ----------------------------------------------------------------------------- 
module slow2fast(input wire rst,input wire clk_50MHz,input wire clk_200MHz,input wire fast_pulse,output wire slow_pulse,output wire widen_flag_see);reg widen_flag;//展宽信号
reg capture_widen,capture_widen_old;//慢时钟域捕获快时钟
reg capture_widen2,capture_widen_old2;//慢时钟域捕获快时钟assign widen_flag_see = widen_flag;//展宽信号
always @(posedge clk_200MHz or posedge rst) beginif (rst == 1'b1) beginwiden_flag <= 1'b0;endelse if(capture_widen_old2 == 1'b1) beginwiden_flag <= 1'b0;endelse if (fast_pulse == 1'b1) beginwiden_flag <= 1'b1;end
end//将展宽信号同步回低频时钟
always @(posedge clk_50MHz or posedge rst) beginif (rst == 1'b1) begin{capture_widen_old,capture_widen} = {1'b0,1'b0};endelse begin{capture_widen_old,capture_widen} = {capture_widen,widen_flag};end
endalways @(posedge clk_50MHz or posedge rst) beginif (rst == 1'b1) begin{capture_widen_old2,capture_widen2} = {1'b0,1'b0};endelse begin{capture_widen_old2,capture_widen2} = {capture_widen2,capture_widen_old};end
end//低频脉冲
assign slow_pulse = (~capture_widen_old) & capture_widen;endmodule

        仿真代码

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : BigFartPeach
// CSDN   : 大屁桃 
// E-mail : 2624507313@qq.com
// File   : tb_fast2slow.v
// Create : 2023-12-06 11:12:27
// ----------------------------------------------------------------------------- 
`timescale 1ns/1psmodule tb_fast2slow();reg rst;
reg clk_50MHz,clk_200MHz;
reg fast_pulse;
wire slow_pulse,widen_flag_see;initial beginrst = 1;fast_pulse = 0;clk_50MHz = 0;clk_200MHz = 0;#102.5;rst = 0;fast_pulse = 1;#5fast_pulse = 0;
endalways #2.5 clk_200MHz = ~clk_200MHz;
always #10 clk_50MHz = ~clk_50MHz;slow2fast inst_slow2fast(.rst            (rst),.clk_50MHz      (clk_50MHz),.clk_200MHz     (clk_200MHz),.fast_pulse     (fast_pulse),.slow_pulse     (slow_pulse),.widen_flag_see (widen_flag_see));endmodule

        仿真代码的波形 

12.2、多bit数据

        目前遇到的方法就是采用异步fifo


第二部分、AXI HP接口的使用

        这里通过自行修改的AXI HP IP的方式来实现对DDR3的访问,实际过程中可以通过调用vivado内部VDMA IP来实现。

1、HP口的封装

第一步、创建一个AXI4的IP

第二步、新建名称,注意,IP的路径要选择当前的工程下的文件夹

第三步、由于这里是建立HP端口,因此这里接口类型要选择 Full模式,接口模式为Master主机模式。因为HP口只能PL做主机。

        注意:这里的数据位宽还修改不了,需要后面通过编辑IP的方式修改数据位宽。最大为位宽就是64bit

第四步、选择Edit IP,修改内部代码等。(不同的时序代码不同,具体参考第2小节

第五步、修改IP基地址、突发长度、数据位宽(单次传输的数据位宽),最后封装IP

2、ZYNQ HP口的配置

第一步、打开PL clock 200M(HP口最高为250M,但是这里还是配置为200M)

第二步、打开一个复位端口

第三步、打开HP0口,位宽64bit

3、IP核的调用以及连线

        这里的时钟配置为200M,虽然HP口最高为250M,但是这里还是配置为200M。

        注意:整个工程,只有时钟没有拉到最高配置(这里200M,最高250M)。HP口的最大位宽(64bit)和突发长度(256),都拉到了最大

        HP IP核连接时钟后,其它的都可以自动连接。Run Connection Automation。

4、HP 口的读写时序

        通过修改读写代码来实现自己想要实现的功能。正常情况下都需要异步fifo来缓存数据,因此代码在不同的场景不一致。

4.1、读时序

        读数据的时序

        读数据数据的波形,由下图我们可以知道,AXI 总线去DDR3内读取数据的时候,先给地址赋值,赋值结束后,数据就源源不断的过来,直到突发长度的最后一个。

4.2、写时序

        写数据时序

第三部分、总结

1、写在前面

        该篇文章介绍AXI总线的相关知识、缓存一致性原理、单bit数据跨时钟域传输问题、包括AXI HP口封装原理等。

       主要是我调试过程中的笔记,但是希望能够给你提供一定的思路。

2、工程链接

         这篇文章的内容是为了这篇文章的内容做铺垫,关于工程下载链接以及实验现象,请参考这篇文章【ZYNQ实验】第一篇、ZYNQ驱动HDMI显示图片-CSDN博客

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

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

相关文章

如何缓解BOT攻击?分享灵活准确的防御之道

BOT流量在所有互联网流量中的占比过半&#xff0c;而且存在好坏之分。其中“好”的BOT&#xff0c;比如在互联网上搜索和查找内容的BOT&#xff0c;它们是我们不可或缺的帮手。恶意的BOT进行信息数据爬取、薅羊毛等攻击行为&#xff0c;正损害着企业和用户的利益。专业数据统计…

将文本文件导入Oracle数据库的简便方法:SQL Developer

需求 我有一个文本文件dbim.txt&#xff0c;是通过alert log生成的&#xff0c;内容如下&#xff1a; 2020-09-11 2020-09-11 ... 2023-12-03 2023-12-03 2023-12-26我已经在Oracle数据库中建立了目标表&#xff1a; create table dbim(a varchar(16));我想把日志文件导入Or…

若依管理系统部署

本文章仅供参考&#xff0c;由于个软件版本不同可能会有偏差。 登录系统打开cmd 编辑文件 这些文件分别打开&#xff0c;打开后在浏览器会出现若依管理系统后台&#xff0c;输入账号 admin 密码 123456即可进入后台。 本文章仅供参考&#xff0c;由于个软件版本不同可能会有…

Linux内存管理:(六)页交换算法

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 引言 在Linux操作系统中&#x…

synchronized锁的底层原理

synchronized 锁是 Java 中用于实现线程同步的关键字。它提供了一种简单而有效的方式来确保多个线程之间的互斥访问。底层原理可以通过 Java 的内存模型和对象监视器锁&#xff08;Monitor Lock&#xff09;来理解。 Monitor结构如下&#xff1a; 在 Java 的内存模型中&#x…

Spring Boot 与 Spring 框架的区别

一、前言 Spring Boot 和 Spring 框架是由 Spring 项目提供的两个关键的技术栈&#xff0c;它们在 Java 开发中扮演着不同的角色。在阐述其区别之前&#xff0c;我们先大致了解下这两个框架 二、Spring 框架 1、背景 Spring 框架是一个全栈的企业应用开发框架&#xff0c;起…

springboot社区养老服务系统设计与实现

&#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;一 、设计说明 1.1 研究背景 当…

梯度、散度、旋度

目录 梯度Gradient 散度Divergence 旋度Curl 梯度Gradient 即函数在该点处沿着该方向&#xff08;此梯度的方向&#xff09;变化最快&#xff0c;变化率最大&#xff08;为该梯度的模&#xff09;&#xff1b; Scalar -> Vector &#xff0c;表示标量变化最快的方向&…

FPGA——VIVADO生成固化文件,掉电不丢失

VIVADO生成固化文件 (1)加入代码(2)生成bin文件&#xff0c;并且下载 (1)加入代码 设计文件(.xdc)中加入这段代码: set_property CFGBVS VCCO [current_design] set_property CONFIG_VOLTAGE 3.3 [current_design] set_property BITSTREAM.GENERAL.COMPRESS true [current_de…

echarts实现点击不同的柱子实现类目的不同名字

实现效果如下图: 首先实现echarts堆叠柱状图数据为0的不占用x轴空间 option {tooltip: {trigger: axis,axisPointer: {type: shadow},},legend: {},grid: {left: 3%,right: 4%,bottom: 3%,containLabel: true},xAxis: [{type: category,position: bottom,data: [园区内, 园区…

Linux_apachectl 网页优化

1.1 网页压缩与缓存 在使用 Apache 作为 Web 服务器的过程中&#xff0c;只有对 Apache 服务器进行适当的优化配 置&#xff0c;才能让 Apache 发挥出更好的性能。反过来说&#xff0c;如果 Apache 的配置非常糟糕&#xff0c; Apache 可能无法正常为我们服务。因此&#xff0c…

静态网页设计——BNA热火队介绍(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 使用技术&#xff1a;HTMLCSSJS 主要内容&#xff1a;对BNA的球队热火队进行介绍。 基本内容 1、首页 首页分为三部分&#xff0c;以html进行分割&#xff0c;最上方…

HTTP打怪升级之路

新手村 上个世纪80年代末&#xff0c;有一天&#xff0c;Tim Berners-Lee正在工作&#xff0c;他需要与另一台计算机上的同事共享一个文件。他尝试使用电子邮件&#xff0c;但发现电子邮件不能发送二进制文件。Tim Berners-Lee意识到&#xff0c;他需要一种新的协议来共享二进制…

静态网页设计——喜羊羊与灰太狼(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1Ta4y1B75m/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS 主要内容&a…

docker学习笔记04-可视化界面Portainer

1.Portainer简介 Portainer 是一款开源的容器管理工具&#xff0c;旨在帮助用户更轻松地管理 Docker 环境。无论您是 Docker 新手还是经验丰富的开发人员&#xff0c;Portainer 都提供了直观的用户界面&#xff0c;使您能够方便地创建、部署和监控容器。 安装 Portainer 非常…

Java项目:109SpringBoot超市仓管系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 超市仓管系统基于SpringBootMybatis开发&#xff0c;系统使用shiro框架做权限安全控制&#xff0c;超级管理员登录系统后可根据自己的实际需求配角色&…

PostgreSQL 分区

由于大量数据存储在数据库同一张表中&#xff0c;后期性能和扩展会受到影响。所以需要进行表分区&#xff0c;因为它可以将大表分成较小的表&#xff0c;从而减少内存交换问题和表扫描&#xff0c;最终提高性能。庞大的数据集被分成更小的分区&#xff0c;更易于访问和管理。 …

入门Python数据分析最好的实战项目

本篇将继续上一篇数据分析之后进行数据挖掘建模预测&#xff0c;这两部分构成了一个简单的完整项目。结合两篇文章通过数据分析和挖掘的方法可以达到二手房屋价格预测的效果。 下面从特征工程开始讲述。 特征工程 特征工程包括的内容很多&#xff0c;有特征清洗&#xff0c;…

DevOps(9)

目录 45.如何在Linux中将一个文件附加到另一个文件&#xff1f; 46.解释如何使用终端找到文件&#xff1f; 47.解释如何使用终端创建文件夹&#xff1f; 48.解释如何使用终端查看文本文件&#xff1f; 49.解释如何在Ubuntu LAMP堆栈上启用curl&#xff1f; 50.解释如何在…

Spring Cloud Gateway 缓存区异常

目录 1、问题背景 2、分析源码过程 3、解决办法 最近在测试环境spring cloud gateway突然出现了异常&#xff0c;在这里记录一下&#xff0c;直接上干货 1、问题背景 测试环境spring cloud gateway遇到以下异常 DataBufferLimitException: Exceeded limit on max bytes t…