在使用ZYNQ7021系列的FPGA,若涉及到PL部分读写DDR,可使用过AXI-Lite,AXI4-FULL,AXI-Stream这三个IP来实现,使用的是这三个IP的主机模式。

AXI 4总线协议解析

  • AXI4:主要面向高性能地址映射通信的需求;
  • AXI4-Lite:是一个简单地吞吐量地址映射性通信总线;
  • AXI4-Stream:面向高速流数据传输;
  • AXI4总线分为主、从两端,两者间可以连续的进行通信;

AXI 4总线采用READY,VALID握手通信机制,主设备收到从设备发送的READY,主设备将数据和VALID信号同时发送给从设备。
AXI 4-Lite所有的猝发长度为1,数据总线宽度为32位或64位
AXI 4-Stream数据总线宽度:8、16、32、64、128、256、512和1024位;
axi总线分为五个通道:

  • --读地址通道,包含ARVALID,ARADDR, ARREADY信号;
  • --写地址通道,包含AWVALID,AWADDR,AWREADY信号;
  • --读数据通道,包含RVALID,RDATA, RREADY, RRESP信号;
  • --写数据通道,包含WVALID, WDATA,WSTRB,WREADY信号;
  • --写应答通道,包含BVALID,BRESP, BREADY信号;
    AWLEN,猝发长度,是一个猝发中传送的数据个数,传送个数=AWLEN+1;如AWLEN=5,传送6个数据。
    AWSIZE,猝发大小,猝发中每个传送的数据的大小,字节数为=2^AWSIZE;如AWSIZE=0,每个数据是1个字节,AWSIZE=3,每个数据大小是8个字节

axis信号分为:

  • --TREADY信号:从告诉主做好传输准备;
  • --TVALID信号:主告诉从数据传输有效;
  • --TLAST信号:主告诉从该次传输为突发传输结尾
  • --TDATA信号:数据,可选宽度32,64,128,256bit
  • --TSTRB信号:为1的bit为对应tdata有效字节,宽度为tdata/8
  • --TUSER信号  :用户定义信号,宽度为128bit
  • --ACLK信号:总线时钟,上升沿有效;
  • --ARESETn信号:总线复位,低电平有效;

读操作

在读交易中,主设备先发送ARADDR和ARVALID给从设备,从设备回发ARREADY,通知主设备该地址有效,当ARVALID和ARREADY都为高电平时,主设备发出RREADY,表示主设备准备好接受读数据和相应信号了。从设备发送RVALID、RDATA以及RRESP,当RVALID和RREADY都为高电平时,数据被写入主设备。
写操作

在写操作中,主设备往从设备中写入AWADDR和AWVALID,然后主设备并没有等待从设备的AWREADY,而是继续发送WVALID和WDATA,当从设备回应AWREADY有效后,紧接着从设备发送WREADY表示从设备准备好接受数据,当WVALID和WREADY都为高电平是数据写入从设备。主设备发送的AWVALID和WVALID要有重叠区。

关于同时对DDR写操作的说明

在进行数据存储时,有时候有几类数据需要写入DDR,并且这些数据相互间没有相关性,比如将AD芯片K5394获取的数据存入地址为0x02000000,长度为0xf,将时间信息存入0x020000f0,长度为0XF0的DDR空间,这两者间数据基本无相关性,即获得了数据就将其写入DDR中,在使用这些IP来写数据时不需要考虑数据写入之间的竞争情况,因为AXI的IP模块有自己的WID,不同的WID可以乱序写入,但是同一个WID需要顺序写入,模块将会根据WID来X向DDR写数据。同时AK5394的数据得到为流水线形式,且得到两个数据之间的时间较大,因此这种的数据适合使用AXI-Lite来进行数据传输。
验证例程为pl_write_ddr_lite,其中MCU_2_FPGA的IP为修改的axi-lite的slave的IP,用于PS向PL部分发送数据。

axi_lite_wrddr模块是修改的AXI-Lite的Master的IP,用于实现想DDR的某一地址写入数据。

在使用时,由于对该IP进行了修改,若设置多次传输数据,将会对同一地址写入相同的数据,该模块主要是为了对一个地址写一个数据,不进行突发数据写入,因此需要设置写入次数为1次,如下图所示。同时写入的地址和写入的数据被引出,方便使用。

HP和GP接口

在 ZYNQ 芯片内部用硬件实现了 AXI 总线协议,包括 9 个物理接口,分别为 AXI-GP0~AXI-
GP3,AXI-HP0~AXI-HP3,AXI-ACP 接口。
AXI_ACP 接口,是 ARM 多核架构下定义的一种接口,中文翻译为加速器一致性端口,用
来管理 DMA 之类的不带缓存的 AXI 外设,PS 端是 Slave 接口。
AXI_HP 接口,是高性能/带宽的 AXI3.0 标准的接口,总共有四个,PL 模块作为主设备连
接。主要用于 PL 访问 PS 上的存储器(DDR 和 On-Chip RAM)
AXI_GP 接口,是通用的 AXI 接口,总共有四个,包括两个 32 位主设备接口和两个 32 位
从设备接口。

可以看到,只有两个 AXI-GP 是 Master Port,即主机接口,其余 7 个口都是 Slave Port(从
机接口)。主机接口具有发起读写的权限,ARM 可以利用两个 AXI-GP 主机接口主动访问 PL 逻
辑,其实就是把 PL 映射到某个地址,读写 PL 寄存器如同在读写自己的存储器。其余从机接口
就属于被动接口,接受来自 PL 的读写,逆来顺受。
另外这 9 个 AXI 接口性能也是不同的。GP 接口是 32 位的低性能接口,理论带宽
600MB/s,而 HP 和 ACP 接口为 64 位高性能接口,理论带宽 1200MB/s。有人会问,为什么高
性能接口不做成主机接口呢?这样可以由 ARM 发起高速数据传输。答案是高性能接口根本不
需要 ARM CPU 来负责数据搬移,真正的搬运工是位于 PL 中的 DMA 控制器。

几个AXI IP介绍

下面为几个常用的 AXI 接口 IP 的功能介绍:
AXI-DMA:实现从 PS 内存到 PL 高速传输高速通道 AXI-HP<---->AXI-Stream 的转换

AXI-FIFO-MM2S:实现从 PS 内存到 PL 通用传输通道 AXI-GP<----->AXI-Stream 的转换

AXI-Datamover:实现从 PS 内存到 PL 高速传输高速通道 AXI-HP<---->AXI-Stream 的转换,只
不过这次是完全由 PL 控制的,PS 是完全被动的。
AXI-VDMA:实现从 PS 内存到 PL 高速传输高速通道 AXI-HP<---->AXI-Stream 的转换,只不
过是专门针对视频、图像等二维数据的。
AXI-CDMA:这个是由 PL 完成的将数据从内存的一个位置搬移到另一个位置,无需 CPU 来
插手。
AXI 协议严格的讲是一个点对点的主从接口协议,当多个外设需要互相交互数据时,我们
需要加入一个 AXI Interconnect 模块,也就是 AXI 互联矩阵,作用是提供将一个或多个 AXI 主设
备连接到一个或多个 AXI 从设备的一种交换机制(有点类似于交换机里面的交换矩阵)。
这个 AXI Interconnect IP 核最多可以支持 16 个主设备、16 个从设备,如果需要更多的接
口,可以多加入几个 IP 核。

多个AXI模块并存时的地址分配

当使用多个AXI的IP(主机/从机),需要对地址进行映射。

需要对每一个主机会映射的从机进行地址分配,如硬核PS的AXI主机接口需要连接MCU_2_FPGA的IP,那么就对这哥IP进行地址分配。axi_lite_wrddr需要映射到PS的HP接口,则对HP进行地址分配。

但是需要注意的是,两个IP不要对重复地址段进行写数据,因为这样会造成数据混乱。

测试程序说明

main文件代码如下:

/*
 * helloworld.c: simple test application
 *
 * This application configures UART 16550 to baud rate 9600.
 * PS7 UART (Zynq) is not initialized by this application, since
 * bootrom/bsp configures it to baud rate 115200
 *
 * ------------------------------------------------
 * | UART TYPE   BAUD RATE                        |
 * ------------------------------------------------
 *   uartns550   9600
 *   uartlite    Configurable only in HW design
 *   ps7_uart    115200 (configured by bootrom/bsp)
 */
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14