AlveoU200在pynq-z2上做的那个手写数字识别工程在这块板上复现一下。 数字识别的基础知识

2024-06-17 14:43:21

最近实验室租了块xilinx家的AlveoU200加速卡,过去几天被这块板吸引了注意力。刚开始了解,做点什么来试试水呢?一想,可以把曾经学 在pynq-z2上做的那个手写数字识别工程在这块板上复现一下。


数字识别的基础知识在我曾经pynq-z2的总结里讲过了,


接下来就专门来说说加速卡的开发是个什么名堂,以我自己的理解先来比较一下zedboard纯PL开发,pynq使用,以及U200加速卡的区别吧。



1.纯PL开发没啥可说的,写好RTL,烧进去,跑就完事了。


2.pynq的开发跟zedboard的PS开发本质是一回事,只不过pynq是一个先装好了linux的zedboard,同时还有个overlay让这个板子可以支持python。这个在调用的时候,虽然ip核的调用是用python(在zedboard就是用C)来控制的,但ip核之间的调用流程,还有内存的使用方式等细节,我们是控制不了的。


3.U200走的路子跟前面就不同了,它用openCL来写主函数, openCL是专门为异构平台写程序的语言。我们可以实现对ip核调用过程,内存使用等方法的控制。emmm,说实话我简单使用下来的感觉是opencl使用起来并不方便,但起码它提供了方法完成以前做不到的事情2333。


整个事情的流程是这样的:


(1)测试读取目标图像的bmp文件、卷积核以及偏置数据的代码。


(2)使用VITIS的HLS工具将c代码封装成核


(3)用openCL编写host程序,跑仿真,这里面我还分了9步。


3-1:读取main函数的argv[](也就是读取ip核)

3-2:读取图像

3-3:读取卷积核以及偏置参数

3-4: 在host上分配各种ip核处理完后放结果的内存

3-5:用opencl做配置操作

3-6:接下来将device跟host上已经写好的内存位置连接起来

3-7:设置第一次卷积和池化的参数

3-8:将第一次卷积操作压入queue,开始执行

3-9:GUI 操作



(1)读取目标图像的bmp文件、卷积核以及偏置数据


1-1:读bmp


读取目标图像在pynq上面是通过cv2的读取jpeg库函数一步到位完成的。但是U200不支持python,所以这个过程咱们要自己写段简单的C程序完成,为了方便我们将目标函数从jepg格式改成bmp格式。


代码在下面,逻辑很简单,就是bmp整个格式实际有效的数据在文件最后,文件前面有一堆标注格式和文件内容的"废话",我们要做的就是跳过前面的部分,直接把后面的内容读出来。


这里多说一句,这种读文件的操作,写代码的时候还是多花几秒钟把各步的错误信号设置好,说不定就可以为debug省去不少时间。


首页
产品
新闻
联系
Powered by MetInfo 7.3.0 ©2008-2021  mituo.cn