如何利用xilinx器件中LUT的结构特征设计乘法器呢?

卷积占据了cnn网络中绝大部分运算,进行乘法运算通常都是使用fpga中的dsp,这样算力就受到了器件中dsp资源的限制。比如在zynq7000器件中,dsp资源就较少,神经网络的性能就无法得到提升。利用xilinx器件中lut的结构特征,设计出的乘法器不但能灵活适应数据位宽,而且能最大限度降低lut资源使用。
01
xilinx ultrascale器件lut结构
在这里简要介绍一下ultrascale系列器件中的lut结构,有助于后边对乘法器设计思路的理解。clb(configuratble logic block)是主要的资源模块,其包含了8个lut,16个寄存器,carry逻辑,以及多路选通器等。其中lut可以用作6输入1输出,或者两个5输入lut,但是这两个lut公用输入,具有不同输出。每个lut输出可以连接到寄存器或者锁存器,或者从clb输出。lut可以用于64x1和32x2的分布式ram,一个clb内最大可以支持512x1大小的ram。ram的读写地址和输入的读写数据是共享的,数据通道可以使用x和i接口。lut还可以配置用于4:1选通器,clb最大能够支持到32:1的选通器。clb中的carry逻辑含有异或门和产生进位的门,用于生成进位数据。
图1.1 lut结构
lut还可以被动态配置成32bit移位寄存器,这个功能在乘法器设计中可以用于改变乘法器的乘数和被乘数。在写入lut数据的时候,每个时钟周期从d接口进入数据,依次写入32bit数据。读数据的时候,可以通过地址来定位任何32bit中的数据。这样就可以配置成任何小于32bit的移位寄存器。移位输出q31可以进入下一级lut用于串联产生更大移位寄存器。在一个clb中最大可以串联产生256bit移位寄存器。
图1.2 移位寄存器配置
02
lut乘法器原理
首先假设我们处理整数乘法,小数乘法也可以用这样的方法。基本思想就是将m bit大小的数据进行分割表示:
其中0<=di<2^q。乘以一个常数k:
这样就将两个数据乘法分解成低bit数据乘法,结果是一个常数k和di相乘,然后再进行移位求和。m bit数据分解后的低bit数据位宽通常都适配lut输入宽度,这样能最大利用lut资源。现在乘法只有k*di,由于bit位宽较小,这部分可以用lut查找表的形式来。预先将0k到(2^q-1)k的数据存储到lut中,然后通过di来选择对应的数据。如果是负数乘法,那么数据使用补码表示,那么lut中存储的数据是从-2^(q-1)k到(2^(q-1)-1)k。针对以上介绍的ultrascale器件的lut6,q可以选择为5。但是在本论文中使用的是lut4器件,其只有4输入,因此选择了q=3,为什么没有选择4呢?另外1bit是为了用于半加器的实现。
03
基本结构
实现上述累加的方法有很多种,论文中采用了进位链加法器。图2.1中是m bit和n bit数据乘法,每个e结构计算di*k,并且和上一个结构求和,输出的低3bit直接作为最终结果,而n bit传输到下一级进行计算。q=3的计算单元e有[m/3]个。k*di是有n+3bit的查找表实现的。查找表的结果由di选择,然后再通过一个求和器和之前数据求和。这是一个最基本的结构,论文又针对这个结构做了优化,用一个lut同时实现了一个查找表和半加器。具体来讲,其中3bit输入用于di,还有1bit用于上一次输出,lut中存放数据是di*k和上一次结果第j bit的半加结果,实际上是第j bit数据lut中结果的异或。而进位数据由clb中相应的carry逻辑来计算。相比于粗暴的进行数据求和,这样精确的来控制lut能够大大节省资源。
图2.1 基本结构
图2.2 lut实现乘法和半加,外围carry逻辑实现进位
04
动态配置lut内容
xilinx的lut结构允许在运行过程中改变lut中的内容,这样的乘法器就能改变被乘数据k。这可以实现在神经网络计算中需要更新权重参数。论文中使用的是lut4,所以一个lut可以被配置成16bit移位寄存器。通过这16bit寄存器可以来配置lut中的内容,每个时钟周期更新1bit数据,16个时钟周期可以完成一个lut中数据更新。是否进行lut内容更新通过ce使能信号控制。
如何产生lut中数据的值呢?如果上一次输出数据对应bit为0,那么lut中就存放0*k到7*k的值,如果上一次对应bit为1,那么存放值为对以上数据取反。图4.1表示了获得lut中内容的电路图。首先数据被初始化为0*k,下一次对应着求和进位为1的情况,取反,然后再加k得到1*k的值,这样每隔两个时钟周期就得到下一个乘法的数据值,依次对lut进行更新。上述中针对的是正整数,如果对于负数乘法更新,可以在上述求整数乘法的电路基础上做一下改进,如图4.2。当最高位为0的时候,输出结果就是之前求得的乘法结果。如果最高位是1,那么负数的补码表示是乘法的原码结果减去最高位数值。
图4.1 lut中内容更新电路图
图4.2 负数乘法结果更新电路
05
结果分析
最后我们来看看这种乘法器的实现效果,图5.1表示对多级进位不适用pipeline结构的时钟频率随着被乘数k位宽变化,可以看到随着级数e的增加,频率降低很多,这主要是进位链边长导致。而随着k位宽增加,频率也有降低,这主要是因为实现di*k乘法的lut资源增加导致。
图5.1 没有pipeline下频率mhz
图5.2是不同乘法位宽下的使用slice数量。论文中考虑了两种极端情况,一种是完全pipeline下,即每级计算单元都经过寄存器,另外一种是完全没有pipeline,所有级e都是串联。
图5.2 slice资源
结论
上述通过lut来设计乘法器的方法,可以应用于cnn中的卷积运算当中,因为权重可以被当做被乘数,用于lut内容的配置,在更换权重时,可以对lut内容更新,这样就能避免了dsp资源的限制,不失为一种增加算力的方法。


一位成就系统工程师的职业生涯
“一体化”模式与钢铁制造业数字化转型
Intel:ARM架构的SoC FPGA将继续更新,IA架构的未来也会有!
常用信号的分类与观察
英创信息技术EM9380多路任意脉冲发生器及应用
如何利用xilinx器件中LUT的结构特征设计乘法器呢?
爱特公司宣布其多种FPGA产品现可搭配使用加密内核,Acte
主板维修入门教程:电路的基本概念
智能制造是什么 智能制造是干什么的
近红外技术备受欢迎 人脸识别迈入消费级领域
交流负反馈电路原理图
基于Qtopia的嵌入式九宫格方式的中文输入法设计
实体商家会受到5G时代的冲击吗
为什么说 GaN 是 5G 的超级“动力”
瑞迅科技触控一体机在茶咖商用设备上的应用解决方案
三星S7/S7 edge有三种方式来更新Android 7.0
中国移动推出切片分组网络SPN技术已具备规模试商用条件
一款可提高电源效率的负端同步整流芯片U7710
嵌入式微处理器对电源管理的支持
人脸识别应用或迎来井喷期 应用场景会越来越广泛