业界动态
一起学习用Verilog在FPGA上实现CNN----(二)卷积层设计
2023-05-17 07:29

Vivado工程文件如图

在这里插入图片描述

打开Vivado软件,打开工程,如图

在这里插入图片描述

自动升级到当前版本,如图

在这里插入图片描述

暂时选择现有开发板的型号,如图

在这里插入图片描述

出现一条警告性信息,暂时先不管,点击OK

在这里插入图片描述

可以看到完整的工程文件包含如下图

在这里插入图片描述

自顶而下分析卷积层的设计过程

图为该项目的一个卷积层,其中包含了多个卷积核(Filter),模块的输入为图像矩阵和卷积核设置参数,输出为卷积提取的特征矩阵

在这里插入图片描述

卷积层的原理图如图所示,其中filters的位宽为2400,image的位宽是16384,该层卷积的输出位宽是75264

  • filters位宽计算:卷积核大小为5x5,卷积核个数为6,数据位宽为float16(16bits),所以5x5x6x16=2400
  • image位宽计算:手写数字图像大小为32x32,数据位宽为float16,所以32x32x16=16384
  • outputConv位宽计算:28x28x6x16=75264,式中28x28表示卷积层输出特征矩阵的长和宽,6表示卷积核的数量,数据位宽是float16
  • 补充卷积输出特征尺寸计算:m=[(n-k+2xp)/s]+1,n表示输入图像或特征矩阵的尺寸,k表示卷积核的尺寸,s表示卷积核滑动的步长(stride),p表示填充(padding)。例如,图像大小为32x32,卷积核大小为5x5,步长为1,m=[(32-5+2x0)/1]+1=28

在这里插入图片描述

单个卷积核层的设计如图,输入为图像矩阵image和单个卷积核filter,输出卷积核处理的特征矩阵

在这里插入图片描述

原理图如图所示,filter的位宽为400,image的位宽是16384,输出位宽是12544

  • filters位宽计算:卷积核大小为5x5,卷积核个数为1,数据位宽为float16,所以5x5x1x16=400
  • image位宽计算:手写数字图像大小为32x32,数据位宽为float16,所以32x32x16=16384
  • outputConv位宽计算:28x28x1x16=12544,式中28x28表示卷积层输出特征矩阵的长和宽,1表示卷积核的数量,数据位宽是float16

在这里插入图片描述

卷积单元如图所示,输入为卷积核filter和卷积核窗口覆盖的图像image,计算输出该窗口提取的特征

在这里插入图片描述

原理图如图所示,filter的位宽为400,卷积核窗口覆盖的图像image的位宽是400,输出位宽是16

  • filters位宽计算:卷积核大小为5x5,卷积核个数为1,数据位宽为float16,所以5x5x1x16=400
  • image位宽计算:手写数字图像大小为32x32,卷积核窗口覆盖的图像大小为5x5,数据位宽为float16,所,5x5x16=400
  • result位宽计算:输出结果为float16数据类型的数,具体计算见 2.4 Processing Element 章节

在这里插入图片描述

卷积单元具体实现如图所示,即相乘相加操作。卷积计算具体操作就是点乘,本质就是乘法和加法。图中输入为float16类型数据A和B,输出float16数据类型的结果
在这里插入图片描述

原理图如图所示,可以看到输入floatA和floatB,以及输出result位宽均为16

在这里插入图片描述

自底向上分析每个模块的功能和具体实现

如图所示Processing Element由FM(floatMult16),FADD(floatAdd16),result_reg三个单元组成

  • FM(floatMult16)单元是执行两个float16数据的乘法
  • FADD(floatAdd16)单元是执行两个float16数据的加法
  • result_reg寄存器,存放的是新的求和,将电路从组合逻辑转为同步时序电路,保证数据的同步
    在这里插入图片描述

卷积单元完整的顶层原理图如图所示,对一个卷积核和该卷积核覆盖的图像区域(可以称为窗口)进行计算,输出一个计算结果(float16)

在这里插入图片描述

Single Filter Layer原理图如图所示,由1个RF selector和14个CU组成,该部分是计算一个卷积核与一幅图像的卷积,输出卷积提取的完整图像的特征。

RF selector的作用:将卷积核覆盖的图像区域(可以称为窗口)的数据对应传输给14个CU,输入图像尺寸为32x32x16,卷积核大小为5x5x16,卷积核滑动步长为1,此时一幅完整图像将产生28x28个窗口数据,每个窗口数据为5x5x16。因为14个CU是并行计算的,故RF selector输出位宽为14x5x5x16=5600

为什么选择使用14个CU,作者给出的解释是:LUT的数量在单个或多个卷积核模块中呈指数增长,实验对比后,最终决定使用CU的数量等于输出特征中单行像素数量的一半。例如,输入图像32x32,卷积核5x5,输出特征为28x28,故CU的数量等于28/2=14

在这里插入图片描述

Multi Filter Layer原理图如图所示,由2个convLayerSingle组成,即并行度为2。上述内容可知Multi Filter Layer的输入是图像和6个卷积核,因此6个卷积核分为2个一组,循环3次输入到convLayerSingle,即每次执行2个卷积核与图像的卷积

在这里插入图片描述

新建工程,操作如图所示

在这里插入图片描述

输入工程名字和工程路径,如图

在这里插入图片描述

选择创建RTL工程,如图

在这里插入图片描述

直接点击Next

在这里插入图片描述

继续点击Next

在这里插入图片描述

添加芯片型号,操作如图

在这里插入图片描述

完成创建

在这里插入图片描述

创建工程文件,操作如图

在这里插入图片描述

创建floatAdd16文件

在这里插入图片描述

创建完成

在这里插入图片描述

双击打开,输入如下代码

 

如图所示

在这里插入图片描述

对设计进行分析,操作如图

在这里插入图片描述

分析后的设计,Vivado自动生成原理图,如图

在这里插入图片描述

对设计进行综合,操作如图

在这里插入图片描述

综合完成后,弹出窗口如下,直接关闭

在这里插入图片描述

创建TestBench,操作如图所示

在这里插入图片描述

创建激励文件,输入文件名

在这里插入图片描述

创建完成

在这里插入图片描述

双击打开,输入激励代码

 

如图所示

在这里插入图片描述

开始进行仿真,操作如下

在这里插入图片描述

仿真操作,如图

在这里插入图片描述

调整波形,进行观察

在这里插入图片描述

仿真波形如图

在这里插入图片描述

关闭仿真

在这里插入图片描述

点击OK

在这里插入图片描述

创建floatMult16文件,如图

在这里插入图片描述

双击打开,输入如下代码

 

如图所示

在这里插入图片描述

将floatMult16设置为顶层

在这里插入图片描述

关闭上次的分析文件

在这里插入图片描述

对设计进行分析,操作如图

在这里插入图片描述

分析后的设计,Vivado自动生成原理图,如图

在这里插入图片描述

对设计进行综合,操作如图

在这里插入图片描述

创建TestBench,操作如图所示

在这里插入图片描述

双击打开,输入激励代码

 

如图所示

在这里插入图片描述

将tb_floatMult16设置为顶层

在这里插入图片描述

开始进行仿真,操作如下:

在这里插入图片描述

添加仿真对象,操作如图

在这里插入图片描述

开始仿真,如图

在这里插入图片描述

仿真波形,如图

在这里插入图片描述

创建processingElement16文件,如图

在这里插入图片描述

双击打开,输入如下代码

 

如图所示

在这里插入图片描述

关闭上次的分析文件

在这里插入图片描述

将processingElement16设置为顶层

在这里插入图片描述

对设计进行分析,操作如图

在这里插入图片描述

分析后的设计,Vivado自动生成原理图,如图

在这里插入图片描述

对设计进行综合,操作如图

在这里插入图片描述

创建TestBench,操作如图所示

在这里插入图片描述

双击打开,输入激励代码

 

如图所示

在这里插入图片描述

将tb_processingElement16设置为顶层

在这里插入图片描述

开始进行仿真,操作如下:

在这里插入图片描述

开始仿真,如图

在这里插入图片描述

仿真波形,如图

在这里插入图片描述

创建convUnit文件,如图

在这里插入图片描述

双击打开,输入如下代码

 

如图所示

在这里插入图片描述

将convUnit设置为顶层

在这里插入图片描述

关闭上次的分析文件

在这里插入图片描述

对设计进行分析,操作如图

在这里插入图片描述

分析后的设计,Vivado自动生成原理图,如图

在这里插入图片描述

对设计进行综合,操作如图

在这里插入图片描述

创建TestBench,操作如图所示

在这里插入图片描述

双击打开,输入激励代码

 

如图所示

在这里插入图片描述

将tb_convUnit设置为顶层

在这里插入图片描述

开始进行仿真,操作如下:

在这里插入图片描述

开始仿真,如图

在这里插入图片描述

仿真波形,如图

在这里插入图片描述

创建convLayerSingle工程文件,如图

在这里插入图片描述

双击打开,输入如下代码

 

如图所示

在这里插入图片描述

继续创建RFselector文件

在这里插入图片描述

双击打开,输入如下代码

 

如图所示

在这里插入图片描述

将convLayerSingle设置为顶层

在这里插入图片描述

关闭上次的分析文件

在这里插入图片描述

对设计进行分析,操作如图

在这里插入图片描述

分析后的设计,Vivado自动生成原理图,如图

在这里插入图片描述

对设计进行综合,操作如图

在这里插入图片描述

创建TestBench,文件名为tb_convLayerSingle,如图所示

在这里插入图片描述

双击打开,输入激励代码

 

如图所示

在这里插入图片描述

将tb_convLayerSingle设置为顶层

在这里插入图片描述

开始进行仿真,操作如下:

在这里插入图片描述

开始仿真,如图

在这里插入图片描述

仿真波形如图所示

在这里插入图片描述

创建convLayerMulti文件,如图

在这里插入图片描述

双击打开,输入如下代码

 

如图所示

在这里插入图片描述

将convLayerMulti设置为顶层

在这里插入图片描述

关闭上次的分析文件

在这里插入图片描述
对设计进行分析,操作如图

在这里插入图片描述
分析后的设计,Vivado自动生成原理图,如图

在这里插入图片描述
对设计进行综合,操作如图

在这里插入图片描述

创建TestBench,操作如图所示

在这里插入图片描述

双击打开,输入激励代码

 

如图所示

在这里插入图片描述
开始进行仿真,操作如下:

在这里插入图片描述
开始仿真,如图

在这里插入图片描述

创建integrationConv文件,如图

在这里插入图片描述
双击打开,输入如下代码

 

如图所示

在这里插入图片描述

将integrationConv设置为顶层

在这里插入图片描述
关闭上次的分析文件

在这里插入图片描述
对设计进行分析,操作如图

在这里插入图片描述
分析后的设计,Vivado自动生成原理图,如图

在这里插入图片描述

对设计进行综合,操作如图

在这里插入图片描述

在这里插入图片描述

希望本文对大家有帮助,上文若有不妥之处,欢迎指正

分享决定高度,学习拉开差距

    以上就是本篇文章【一起学习用Verilog在FPGA上实现CNN----(二)卷积层设计】的全部内容了,欢迎阅览 ! 文章地址:http://www.razcy.com/news/3191.html 
     资讯      企业新闻      行情      企业黄页      同类资讯      首页      网站地图      返回首页 月落星辰移动站 http://m.razcy.com/ , 查看更多   

点击拨打: