代码:https://github.com/gonhjj/lenet5-zynq7010
https://www.bilibili.com/read/cv18010558/
https://blog.csdn.net/u012116328/article/details/117246023
https://blog.csdn.net/qq_44447544/article/details/136460833
本项目采用的是璞致电子科技的板卡,还需一张SD卡存储图片。
使用的软件为pycharm 2021.1 vivado 2019.1
一、训练Lenet5模型(lenet5文件夹)
这里使用的是pycharm搭建和训练网络,这里不详细讲搭建过程了。由于zynq7010资源限制,保存模型的权重和偏置参数为半精度浮点数。
使用lenet_half.py训练,保存模型为lenet5_m_half.pth(在lenet5_half文件中),在lenet5文件夹中保存的是lenet5_train.py训练的结果。导入到Netron软件当中,将各层的参数导出为.npy文件,然后使用npy_to_txt.py转为txt文件。
in_to_txt.py是将mnist测试集中的图片下载为.txt文件,然后使用txt_to_bin.py转换为.bin文件。方便后续zynq从SD卡中读取,lenet5文件夹中保存了0到9。
二、在Vivado HLS搭建网络和加速(lenet_hls_010文件夹)
搭建网络:搭建卷积,池化和全连接层,保存在function.cpp中。搭建网络的详细过程可以去看看视频。
加速:参考:https://blog.csdn.net/louvinci/article/details/104447604/
注意输入input和输出Cout的接口类型为bram。优化这部分可以自己再改改,我并没有使用完所有的资源。
s_1为未使用hls优化,s_5是使用了的。生成的IP核保存在s_5/impl/ip/xilinx_com_hls_lenet_1_0
三、创建BD和SDK测试(lenet5_v_p文件夹中)
如果直接使用我给的程序,可跳过这部分,直接看SDK中的测试程序,通过JTAG下载到板子上。
将生成的IP核导入到Vivado中(下面的图片均是在我的项目中做演示)
创建Block Design,连线。修改下ZYNQ IP核的设置(串口,SD卡,DDR这些)。这个BD表示的过程是ZYNQ从SD卡中读取图片数据,然后通过AXI总线传到BRAM0中,然后再到lenet IP核中处理,处理结果再传到BRAM1,最后返回ZYNQ由串口把数据打印出。
连完线后点击Generate Output Products,再点击Create HDL Wrapper。
再点击Run Implementation进行综合布线,然后点击Generate Bitstream生成bit流文件。
导出硬件描述文件,点击Launch SDK打开Vivado SDK。
打开软件后点击File创建文件 ,将lenet_v_p\lenet_v_p.sdk\lenet\src\中的top.c,sd.c,sd.h放到你的工程目录下,就可以使用了。代码这部分也比较简单,不做过多概述。
然后下载到板卡
打开串口工具查看结果。
四、我的一些问题,还未解决(求助)
做完上述这些,是想把测试放到linux上的,结果搞了段时间连PS端的以太网口都没搞好。
我原本是按照网上的,只把ZYNQ的IP核设置好,然后生成硬件描述到petalinux工程,然后petalinux-config,再petalinux-config -c u-boot,petalinux-config -c kernel。。。设置完后下载到SD卡,启动还是显示,不知道怎么搞。
-
PHY is not detected
-
GEM PHY init failed
现在以太网口用的是淘宝卖家给的例程,用的是AXI 1G/2.5G Ethernet Subsystem 这个IP核。但我感觉使用PS端的实现应该不需要额外的IP核吧,不懂linux的开发。
到此结束,有懂的可以联系我,感谢!