网络模型量化和卷积网络的定点化
64位双精度浮点数到16位半精度浮点数的量化。
确定量化位数,保证量化后的的数据不会比原有数据失真太多。然后确定浮点数包含的位数,即量化精度。量化后的整数范围不能比原有数据小,尽可能提高浮点数所能表示的精度。
16位浮点数相比64位双精度浮点数,减小了3/4的存储量。
定点数精度的选取是算法性能与资源消耗之间的折衷。使用16-bit的定点数。
定点数的Q值,Q值表示定点数的位置。S5.10。 小数部分五位。采用Q10满足精度。
输出32位数据裁剪成,为了节省资源,将输出32bit数据裁剪成21bit有符号数,将定点化转化为S8.12。 将16bit有符号定点数扩展为21bit有符号定点数S8.12。 存入缓冲区进行累加运算。完成累加后,转换为16bit定点数。
控制通路和数据缓存通路。
PS端负责网络整体控制,数据传输和缓存,SD卡数据加载。 VDMA通过先参数后特征数据的方式,将参数和特征数据传送给FPGA进行运算。运算完的特征数再次缓存到DDR3,然后将下一层的参数和一层运算完成的特征数据再次传输到FPGA端。
PS DDR PL
PL端控制模块
DDR的数据访问,通过VDMA实现DDR和PL之间的高速数据搬运。通过ZYNQ的AXI HP接口与DDR进行通信,并将数据转换为AXI-stream类型供外设使用。
PL端控制模块解析从PS侧发送来的控制信息特征图数量大小等。生成控制字给数据模块。
DDR存储 数据和参数
输入数据缓存分三类,一类存储bias,一类存储权重。第三类存储特征图数据。 缓存输入64位位AXI-HP总线的位宽,16位数每个像素的宽度。
SD卡存储着CNN网络训练得到的权重值和偏置值,CNN加速器初始化时,一次将权重和偏置写入外部存储器DDR3中。输入特征可以存储在SD卡作为测试数据。PS端通过DDR3将权重和偏置和特征加载给PL,PL端进行各层的硬件加速,计算完毕,将各层运算结果输出到DDR3中,直到最后一层计算完毕,输出最终运算结果。
总结
本文中,参数传递和运算结果缓存数据量大且传输数据分散,使用AXI-strea协议。FPGA和arm的控制信号传递只占用很少位宽,所以使用AXI4-Lite协议。
PS端负责网络整体控制,数据传输和缓存,SD卡数据加载。 VDMA通过先参数后特征数据的方式,将参数和特征数据传送给FPGA进行运算。运算完的特征数再次缓存到DDR3,然后将下一层的参数和一层运算完成的特征数据再次传输到FPGA端。
VDMA传输大批量参数和特征数据。 GPIO用于传输控制信号。GPIO IP core,ARM端可以直接调用GPIO的函数即可往PL端传输控制寄存器,用于初始化同步,数据传输握手,运算起始Flag信号。
VDMA传输位宽64bit,导致PE模块并行度最大为4。
ddr的数据访问,通过VDMA实现DDR和PL之间的高速数据搬运。通过ZYNQ的AXI HP接口与DDR进行通信,并将数据转换为AXI-stream类型供外设使用。
PL端控制模块解析从PS侧发送来的控制信息特征图数量大小等。生成控制字给数据模块。
输入数据缓存分三类,一类存储bias,一类存储权重。第三类存储特征图数据。 缓存输入64位位AXI-HP总线的位宽,16位数每个像素的宽度。
图像预处理模块PL端实现
对OV5640输入,图像预处理模块完成灰度化 ,三个通道加权平均。
OV5640输入数据格式为RGB565 -灰度化后 -AXIstream - 通过VDMA存储到DDR中。
输入640 - 320. 等间隔采样法实现图像的放大和缩小,等间隔采样其实就是在原图中每间隔一定的距离取像素点放到输出图像上。 这部分在PL端实现。预处理模块。
ZYNQ从CMOS摄像头采集图像数据,经过预处理模块。并写入DDR3内存,DDR3数据写入模块再内存建立三帧图像数据缓冲,获取正在写入DDR3的帧数标志,读取上一帧的图像数据,经预处理后图像缩放为32x32. 经过CNN硬件加速器得到分类后的结果,与原有数据进行叠加显示。
验证
本文再prcharm开发环境下训练,使用keras框架。模型训练和测试都使用的mnist数据集。 硬件实现基于Xilinx artix7 ZYNQ 7020
验证: FPGA验证xilinx vivado
1 获取模型结构和数据的。存储数据的txt文件。
2 使用modelsim进行功能仿真和时序仿真,生成bit流文件。
3 将bit流文件下载到fpga中,构建真正的硬件电路,并进行板级验证。
输入为图片的数据txt文件。
数码管输出结果3.在数码管显示类别。
将权重初始化到DDR中。 将模型参数转化为COE格式,使用matlab将权重转为COE格式文件,并初始化到片上DDR中。
modelsim仿真:
仿真阶段通过modelsim直接读取数据。
输入直接读取txt。
时间大概为80微妙,准确度94%。
时钟频率和信号处理 上版测试
将权重初始化到片上DDR中。 将模型参数转化为COE格式,使用matlab将权重转为COE格式文件,并初始化到片上DDR中。
单张图片: 计算时间80微妙 准确度91%。
OV5640采集图像数据为90fps 640 480(双线性插值做预处理PL端),每帧采集时间约为11.11ms。
OV5640,输入时钟频率为100MHZ,分频后输出时钟频率scl为200khz。满足sccb时序要求。
PL端有两个时钟域,DDR的访问时钟域150MHZ.
控制模块和运算模块时钟域 100MHZ.
最终输出结果,通过数码管显示类别。比较10个类别的比例。
跨时钟域处理:
两个时钟之间控制信号跨越通过同步模块实现,数据信号的跨越通过异步fifo。
PL端控制模块解析从PS侧发送来的控制信息特征图数量大小等。生成控制字给数据模块。