
[简介]
这一系列教程演示了如何使用xilinx的HLS工具来加速算法的硬件。分为三个部分,分别是HLS IP设计、vivado硬件环境搭建、SDK软件控制。在HLS端,需要将硬件加速的软件算法转换成RTL级电路,生成嵌入式使用的axi控制端口,用于数据传输和模块控制。
HLS简介]
HLS可以直接将算法映射到RTL电路,实现高层次综合。Vivado-HLS可以直接使用C、C和System C语言对Xilinx的FPGA器件进行编程。用户无需手动创建RTL,而是通过高级合成生成HDL级别的IP核,从而加速IP创建。HLS的官方参考文献有:UG 871(ug871-vivado-high-level-synthesis-tutorial.pdf)和UG 902(UG 902-vivado-high-level-synthesis . pdf)。对于Vivado Hls,输入包括Tesbench、C/C源代码和指令,对应的输出是IP Catalog、DSP和SysGen。特别是一个项目只能有一个顶层函数进行合成,这个顶层函数下面的子函数也可以进行合成,会生成相应的VHDL和Verilog代码。所以C综合后的RTL码结构通常和原C描述的一样,除非是子函数。不是所有的C/C都可以集成,涉及操作系统级别的动态内存分配和操作都不能集成。Vivado HLS的设计过程如下:
在整个过程中,用户首先创建一个设计C、C或SystemC源代码和一个C测试平台。通过Vivado HLS综合的设计,生成RTL设计,代码可以是Verilog或者VHDL。使用RTL,可以立即执行设计的Verilog或VHDL模拟,或者可以使用该工具的C包装器技术来创建SystemC版本。然后可以进行System C架构级仿真,根据之前创建的C测试平台进一步验证设计的架构行为和功能。设计固化后,您可以通过Vivado设计套件的物理实施流程运行设计,在设备上对设计进行编程,在硬件中运行设计和/或使用IP wrapper将设计转化为可重复使用的IP。
步骤1:创建新项目
1.创建新项目创建新文档,并输入项目名称和项目路径。完成后,单击下一步。
2.添加设计文件,制定顶层功能。完成后,单击下一步。
3、添加C语言模拟文件。完成后,单击下一步。
4,配置解决方案名称,这通常是默认值。以ns为单位配置时钟周期。配置不确定性,默认为空。选择产品型号。完成后,单击完成。
5.HLS是典型的Eclipse接口,与SDK接口非常相似。
导入文件的代码如下:1。源文件。axi_interfaces.c
# include ' axi _ interfaces . h ' void axi _ interfaces(dout _ t d _ o[N],din_t d_i[N]) {inti,rem//存储累积的datastaticdacc _ tacc[CHANNELS];axi _ interfaces _ label 0:for(I=0;I # ifndef AXI _接口_ H _ #定义接口_ H _ #包含类型定义int din _ t;typedef int dout _ t;typedefinitdacc _ t;#定义通道8 #定义样本4 #定义通道*样本voida Xi _ interfaces(dout _ TD _ o[N],din _ TD _ I[N]);#endif 3,测试文件。axi _ interfaces _ test.c
# include ' axi _ interfaces . h ' int main(){//创建输入数据din_t d_i[N]={10,20,30,40,50,60,70,80,11,21,31,41,51,61,71,81,12,22,32,42,52,62,72,82,13,23,33,43,53,63,73,83 };dout _ t d _ o[N];int i,retval=0;FILE * fp//调用函数对数据axi_interfaces(d_o,d_i)进行操作;//将结果保存到一个文件fp=fopen('result.dat '' w ');fprintf(fp,' Din Dout ');for(I=0;id in Dout 10 10 20 20 30 30 40 40 50 50 60 60 70 70 80 80 11 21 21 41 41 81 51 101 61 121 71 141 81 161 12 33 22 63 32 93 42 123 52 153 62 183 72 213 82 243 13 46 23 86 33 126 43 163
这一步是功能代码的逻辑验证,相当于前功能模仿。1.测试程序的代码如下所示。程序首先调用综合函数得到计算结果,然后与之前的数据集进行比较,最后返回计算结果。当计算结果与之前的数据集一致时,测试通过,不一致时,测试失败。需要查看代码,寻找错误。
2.单击红色框中的按钮,启动C源代码验证。
3.验证结果显示在控制栏中。如图,测试通过。
4.在头文件中,数据类型和参数被重新定义,函数被声明。
第三步:高级综合
这一步是将功能代码合成为RTL逻辑。1.点击红框中的按钮,将C代码合成为RTL。合成完成后,检查结果。
2.综合完成后,查看综合报告。包括定时、延迟、资源占用、端口信息等。
3、端口分析。(1)控制端口用于控制和显示模块的工作状态。每个端口的功能如下。默认情况下,将生成以下四个控制端口。Lap_start(in):高电平时,模块开始处理数据。Lap_done(out):高电平时表示模块已经处理完数据。Lap_idle(out):指示模块是否空闲。高电平有效。高的时候应该是闲的。Lap_ready(out):高电平时,表示模块可以接受新数据。(2)数据端口用于传递模块的输入输出参数。参数d_o和d_i是数组类型,所以默认生成内存接口。存储器接口(数组类型参数)的数据来自外部存储器,通过地址信号读取相应的数据输入模块。输入数组从外部存储器读取源数据,输出数组从外部存储器写入结果数据。每个端口定义如下。Laddress:地址信号lce0:片选信号lwe0:写使能信号ld0:数据信号4、综合结果分析。在分析界面中,你可以看到该模块的操作。包括数据依赖和每个周期执行的操作,读写IO口,访问内存口等等。
第四步:全面优化
当使用高级综合来创建高质量的RTL设计时,一个重要的部分是优化C代码。Vivado HLS有自动优化的功能,尽量减少循环和函数的延迟。除了自动优化之外,我们还可以手动优化程序,即通过给不同的解决方案添加不同的指令来进行优化和性能比较。其中,对于同一个项目,可以建立多个不同的解决方案,给不同的解决方案添加directive可以达到以下目的。优化的类型可以分为以下几类:L端口优化。指定不同类型的模块端口。l函数优化。加快函数的执行速度,减少执行周期。我遵循坏的优化。使用扩展和流水线形式,减少了循环的执行周期。1.单击下面红色框中的图标创建新的解决方案。
2.不同解决方案位于不同的文件夹中。
3.选择综合文件。你可以在直接框中看到可以优化的标签。
4.双击选择d_o,然后选择interface,s_axilite。单击确定。将d_o的端口类型设置为s_axilite类型。
5.参考d_o,将d_i的接口类型设置为s_axilite。将d_i的端口类型设置为s_axilite类型。
6.双击选择函数名axi_interface,选择interface,s_axilite。单击确定。将控制端口的端口类型设置为s_axilite类型。
7.双击循环标签,选择“管道”,然后单击“确定”。
8.双击循环标签,选择循环展开优化,然后单击确定。
9.如上所述,标记为for_loop的循环也被流水线化和优化。10.最终优化情况总结如下。
11.重新合成函数,检查综合报告如下。
12、分析。与未优化相比,优化后的函数综合产生的模块运行时钟大大降低。端口的接口类型也改成了axi_lite端口。但资源占用率提高了,这也体现了以资源换速度的设计理念。
第五步:综合结果文件
合成完成后,可以在每个解决方案的syn文件夹中看到合成器生成的RTL代码。包括systemc,VHDL和Verilog。
第六步:导出IP
在菜单中,按如下方式设置SolutionExport TL,然后单击ok。
ip包完成后,会在impl文件夹中输出IP文件夹,其中包含RTL代码(hdl)、模块驱动(drivers)、文档(doc)等信息,包括一个压缩包文件,这是用来建立vivado项目的IP压缩包。
第七步:总结
本文侧重于hls软件的使用和优化,而不是C语言模块的设计。掌握hls软件的基本用法和优化方法后,可以设计更复杂的C语言模块,进行rtl综合,加快设计开发速度。









