reference:
VIVADO HLS TrainingCreating a simple AXI-master interface for testing with Vivado HLS如何使用Vivado HLS加速FPGA算法开发米联客XILINX_ZYNQ-7000系列(第四期) HLS入门参考戴书画给的百度网盘文件里面的“04_XILINX7 系列FPGA HLS入门.pdf”四种PS-PL接口
PS指的是ARM核,PL指的是FPGAaxi-lite接口,PS可以读写IP核里面的单个变量,参考:VIVADO HLS Training - AXI Lite slave floating point #5bram接口,bram是FPGA内部的ram,bram的地址映射到了指定地址空间供PS访问,相当于PS核PL之间的共享内存,参考:VIVADO HLS Training - BRAM interface #06注:实验发现单个数组的大小不能超过一个BRAM的大小,一个BRAM大小参考/blog//100016569.htmlaxi stream接口,数据流的形式,结合DMA实现,参考:VIVADO HLS Training AXI Stream interface #07axi master接口,IP核可以直接访问PS的地址空间,使用axi master作为接口很方便,但是读写速度较慢,因为要经过AXI总线,参考:Creating a simple AXI-master interface for testing with Vivado HLS总结最便捷的做法:使用axi master作为PS和PL之间的接口,在IP核的内部将PS内部的数据拷贝一份到bram(即在HLS中声明的变量或者数组里面),然后处理bram中的数据,最后通过axi master接口写回到PS的内存空间,注意在xilinx sdk的代码中要在IP核的驱动函数前后都加上Xil_DCacheFlush()。
循环加速
pipline/全展开/部分展开循环加速后会使用更多的硬件资源,通过观察c synthesis的结果中的资源占用量的变化可以看出来。pipeline可以针对函数,也可以针对循环/多层循环。注意,针对函数或者多层循环的pipeline deractive内部所有的子循环都要pipeline,所以先对每一个最内层的循环pipeline,然后依次向上层加pipeline,直到pipeline失效。数组优化
reference: /video/BV1J5411t7uE?p=20
数组分割,分割后各个子数组可以并行读写,打破内存墙的限制,提高并行度数组重组,通过合并数组,减少资源利用率hls中声明为const的数据类型,会被存在ROM里面。hls中声明为static的数据类型,会用memory实现。数组可以用bram或者lutram的资源,bram可以存下int[100000],lutram可以存下int[20000],但是使用lutram会有各种问题,所以建议使用bram;可以用#pragma HLS RESOURCE指定数组使用哪种资源在不同函数中声明的局部数组占用的空间不会释放,所以尽量不要使用局部的数组,临时使用的数组建议放在全局的buffer里面