继第一篇卷积神经网络博客,这里继续更新后文。
3 数字模块实现方案
3.1 总体模块
总体模块不做过多说明,详细请看各底层子模块的介绍。
3.1.1 接口定义
3.2 乘法器子模块
3.2.1 模块功能
实现两个8位有符号数之间的乘法,并输出一个16位的数据。对输出结果不进行截取或饱和处理,保证数据的完备性。
3.2.2 接口定义
3.2.3 实现方案
本乘法器采用类似booth乘法器的算法,并在其基础上作加速处理。
1.输入被乘数A和乘数B,并存储在相应的寄存器中,同时声明16位的P空间;
2.将乘数A直接存入P空间;
3.读取乘数B的最低两位,对被乘数A执行相关的操作,并将其存入P空间,相关操作如下表;
4.将乘数B右移两位,并重复步骤2,总共重复n/2次(n位乘数B的位宽);
5.执行完n/2次后,P空间中的数据即为输出结果。
(表中P指的是P空间中数据的值。)
3.3 weight_manage子模块
3.3.1 模块功能
把从TOP.v接收到的weight存储器进行格式重排列,排列成从低到高,每9个为一个输出通道对应的3x3卷积核,并将新格式的weight存储器输出。
3.3.2 接口定义
3.4 加法器子模块
3.4.1 模块功能
本设计加法器包括3种:2输入加法器、64输入加法器、9输入加法器。分别对应到输出通道计算中的偏置相加,输入64通道的卷积输出结果的相加和每个卷积运算部分的9数相加(3×3模板中对应元素相乘之后得到9数相加),其中2输入加法器和9输入加法器是底层加法器模块,9输入加法器用于64输入加法器的构建以及卷积计算中。
之所以没有将加法器的输入端口数量进行模块化设计,
原因有二:
其一是端口数量的模块化在代码建模时不好设计;
其二是本设计中实涉及到的最底层加法器模块只有2输入和9输入两种。64输入模块的实现实际上是通过将9输入加法器例化8次(每个module中将其中一个输入置0)而得到。实际上,2输入与9输入加法器的最基本实现思路是完全一致的,故而以下以2输入加法器为例进行说明。