0、设计思路
本文目的是为在PYNQ调用HLS所生成的bit文件所写,旨在明晰整个流程和细节,属于个人学习笔记,将随着工作的开展而逐步更新完善,该文章可能不会对您的工作有所帮助,但也希望您能指出文中的错误,谢谢。
当前将从矩阵乘法示例,将整个流程进行细化,以供日后自己的IP使用。
以下以矩阵乘法举例,HLS源文件详见https://download.csdn.net/download/u014798590/64515794
里面包含矩阵乘法的源文件与测试文件。
本文如有不详细的地方可参考该大佬的文章https://blog.csdn.net/qq_42334072/article/details/106769534
Tips:
01、PS与PL通讯
根据《The Zynq Book》所提到,PL(可编程逻辑)与PS(处理系统)中采用AXI(Advanced eXtensible Interface)进行通讯。
有关AXI的介绍与使用,详见《The Zynq Book》中的第19章以及《UG871 HLS Tutoial》ch.4的 lab4章节
关于图片的设计思路,送进去之前由PS端的Python已经转成了rgb位图,然后调用AXI接口写进去一帧数据,进行处理后读出来,本例中,图像采用AXI_Stream实现
02、使用自己的ip思路
如下图可以看到,例程所设计的IP(image_process),具有输入输出两个接口,我们在Diagram中,将image IP与axi_dam进行连接,图像处理教程,是非常好的学习资料,在深度学习中,image IP的本质是一个卷积层,输入原始图像,获得卷积后的图像,后续将在这个例子中进行学习。
03、在Vivado中添加第三方板卡
访问该网站 https://github.com/Avnet/bdf;
将对应板卡的文件夹,复制到 E:\Xilinx\Vivado\2018.3\data\boards\board_files文件夹中;
需要注意的是如果板卡具有多个version,只需要拷贝一个文件夹;
在工程中切换Parts/Boards,而后搜索,选择。
1、HLS设计
请注意,HLS选择的芯片型号,一定要和Vivado设计中的芯片or板卡型号一致,否则在BD中 ,或无法找到你所打包的IP
概述:
编写完成的HLS文件,测试、综合完成后生成IP核。
1.1、流程备忘
1.1.5、添加头文件
在综合前,需要先进行以下流程的设置
project——》project setting——》synthesis——》Top Function
选择对应的函数
C synthesis
1.2、Pragma设计与优化
详见HLS相关学习博客,《Xilinx HLS 学习笔记3(for循环优化)》
下例为对for循环的优化,增加流水线
在对程序进行优化的过程中,可以使用Pragma代码或者HLS Directive方法进行配置
以下分开进行展示
1.2.1、Directive 方式
首先对需要展开或流水的for循环命名
然后可在右侧的Directive中看到其
右键命名,可进行insert directive设置,在弹出的对话框中,根据实际情况,选择命令
最后可看到相关命令出现,表明配置生效
1.2.2、Pragma方式
直接使用pragma HLS PIPELINE进行配置
最终结果
1.2.3、对接口配置(留坑)
同理也可使用两种方法实现一样的效果,(关于接口的作用与定义,待更新)
1.3、综合、打包IP
最后在该路径下找到IP文件夹(下一步中会用到)
D:\ZYNQ_PACK\Zynq7020\HLS_Project\AXI_Test1\IP_Matrix\Matrix\solution1\impl