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

news2025/2/24 11:15:19

目录

第一部分、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) begin
    if (rst == 1'b1) begin
        widen_flag <= 1'b0;
    end
    else if(capture_widen_old2 == 1'b1) begin
        widen_flag <= 1'b0;
    end
    else if (fast_pulse == 1'b1) begin
        widen_flag <= 1'b1;
    end
end

//将展宽信号同步回低频时钟
always @(posedge clk_50MHz or posedge rst) begin
    if (rst == 1'b1) begin
        {capture_widen_old,capture_widen} = {1'b0,1'b0};
    end
    else begin
        {capture_widen_old,capture_widen} = {capture_widen,widen_flag};
    end
end

always @(posedge clk_50MHz or posedge rst) begin
    if (rst == 1'b1) begin
        {capture_widen_old2,capture_widen2} = {1'b0,1'b0};
    end
    else 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/1ps

module tb_fast2slow();

reg rst;
reg clk_50MHz,clk_200MHz;
reg fast_pulse;
wire slow_pulse,widen_flag_see;

initial begin
    rst = 1;
    fast_pulse = 0;
    clk_50MHz = 0;
    clk_200MHz = 0;
    #102.5;
    rst = 0;
    fast_pulse = 1;
    #5
    fast_pulse = 0;
end

always #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.coloradmin.cn/o/1357997.html

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

相关文章

监控各大电商平台商品价格,库存信息,数据分析,京东SKU详情

要接入API接口以采集电商平台上的商品数据&#xff0c;可以按照以下步骤进行&#xff1a; 1、找到可用的API接口&#xff1a;首先&#xff0c;需要找到支持查询商品信息的API接口。这些信息通常可以在电商平台的官方文档或开发者门户网站上找到。 2、注册并获取API密钥&#x…

2023春季李宏毅机器学习笔记 06 :Diffusion Model 原理剖析

资料 课程主页&#xff1a;https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.phpGithub&#xff1a;https://github.com/Fafa-DL/Lhy_Machine_LearningB站课程&#xff1a;https://space.bilibili.com/253734135/channel/collectiondetail?sid2014800 一、想法概念 Q1&…

解读IPD产品需求管理流程

在IPD体系下&#xff0c;产品投资组合管理的例行活动首先表现在对客户需求的快速响应上。这包括需求的收集、分析与决策、研发实现等端到端等业务流。需求管理本质上是一条“从客户中来到客户中去”的业务流。为了高效地协同各个部门&#xff0c;更好地管理客户需求被满足的全过…

美格智能5G RedCap模组SRM813Q通过广东联通5G创新实验室测试认证

近日&#xff0c;美格智能5G RedCap轻量化模组SRM813Q正式通过广东联通5G创新实验室端到端的测试验收&#xff0c;获颁测评证书。美格智能已连续通过业内两家权威实验室的测试认证&#xff0c;充分验证SRM813Q系列模组已经具备了成熟的商用能力&#xff0c;将为智慧工业、安防监…

PPI+机器学习+免疫浸润+实验验证,如此简单也能发4+

今天给同学们分享一篇生信文章“Identification of metabolic biomarkers associated with nonalcoholic fatty liver disease”&#xff0c;这篇文章发表在Lipids Health Dis期刊上&#xff0c;影响因子为4.5。 结果解读&#xff1a; 识别NAFLD患者的MR DEG 主成分分析&…

2023 波卡年度报告选读:Polkadot SDK 与开发者社区

原文&#xff1a;https://dashboards.data.paritytech.io/reports/2023/index.html#section6 编译&#xff1a;OneBlock 编者注&#xff1a;Parity 数据团队发布的 2023 年 Polkadot 年度数据报告&#xff0c;对推动生态系统的关键数据进行了深入分析。报告全文较长&#xff…

【数据库原理】(7)关系数据库的完整性约束

关系模型的完整性规则是为了确保数据的唯一性和数据之间的关系的准确性。 有三类完整性约束:实体完整性、参照完整性和用户定义完整性。 其中实体完整性和参照完整性是必须满足的完整性约束条件,应该由关系系统自动支持。 实体完整性 实体完整性的核心概念 唯一性&#xf…

Excel如何将单元格设为文本

文章目录 一、打开excel文件二、选中单元格三、右键设置单元格格式四、设置界面选择文本后点确定五、其他问题 在caa开发过程中遇到从CATUnicodeString转成CString时&#xff0c;通过SetItemText写入将ID号写入单元格&#xff0c;无法保存ID号中的数字0&#xff0c;故将单元格格…

【EI会议征稿通知】2024年第九届智能计算与信号处理国际学术会议(ICSP 2024)

2024年第九届智能计算与信号处理国际学术会议&#xff08;ICSP 2024&#xff09; 2024年第八届智能计算与信号处理国际学术会议&#xff08;ICSP 2024&#xff09;将在西安举行&#xff0c; 会期是2024年4月19-21日&#xff0c; 为期三天, 会议由西安科技大学主办。 欢迎参会&…

AI无人直播系统怎么样?三点说明

近年来&#xff0c;因为科技的高速进步&#xff0c;不断涌现出了越来越多的新技术和创新事物&#xff0c;它们以其独特的方式取代了我们的许多传统做法&#xff0c;从而彻底解放了我们的双手。在这股潮流中&#xff0c;无人直播作为一种创新形式&#xff0c;使得直播变得更加简…

使用Go语言编写高效的HTTP服务器

随着互联网的快速发展&#xff0c;HTTP服务器在Web开发中扮演着越来越重要的角色。而Go语言作为一种高效、并发性强的编程语言&#xff0c;为编写高性能的HTTP服务器提供了强大的支持。本文将探讨如何使用Go语言编写高效的HTTP服务器。 首先&#xff0c;我们需要了解Go语言的H…

【nginx】linux(centos版本)安装nginx

目录 一、下载安装包1.1 官网下载1.2 linux命令下载 二、安装2.1 安装依赖包2.2 安装nginx 三、启动四、访问五、关停六、重载配置 一、下载安装包 1.1 官网下载 1.官网地址 https://nginx.org/en/download.html2.版本说明 1.Mainline version-主线版本 2.Stable version-稳…

OpenAI ChatGPT-4开发笔记2024-03:Chat之Function Calling/Function/Tool/Tool_Choice

Updates on Function Calling were a major highlight at OpenAI DevDay. In another world,原来的function call都不再正常工作了&#xff0c;必须全部重写。 function和function call全部由tool和tool_choice取代。2023年11月之前关于function call的代码都准备翘翘。 干嘛…

前端常用的几种算法的特征、复杂度、分类及用法示例演示

算法&#xff08;Algorithm&#xff09;可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤&#xff0c;或者看成按照要求设计好的有限的确切的计算序列&#xff0c;并且这样的步骤和序列可以解决一类问题。算法代表着用系统的方法描述解决问题的策略机制&#xff0c…

零信任(Zero Trust):理论与实践

零信任 &#xff08;Zero Trust&#xff09; 网络安全原则强调在组织内外始终不假设信任&#xff0c;并要求对每一个通信尝试进行严格的验证。无论是来自外部的访问请求还是内部网络的数据访问&#xff0c;零信任模型均要求对其进行细致的审查。 用一个简洁的口号来概括&#…

【JaveWeb教程】(1)Web前端基础:HTML+CSS入门不再难:一篇文章教你轻松搞定HTML与CSS!

目录 1. 前端开发介绍2. HTML & CSS2.1 HTML快速入门2.1.1 操作2.1.2 总结 2.2 开发工具2.3 基础标签 & 样式2.3.1 新浪新闻-标题实现2.3.1.1 标题排版2.3.1.1.1 分析2.3.1.1.2 标签2.3.1.1.2 实现 2.3.1.2 标题样式2.3.1.2.1 CSS引入方式2.3.1.2.2 颜色表示2.3.1.2.3 …

域传送漏洞

DNS解析 当用户访问域名时浏览器解析首先会查看浏览器缓存是否有对应的ip&#xff0c;如果没有则会到本地host文件中查看是否有对应的ip&#xff0c;如果没用则会将域名发送给本地区的DNS服务器. DNS服务器分为递归服务器&#xff0c;根服务器&#xff0c;权威服务器 首先是递…

695岛屿最大面积

题目 给定一个 row x col 的二维网格地图 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陆地&#xff0c; grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向相连&#xff08;对角线方向不相连&#xff09;。整个网格被水完全包围&#xff0c;但其中恰好有一个…

快手开源Kwai Agents系统、模型、数据全部开源;Transformer模型中的数学示例

&#x1f989; AI新闻 &#x1f680; 快手开源Kwai Agents系统、模型、数据全部开源&#xff0c;提升大语言模型准确性 摘要&#xff1a;快手开源了Kwai Agents&#xff0c;这是一个先进的AI智能体系统&#xff0c;能通过模仿人类认知技能来解决大语言模型的准确性问题。Kwai…

Redis命令---List篇

目录 1.Redis Lindex 命令 - 通过索引获取列表中的元素简介语法可用版本: > 1.0.0返回值: 列表中下标为指定索引值的元素。 如果指定索引值不在列表的区间范围内&#xff0c;返回 nil 。 示例 2.Redis Rpush 命令 - 在列表中添加一个或多个值简介语法可用版本: > 1.0.0返…