ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯

ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯

  • 导语
  • 实现步骤
  • 结语

导语

不好意思,这篇博文又来晚了,是繁忙阻碍了博主博客的更新,其实博主想要有好多关于技术的话要说,奈何文采有限,时间有限,这里博主就不话痨了,总之做技术只要认真坚持就一定能成。直接进出主题,在ZYNQ进阶之路12章节中我们讲了在PL端实现AXI-full master,将PL串口接收到的数据写入DDR3指定地址并产生中断通知PS将写入的数据读出,再将读出的数据通过PS的UART1发送到PC端,本章节将在之前章节的基础上实现将一个反向的流程:通过PS端的UART1接收PC端的数据,然后将接收到的数据写入DDR3指定地址,然后通过AXI-LITE通知PL端读取DDR3数据,再将读取到的数据通过PL端串口发送会PC。这样我们就实现了通过AXI-FULL 的PL到PS和PS到PL的双向高速数据传输了。好了以下我们来探讨实现的过程吧。
本文工程文件链接:https://download.csdn.net/download/wp_fd/11190669

实现步骤

首先我们打开ZYNQ进阶之路12的工程,然后编辑当中的uart_axi_full IP模块
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第1张图片
首先我们要将ZYNQ进阶之路3中的串口发送模块加入这个IP中,在该IP顶层文件中加入如下代码,该代码实现串口发送的逻辑:
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第2张图片
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第3张图片
然后我们将串口发送模块中的波特率计数位宽改为16位的,因为如果要使用9600波特率的话计数值=100M/9600 = 10417,所以至少需要14位位宽:
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第4张图片
然后就是在顶层模块加入需要的信号接口:
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第5张图片
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第6张图片
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第7张图片
在AXI_FULL master模块中添加信号端口和修改逻辑代码,在master模块中我们需要将master读数据和写数据分开,在执行这样的修改之前我们首先需要知道axi总线的一些基础知识,首先axi总线包含如下几个通道:
1、读地址通道(AR)
2、写地址通道(AW)
3、读数据通道(R)
4、写数据通道(W)
5、写响应通道(B)
每个通道由一个信号集构成,并且使用双向的valid和ready握手信号机制,读写流程如下所示:
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第8张图片
在AXI_FULL master模块中我们需要通过修改逻辑代码将读通道和写通道分割成两个独立的状态机,以将两个通道独立开来,首先我们将原来的一个状态机改成两个完全独立的分别控制读写的状态机,写状态机:
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第9张图片
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第10张图片
读状态机:
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第11张图片
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第12张图片
我们需要将读通道的所有always块加入清零信号,由于相关always块很多,所以我列出其中一个作为示例,如下所示:
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第13张图片
我们还需要将接收到的数据接收到一个寄存器中,固定位宽位128位,也就是uart固定为16个字节,也就是说我提供的示例都只支持一次必须传输16字节的数据,如果需要其他长度或者不定长度,可以通过自己添加FIFO,修改逻辑实现:
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第14张图片
然后我们需要修改AXI_LITE slave模块,增加uart发送模块波特率寄存器配置通道和PS通知发送数据开始信号通道:
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第15张图片
在这里插入图片描述
到此我们IP模块就修改完成了,然后就是重新生成IP,并将MIO使能,这样我们在程序中可以控制PS端的led,查看系统运行状态。再然后就是绑定PL端串口TX信号引脚,生成bit文件->导入SDK->打开SDK->创建helloworld工程如下所示:
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第16张图片
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第17张图片
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第18张图片
然后编译后下载到芯片中,将PL和PS端的串口接入PC,两边同时连续发送数据,互相接收发送,测试如下:
ZYNQ进阶之路13--自定义AXI-FULL IP实现PS和PL双向高速通讯_第19张图片

结语

在该工程中我们使用了PS端的串口接收功能,PS端串口接收和发送分别有一个64字节的FIFO,但是因为串口接收阈值设置为16,所以固定接收16个字节数据后才会发生中断,之前有博友联系我提出需要PS端串口接收的例程,为了让大家对PS串口接收有更深的了解,我在下一章节中将写一篇uart接收的博文,实现串口接收小于64字节的任意长度的数据,具体实现方法希望大家持续关注我的博客或者通过邮件联系博主:[email protected]

由于该博文如果将相关代码全部贴出篇幅过大,所以博主将工程分享出来供大家参考,希望能帮助到大家。博客开发环境为vivado2018.3版本.

你可能感兴趣的:(zynq,FPGA,ZYNQ进阶之路,zynq,axi-full,xilinx,fpga,DDR)