FPGA----ZCU106基于axi-hp通道的pl与ps数据交互(全网唯一最详)

news2024/11/25 11:01:34

1、大家好,今天给大家带来的内容是,基于AXI4协议的采用AXI-HP通道完成PL侧数据发送至PS侧(PS侧数据发送至PL侧并没有实现,但是保留了PL读取PS测数据的接口)

2、如果大家用到SoC这种高级功能,那大家应该对于AXI4协议已经很熟悉了,但本文侧重点为初学者直接提供可以上手的硬件实验,大佬请忽略。

3、AXI4协议的基础内容:

之前对于AXI4协议已经做过一些总结,但是总结的不好,下面重新进行总结。

(1)关于AXI4协议的视频课以及博客

FPGA-ZCU106-PL侧读写ddr4(全网唯一)_发光的沙子的博客-CSDN博客本次给大带来了ZCU106的PL侧读写ddr4的教程,本教程是全网唯一ZCU106教程。本教程采用的是xilinx的ddr4的IP核的AXI4接口开发的,因此需要先了解AXI4总线协议。https://blog.csdn.net/qq_37912811/article/details/125952512?spm=1001.2014.3001.5502这是我之前对AXI4协议的总结nullSDK篇_58~62_AXI接口简介【Xilinx】+【Vivado】+【AXI4总线】+【FPGA】共计5条视频,包括:58_AXI接口简介(第一讲)、59_AXI接口简介(第二讲)、60_AXI接口简介(第三讲)等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV1gy4y1Y7zr/?spm_id_from=333.337.search-card.all.click&vd_source=6b401d1c7af4d19ac1a956340ac80699这是b站的课程,看完之后会对AXI4有更深的了解。

(2)AXI4协议的总结

①写时序

 写时序,主机向从机写入数据。

一:aw开头的信号是写地址协议。主机告诉从机,我要向awaddr这个地址写数据。

二:w开头的信号是写数据协议。主机告诉从机,我要向awaddr这个地址写入wdata这个数据。

三:b开头的写响应协议。从机高速主机,你写的操作是否成功。

以上三个步骤,均需要ready以及valid双握手,这两个信号同时高电平时,协议才能正常传输。

注意:M_AXI_WR_awlen这个信号代表了每组数据需要传输的次数,在最后一次传输时,M_AXI_WR_wlas信号置为高电平。M_AXI_WR_awsize代表每次传输的字节数大小。例如,1024bit数据传输,通道最大传输为128bit;则需要传输1024bit/128bit=8次,128bit/8=16byte。

②读时序

 读时序,从机向主机请求数据。

一:ar开头的信号是读地址协议。从机告诉主机,我要向araddr这个地址读数据。

二:r开头的信号是读数据协议。从机告诉主机,我要读取araddr这个地址对应的rdata这个数据。

三:没有读数据相应,rresp信号被包含在读数据协议中,用以指示读响应,表明读传输的状态。

4、PL侧向PS侧通过AXI-HP通道写入数据实验

(1)实验任务:PL侧生成数据,通过AXI-HP通道写入PS侧的ddr中。PS侧完成软件设计,完成对PL侧写来的数据处理。

(2)实验软硬件:Vivado 2019.1、ZCU106

(3)实验过程:

①建立工程:embedded_axi_hp,选择ZCU106器件

②进行PS侧设计:仅针对ZCU106

一、搜索ZYNQ添加器件后,点击红框自动布线

 二、设置ddr,经本人亲测,我的ddr只能用这个设置,大家自己多调一下看看吧,这儿挺坑的。

FPGA学习之路-ZCU106板子点亮PS侧LED_发光的沙子的博客-CSDN博客_zcu1061、本文章借鉴了ZCU106--PL+PS点灯_Junluoyu的博客-CSDN博客_zcu106、ZCU106开发之PS侧MIO闪灯_lixiaolin126的博客-CSDN博客https://blog.csdn.net/qq_37912811/article/details/121953910?spm=1001.2014.3001.5502三、去掉无用端口

四、添加HP0端口,位宽选择128位(HP支持32/64/128位,PG201) 。右键各个端口,点击Make External,变成下面这样。

五、添加地址,容量自己设定,我直接用的就是系统直接给分配好的。

 六、添加debug,等待一会,点击左上角的即可。

 

 七、设置复位模块,并点击右上角的自动布线按钮。最终变成下图。

 

 点击红框,弹出成功表示设计无误。

 

 八、输出产品,生成HDL

 九,编写PL侧数据生成代码以及AXI4读写协议,整个项目目录如下所示。

这里给出data_gen.v代码,其余代码请联系作者

`timescale 1ns / 1ps
//
// Company: 东北电力大学
// Engineer: Yang Zheng
// 
// Create Date: 2022/11/27 14:18:57
// Design Name: 
// Module Name: data_gen
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module data_gen(
        input sys_clk,                  //系统时钟
        input sys_rst_n,                //系统复位,低电平有效
        //写
        output reg wr_en,               //写使能
        output reg [1023:0] wr_data,    //写数据
        output read_enable,             //写完成,开始读
        //读
        output reg rd_en,               //读使能
        input [1023:0] rd_data,         //读数据
        input rd_fifo_valid,            //读出数据时为高电平,由于ddr是512位的,因此我们需要计数4次,即每次读回4条数据;512/128=4
        input rd_fifo_wr_ack,            //写入数据为高电平
        //开始写入数据物理按钮
        input start_bnt
    );  
    //********************************************************************//
    //****************** Parameter and Internal Signal *******************//
    //********************************************************************//
    
    //parameter define
    parameter COUTER_MAX = 30'd5_000_000;//0.2s的时间计数器
    reg [29:0] time_counter = 'd0;
    //reg define
    reg [29:0] count = 'd0; //写入计数器
    reg wr_flag = 'd0; //写标志
    //********************************************************************//
    //***************************** Main Code ****************************//
    //********************************************************************//
    
    assign read_enable = wr_flag;
    
    //生成64个32位的数据并且写入PS侧
    //这里的 wr_data是输入到ddr的数据,wr_en是使能端口
    //这里的 wr_flag是可以ddr存有数据,因此可读标志
    always@(posedge sys_clk or negedge sys_rst_n) begin
        if (sys_rst_n == 1'b0) begin
            wr_data <= 1024'd0;
            wr_en   <= 1'd0;
            wr_flag <= 1'b0;
            count <= 'd0;
        end
        else begin
            if (wr_flag == 1'b0 && count < 'd4 && start_bnt == 1'b0) begin
                //wr_en <= 1'd1;
                count <= count + 1'b1;// 1
            end
            else if(start_bnt == 1'b1) begin
                if (wr_flag == 1'b0 &&  count == 'd4) begin
                    wr_data <= {
                        32'd1 ,32'd2 ,32'd3 ,32'd4 ,32'd5 ,32'd6 ,32'd7 ,32'd8 ,
                        32'd9 ,32'd10,32'd11,32'd12,32'd13,32'd14,32'd15,32'd15,
                        32'd17,32'd18,32'd19,32'd20,32'd21,32'd22,32'd23,32'd24,
                        32'd25,32'd26,32'd27,32'd28,32'd29,32'd30,32'd31,32'd32
                    };
                    wr_en <= 1'd1;
                    count <= count + 1'b1;// 2
                end
                else if (wr_flag == 1'b0 && count == 'd5) begin
                    wr_data <= {
                        32'd33,32'd34,32'd35,32'd36,32'd37,32'd38,32'd39,32'd40,
                        32'd41,32'd42,32'd43,32'd44,32'd45,32'd46,32'd47,32'd48,
                        32'd49,32'd50,32'd51,32'd52,32'd53,32'd54,32'd55,32'd56,
                        32'd57,32'd58,32'd59,32'd60,32'd61,32'd62,32'd63,32'd64
                    };
                    wr_en <= 1'd1;
                    count <= count + 1'b1;// 3
                end
                else if (wr_flag == 1'b0 && count == 'd6) begin
                    wr_data <= {
                        32'd1 ,32'd2 ,32'd3 ,32'd4 ,32'd5 ,32'd6 ,32'd7 ,32'd8 ,
                        32'd9 ,32'd10,32'd11,32'd12,32'd13,32'd14,32'd15,32'd15,
                        32'd17,32'd18,32'd19,32'd20,32'd21,32'd22,32'd23,32'd24,
                        32'd25,32'd26,32'd27,32'd28,32'd29,32'd30,32'd31,32'd32
                    };
                    wr_en <= 1'd1;
                    count <= count + 1'b1;// 3
                end
                else if (wr_flag == 1'b0 && count == 'd7) begin
                    wr_flag <= 1'b1;
                    wr_en <= 1'd0;
                end
            end
        end
    end
    always@(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            time_counter <= 30'd0;
        end
        else begin
            if (wr_flag) begin
                time_counter <= time_counter + 1;
                if(time_counter == COUTER_MAX) begin
                    time_counter <= 30'd0;
                end
            end
        end
    end
    //根据写完成拉高读使能数据
    //这里的rd_en可以控制是否读取ddr,因此每次读取给出一个周期的高电平即可
    //一直读取
    always@(posedge sys_clk or negedge sys_rst_n) begin
        if (~sys_rst_n) begin
            rd_en <= 1'd0;
        end
        //写完后等待0.2s开始读取数据
        else begin
            if(wr_flag == 1'b1 && time_counter == COUTER_MAX) begin//写完后等待0.2s
                rd_en<=1'd1;
            end
            else begin
                rd_en<=1'd0;
            end
        end
    end
endmodule

(4)实验结果:

一、仿真结果

可以看到数据已经写入到wdata信号,bresp响应0且bvalid为高电平说明已经将数据写入到PS侧。

二、硬件结果

这里给出helloword.c代码,由于传输数据量小,因此需要将缓存屏蔽掉。

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xil_cache.h"


int main()
{
    //init_platform();
	Xil_DCacheDisable();
    print("Hello World\n\r");

    //cleanup_platform();
    return 0;
}

基于axi-hp通道的pl与ps数据交互

 5、结论及展望

以上就是本实验的全部内容。本实验完成了,PL侧自定义数据传输到PS侧,并在PS侧写加软件,完成了PL侧传入数据的求和功能,发挥了整个SoC的功能,为后续PL侧加速计算,PS侧数据分析奠定了基础。

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

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

相关文章

系列ML.Net 学习篇【一】——初识机器学习

由于公司项目涉及到机器学习和图像识别,虽然我并不是算法专家&#xff0c;但毕竟需要了解和知道其运转原理&#xff0c;因此自我进行了学习进化&#xff0c;决定在机器学习上有所进展&#xff0c;结合.NET技术的ML.NET,把机器学习的技能提升一个Level&#xff0c;如果你也有兴趣…

vue学习31~39(列表过滤+列表排序+vue检测data中的数据+收集表单数据+过滤器)

1.14 列表过滤 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

VM虚拟机三种网络配置详解(桥接、NAT、仅主机)

在学习网络配置之前&#xff0c;需要搞明白有关于网络的一些基本概念&#xff0c;什么是ip&#xff0c;子网掩码&#xff0c;网段&#xff0c;网关&#xff1f;这里只做最简单的解释&#xff0c;实际上远远不止这些。 网络名词 ip 在现实生活中&#xff0c;这么大的一个中国…

bootstrap标签和导航条件组件学习(七)

标签和导航条件组件 这里的标签是不能切换的&#xff0c;它是静态的&#xff0c;在JavaScrapt插件里面是是可以切换页面的 需要配合插件 加选中状态&#xff1a; 它是自适应屏幕宽度&#xff1a; 胶囊式标签下拉菜单&#xff1a; 复制代码放到页面中&#xff1a; div 的class…

KubeEdge设备接入的mqtt调试

kubeedge的设备接入是用mqtt进行转接的。但是如果遇到一些问题需要排查问题时&#xff0c;希望可以查看终端发的mqtt消息。 目前 mosquitto 没有看到有进行消息查看的机制&#xff08;也可能我不知道&#xff09; EMQ可以进行消息查看。 1.安装EMQ 快速开始 | EMQX 5.0 文…

数据存储——声音存储

声音数字化一、声音的采样&#xff08;一&#xff09;信号分类1.模拟信号2. 数字信号&#xff08;二&#xff09;存储1、采样2.量化3.编码1.数字音频的技术指标2.未经压缩的数字音频的数据量&#xff08;字节&#xff08;8bit&#xff09;&#xff09;总结 声音的数字化过程一、…

[附源码]SSM计算机毕业设计校园一卡通管理信息系统台JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

zabbix监控Nginx

目录 一、环境准备 二、部署Nginx被监控端 三、自定义Nginx监控key 四、给目标主机创建监控项 一、环境准备 搭建zabbix基础环境 zabbix基础环境部署参照&#xff1a;zabbix基础环境部署_桂安俊kylinOS的博客-CSDN博客 以下实验部署均基于上述环境 二、部署Nginx被监控端…

芯片级解密YMTC NAND Xtacking 3.0技术

长江存储YMTC自从2016年成立以来&#xff0c;一直在吸引外界的关注。作为NAND国产厂商&#xff0c;被寄予厚望。在2018年FMS闪存峰会发布了Xtacking 1.0的NAND架构&#xff0c;凭借该技术荣获了“最具创新初创闪存企业”。 在2019年又发布了Xtacking 2.0的NAND架构。根据官网介…

xss-labs/level8

单单从界面上看 只剩下一个输出点了 但是界面毕竟就是界面 而源代码才是更深层的东西 通过源代码我们看得出来 有两个输出点 第一处是经过htmlspecialchars转义之后然后插入 第二处则是对关键字进行了下划线插入操作 我们试试看构造如下 " onclickjavascript:alert(…

Qt(Python+Qt)QMainWindow的splitDockWidget方法将QDockWidget停靠窗分割排列

主窗口的splitDockWidget方法用于将一个停靠窗占据的空间分割成两部分&#xff0c;原有停靠窗放置在第一部分的区域&#xff0c;另一个停靠窗放置在第二部分的区域。调用语法&#xff1a; splitDockWidget( QDockWidget first, QDockWidget second, Qt.Orientation orientatio…

疫情下就业形势怎样?存在抗衰行业吗?

三年的疫情下&#xff0c;全球各国的经济都受到了重要影响。特别是今年以来&#xff0c;国际形势复杂严峻&#xff0c;国内疫情点、面频发&#xff0c;对经济运行的冲击和影响加大。 这一场持续三年的疫情&#xff0c;给很多正常人的工作和生活都带来了不确定性&#xff0c;也给…

转扩!寻找G2022次列车“旅客”

各位求职朋友大家好&#xff0c;欢迎乘坐G2022次列车 本次列车为6节编组&#xff0c;由上海开往北京&#xff0c;途径宁波、重庆 本次列车乘务组全体工作人员为您提供全方位福利待遇 上车地址&#xff1a;上海擎创信息技术有限公司 - 社会招聘 (eoitek.com) 如您还需其他帮助…

架构体系-黑马学习2:-业务幂等性技术架构体系(1)

25min 以下涉及到的都是一人操作时候&#xff0c;多次点击造成的并发&#xff0c;对幂等性问题的影响。 大多适用场景&#xff0c;都是单表。没有兼顾数据库分库分表分区场景。 幂等性定义&#xff1a;无论对某一个资源操作了多少次&#xff0c;其影响都应该是相同的。换句话…

Kepserver EX6配置opc ua服务端 以及客户端

一.Kepserver EX6下载 链接&#xff1a;https://pan.baidu.com/s/1zNr-J0vmBdu9qmI1GtXxrw 提取码&#xff1a;wqcl 二.Kepserver EX6安装 点击安装包》选择“简体中文语言包”》一直默认下一步就可以直到结束安装 下载包中有破解补丁的详细使用说明这里就不多做说明了 下面…

《联邦学习实战—杨强》之使用Python从零开始实现一个简单的横向联邦学习模型

文章目录前言环境准备完整代码配置文件(conf.json)获取数据集(datasets.py)获取PyTorch中自带深度学习网络预训练模型(models.py)客户端(client.py)服务端(server.py)main.py运行知识点补充argparse基本用法tensor.copy_()[Python dict() 函数](https://www.runoob.com/python/…

Redis——》数据类型:zset(有序集合)

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 Redis——》数据类型&#xff1a;zset&#xff08;有序集合&#xff09;一、…

基于SpringBoot的在线点餐系统【附源码】

功能模块设计 技术概要 前端技术&#xff1a;JQuery&#xff0c;Thymeleaf&#xff0c; CSS 后端技术&#xff1a;SpringBoot&#xff0c;SpringMVC&#xff0c;mybaits 数据库&#xff1a;mysql 主要功能 首页实现 主页也是网址的入口处,一般包括了:LOGO、导航、Banner、…

C指针之初始化(三)

一、引言 C/C语言中引入了指针&#xff0c;使得程序能够直接访问内存地址&#xff0c;使得很多复杂的操作变得简单&#xff0c;同时也提高了程序的运行效率。指针即是地址&#xff0c;但是地址却是通过指针变量来存储的。因此我们通常所说的指针在很多时候说的都是指针变量。指…

AzkabanExecutorServer自动注册分析

启动AzkabanExecutorServer发现会自动注册&#xff0c;但是active默认为0&#xff0c;需要修改为1&#xff0c;否则 SELECT id, host, port, active FROM executors where activetrue查询不到记录&#xff0c;导致 AzkabanWebServer启动时候还是失败。 因此azkaban的正确启动…