1 端口级接口协议:AXI4接口
Vivado HLS支持的AXI4接口包括AXI4- stream (axis)和AXI4- lite(s_axilite)和AXI4 master (m_axi)接口
AXI4-Stream接口:只指定输入参数或输出参数,而不指定输入/输出参数。
AXI4-Lite接口:指定除数组以外的任何类型的参数。你可以在同一个AXI4-Lite接口中添加多个参数。
AXI4-master接口:仅在数组和指针(以及c++中的引用)上指定。你可以将多个参数分组到同一个AXI4接口中。
1.1 AXI4-Stream Interface
AXI4-Stream接口可以应用于任何输入参数和任何数组或指针输出参数。
1.2 AXI4-Lite Interface
使用AXI4-Lite接口来允许由CPU或微控制器控制设计。使用Vivado HLS AXI4-Lite接口,你可以:
1、将多个端口分组到同一个AXI4-Lite接口中。
2、输出C驱动程序文件,以便与运行在处理器上的代码一起使用。
Note:它提供了一组C应用程序编程接口(API)函数,它允许您从软件轻松地控制硬件。这在将设计导出到IP目录时非常有用。
Xilinx建议在AXI4-Lite接口中包含与返回端口相关联的块级I/O协议。
在一个AXI4-Lite接口中,Vivado HLS为块级I/O协议信号和中断控制保留0x0000到0x000C的地址。
1.3 AXI4-master Interface
对于单个数据传输,Vivado HLS读取或写入每个地址的单个数据元素。下面的示例显示了单个读和单个写操作。在本例中,Vivado HLS在AXI接口上生成一个地址来读取单个数据值,并生成一个地址来写入单个数据值。接口为每个地址传输一个数据值。
在突发模式传输中,Vivado HLS使用一个基址,后跟多个顺序数据样本来读取或写入数据,这使得这种模式能够实现更高的数据吞吐量。当您使用C memcpy函数或流水线for循环时,可以使用突发操作模式。
在突发模式中使用for循环,要注意
1、使用 pipeline
2、按递增顺序访问地址
3、不要在条件语句中放置访问
4、对于嵌套循环,不要扁平循环,因为这将抑制突发操作
5、在for循环中只允许一次读和一次写,除非端口被绑定在不同的AXI端口中(bundle)
要创建最佳的AXI4接口,接口指令中提供了以下选项来指定突发的行为并优化AXI4接口的效率。
1、latency:指定AXI4接口的预期延迟,允许设计在预期的读或写之前启动总线请求数个周期(延迟)。如果这个数字太低,设计就会准备得太早,可能会耽误公交车的等待。如果这个数字太高,总线访问可能被授予,但是总线可能会停止等待设计开始访问。
2、max_read_burst_length:指定在突发传输期间读取的数据值的最大数。
3、num_read_outstanding:指定在设计停止之前,在没有响应的情况下可以向AXI4总线发出多少读请求。
4、max_write_burst_length:指定在突发传输期间写入的数据值的最大数目。
5、num_write_outstanding:指定在设计停止之前,在没有响应的情况下可以向AXI4总线发出多少写请求。
在AXI4接口中控制地址偏移量
offset = < >
off:不应用偏移地址。这是默认的
direct:在设计中添加一个32位端口,用于应用地址偏移量
slave:在AXI4-Lite接口中添加一个32位寄存器,用于应用地址偏移量。
如果在AXI接口中使用slave选项,则必须在设计接口上使用AXI4-Lite端口。Xilinx建议使用以下pragma实现AXI4-Lite接口:
另外,如果使用slave选项并且使用了几个AXI4-Lite接口,则必须确保将AXI主端口偏移寄存器绑定到正确的AXI4-Lite接口中。在下面的示例中,端口a被实现为一个AXI主接口,带有一个名为AXI_Lite_1和AXI_Lite_2的偏移量和AXI4-Lite接口:
2 HLS Stream Library
Vivado HLS提供了一个c++模板类hls::stream< >来建模流数据结构。用hls::stream< >类实现的流具有以下属性:
1、在C代码中,一个hls::stream<>的行为类似于一个无限深度的FIFO。不需要定义hls::stream<>的大小。
2、按顺序读取和写入它们。也就是说,从hls::stream< >中读取数据后,将无法再次读取该数据。
3、默认情况下,顶级接口上的hls::stream< >是通过ap_fifo接口实现的。
4、设计内部的一个hls::stream< >被实现为一个深度为1的FIFO。优化指令流用于更改默认大小。
#include "hls_stream.h"
当流被传入和传出函数时,它们必须按引用传递,如下例所示:
阻塞方式
非阻塞方式