16. 用DSP块或者逻辑资源实现乘法器
Altera提供3种利用DSP块或者逻辑资源的QuartusII Megafunction来实现不同的乘法(multiply)、
乘累加(multiply-accumulate)和乘加(multiply-add)函数。
- lpm_mult Megafunction只实现乘法功能。
- altmult_add Megafunction可以实现乘法或者乘加功能。
- altmult_accum Megafunction只能实现乘累加功能。
- 7. 硬件乘法器
StratixII、Stratix和StratixGX器件中的硬件乘法器由DSP块和逻辑资源联合实现,而CycloneII器
件中的硬件乘法器则由嵌入式乘法器和逻辑资源联合实现。硬件乘法器可以提高StratixII、Stratix、
StratixGX和CycloneII器件中的DSP块和嵌入式乘法器的利用率。StratixII、Stratix和StratixGX
中的DSP块支持36X36、18X18和9X9的乘法器,CycloneII中的嵌入式乘法器支持18X18和9X9操作。
有时候为了实现不同宽度的乘法,DSP块(或者嵌入式乘法器)可能只会被部份利用。例如一个12X9的
乘法,必须用2个9X9的DSP块(或者嵌入式乘法器)来实现,因为12位的输入超出了单个9X9 DSP
块(或者嵌入式乘法器)的最大输入要求。实现12X9乘法的时候,一个9X9 DSP块(或者嵌入式乘法器)
被完全利用,而另一个9X9 DSP块(或者嵌入式乘法器)只是部份利用而已。为了节省DSP块(或者嵌入
式乘法器),可以用器件中剩余的逻辑资源代替只被部份利用的DSP块(或者嵌入式乘法器)。这种方法
在一个需要大量DSP块(或者嵌入式乘法器)且有足够多的剩余逻辑资源的设计中非常有用。
为了实现12X9乘法,将12位输入分开,分解成较小的可以在DSP块(或者嵌入式乘法器)和逻辑资源中实现
的乘数,部份积。为了最大限度地利用DSP块(或者嵌入式乘法器),将12位输入分成两部份:9位 乘法在
DSP块(或者嵌入式乘法器)中实现;3位乘在逻辑资源中实现。如果9位是12位数的最低位的时候,那它就
是一个无符号数值,而高3位就是一个有符号数值。反之亦然。
选择3位块的截取位置,到底从高位截取还是低位截取,此时一定要知道有符号乘法比无符号乘法更适合于
在ALM或者LE中实现。如果9位块输入是无符号数值,这时3位块最好从12位输入的高位(MSB)中截取,这
样ALM或者LE乘法器执行的就是有符号乘法。如果9位块输入是有符号数,则3位块可以是12位输入的高
位(MSB)或者低位(LSB)截取的,因为这时候不管从那里截取在ALM或者LE中执行的都是有符号乘法。
图23显示了12X9硬件乘法器的分解。
基于上图所示的分解,可以用3个主要的模块来建立一个硬件乘法器的电路:
- DSP块(或者嵌入式乘法器- 用lpm_mult或者altmult_addMegafunction建立。
- 基于ALM或者LE的乘法器- 用lpm_mult或者altmult_addMegafunction建立。
- End-stage加法器- 用lpm_add_subMegafunction建立。
DSP块(或者嵌入式乘法器)中乘法用9位输入乘以12位输入的低9位块,而基于ALM或者LE的乘法器中用9位
输入乘以12位输入的高3位块。两个乘法器输出的结果就是这个分解的部份积。部份积的结果在end-stage加法
器中被累加之前被加上权位,该权位和加法可以恢复出部份积的位置信息,以确保得到正确的结果。如图23所示,
9X3乘法的部份积通过左移9位来实现加权,12位的end-stage加法器将9X3乘法器的12位结果和9X9乘法器的
高9位的结果累加,并加上符号位。图24显示了12X9硬件乘法器的电路图。
图25显示了图24中电路的仿真结果。
表34和35分别显示了用StratixII和Stratix来实现图24所示的12X9硬件乘法器电路的结果。
图24中的例子适合于单DSP块(或者嵌入式乘法器)的一个输入乘数的位宽超过9位。当两个乘数都
超过9位的时候,如一个12X12的乘法器,乘法必须被分解成3个部份积而不再是2个。12位输入必须
分块,从而在用逻辑资源来实现有符号乘法的时候最大化地利用9X9DSP块(或者嵌入式乘法器)以及
尽可能地提高其利用率。于是,两个输入均被分成一个3位 MSB块和一个9位 LSB块。图26显示
了12X12乘法器的分解。
这样现在就可以从上面的分解图中萃取出该硬件乘法器的电路,该电路主要包括5个部份:
- 一个DSP块乘法器(或者嵌入式乘法器)-用lpm_mult或者altmult_add Megafunction建立。
- 两个基于ALM或者LE乘法器-用lpm_mult或者altmult_add Megafunction建立。
- 两个加法器-用lpm_add_sub Megafunction建立。
在DSP块(嵌入式乘法器)乘法器中使两个12位输入的9位 LSB块相乘;在第一个基于ALM或者LE乘法器
中使一个12位输入的9位 LSB块与另一个12位输入的3位 MSB块相乘;另一个基于ALM或者LE乘法器中
使一个12位输入的3位 MSB块与另一个输入的整个12位相乘。如此分解相乘得到三个部份积。在最终结
果产生之前将这些部份积通过两级加法乘加求和(用到两个加法器)。图27显示了最终的12X12硬件乘
法器中的两级加法树。
图28显示了图27所示的例子电路的仿真结果。
表36和37分别显示了用StratixII和Stratix来实现图27所示的12X12硬件乘法器电路的结果。
- 8. 结论
StratixII、Stratix和StratixGX的DSP块以及CycloneII器件内的嵌入式乘法器可以用来实现DSP应用。
如果当你的设计需要的乘法器超出DSP块和嵌入式乘法器所能提供的数目的时候,可以利用StratixII、
Stratix和StratixGX中的TriMatrix(M512和M4K RAM块)及CycloneII和Cyclone中的M4K获得更多
的乘法器。例如:当利用软乘法器的时候,可以增加Stratix器件EP1S80中的16X16乘法器个数多达表
14中所显示数量的7倍。另一个例子是,全变量软乘法器是实现较小的变系数乘法器的理想选择。其它
模式的软乘法更适合于系数不频繁更新的场合,其应用效率更高。硬件乘法器可以在使用DSP块或者嵌
入式乘法器与ALM或者基于LE之间平衡,这样可以使StratixII、Stratix和StratixGX中的DSP块以及
CycloneII中的嵌入式乘法器得到更高效利用