如何在HLS中使用AXI4-Stream接口
AXI4-Stream接口在进行数据传输时是顺序传输的,类似于FIFO,先进先出,这意味着需要映射为AXI4-Stream接口的函数形参只能被读取或只能被写入(赋值)。同时,AXI4-Stream传输数据的位宽是按Byte(字节)对其的,这意味着如果数据位宽不是8的整数倍,那么就需要对数据进行扩展,类如,若数据是12-bit,就需要将其扩展为16-bit,具体是高4位补零还是符号位扩展取决于传输数据是无符号数还是有符号数。此外,传输数据的最大位宽是4096-bit。再来看一下AXI4-Stream是如何工作的。如下图所示。Producer和Consumer之间只有数据通道TDATA和其他握手信号如TREADY、TLAST、TVALID。其中TVALID为高表明Producer发送的数据有效,TLAST为高时表明此时发送的是最后一笔数据,TREADY为高时表明Consumer可以接收数据。
注:既然是将函数形参设置为AXI4-Stream接口,这就要求该函数必须的待综合的顶层函数。
如果需要使用AXI4-Stream接口,就不得不用Vitis HLS的库HLS::stream。Vitis HLS提供了两种方式用于将形参映射为AXI4-Stream接口。第一种是通过Pragma INTERFACE设置,此时需要在C++代码里使用HLS Stream库,如下所示。
在使用Pragma INTERFACE时,Vitis HLS提供了register_mode,如上图所示,共4个可选值。其中Forward是将TDATA和TVALID使用寄存器输出;Reverse只把TREADY使用寄存器输出;Both则是将TDATA/TVALID和TREADY都使用寄存器输出;而Off则是关闭寄存器输出功能。Xilinx建议至少保证一个方向是寄存器输出即可以选择Forward或Reverse,但不要选择Off。
第二种方式较为直接,需用用到axis或axiu数据类型,前者针对有符号数,后者针对无符号数。两者军需添加头文件ap_axi_sdata.h。我们通过一个案例进行说明,如下图所示。这里注意代码第20行和第21行。第20行定义了数据类型为ap_int<32>,第21行定义了axis类型,其中数据类型为ap_int<32>,其余三个参数依次对应TUSER、TID和TDEST的位宽。这里为0,表明设计不需要这三个辅助信号。使用这种方式就不需要再通过Pragma INTERFACE指定其接口类型了。
Copyright @ FPGA技术驿站
转载事宜请私信 | 获得授权后方可转载
相关文章
- DockerFile 编译语法详解
- (四)汇编语言——简单程序
- 高并发场景下的限流,熔断,降级(待续)
- Docker 构建私有镜像仓库
- (五)汇编语言——[bx]和loop指令
- 区块链碎片知识
- CentOS 7 安装ror出现的问题
- Zabbix 配置钉钉脚本告警
- Zabbix 监控常见服务
- CentOS 7 使用ror出现的问题
- Ansible 系统概述与部署
- Ansible 清单与命令解析
- bee generate docs
- Ansible 常用模块详解
- 深入理解 Java 中 SPI 机制
- 不想加班开发管理后台了,试试这个 Java 开源项目吧!
- 用 Java 训练出一只“不死鸟”
- 用 Java 训练深度学习模型,原来可以这么简单!
- [Java 开源项目]一款无需写任何代码,即可一键生成前后端代码的工具
- 用 Java 做个“你画手机猜”的小游戏