zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Xilinx HLS基础介绍(二)—— AXI4接口类型定义

2023-04-18 16:44:45 时间

本期主题:
HLS的接口类型定义


往期链接:



1.Vitis HLS AXI4 接口概述

IP可通过Vitis HLS来生成,IP需要与其他模块通信,一般来说有两种方式:

1.软件控制:通过寄存器的方式,通过在ARM处理器上运行应用程序,这些程序来访问操作寄存器,从而实现操作IP的目的;
2.自同步:这种模式下,IP将公开所有信号,这些信号用来启动/停止内核,这些信号其他IP和系统的控制;

Vivado IP 流程支持 存储器、串流和寄存器 接口范例,其中每个范例都支持不同接口协议与外部世界进行通信,这些都是AXI4接口,包括:

  • 存储器范例 (m_axi):内核通过存储器(如 DDR、HBM、PLRAM/BRAM/URAM)来访问数据;
  • 串流范例 (axis):数据从其它串流源(例如,视频处理器或其它内核)串流至内核中,也可从该内核流出;
  • 寄存器范例 (s_axilite):内核通过寄存器接口来访问数据,软件则通过寄存器读/写来访问数据;

更为详细的描述如下:

范例描述接口类型
存储器内核通过存储器(如 DDR、HBM、PLRAM/BRAM/URAM 支持的接口协议)来访问数据ap_memory、BRAM、AXI4 存储器映射 (m_axi)
串流受支持的接口数据将从其它串流源(如视频处理器或其它内核)串流至内核,并且可从内核流出ap_fifo, AXI4-Stream (axis)
寄存器内核通过寄存器读取和写入所执行的寄存器接口来访问数据ap_none、ap_hs、ap_ack、ap_ovld、ap_vld和 AXI4-Lite 适配器 (s_axilite)

2.顶层函数的实参类型与接口关系

C语言实参类型受支持范例默认范例
标量变量(通过值来传递)寄存器寄存器
数组存储器、串流存储器
指针存储器、串流 、寄存器寄存器
参考值寄存器寄存器
hls::stream串流串流

2.1 寄存器接口 S_AXILITE

在vivado IP流程中,默认执行流程是由寄存器来控制IP的。寄存器是通过s_axilite接口,默认的控制协议为 ap_ctrl_hs

s_axilite接口可提供下列功能特性:

  • 控制协议:采用 块级控制协议 中的块控制协议;
  • 标量实参:顶层函数的实参映射到s_axilite接口,ARM可对此寄存器空间执行读/写操作;
  • 偏移规则:指定寄存器的偏移地址;
  • 捆绑规则:使用s_axilite接口指定多个捆绑,为每个捆绑创建一个独立的接口适配器;

示例code:

#include <stdio.h>


void example(char *a, char *b, char *c)
{
#pragma HLS INTERFACE s_axilite port=a bundle=BUS_A
#pragma HLS INTERFACE s_axilite port=b bundle=BUS_A
#pragma HLS INTERFACE s_axilite port=c bundle=BUS_A
#pragma HLS INTERFACE s_axilite port=return bundle=BUS_A

  *c += *a + *b;
}

综合结果如下图所示:

  • 实参a、b是s_axilite接口,ARM可对此寄存器空间进行写;
  • 实参c也是axilite接口,并且有输入、输出的信号;

在这里插入图片描述

2.2 存储器接口 m_axi

AXI4存储器映射(m_axi)允许内核在全局存储器(DDR、HBM和PLRAM)内读写数据。
看一个例子:

void example(volatile int *a) {
//Port a is assigned to an AXI4 master interface
#pragma HLS INTERFACE mode=m_axi depth=50 port=a
....
}

综合出的结果为:
在这里插入图片描述
一般来说,axilite会和m_axi组合起来使用,HLS中axilite适合用来去配置寄存器,m_axi适合对全局存储器进行读写执行。
在这里插入图片描述

2.3 串流接口 axi4_stream

1. axi4_stream的工作原理

AXI4-Stream 是专为传输任意单向数据而设计的协议。其中:

  • TDATA是按照时钟周期来传输的数据;
  • TVALID是生产者发出的此时数据有效的信号;
  • TREADY是使用者回复的信号,代表此时可以进行数据接收;
  • TLAST 信号表明这是串流的最后一个字节;

生产者、使用者的交互图如下:
在这里插入图片描述
详细的AXI4-stream的介绍可查看官方文档(UG1307)

2. axis的结构体

如果我们要用vitis_hls中的接口来描述axis,那么就需要通过接口定义TDATA、TVALID、TREADY信号。
AXIS在HLS中的结构体定义如下:

template <typename T, size_t WUser, size_t WId, size_t WDest> struct axis
{ .. };

其中,

  • T:代表串流的数据类型
  • Wuser:TUSER的信号宽度
  • Wid:TID的信号宽度
  • Wdest:Tdest信号的宽度

去除了AXI4的旁路元素(即Wuser、Wid、Wdest参数设置为0),这种就是不含旁路的AXI4-stream,也称为hls::stream,这种信号只有数据信息

重点:

  1. hls::axis、ap_axiu、ap_axis的使用仅限于顶层函数接口,因为它包含着AXI4-STREAM的旁路信息,这种信号无法在内部函数或变量上使用;
  2. 对于内部串流,必须使用 hls::stream 信号