ZYNQ7000系列中PS端与PL端的通信都是通过AXI总线进行连接的,利用好AXI协议是PS与PL交互的基础,因此设计这个实验来进一步了解两者间的通信。

1.实验目的

PL端通过AXI协议访问PS端的DDR内存,其中包括往DDR写数据,以及读取DDR内部的数据。

图 1 实验框图

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 ZYNQ示意图

从图 2中可以看出访问DDR3的接口有三条①、②、③条接口,其中PL的访问有两条,分别为①和③,为了简单我们选个③,如果有兴趣可以使用③来写,①来读的操作,这样能更好的理解两者间的交互。

5.从机与主机

这个简单的理解就是图 2中的箭头,箭头连接的一段为从机,没有连接的一段为主。例如AXI_HP接口,主机就是PL,而箭头连接的一段是PS,那么PS就是从机。

6.读写时序的控制

主要的问题集中于PL什么时候写数据;PL什么时候读数据。简单的一种控制就是PL自己控制,例如先写5个数据,在读5个数据,为了增加点难度,我们可以这样设计,用PS来通知PL什么时候写,什么时候读。那么又涉及到了两者的通信,而这种通信就比较普通,不是内存的控制,具有普适化的意义,这里使用AXI_GP来进行通信,以PS为主机。

注:PS发数据是走红色的路还是蓝色的路是由其地址决定的

图 3 PS发命令的端口

7.总结

最后我们使用AXI_GP接口来控制读写,其中PS为主机;用AXI_HP接口来进行DDR3数据的输入与输出,这时PL为主机。

8.程序设计流程图

流程图包含PS部分和PL部分。

9.PS部分流程设计

PS端的程序,我们采用轮训的方式进行读写命令完成的获取,也就是PS端不停地读取PL端是否写完,以及是否读完的命令。后续可以拓展为采用中断的方式进行读写控制。

图 4 PS端流程图

10.PL部分流程设计

PL端AXI_HP的流程如图 4所示,一个简单的状态机来完成数据的读写,此时PL为主机。

图 5 PL端AXI_HP的状态机

PL端AXI_GP的流程图如所示,也是一个简单的状态机,但是此时PL是从机,PS是主机,PS发出读取(是否写完或者是否读取)的状态,PL将此时的状态返回给PS端,让PS来进行判断是否需要进行下一步操作。

图 6 PL端AXI_GP的状态机

11.程序设计

首先,设计FPGA端的程序。有几个注意点:

  1. PL端的逻辑一般都是先仿真,然后进行板级调试,如果仿真没过,那么下载到板子上肯定不过(仿真很重要)。
  2. ZYNQ-7000的AXI协议不是和ARM一样严格遵守的,有些端口是没有用到的如图 7,但是响应这些一定要按协议来。

这里可以简单的想一下,PS端的DDR怎么能用PL来仿真呢?我能想到的解决方法有2个(欢迎提供更多的方法):

  1. 在PL端利用ddr的ip核选择AXI模式进行仿真,操作比较麻烦,同时仿真时间长,但是参考价值高
  2. 就在PL端用一个带AXI4总线的bram进行仿真,比较简单,但是参考价值低

为了偷懒,我这边就用方法2来仿真。这个IP中有些端口也是没有用到的

图 7 axi_bram s_axi_awlock端口

根据4.2中的流程图,以及5中的分析,自己编写axi协议后,得到仿真图如图 8 AXI_HP的仿真,采用AXI INCR突发模式,突发大小为8个字节,突发长度为2。突发的地址是根据ZYNQ中的硬件地址来的如图 9,采用32’h0008_0000为起始地址(仿真的起始地址是0)。

图 8 PL端的AXI_HP仿真图

那么往ddr3写数据的地址应该怎么确定呢?图 9中可以看到AXI_HP可以用的地址,我用的起始地址是32’h0008_0000。

图 9 PS的地址映射

这里有个问题可以想一下,PS端的程序也是跑在DDR3里面的,那么怎么才能使得PL端访问的地址与程序跑的地址不冲突呢?(这个可以在评论中给点意见)

我这里的解决方案有两个:

  1. 简单的就是写的地址与程序的地址不一样就好了
  2. 就是在PS端分配好内存用来写ddr,然后将这个地址的起始地址发给PL,这样肯定不会有冲突(也许xilinx dma那个ip核就是这么干的吧)

同样为了偷懒,我采用第一个方法,那么怎么知道程序跑的地址呢?

在SDK的工程里面有个lscript.ld里面有许多地址的信息如图 10,图 11。可以看到这边的地址是从100000开始的,所以我用的地址不在这里。

图 10
图 11

12.程序验证结果

因为熟悉了一点AXI协议,就自己写了个AXI通信的模块,然后实现了PL与ddr的通信,以及PL与PS的通信。

本来用黑金zynq7020的板子验证的,结果电源模块坏了,找客服修说过保了,就不能修了,哎,好可惜。。。。。。。。。。。应该是二极管击穿导致的。

于是接了个ZCU102的开发板来测试这个程序,不过原理都是一样,只是代码上的地址可能要改一下。

写数据结果如图 12

图 12 写数据

读数据结果如图 13

图 13 读数据

上述读写的结果一致,完成了本次实验,这次实验中最重要的部分就是对AXI协议的理解。

参考资料

  1. https://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf ug585 zynq7000的说明书
  2. https://www.xilinx.com/support/answers/56609.html 解决时钟分配报错
  3. https://china.xilinx.com/support/documentation/ip_documentation/axi_ref_guide/latest/ug1037-vivado-axi-reference-guide.pdf xilinx axi协议
  4. https://static.docs.arm.com/ihi0022/b/AMBAaxi.pdf?_ga=2.266008774.891364608.1562316711-1290272031.1561358385 arm axi协议

附录

Block Design如图 14 这个是ZCU102的,如果是zynq-7000.只要把中间的换了就好。

图 14 Block Design

zynq tcp如何从网口发数据_ZYNQ_PL与PS的DDR交互相关推荐

  1. zynq tcp如何从网口发数据_基于TCP/IP协议的电口通信

    之前有介绍过TCP/IP协议的实现是通过轻量级LWIP协议实现的,具体在FPGA中实现又可以分为多种方式,具体如下: 图8‑98 LWIP协议在FPGA中的实现方式 LWIP可以通过硬核实现或者软核实 ...

  2. ps读写ddr3里面的数据 zynq_ZYNQ_PL与PS的DDR交互

    ZYNQ7000系列中PS端与PL端的通信都是通过AXI总线进行连接的,利用好AXI协议是PS与PL交互的基础,因此设计这个实验来进一步了解两者间的通信. 1.实验目的 PL端通过AXI协议访问PS端 ...

  3. ESP8266,电脑作为TCP SERVER,8266发数据给电脑

    正确打开ESP8266-与本机电脑建立连接并互发消息 1.确认ESP8266正常上电 2.使ESP8266进入AT模式 波特率:115200:数据位8位,1位停止位,无奇偶校正,无数据流控制. 3. ...

  4. “Xilinx ZYNQ+TCP通信+Python上位机”实现实时视频传输系统

    笔者在CSDN的第一篇万字长文,请多多支持. 本文是笔者的公众号 IC设计者笔记 文章的转载.很多优质原创内容都会第一时间发布在公众号,欢迎关注公众号,一起交流学习.公众号后台回复"ZYNQ ...

  5. TCP报文格式和三次握手——三次握手三个tcp包(header+data),此外,TCP 报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。...

    from:https://blog.csdn.net/mary19920410/article/details/58030147 TCP报文是TCP层传输的数据单元,也叫报文段. 1.端口号:用来标识 ...

  6. 【转】使用TCP协议连续传输大量数据时,是否会丢包,应如何避免?

    [转]使用TCP协议连续传输大量数据时,是否会丢包,应如何避免? Posted on 2008-06-11 15:24 路缘 阅读(3868) 评论(0) 编辑 收藏  http://www.cnbl ...

  7. 【ZYNQ Ultrascale+ MPSOC FPGA教程】第三十二章 PL读写PS端DDR数据

    本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处. 适用于板卡型号: AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4E ...

  8. 使用TCP协议连续传输大量数据时,是否会丢包,应如何避免

    使用TCP协议连续传输大量数据时,是否会丢包,应如何避免 这个问题看看似比较容易,但很多人有不同的理解.开发中遇到是否每包(包数据可能大于1460)发送完之后需要由server->client确 ...

  9. openStack controller 管理网口TX数据量非常大 网络总是丢包

    openStack controller 管理网口TX数据量非常大 网络总是丢包 posted on 2015-10-26 09:19 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏 转 ...

最新文章

  1. MySQL 过滤规则-误解处理
  2. CFNet 论文解读
  3. java按行读取txt文件内容_对txt文件中的内容进行排序
  4. MySQL防止库存超卖方法总结
  5. python生成报告_python生成测试报告
  6. 深入浅析Python 函数注解与匿名函数
  7. 使用View的getWidth(),getHeight()方法返回0的问题
  8. 2020-08-07 光纤通信第二章知识点整理
  9. 【我想进大厂】Redis夺命连环11问
  10. centos 日志切割_CentOS Linux使用logrotate分割管理日志
  11. 怎么用光驱给服务器装系统,如何用光驱重装系统?
  12. PropertyUtils.copyProperties 属性值复制失败
  13. Java识别获取pdf中文字信息
  14. ftp上传工具下载,八款中文绿色版ftp上传工具下载(ftp客户端)
  15. C语言自由落体程序咋写,C语言实现 小球自由落体问题
  16. SoundPool播放系统提示音
  17. 见过贪婪的,没见过这么贪婪的
  18. BetaFlight统一硬件配置文件研读之set命令
  19. SpringBoot项目访问jsp页面500问题处理
  20. oracle ebs 组件,Oracle EBS 中BOM学习

热门文章

  1. MATLAB_图形学_形态学课程_找出薛之谦的歌词所有字数
  2. Python OpenCV像素操作
  3. 使用PyTorch时,最常见的4个错误
  4. 打造属于自己的underscore系列(五)- 偏函数和函数柯里化
  5. HBase安装配置以及Java操作hbase
  6. linux nmon
  7. 03-获取 TargetUser 的 Followings 列表
  8. 《网管员必读》学习笔记之DNS服务器的安装与配置
  9. 【收藏】推荐系列:2008年第08期 总10期
  10. log4j.logger java_log4j的多logger记录日志的简明使用