在了解基本神经网络的配置之后将利用HLS平台实现基本的神经网络,网络目前没有进行量化,选择的数据格式为float,由于神经网络的feature map较大,FPGA的片上RAM难以存储整个网络,所以采取逐层加速的方法,降低计算过程中对RAM的需求,但是网络会更容易受到DDR读写带宽的限制。下面对HLS程序进行简单的介绍:
首先使用AXI_Master总线用于读取位于PS侧的图像和权重数据,然后使用AXI_lite总线用于配置读取的物理地址。
通过AXI总线加载数据的函数如下所示:
根据UG902当中的介绍,在使用AXI总线时使用memcpy函数是可综合成实际电路的。加载完成后将使用逐层计算的方式进行加速:
运算过程中直接使用了for循环,没有根据计算过程设计更优的硬件,for循环中仅使用了流水线命令进行优化,同时使用了数组分割使数组直接映射为触发器,减少运算带宽问题,根据LetNet网络结构完成相关代码编写后,进行综合,HLS综合得到的结果如下所示:
可以看到整体资源占用较少,HLS综合得到的结果并不准确,时序和资源等参数仅能作为参考,需要使用vivado进行综合才能得到更为准确的结果。综合完成后导出IP,方便进行vivado工程搭建。搭建完成的vivado工程如下所示:
然后进行编译得到的结果如下所示:
可以看到整个工程的LUT占用较多,DSP占用较少,HLS部分还有很大的优化空间。然后将生成的tcl、bit和hwh文件导入pynq,然后打开ipynb文件运行相关程序:
首先配置相关寄存器:
寄存器的具体地址可以使用vivado或者SDK进行查看,然后逐层运行加速程序:
最终得到识别结果:
可以看到结果正确,并且进行一张图片的推理时间为0.005秒左右,说明计算帧率在200帧左右,效果良好。