zynq tcp如何从网口发数据_ZYNQ_PL与PS的DDR交互
ZYNQ7000系列中PS端与PL端的通信都是通过AXI总线进行连接的,利用好AXI协议是PS与PL交互的基础,因此设计这个实验来进一步了解两者间的通信。
1.实验目的
PL端通过AXI协议访问PS端的DDR内存,其中包括往DDR写数据,以及读取DDR内部的数据。
2.如何实现
看起来实验目的很简单,但是对于像我这样的初学者而言那还是有很多的问题的。例如:
1.芯片内部硬件怎么连接(好比两个人打电话,总得知道电话号码才能交流)
2.谁是主机谁是从机(好比两个人打电话,谁打给谁)
3.什么时候发数据,什么时候读数据,总不能在别人还没存好数据的时候读吧(比如两个人打电话,一个人在睡觉,怎么都打不通吧)
3.设计思路
针对上述3个问题,来设计总的思路,这样能有条理的实现总体的功能。
4.芯片内部硬件连接
ZYNQ中有9个AXI总线(如图 1),其中包含4个General-Purpose Ports(AXI_GP),主要是一些常用的通信,位宽为32位,4个High-Performance Ports,高速的通信,位宽为64位,还有一个AXI_AXP这个我不太了解,不过位宽也是64位。
从图 2中可以看出访问DDR3的接口有三条①、②、③条接口,其中PL的访问有两条,分别为①和③,为了简单我们选个③,如果有兴趣可以使用③来写,①来读的操作,这样能更好的理解两者间的交互。
5.从机与主机
这个简单的理解就是图 2中的箭头,箭头连接的一段为从机,没有连接的一段为主。例如AXI_HP接口,主机就是PL,而箭头连接的一段是PS,那么PS就是从机。
6.读写时序的控制
主要的问题集中于PL什么时候写数据;PL什么时候读数据。简单的一种控制就是PL自己控制,例如先写5个数据,在读5个数据,为了增加点难度,我们可以这样设计,用PS来通知PL什么时候写,什么时候读。那么又涉及到了两者的通信,而这种通信就比较普通,不是内存的控制,具有普适化的意义,这里使用AXI_GP来进行通信,以PS为主机。
注:PS发数据是走红色的路还是蓝色的路是由其地址决定的
7.总结
最后我们使用AXI_GP接口来控制读写,其中PS为主机;用AXI_HP接口来进行DDR3数据的输入与输出,这时PL为主机。
8.程序设计流程图
流程图包含PS部分和PL部分。
9.PS部分流程设计
PS端的程序,我们采用轮训的方式进行读写命令完成的获取,也就是PS端不停地读取PL端是否写完,以及是否读完的命令。后续可以拓展为采用中断的方式进行读写控制。
10.PL部分流程设计
PL端AXI_HP的流程如图 4所示,一个简单的状态机来完成数据的读写,此时PL为主机。
PL端AXI_GP的流程图如所示,也是一个简单的状态机,但是此时PL是从机,PS是主机,PS发出读取(是否写完或者是否读取)的状态,PL将此时的状态返回给PS端,让PS来进行判断是否需要进行下一步操作。
图 6 PL端AXI_GP的状态机
11.程序设计
首先,设计FPGA端的程序。有几个注意点:
- PL端的逻辑一般都是先仿真,然后进行板级调试,如果仿真没过,那么下载到板子上肯定不过(仿真很重要)。
- ZYNQ-7000的AXI协议不是和ARM一样严格遵守的,有些端口是没有用到的如图 7,但是响应这些一定要按协议来。
这里可以简单的想一下,PS端的DDR怎么能用PL来仿真呢?我能想到的解决方法有2个(欢迎提供更多的方法):
- 在PL端利用ddr的ip核选择AXI模式进行仿真,操作比较麻烦,同时仿真时间长,但是参考价值高
- 就在PL端用一个带AXI4总线的bram进行仿真,比较简单,但是参考价值低
为了偷懒,我这边就用方法2来仿真。这个IP中有些端口也是没有用到的
根据4.2中的流程图,以及5中的分析,自己编写axi协议后,得到仿真图如图 8 AXI_HP的仿真,采用AXI INCR突发模式,突发大小为8个字节,突发长度为2。突发的地址是根据ZYNQ中的硬件地址来的如图 9,采用32’h0008_0000为起始地址(仿真的起始地址是0)。
那么往ddr3写数据的地址应该怎么确定呢?图 9中可以看到AXI_HP可以用的地址,我用的起始地址是32’h0008_0000。
这里有个问题可以想一下,PS端的程序也是跑在DDR3里面的,那么怎么才能使得PL端访问的地址与程序跑的地址不冲突呢?(这个可以在评论中给点意见)
我这里的解决方案有两个:
- 简单的就是写的地址与程序的地址不一样就好了
- 就是在PS端分配好内存用来写ddr,然后将这个地址的起始地址发给PL,这样肯定不会有冲突(也许xilinx dma那个ip核就是这么干的吧)
同样为了偷懒,我采用第一个方法,那么怎么知道程序跑的地址呢?
在SDK的工程里面有个lscript.ld里面有许多地址的信息如图 10,图 11。可以看到这边的地址是从100000开始的,所以我用的地址不在这里。
12.程序验证结果
因为熟悉了一点AXI协议,就自己写了个AXI通信的模块,然后实现了PL与ddr的通信,以及PL与PS的通信。
本来用黑金zynq7020的板子验证的,结果电源模块坏了,找客服修说过保了,就不能修了,哎,好可惜。。。。。。。。。。。应该是二极管击穿导致的。
于是接了个ZCU102的开发板来测试这个程序,不过原理都是一样,只是代码上的地址可能要改一下。
写数据结果如图 12
读数据结果如图 13
上述读写的结果一致,完成了本次实验,这次实验中最重要的部分就是对AXI协议的理解。
参考资料
- https://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf ug585 zynq7000的说明书
- https://www.xilinx.com/support/answers/56609.html 解决时钟分配报错
- https://china.xilinx.com/support/documentation/ip_documentation/axi_ref_guide/latest/ug1037-vivado-axi-reference-guide.pdf xilinx axi协议
- https://static.docs.arm.com/ihi0022/b/AMBAaxi.pdf?_ga=2.266008774.891364608.1562316711-1290272031.1561358385 arm axi协议
附录
Block Design如图 14 这个是ZCU102的,如果是zynq-7000.只要把中间的换了就好。
zynq tcp如何从网口发数据_ZYNQ_PL与PS的DDR交互相关推荐
- zynq tcp如何从网口发数据_基于TCP/IP协议的电口通信
之前有介绍过TCP/IP协议的实现是通过轻量级LWIP协议实现的,具体在FPGA中实现又可以分为多种方式,具体如下: 图8‑98 LWIP协议在FPGA中的实现方式 LWIP可以通过硬核实现或者软核实 ...
- ps读写ddr3里面的数据 zynq_ZYNQ_PL与PS的DDR交互
ZYNQ7000系列中PS端与PL端的通信都是通过AXI总线进行连接的,利用好AXI协议是PS与PL交互的基础,因此设计这个实验来进一步了解两者间的通信. 1.实验目的 PL端通过AXI协议访问PS端 ...
- ESP8266,电脑作为TCP SERVER,8266发数据给电脑
正确打开ESP8266-与本机电脑建立连接并互发消息 1.确认ESP8266正常上电 2.使ESP8266进入AT模式 波特率:115200:数据位8位,1位停止位,无奇偶校正,无数据流控制. 3. ...
- “Xilinx ZYNQ+TCP通信+Python上位机”实现实时视频传输系统
笔者在CSDN的第一篇万字长文,请多多支持. 本文是笔者的公众号 IC设计者笔记 文章的转载.很多优质原创内容都会第一时间发布在公众号,欢迎关注公众号,一起交流学习.公众号后台回复"ZYNQ ...
- TCP报文格式和三次握手——三次握手三个tcp包(header+data),此外,TCP 报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。...
from:https://blog.csdn.net/mary19920410/article/details/58030147 TCP报文是TCP层传输的数据单元,也叫报文段. 1.端口号:用来标识 ...
- 【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?
[转]使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? Posted on 2008-06-11 15:24 路缘 阅读(3868) 评论(0) 编辑 收藏 http://www.cnbl ...
- 【ZYNQ Ultrascale+ MPSOC FPGA教程】第三十二章 PL读写PS端DDR数据
本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处. 适用于板卡型号: AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4E ...
- 使用TCP协议连续传输大量数据时,是否会丢包,应如何避免
使用TCP协议连续传输大量数据时,是否会丢包,应如何避免 这个问题看看似比较容易,但很多人有不同的理解.开发中遇到是否每包(包数据可能大于1460)发送完之后需要由server->client确 ...
- openStack controller 管理网口TX数据量非常大 网络总是丢包
openStack controller 管理网口TX数据量非常大 网络总是丢包 posted on 2015-10-26 09:19 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏 转 ...
最新文章
- MySQL 过滤规则-误解处理
- CFNet 论文解读
- java按行读取txt文件内容_对txt文件中的内容进行排序
- MySQL防止库存超卖方法总结
- python生成报告_python生成测试报告
- 深入浅析Python 函数注解与匿名函数
- 使用View的getWidth(),getHeight()方法返回0的问题
- 2020-08-07 光纤通信第二章知识点整理
- 【我想进大厂】Redis夺命连环11问
- centos 日志切割_CentOS Linux使用logrotate分割管理日志
- 怎么用光驱给服务器装系统,如何用光驱重装系统?
- PropertyUtils.copyProperties 属性值复制失败
- Java识别获取pdf中文字信息
- ftp上传工具下载,八款中文绿色版ftp上传工具下载(ftp客户端)
- C语言自由落体程序咋写,C语言实现 小球自由落体问题
- SoundPool播放系统提示音
- 见过贪婪的,没见过这么贪婪的
- BetaFlight统一硬件配置文件研读之set命令
- SpringBoot项目访问jsp页面500问题处理
- oracle ebs 组件,Oracle EBS 中BOM学习