最后也是最关键的,就是在fpga上搭建出卷积神经网络的结构。
我使用的fpga是xilinx的xc6slx45,以下是最后的资源使用情况
其中设计最重要的就是解决二维卷积的问题,我采用了shift ram ip核
但是使用会遇到一个问题:需要剔除一些无效数据。 具体如下:
同时,这种结构也可以用在maxpooling上。
**函数使用RELU,在verilog中只需要一行代码就能搞定
整个设计用到了shift ram(用来做二维卷积),block ram(做数据缓存,缓存中间结果),rom(存放图片以及参数)。由于这款芯片的dsp只有58个,每个卷积核大小为5x5,因此计算每个卷积需要25个dsp做乘法,所以计算的并行度最多为2,同时计算2个feature map共消耗dsp 50个。为了节约资源,第二层卷积层的乘法器也复用第一层的乘法器。
最后的计算结果:
tensorflow的(转化为mat文件,用MATLAB查看的):
fpga的(用chipscope查看的):
总结:fpga的计算结果和tensorflow的结果差一个系数,还有一些误差来自于小数取整带来的问题,总体来说算法的验证时正确的。最后fpga计算完需要7145个周期,在时钟为100MHZ的情况下,一共用时71.45us。
项目做完了,写一些总结(总结一些坑和思路)!!!!!!!!!!!
ps: 学习交流可以加我qq1343395571,程序的话只能自己慢慢写了