如何利用Zynq-7000的PL和PS进行交互

如何在 zynq 中进行 PL 端与 PS 端的数据交互

在zynq的使用中,高效的进行 BRAM 与 zynq 硬核的数据交换至关重要当我们需要进行小批量的数据交换时,可以考虑采用 BRAM 作为数据交换的媒介在 PS 端,将数据通过 AXI 总线写入 PL端的 BRAM 里面去并且再读出来。整体的设计图如下所示:

在 vivado 2017.4 下可以通过 block design 快速进行模块的添加与设计。设计出来的架構如图所示:

  • zynq 端要打开中断

在经过上面的 block design 设计之后可将硬件导出,然后打开 sdk ide 开始进行 PS 端程序的开发

  1. 在 PS 端输入起始地址和长度
  2. PL 内部读完後向相同的位置写入数据,初始数据有CPU告知
  3. 中断读取 BRAM 数据打印显示

关于自定义 IP 的设计:
自定义 IP 实现了对 PL 端 BRAM 的读写操作,并且在外部封装嘚有 AXI 总线的端口核心的读写逻辑如下:

这个自定义 IP 的实现是为了令实例更为完整,方便在逻辑分析仪中进行观察

打开 sdk 工具,开始进行軟件开发


 
 
 
 
 
 
 
 
 

最终实现效果如下图所示:
需要完整项目代码的可以留言。

      AXI-EMC IP是一个可以可以支持各种内存型號的控制器利用这个IP可以非常方便地模拟各种类型的内存或者FLASH接口实现数据的交互和通信。以下是AXI-EMC IP的功能特性:

3、支持AXI4增量和包传输

4、支持AXI4窄带和非对齐传输

5、最多支持四个外部存储器组

6、支持具有可配置字节奇偶校验和流水线级的同步SRAM

8、提供配置寄存器动态更改PSRAM和Micron?闪存的访问机制

9、为同步SRAM存储器提供奇偶校验错误状态寄存器

本课程中,利用EMC实现异步SRAM的功能实现数据的读写操作。

在本课程中主要用箌了AXI_EMC这个IP,下面我们看下这个IP的设置双击这个IP

 修改调用BD工程的顶层代码,增加异步SRAM的读写接口控制逻辑。在以下FPGA代码中我们的SDK代码会寫入4个数据,之后再读出来

以上代码中先写入4个数据,之后在读出来这里需要注意,ZYNQ是32bit的数据总线所以地址每次要增加4.

前面介绍了PS与PL通过DMA通信的基本测試但是之前用的都是xilinx的官方的IP核,接口都是做好的我们直接例化就好。而在实际应用中我们更加关心用户逻辑怎么与PS间进行数据通信。下面就介绍在BD中添加用户逻辑的方式以及在其过程中所遇到的问题

这里我们用户逻辑以UART接口为代表设计PL端实现UART功能,在SDK里发送數据通过DMA给PL端的UART发送出去在外部将UART的收发回环,将发送出去的数据再收回来通过DMA在给PS。此外我们在PL的uart上封装层slip协议用来实现在uart上进荇帧操作。测试硬件框图如下:
就是在之前的测试环境中将AXIS_DATA_FIFO换成了我们用户逻辑UART部分其中FIFO_to_AXIS是用来实现FIFO接口与AXIS接口的转换模块。

建立相应嘚vivado工程并添加用户逻辑代码(模块不一一分析了):
此时我们发现在用户逻辑部分还缺少FIFO IP核,我们用IP catalog增加相应的IP核具体IP核的参数根据洎己的需要进行定制。
在BD当中可以通过add IP和add module的方式来增加用户逻辑两者稍微有点区别。
Add IP需要将用户逻辑提前封装好成IP核然后通过IP Catalog来添加;而Add module可直接Diagram里添加。不过我在用Add module时遇到一些问题还没解决可能BD并不认可我们写的fifo_to_axis的AXIS接口(其实在Add ip方式下我们并没有更改fifo_to_axis的逻辑,待定位問题)

在Diagram里右键,选add module在弹出的对话框选择你添加模块的顶层文件:
添加后模块上会显示RTL的标志,然后手动连线:
连线完成后进行validate时報如下错误:
然后尝试定位问题,不过目前还没定位到地方带我稍微再研究研究看看,我们先采用Add IP的方式

首先我们需要将用户逻辑封裝成AXIS4接口IP,步骤可参考相关教程不细说,只介绍和教程有区别的地方
新建一个New IP,取名my_uart_ip这里我们选2个AXIS接口,一主一从然后位宽是32位(其实我们需要8位,但这里改不了我们先不用管)
和之前一样增加用户逻辑内部的fifo IP核,不介绍了

然后我们修改my_uart_ip_v1_0.v模块,去掉系统生成的兩个子模块加上我们自己的fifo_to_axis模块。
my_uart_ip_v1_0.v具体代码如下(这个地方其实也看出我们并没有修改fifo_to_axis的代码只是将fifo_to_axis模块用系统封装成IP核了,理论上囷add module的效果一样不知道为什么add module的方式不行):

然后修改下IP的接口(可能有一部分信号没有分配为总线方式),这时我们可以右键Auto infer Interface Chooser选择你需要的接口方式:
然后还要关联下相应的时钟:
最后Re-package IP,这样我们的用户IP就定制好了

另外我们可以通过netlist方式增加Debug信号(具有层级关系,好萣位需要加的信号)
生成bit文件后导出硬件打开SDK,SDK里的驱动和上一章一样没有做修改,所以不再介绍了

因为开发板上PL没有接UART芯片,没法直接接串口我们用FPGA的2个IO口模拟UART的收发,在开发板上用跳线将收发端回环(可以用示波器抓取UART的波形):
运行SDK的程序进行测试,测试結果如下:
我们在debug里分析下fifo_to_axis的相关接口波形看到PL端通过AXIS接口收过来数据后写到了对应得fifo中(另外一侧一样不细分析):
到此我们完整的實现了在zynq中PS和PL(用户逻辑)数据互通。

在此附上fifo_to_axis接口转换的代码因为比较简单就没有采用状态机来实现:

本文主要介绍了ZYNQ设计中在BD中加叺用户逻辑的方法和具体流程以及测试过程中遇到的一些问题,供以后回顾
其中通过Add Module的方式加入用户逻辑遇到的错误还需进一步解决,洳果有小伙伴解决了该问题也请交流经验

我要回帖

 

随机推荐