HLS是Xilinx的高级开发工具,高级的地方不止体现在可以使用C语言写Verilog,而且还有点曲高和寡的意思,复杂的语法逻辑让初学者摸不着头脑,学习曲线非常的陡,水也非常的深。一方面惊叹于当时开发这套工具的人有多NB,另一方面又替这门技术担忧,简单易用的编程逻辑永远是编程语言传播的第一要义,如果HLS做到可以和Python语言那样,我也不会想着写一些HLS的博客,做一些HLS的教程。话说回来,难归难,这个工具用起来是真心好用。如果能够忍受HLS工具学习过程中的不确定性、所见非所得和莫名其妙的错误,那么它是你做FPGA逻辑的神器!尤其在现在各行各业都这么卷的环境下,卷什么都是卷,还不如卷一个准入门槛比较高的工具,绝对不会辜负你的时间。
Xilinx的很多IP核尤其是图像领域,大量的使用HLS工具实现。图像是矩阵数据,非常适合HLS工具中的并行处理。HLS丰富的接口尤其是对AXI4协议的支持,可以轻松实现数据流、配置寄存器和读写DDR等操作。上节讲到的Sensor Demosaic就是使用HLS实现的,在完成底层FPGA逻辑的实现后,相应的驱动会集成在向Vitis提供的xsa驱动文件中,用户只用执行简单的几句调用语句就可以配置FPGA。只是Sensor Demosaic没有调试成功,出来的图像颜色不对,所以决定自己写一个。这个就是HLS工具带来的生产力,你如果觉得某个IP核不好或者不会用,那么可以立即自己做一个出来,在其他的一些图像算法上也一样,HLS的快速实现给了我们足够多的底气。
ug902是HLS工具的官方文档,也是一开始学习HLS必看的手册,类似于教科书。教科书的特点是讲的特别全面,所有用到和涉及到的知识都会讲,缺点是光看这个手册有点云里雾里,发散性太强,没有重点,也没有足够多的实例Demo,而且其中的好多指令以及代码标准在实际中并不会用到,相信大家在学习其他编程语言看教科书的过程中也有相似的体会。如果单从设计一个图像处理IP核的角度出发,那就变得简单多了,不用操心根本用不到的优化指令,只用在三个方面把握好了,基本就没有问题:接口、II=1和仿真。
接口
如果大家有关注过Xilinx自己使用HLS实现的一些图像IP的话应该对于AXI4的接口不陌生,包括Axi Lite、Axi Full和Axi Stream,前边在讲标准接口时也提到这些AXI4的接口在Vivado中用的非常多,能做到即插即用,非常的好使。Verilog中可以按照例程手写出这些接口,那么在HLS中是怎么实现的呢?答案是interface的pragma命令。
void AxiStream_Bayer2RGB(stream<type_streamin> &DataIn, stream<type_streamout> &DataOut,
unsigned short InputWidth, unsigned short InputHeight)
{
#pragma HLS INTERFACE axis register both port=DataIn
#pragma HLS INTERFACE axis register both port=DataOut
#pragma HLS INTERFACE s_axilite port=InputWidth
#pragma HLS INTERFACE s_axilite port=InputHeight
#pragma HLS INTERFACE s_axilite port=return
......
}
上述命令的结果是DataIn和DataOut使用Axi Stream接口,InputWidth和InputHeight这两个参数使用Axi Lite接口,最后一句pragma代表这个IP核的启动、停止以及查询和使能IP核中断等操作使用Axi Lite接口控制,不受FPGA的信号控制,FPGA中也看不到这