在ZYNQ-7010上部署卷积神经网络。包括2X2卷积层、最大池化层、线性层、Relu层、线性层、Relu层、softmax层。所有的计算都是基于FP16半精度浮点数据。 由于7010资源很少,因此在编写代码时用了些小trick,比如把卷积矩阵、线性层中的bias偏置等设置成0,线性层中的filter设置成0.01等。 目前资源占用率比较少,只使用了44%的LUT,20%的FF,但相应的,处理速度就比较慢了,在50MHz工作频率下,对于输入尺寸为28*28的FP16精度数据/图片,可以实现19K帧/s
目前还存在一些问题,比如在综合的时候部分代码会被优化掉导致逻辑出错(应该是代码问题);FP16数据的指数计算及求倒数方法,目前的算法比较实用,但不优雅简洁,有待改进。 目前暂挂着,后续实验上有实际需求了再来优化。
-------------- update: 09/24/2023 --------------
一、框架说明
- 该卷积模块的对象设定为28X28size的图片/数据,输入数据格式为FP16。目前该卷积模块只包含核心的数据处理部分,不包含输入输出模块。用户需要根据自己的板载情况,编写自己的数据接口部分,比如通过USB、AXI4通信从PS端获取数据等方法;
- 模块按流水计算顺序分为卷积层、最大池化层、49X49线性层、Relu层、49X10线性层、Relu层、softmax层。各个子模块的功能可能包含多个.V文件,功能如文件名所述。如data_ff.v表示数据寄存打拍,FP16_reciprocal.v表示是倒数计算...各个模块包含的计算部分不多,只有FP16数据的4则运算和指数、倒数计算。4则运算和浮点数据计算原理相同;指数和倒数分别通过9阶泰勒展开、牛顿迭代法计算。具体可以参考代码;
- 该卷积模块中线性层的参数需要用户自己更改设定,因此对应的子模块的接口可能会需要用户自己调整,添加更多的接口来接收自己设定的权重及偏置参数。目前框架中统一将线性层中每一个节点的bias都设置为0,每一个节点的乘积权重都设置为0.01;
- 项目没有提供各个模块的完备性验证case。用户可以使用verilator验证工具(推荐)或modelsim来对各个模块做验证测试;
- 顶层接口保留有ila逻辑分析仪的例化模块,用户可以自由删去。
二、其他
- 希望小伙伴不吝赐教,有bug请第一时间提交issue,感谢!