Skip to content
 
 

Repository files navigation

LeNet-5-on-FPGA

本工程使用纯verilog语言编写rtl代码,在FPGA上搭建神经网络LeNet-5,实现手写数字识别的功能。 由于一些文件太大,所以它们无法上传,但核心的rtl代码都在src文件夹中,测试文件在sim文件夹中,约束文件在constr文件夹中。 阅读src文件夹中rtl代码时,请对照代码说明。

工程介绍:

本作品使用的神经网络架构是在经典的LeNet-5神经网络架构的基础上经过简化得到的,包括两个卷积层、两个池化层、两个全连接层、三个激活层。使用PyTorch构建和训练模型,训练和测试数据集采用MNIST数据集,理论精度达98.6%。

第一卷积层使用六个单层卷积核,卷积前在图片周围进行2圈0填充;第二个卷积层使用六个六层卷积核,无填充,卷积核尺寸均为5×5;池化采用最大池化;激活函数采用简单的ReLU函数。最终得到的输出结果是十个小数,取最大的一个数对应的结果作为最终识别结果。

硬件系统的核心部件为112个乘法器、112个加法器、2个比较器(进行4个数比较),由它们完成卷积、池化、激活、全连接的操作,整个系统的工作时序由状态机(state)和两个计数器(cnt1/cnt2)控制。

工作时,图片数据通过串口送入该系统的输入缓存(input_buffer),此后乘法器和加法器对图片分多次进行卷积操作(即将像素数据与权重数据进行乘累加运算,并加上偏置),待一次累加完毕,将加法器的输出结果存入缓存(cache),此后在卷积的同时,用四数比较器(comparer)对缓存中的数池化、激活,存入第一次卷积结果存储器(conv1_result)。

当第一次卷积即将结束时,并行开始第二次卷积,经与第一次卷积类似的过程将结果存入第二次卷积结果存储器(conv2_result),随后开始第一次全连接,经过乘累加运算和激活层后将结果存入缓存(cache),再进行第二次全连接,将计算结果送入十数比较器(compare_10),输出10位独热码,得到识别结果。

About

本工程使用纯verilog编写rtl代码,在FPGA上搭建神经网络LeNet-5,实现手写数字识别的功能。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages