ZYNQ平台软硬件协同设计总结

我们的参赛作品是基于ZYNQ的视频总结与检索系统,由于视频摘要与视频总结中运用了大量的图像处理算法,而大部分图像处理算法需要处理二维数据,对于实时性要求高的系统,顺序运行的CPU难以胜任,这时有两种选择,一种是专用的DSP系统,虽然这种系统实时性比较好,但是成本非常高,而对于FPGA来说,由于其本身的特性决定了它非常适合于高速并行处理,为我们使用FPGA硬件加速提供了可能。由于ZYNQ将CPU与FPGA集成在了一起,因此非常适合用于软硬件协同处理,在PS中完成基本的输出输出操作,而核心的算法使用PL进行加速,提供了性价比很高的解决方案。

PL硬件加速需要如下几个步骤完成:1,利用PS中ARM的预先存储待处理的图像数据至DDR中;2,通过数据通道将DDR中的图像数据传送至PL中;3,使用FPGA进行图像处理算法设计;4,通过数据通道将FPGA处理之后数据送回至DDR中;5,PS中ARM将处理之后的图像数据读出。模块框图如下所示:

ZYNQ平台软硬件协同设计总结_第1张图片

通过模块框图可以看到,系统中数据流向分为两大块,即:①、⑤和②、③、④。

传输方案的选取:

 

        由于我们采用PS与PL协同操作,因此选择一个合适的系统传输方案是实现高效系统的保障,我们首先分析数据吞吐量从而寻找可能存在的性能瓶颈。我们的最终目标是实现视频的实时处理与分析,由于实时视频的数据量大,运算量高,因此我们必须要选择传输速度快,总线位宽高的传输总线。鉴于我们的数据是存放在DDR中的,那么较理想的传输方案即AXI_HP和PL内DMA的传输,与其他传输方式相比,它具有高数据吞吐量以及多个接口等优势。

Cache问题:

Cache最初的目的是为了加快ARM和DDR之间的交互速度,将一部分缓存存储在DDR中,当ARM需要去访问DDR中数据时,如果cache中已经有了相应的缓存(即“cache命中”),ARM就会直接访问cache中的数据,从而提高运行速度。当我们使用FPGA进行加速时,FPGA会绕过cache对DDR中的数据进行读写从而cache中该部分缓存(如果之前缓存过)是已经过时的数据,然而cache本身并不知道该数据被FPGA修改过,仍然认为缓存的数据时正确的,从而ARM无法读取到正确的数据。

解决方法:在ARM对相应的内存访问之前需要通知cache,该段内存的cache无效,从而ARM才能够直接访问到DDR中的数据。对于zynq裸机下的操作,可以直接使用Xilinx提供的BSP中的相应的Xil_DCacheFlushRange()函数。而在嵌入式linux开发环境下,方法较为复杂,核心的部分就是在内核空间中申请一致性DMA缓冲区,即调用dma_alloc_coherent()函数。

 

PL硬件加速:

        对于硬件加速,常规的步骤是首先在软件上验证算法的正确性,然后将软件中的一部分算法使用硬件模块来代替其运算。我们在PS中的大部分图像处理操作都是依赖于OpenCV函数库,而独立开发的FPGA上的算法会与OpenCV中的函数存在一定的不兼容。因此,经过查阅相关的资料,我们决定使用Xilinx Vivado_hls进行FPGA图像处理的加速设计。Vivado_hls 2013.1中已经包含了hls_video可综合视频库,并且视频库中大部分图像处理算法与OpenCV保持了高度的一致性,并且vivado_hls提供了C Simulation功能,能够验证用户开发的算法与软件的一致性,极大地加速了算法的开发与调试。最后通过vivado_hls,我们将软件设计中的大部分预处理算法都移植到了PL中,进行加速,提高了系统运行速度,尤其在视频码率较高的情况下系统加速效果明显。

你可能感兴趣的:(技术)