Aurora-64B/10B、XDMA与DDR结合设计高速数据流通路设计/Aurora光纤设计/XDMA读取DDR设计/基于FPGA的高速数据传输设计

因最近想通过FPGA把数据从光纤传到PC,借此机会和大家一起学习Aurora、XDMA结合DDR

制作不易,记得三连哦,给我动力,持续更新!!!   

完整工程文件下载:XDMA读写DDR工程   提取码:4sxh


         根据前几个章节的学习,已经把DDR、XDMA的相关介绍和设置,已经配置完成了,接下来就再次升华一下,再把一个高速接口Aurora添加进来,完全实现一个 光纤-> PCIE 高速传输通路,此设计适用于各大进行高速数据传输的项目,最大速度可以达到10G。

        太多了理论知识,我也不想在这里废话,咱们直接来干货!!

        为了此次设计,可以进行下板测试,咱们需要把Aurora的发送和接收连接在一起,然后通过FPGA产生数据,通过Aurora发送,同时Aurora接受过来,然后把数据存储到DDR,并且通过XDMA连接到PCIE,通过XDMA驱动,在主机端读出数据,最终来验证读出来的数据是否和自己产生的数据匹配,通过添加ILA,抓取各个状态的数据状态。

        测试环境介绍:       

                1、FPGA主芯片:zynq7100

                2、光纤连接线

                3、PCIE主机(Windows10系统)(linux也可以,但是本文采用的Windows)

                4、vivado版本:2019.2

一、设计框图

二、设计思路                

2.1 Aurora数据产生模块设计

       2.1.1 代码设计

        此模块就需要借助之前的文章,Aurora的配置说明,不会的小伙伴记得去我的主页翻一下,然后就得到了一个官方的Aurora例子,咱们通过修改这个个例子,进行数据产生、发送、接受,该说不说xilinx真的很良心,再次点赞!!!!

        配置介绍:

                1、Aurora速度:10.125Gbps

                2、Aurora时钟:156.25Mhz

                3、接口模式:Framing模式

        先分析一下官方例子中的各个模块作用:

我们只需修改FRAME_GEN模块即可产生自己的数据,(AXI协议数据) 下面是具体修改的内容:

部分代码:

 assign reset_i = RESET || (!CHANNEL_UP);assign RESET_ii = RESET ; assign resetUFC = reset_i; assign i_ready = !TX_DST_RDY_N;integer i=0;reg     [31:0] count;reg     [63:0] array [0:3];initial beginarray[0] = 64'h0000_0101_0202_0303;array[1] = 64'h0404_0505_0606_0707;array[2] = 64'h0808_0909_0A0A_0B0B;endreg [3:0] c_state, n_state;localparam   IDLE        = 0,DATA        = 1,DATA2       = 2,LAST_DATA   = 3,STOP        = 4;always @ (posedge USER_CLK) beginif (reset_i)c_state <= 0;elsebegin c_state <= n_state;endendalways @(*) begincase (c_state)IDLE    :   beginn_state = DATA;endDATA    :   beginif (i == 2 && i_ready)n_state = LAST_DATA;elsen_state = DATA;end LAST_DATA   :   beginif(i_ready)      n_state = STOP;elsen_state = LAST_DATA;endSTOP    :   beginif (count >=200_000_000)n_state = DATA; elsen_state = STOP;enddefault :   ;endcaseend

然后再自己建立一个顶层,(因为开发板的时钟和复位可能不符合Aurora协议),然后把这个设计例化到顶层,添加好约束文件,综合、实现、生成、bit文件。

     2.1.2 发送数据验证

        添加ILA到工程,具体采集的几个信号如下:(包括了发送数据部分、接受数据部分、Aurora状态部分)

然后重新编译工程,下载bit文件到开发板

打开ILA界面,抓取tx_valid和tx_ready同时为高电平的时候的触发:(此时光纤必须回环连接)

如上图可以发现,就是按照咱们代码里的一样,发送出来三组数据00--0B

由此可以验证发送数据没问题!!

2.1.3 接受数据验证

        紧接着我们可以来验证一下接受数据信号,同样在刚刚的ILA里,把接受数据的一些列信号移动到一起:

如上图可以发现,接受的数据和发射的数据完全一致,因为是Framing模式,所以数据接收并没有ready信号。

由此可以验证发送数据没问题!!

2.2 xdma、DDR链路模块设计

        xdma、DDR链路本次设计采用block design设计

        配置介绍:

                1、PCIE链路速度:x4  5.0T

                2、PC操作系统:Windows10

                3、DDR:DDR3                

        2.2.1 代码设计

        首先先建立一个BD设计文件:

        然后可以基于以前的XDMA读写DDR系列文章,来根据你的硬件搭建,我这边就不过多介绍了,直接展示搭建完成的截图。

别忘了给分配地址:

然后把BD设计生成verilog代码,并且置为顶层:

添加好约束文件,综合、实现、生成、bit文件。

2.2.2 XDMA读写DDR验证

        下载bit文件到开发板,并且重启主机

        在powershell打开xdma驱动文件夹,并运行test.exe文件:

如上图所示,表示PCIE 向DDR写入4096字节,然后又从DDR读出4096字节,对比数据,数据一致。

由此可以验证XDMA读写DDR没问题!!

2.3 Aurora、XDMA、DDR连接设计

        Aurora和XDMA模块,在前面都是单独测试的,现在我们需要把他们连接起来,实现完整的通路,也是我们这篇文章的重点内容

        (1)首先把Aurora的文件置为顶层

        (2)在BD设计中添加数据接口,以及读写DDR部分代码,如下图所示                

        (3)编译一下BD文件,然后把BD设计例化到,Aurora的代码中,如下图所示     

          (4)同时也需要把DDR3,PCIE的端口添加到Aurora的顶层上面    

       (5)最终的工程层次关系如下:       

        (6)然后添加约束文件,综合、实现、生成、bit文件。

三、设计测试

        3.1 modelsim仿真测试

        首先先对设计进行仿真测试,确保读写DDR模块无误,此次测试需要我们重新创建一个工程,单独仿真使用,这个我们的工程文件里面也包括。        

        由上图可以看见,数据从产生到FIFO,然后再写入到DDR整个链路的数据完整无丢失,这样可以确认我们的写入DDR模块没问题,接下来就可以下班进行测试,相信应该也没什么大问题!!

        3.2 下板测试

        经过上面的设计,以及单独的测试,相信离我们的目标已经很接近了,下面就来展示一下测试的结果。

        将最终的bit文件下载到开发板,然后重启主机

        还是和刚刚的一样,使用XDMA驱动,来读取数据,读取从0地址4096个字节的数据,读取指令:

 .\xdma_rw.exe c2h_0 read 0x0000000 -b -f datafile4K_rd.bin -l 4096

然后使用二进制查看软件,查看datafile4k_rd.bin这个文件即可,作者使用的软件是HxD.exe,需要的小伙伴自行去下载即可。

如上图看出来,读出来的数据和写入的数据完全一致

还可通过ILA观察数据的写入过程,这边添加几个ILA的状态截图

光纤接受数据:

读写DDR状态:

PCIE读取状态:

由此可以验证本次设计整体没问题!!,终于大功告成啦!!!

如果感觉文章对您有用,麻烦三连支持一下,方便下次用到的时候,就可以快速找到我,非常感谢您的支持!!!

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

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

相关文章

网络通信协议,UDP和TCP,初步了解

UDP&#xff08;User Datagram Protocol&#xff09;和TCP&#xff08;Transmission Control Protocol&#xff09;是两种常见的网络通信协议&#xff0c;用于在计算机网络中进行数据传输。 1. TCP&#xff1a;Transmission Control Protocol&#xff08;传输控制协议&#xf…

【经典算法】LeetCode31. 下一个排列(Java/C/Python3/GO实现含注释说明,中等)

题目描述 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地&…

微信小程序的常用API②

一、动画API &#xff08;1&#xff09;作用&#xff1a;用于在微信小程序中完成动画效果的制作 &#xff08;2&#xff09;使用&#xff1a;创建实例 wx.createAnimation() &#xff08;3&#xff09;常用属性&#xff1a; duration 【number型】 动画持续时间&…

探索Flutter 3.0:跨平台开发的新越界

Flutter 3.0 是谷歌推出的最新版本&#xff0c;它是一个开源的UI开发框架&#xff0c;可以用来创建高质量的原生接口在iOS和Android上。自从首次发布以来&#xff0c;Flutter 已经快速发展成为最受欢迎的跨平台移动开发框架之一。Flutter 3.0 带来了许多重要的更新和改进&#…

《C++学习笔记---入门篇2》---传值引用与传引用返回详解

先看这个程序&#xff0c;随着Count栈帧的销毁&#xff0c;会创建一个临时变量将n的值带回&#xff0c;可以实现我们的目的。 再看这个情况的时候&#xff0c;对于n来说他存放的位置在静态区&#xff0c;他不会随着函数栈帧的销毁而销毁&#xff0c;返回的时候依旧靠着临时变量…

Jmeter05:配置环境变量

1 Jmeter 环境 1.1 什么是环境变量&#xff1f;path什么用&#xff1f; 系统设置之一&#xff0c;通过设置PATH&#xff0c;可以让程序在DOS命令行直接启动 1.2 path怎么用 如果想让一个程序可以在DOS直接启动&#xff0c;需要将该程序目录配置进PATH 1.3 PATH和我们的关系…

golang调用阿里云发短信

之前用golang封装的一个发送阿里云短信的工具包&#xff0c;代码如下 client.go package smsimport ("context""github.com/go-playground/validator/v10""github.com/pkg/errors" )type Client interface {// Send 发送短信Send(ctx context.…

Python脚本抢票【笔记】

Python脚本抢票【笔记】 前言版权推荐Python脚本抢票【Python】microsoft edge驱动器下载以及使用最后 前言 2024-4-17 18:19:15 以下内容源自《【笔记】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是ht…

容器工作流

背景 目前某平台使用计算容器和解析容器&#xff0c;这两种容器目前通过rabbitmq消息来进行链接&#xff0c;形成容器工作流&#xff0c;使用容器工作流框架可以省去两个容器中间环节的控制&#xff0c;不需要再使用java代码对容器的操作&#xff0c;通过容器工作流框架即可控…

SpringMVC进阶(数据格式化以及数据校验)

文章目录 1.数据格式化1.基本介绍1.基本说明2.环境搭建 2.基本数据类型和字符串转换1.需求分析2.环境搭建1.data_valid.jsp首页面2.Monster.java封装请求信息3.MonsterHandler.java处理请求信息4.monster_addUI.jsp添加妖怪界面5.单元测试 3.保存妖怪信息1.MonsterHandler.java…

路由嵌套是什么?怎么进行路由嵌套

路由嵌套&#xff1a; 此时我们从一个组件切换到另一个组件时&#xff0c;会直接跳转页面&#xff0c;所以我们需要一个东西让组件们可以在一个页面显示&#xff0c;这时候就需要进行路由嵌套。我们要找到组件之间的关系&#xff0c;大组件嵌套小组件&#xff0c;从大组件中打…

代码随想录算法训练营day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

242.有效的字母异位词 字符串仅包含小写字母&#xff0c;那么可以使用数组声明26位大小&#xff0c;遍历其中一个字符串&#xff0c;记录字符的个数&#xff0c;然后遍历另一个字符串&#xff0c;减去相应字符&#xff0c;最后都为0则符合条件 class Solution:def isAnagram(…

运维笔记:基于阿里云跨地域服务器通信(上)

运维笔记 阿里云&#xff1a;跨地域服务器通信&#xff08;上&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…

构建数据驱动的文化价值体系,还得靠数据分析

在您的业务中创建以数据为中心的文化需要思维方式的转变&#xff0c;这不会在一夜之间发生。但是&#xff0c;这是一个目标变得越来越容易实现&#xff0c;这是由您的员工以激情和热情朝着这个目标努力的驱动力所驱使的&#xff0c;而不是高层要求他们这样做的目标。 有多种因…

Redis面试题超详细(2024最新)

1、Redis是单线程执行还是多线程执行&#xff1f;它有线程安全问题吗&#xff1f;为什么吗&#xff1f; Redis版本在6.0之前都是使用的单线程运行的。所有的客户端的请求处理、命令执行以及数据读写操作都是在一个主线程中完成得。这种设计目的就是为了防止多线程环境下的锁竞争…

git变更远端仓库名之后如何修改本地仓库配置的另一种方法?(删remote指针、添加、绑定master)

背景 如果某个远端的仓库地址变化后&#xff0c;本地仓库可以修改对应的remote。 之前谈过几种方法&#xff0c;比如重新设置一个新的remote的指针&#xff0c;绑定到新地址。然后删除origin&#xff0c;然后把新指针mv到origin。比如直接seturl修改&#xff08;git remote se…

深度学习从入门到精通——词向量介绍及应用

词向量介绍 词向量&#xff08;Word embedding&#xff09;&#xff0c;即把词语表示成实数向量。“好”的词向量能体现词语直接的相近关系。词向量已经被证明可以提高NLP任务的性能&#xff0c;例如语法分析和情感分析。词向量与词嵌入技术的提出是为了解决onehot的缺陷。它把…

ESP32-S3的MQTT实战

昨天&#xff0c;我们讲了socket通信&#xff0c;当服务器和客户端建立起连接时&#xff0c;就可以互相通信了。在互联网应用大多使用WebSocket接口来传输数据。而在物联网的应用中&#xff0c;常常出现这种情况&#xff1a;海量的传感器&#xff0c;需要时刻保持在线&#xff…

微信小程序[黑马笔记]

简介 常用组件 视图组件 <!--pages/list/list.wxml--><scroll-view class"container1" scroll-y><view>A</view><view>B</view><view>A</view></scroll-view><!--pages/list2/list.wxml--><swiper …

❤mac使用Idea工具

❤mac使用Idea工具 1、安装 直接跳过&#xff0c;文章有 &#xff08;点击跳转&#xff09; 给自己的mac系统上安装java环境 2、使用 快捷键 Command , 系统首选项 设置Idea连接数据库 打开右侧的database&#xff08;或菜单里&#xff09;连接数据库&#xff0c;根据提…