个人翻译了Altera的AN306文档,英文水平有限,错漏难免。
1. 简介<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
StratixII、Stratix、StratixGX、CycloneII和Cyclone系列器件中都有专用的结构来实现高效的乘法器。StratixII、Stratix、StratixGX可以用DSP块来实现高性能的乘累加器(MACs)。DSP块的数据运算速率可达300MSPS(million samples per second)以上,这样,StratixII、Stratix、StratixGX成为了理想的高速DSP应用选择。CyclonII可以用内嵌的乘法器块来实现DSP。
除了专用的DSP块,设计者还可以用StratixII、Stratix、StratixGX的TriMatrix存储器块来实现高性能的、可变深度宽度的软乘法器。例如,设计者可以用TriMatrix存储器块作为查找表来存放事先计算好的乘法运算结果,即输入数据和系数之乘积。CycloneII和Cyclone可以利用其M4K存储器块来实现类似的高性能、低成本的和大量的DSP应用。
StratixII、Stratix、StratixGX、CycloneII和Cyclone能实现的乘法器的种类见表1:
表1:支持的乘法器类型
注:
(1)、Cyclone只能用逻辑资源来实现这些乘法器。
表2到表4显示了在StratixII、Stratix、StratixGX中可以得到由DSP块和软乘法器实现的乘法器总数目,表5显示了在CycloneII器件中由嵌入式乘法器和软乘法器组成的总的乘法器的数目,表6显示的是Cyclone器件中总的软乘法器的数目。
表2:StratixII器件中乘法器数目
注:
(1)、软乘法器以乘积和的模式实现。RAM块配置成18位数据宽度,系数的和最高可到18位。
(2)、圆括号内显示的是增量因子,该因子由包括软乘法器在内的总乘法器个数除以DSP块可实现的18X18乘法器个数得到。
(3)、乘法器的总数会因为乘法器的模式不同而不同。
表3:Stratix器件中乘法器数目
注:
(1)、软乘法器以乘积和的模式实现。RAM块配置成18位数据宽度,系数的和最高可到18位。
(2)、圆括号内显示的是增量因子,该因子由包括软乘法器在内的总乘法器个数除以DSP块可实现的18X18乘法器个数得到。
(3)、乘法器的总数会因为乘法器的模式不同而不同。
表4:StratixGX器件中乘法器数目
注:
(1)、软乘法器以乘积和的模式实现。RAM块配置成18位数据宽度,系数的和最高可到18位。
(2)、圆括号内显示的是增量因子,该因子由包括软乘法器在内的总乘法器个数除以DSP块可实现的18X18乘法器个数得到。
(3)、乘法器的总数会因为乘法器的模式不同而不同。
表5:CycloneII器件中乘法器数目
注:
(1)、软乘法器以乘积和的模式实现。RAM块配置成18位数据宽度,系数的和最高可到18位。
(2)、圆括号内显示的是增量因子,该因子由包括软乘法器在内的总乘法器个数除以DSP块可实现的18X18乘法器个数得到。
(3)、乘法器的总数会因为乘法器的模式不同而不同。
表6:Cyclone器件中的乘法器数目
注:
(1)、圆括号内显示的是增量因子,该因子由包括软乘法器在内的总乘法器个数除以DSP块可实现的18X18乘法器个数得到。
(2)、乘法器的总数会因为乘法器的模式不同而不同。
本应用手册,将向你描述专用存储器和DSP块、所支持的乘法器类型以及各类乘法器实现的一个实例。
2. 存储器块
StratixII、Stratix、StratixGX的TriMatrix存储器块包括三种类型的RAM块:M512、M4K和M-RAM。M512和M4K RAM块的最大存储器宽度分别是18位和36位,最大的运行速度可以达到300Mhz左右,非常适合实现软乘法器。
表7到9分别显示了StratixII、Stratix、StratixGX器件中TriMatrix存储器的数量。
表7:StratixII中的TriMatrix存储器数量
表8:Stratix中的TriMatrix存储器数量
表9:StratixGX中的TriMatrix存储器数量
CycloneII和Cyclone的M4K可以有最大到36位的存储器宽度,其最大运行速度达到250Mhz(Cyclone的最大运行速度可到200Mhz)。表10和表11分别显示了CycloneII和Cyclone系列各个器件中M4K的数量。
表10:CycloneII中M4K存储器块的数量
表11:Cyclone中M4K存储器数量
表12显示的是在StratixII、Stratix、StratixGX、CycloneII和Cyclone中M512、M4K和M-RAM的配置。
表12:M512、M4K和M-RAM的配置
3. DSP块
在StratixII、Stratix和StratixGX器件中有专用的DSP块可以执行高速的乘法器功能,表13到15分别显示了StratixII、Stratix和StratixGX器件中DSP块的个数。
表13:StratixII中的DSP块个数
注:
(1)、表中显示了每个器件可分别实现9X9、18X18或36X36的乘法器的个数,每个器件可实现的乘法器总数并不是这三者之和。
表14:Stratix中DSP块个数
注:
(1)、表中显示了每个器件可分别实现9X9、18X18或36X36的乘法器的个数,每个器件可实现的乘法器总数并不是这三者之和。
表15:StratixGX中DSP块个数
注:
(1)、表中显示了每个器件可分别实现9X9、18X18或36X36的乘法器的个数,每个器件可实现的乘法器总数并不是这三者之和。
4. DSP算法结构
DSP富含乘法运算,为了取得更快的运算速度,需设法加速乘法运算的操作。本节将介绍通用DSP算法的数学理论和算法实现。
1) 乘法(Multiplacation)
一般DSP算法的基础是一个乘数乘以一个被乘数。在乘法操作中乘数的每一位乘以被乘数的每一位。每次相乘的部份积依据其权位进行累加,这里权位指示了一个二进制位相对于其它位的位置。例如,如果二进制位4到7的部份积加上二进制位0到3的部份积的时候,位4到7的部份积要偏移相对于其权位以后再加前面的部份积。图1显示了一个简单2X2乘法,其中乘数是a<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1a0,被乘数是b1b0。
图1:两个2位二进制数乘法
2) 分布式算法(DA)
分布式算法是通过基于LUTs分布式操作来实现乘法的一种方法。分布式算法与传统算法实现乘加运算的不同在于执行部份积运算的先后顺序不同。分布式算法在实现乘加功能时,是通过各输入数据的每一对应位产生的部份积预先进行相加形成相应的部份积,然后再对各个部份积累加形成最终结果,而传统算法是等到所有乘积已经产生之后再来相加完成乘加运算的。与传统串行算法相比,分布式算法可极大地减少硬件电路地规模,提高电路地执行速度。图2是一个4路常数累加分布式算法示意图。
图2:4常量被乘数DA结构
3) 用LUT实现DA算法
图3显示了如何用LUTs来实现DA算法。用LUT实现,可以减少组合积和加法树。在图3例子中,LUT存放了所有常系数输入的各种可能组合的和。LUT输出之和在比例加法器中相加并且根据相应的权位移位输出。
图3 常系数4位 乘法器(注1)
注:
(1)、c0到c3是常系数。
图3中的LUT寻址方式和存储值适用于所有乘法操作模式。寻址方式和LUT中存储的数据依据乘法操作模式的不同而不同。
5.用存储器块实现软乘法器
可以用StratixII、Stratix和StratixGX M512或者M4K 和CycloneII和Cyclone的M4K RAM存储器块作为LUTs实现DSP应用中的乘法器。所有系数的组合会预先算好并保存在M512或者M4K中。RAM块的地址对应乘法器的一个操作数,每个地址内存放了一个唯一的计算结果,这个结果是基于要实现的乘法器的类型由输入操作数和一个已知的参数计算得到的。
StratixII、Stratix、StratixGX、CycloneII和Cyclone器件支持的5种软乘法器的类型是:
● 并行乘法器(Parallel multiplication)-每个时钟周期由多个存储器块产生一个乘法结果。该模式在高速数据应用中非常有用。
● 半并行乘法器(Semi-parallel multiplication)-每个存储器块多个时钟周期产生一个乘法器结果。该模式在最小均方值(LMS)更新和参数均衡中非常有用。
● 乘加器(Sum of multiplication)-一个存储器或者一组存储器块产生一组乘法器结果。该模式多用于FIR滤波器和DCTs。
● 混和式乘法器(Hybrid multiplication)-这是半并行模式和群式乘法器的结合和优化。改模式非常适合用于复数乘法,比如复数FFT和IIR滤波器。
● 全变量乘法器(Fully variable multiplication)-该模式适用于输入数据和参数都是变量的软乘法器。该模式很适合实现低精度乘法运算。
下面将举例说明各个模式的乘法器。
1) 并行乘法器(Parallel multiplication)
并行乘法是是指分别将输入乘数的一部份位,乘上被乘数或者系数,然后将所有的部份积相加得到结果。输入的所有位都是并行载入到RAM块的地址寄存器端口,每个时钟周期完成一次乘法。例如,一个16位的输入总线被分成两组8位(一组低8位[LSB],另一组高8位[MSB]),且同时被移位到两个RAM块的地址端口。RAM块的输出为乘数和被乘数相乘的积。图4显示了16位数据输入、10位常系数并行乘法器的分解。
图4 分解一个16位输入、10位系数并行乘法器
图5是由RAM LUT实现图4所示的并行乘法器的示意图。由于一个并行乘法器每个时钟周期允许一个新的数据输入,所以图5中的这种实现方法需要三个时钟周期(一个时钟周期用于加载输入值到RAM块的地址端口,另两个时钟周期用于流水延迟)来运算得到最终的乘法结果。每个时钟周期均可以从RAM块中得到最新的部份积,得到的这些部份积会根据其权位求和。每个部份积乘法会产生一个18位的输出,所有部份积累加后得到一个26位的输出。
图5 用M4K RAM块做LUTs来实现16位输入,10位系数的并行乘法器(1)
注:
(1)、用于增加系统性能的可选的流水寄存器。
图5显示了一个16位输入的乘法器实现,将16位的输入拆分成高低8位两块。对于有符号的输入总线,接收高8位(MSB)的M4K RAM块必须包含预先计算好的有符号系数值,因为流入M4K RAM块的高8位(MSB)被认为是有符号值。而接收低8位(LSB)的M4K RAM块则必须包含预先计算好的无符号系数值,因为流入M4K RAM块的低8位被认为是无符号数。
M4K RAM块有256X18位,所以每个M4K RAM块可存放这种系数的最大地址位数是8(2^8=256个地址)。输入总线和系数尺寸直接影响了用于实现乘法器的RAM块的数目以及其配置形式。并行乘法模式能达到最大的数据吞吐量(例如每周期允许更新一次数据值)。
可以用QuartusII Megafunction函数altmenmult来实现并行定系数乘法器。可以用MegaWizard Plug-In Manager参数化配置altmenmult来定制一个并行、定系数软乘法器。通过设定altmenmult输入和系数的位宽、RAM块的类型来选定实现一个半并行或并行模式软乘发器。图6和图7分别显示了用M4K RAM块来实现图5所示的16位输入、10位系数并行乘法器的MSB和LSB部份所需的设置,本例中乘法器的系数是一个常数值5。
图6 MSB RAM块16位输入、10位系数并行乘法器的altmemmult MegaWizard设置
图7 LSB RAM块16位输入、10位系数并行乘法器的altmemmult MegaWizard设置
sload_data信号和MegaWizard窗口右下方显示的信息指示altmemmult Megafunction实现的是半并行或者并行模式软乘法器。并行软乘法器没有sload_data信号且Megafunction每个时钟周期都可以接受一个新输入。Megafunction altmemmult只能实现较小的并行乘法器(例如:8位输入,10位系数乘法器)。更大的乘法器需要多个Megafunction altmemmult分别产生各个部份积来得到所需结果。为了得到最终的乘法结果,所有的部份积必须在Megafunction altmemmult以外的end-stage加法器中加起来。
a、定系数乘法器
图8显示了在图5中所举例子的仿真结果。本例输入为十进制数297,乘上一个常系数5。
图8 并行乘法器仿真结果
表16和表17分别显示了在StratixII和Stratix器件中实现并行常系数乘法器的结果。例中乘法器是用altmemmult Megafunction实现的。
表16 用StratixII器件实现16位输入,10位常系数并行乘法器的结果
注:
(1)、Latency是指完成单个乘法运算所需的时钟周期。
表17 用Stratix器件实现16位输入,10位常系数并行乘法器的结果
注:
(1)、Latency是指完成单个乘法运算所需的时钟周期。
b、可变系数乘法器
实现定系数乘法器的时候,可以把StratixII、Stratix、StratixGX、CycloneII和Cyclone中的存储器用作ROM。对于变系数乘法器,存储器块必须被实现为RAM块,如此方可以写入或者更新预先计算出的系数。图9显示了一个用M4K单口RAM块实现一个变系数并行乘法器的例子。用此方法,当系数更新的时候,乘法器会暂停工作。但如果用多组RAM块来存储不同的预算系数的时候,就可以使乘法器在一个时钟周期内在两组不同系数之间切换。实现这个功能的一种方法是将RAM块分区,不同区存储不同的系数,并用MSB地址位来选择哪一组系数被使用。此外使用双口RAM块,可以在一个RAM区写入或者更新系数时,同时用另一个RAM区的系数来实现乘法运算。
图9 用M4K单口RAM作LUTs来实现16位输入、10位变系数并行乘法器
注:
(1)、用于增加系统性能的可选的流水寄存器。
提醒:altmemmult兆核也可以通过在MegaWizard窗口中使能“Create ports to allow loading coefficients”选项来支持变系数并行和半并行软乘法器。
表18和表19分别显示了在StratixII和Stratix器件中实现并行变系数乘法器的结果。
表18 在StratixII器件中实现16位输入、10位变系数并行乘法器的结果
注:
(1)、Latency是指完成单个乘法运算所需的时钟周期。
表19 在Stratix器件中实现16位输入、10位变系数并行乘法器的结果
注:
(1)、Latency是指完成单个乘法运算所需的时钟周期。
2) 半并行乘法器(Semi-parallel multiplication)
半并行乘法器将输入乘数的部份位乘上被乘数或者系数,然后将每次得到的部份积移位累加后得到乘法结果。举个例子,一个16位输入总线可以被分成四组四位,四组数据被依次送到RAM块的地址端口,每个时钟送入一组,低四位先送。在每个时钟周期,RAM块依次输出每一组数据和系数相乘的结果。图10显示了是如何分解一个16位输入、14位系数来实现半并行乘法操作的。
图10 分解16位输入、14位系数的半并行乘法器
图11显示了用一个M512RAM LUT实现图10所示的半并行乘法器。实现方法是在每个时钟周期加载四位输入到RAM块,根据权位通过移位累加每个时钟周里RAM块输出的部份积,在六个时钟周期(四个时钟用于加载输入值到RAM块,两个时钟用于流水延迟)后完成一个乘法操作。每次部份积移位相加后输出会增加4位,在第四次部份积累加完成后,乘法器产生一个30位的输出。
图11 把M512 RAM块用作LUTs来实现16位输入、14位系数半并行乘法器(1)
注:
(1)、输入总线是16位宽,但是是被4位一组依次送到RAM块的。这就是为什么图中的总线位宽是4位的原因。
(2)、用于增加系统性能的可选的流水寄存器。
图11显示的是用一个M512实现16位输入被分成4组4位的例子。在本例中,对于同一个存储器块的使用,输入总线的位宽将决定输出的位宽以及乘法器的延迟。增大分组的位宽(比如实现一个大于4位位宽的分组)可以减小乘法器的延时。但这样也许会需要更多的M512块或者使用大的RAM块M4K。
也可以用QuartusII 的Megafunction altmemmult来实现半并行定系数乘法器。设计者可以通过MegaWizard Plug-in Manage窗口在自己的设计中订制生成半并行、定系数软乘法器。同样,乘法器的输入和系数的位宽以及RAM块的选择决定了altmemmult Megafunction实现的是半并行还是并行软乘法器;然而,不管实现的那一种乘法器,Megafunction都非常高效的。图12显示了实现图11所示的16位输入、14位系数的半并行乘法器所需的参数设置。本例中的系数是常数值2。
图12 用altmemmult实现16位输入、14位常系数半并行乘法器时MegaWizard的设置
sload_data信号和MegaWizard窗口右下方显示的信息指示altmemmult Megafunction实现的是半并行或者并行模式软乘法器。半并行软乘法器有sload_data信号且要多个时钟周期才能接受一次新的输入。图11种的半并行乘法器是将16位输入分成4组4位s小块。因为必须花费4个时钟周期才能将一个完整的16位输入加载到RAM块中,所以在加载新的输入之前当前的输入必须稳定地保持4个时钟周期的时间。sload_data信号上出现一个时钟周期的高电平表示可以开始加载新输入数据块。
图13显示了图11中例子的仿真结果。例中,输入是一个十进制的数10,系数是一个常数2。
图13半并行模式的仿真结果
表20和表21分别给出了在StratixII和Stratix器件中实现半并行定系数乘法器的结果。
表20 在StratixII器件中实现16位输入、14位常系数半并行乘法器的结果
注:
(1)、Latency是指完成单个乘法运算所需的时钟周期。
表21 在Stratix器件中实现16位输入、14位常系数半并行乘法器结果
注:
(1)、Latency是指完成单个乘法运算所需的时钟周期。
表22和表23分别显示了在StratixII和Stratix器件中实现半并行可变系数乘法时的结果。
表22 在StratixII器件中实现16位输入、14位变系数乘法器的结果
注:
(1)、Latency是指完成单个乘法运算所需的时钟周期。
表23 在Stratix器件中实现16位输入、14位变系数乘法器的结果
注:
(1)、Latency是指完成单个乘法运算所需的时钟周期。
3) 乘加器(Sum of multiplication)
乘加模式乘法器的运算结果就是一系列输入数据(乘数)乘以一系列被乘数所产生的部份积的和。这种乘加结构易于实现MAC(乘累加)函数,乘累加运算在FIR滤波器等应用中非常常见。乘法器的每个输入数据(乘数)和一个特定的系数(或者叫被乘数)相乘得到一个乘积项,所有乘积项相加后得到最终的乘法结果。
在乘加器模式下,输入总线每个时钟周期送入一位到存储器的地址端口,低位先送。如果乘法器块有四个输入总线(分别是A、B、C和D),那么第一个时钟送入的四个输入的最低位形成一个4位的 RAM块地址。下一个时钟,送入四个输入总线的次低位形成RAM块的第二个4位地址值,依此类推。所以对于一组n位宽度的输入总线,需要n个时钟来送入运算所需要的数据。在每个时钟周期,RAM块依次输出该特定位和被乘数相乘运算的结果。
图14是用RAM LUT实现四个4位输入数据以及高达16位常系数的例子。根据不同的权位,移位累加每个时钟从RAM块得到的部份积,总共需要花费6个时钟周期(四个时钟加载输入数据到RAM块,两个时钟用于流水延时)来完成这种常系数乘法操作。部份积的每次移位累加增加一个进位位。当第四个部份积累加完成后,乘法器产生一个22位的输出。输入数据的位宽决定了乘法器的输出位宽以及延时。
图14 将M512用作LUT来实现4输入乘加器
注:
(1)、用于增加系统性能的可选的流水寄存器。
图15画出了实现图14所示乘加器的等效电路。
图15 四个乘数的乘加器的等效电路
图14中的例子是四个4位的数据输入。因为M512 RAM块的大小是32X18 位,所以每个M512 RAM块实现图中的系数时支持的最大输入位宽是5(2^5=32)。根据乘法器的输入数目、位宽,系数的数目、位宽以及需要的执行速度的不同,所需的RAM块的数目也是不一样的。图14是一个只需一个M512 RAM块的例子。
图16显示了基于图14所示的例子的仿真结果。该例子有一级可选的流水进程,输入A的值是二进制数“0001”,系数c0的值是3。
提醒:设计者可以选择减少流水的级数,不过如此会减小设计结果的Fmax。
图16乘加模式乘法器的仿真结果
表24和表25分别显示了用StratixII和Stratix器件实现图14所示的四输入、16位定系数乘加模式乘法器的结果。
表24 用StratixII实现四输入、16位定系数乘加模式乘法器的结果
注:
(1)、Latency是指完成一个完整的乘加运算所需的时钟周期
表25用Stratix实现四输入、16位定系数乘加模式乘法器的结果
注:
(1)、Latency是指完成一个完整的乘加运算所需的时钟周期
表26和表27分别显示了用StratixII和Stratix器件实现四输入、16位变系数乘加模式乘法器的结果。
表26用StratixII实现四输入、16位变系数乘加模式乘法器的结果
注:
(1)、Latency是指完成一个完整的乘加运算所需的时钟周期
表27用Stratix实现四输入、16位变系数乘加模式乘法器的结果
注:
(1)、Latency是指完成一个完整的乘加运算所需的时钟周期
可以将多个M512块和(或者)M4K块组合在一起实现更大的乘法结构,这样就可以同时运算更多的输入数据和系数的乘积。图17中的例子是用两个M512 RAM块实现八个4位输入数据、八个16位常系数的乘法器。
图17 由多个M512RAM块实现的8-系数乘法器
注:
(1)、用于增加系统性能的可选的流水寄存器。
同样也可以用M4K来实现乘法器,特别是当系数大于16位的时候。图18是用一个M4K实现七个16位输入数据乘以一个20位常系数的乘法器。M4K RAM块的128根地址线对应于七个输入数据或者唯一的系数。执行七个16X20的乘法,从M4K RAM块产生一个23位的输出。共需18个时钟周期来完成部份积的累加(16个时钟周期用于移位输入数据到RAM块的地址端口,外加2个时钟周期用来流水延迟)。每次部份积相加,结果的位数会增加一位,这样乘法器最终产生一个39位的输出结果。
图18 用一个M4K RAM块一个7-系数乘法器
注:
(1)、用于增加系统性能的可选的流水寄存器。
4) 混和式乘法器(Hybrid multiplication)
混合乘法器模式结合了半并行和乘加两种乘法器模式,它有不同的两个输入位流,并且乘以不同的系数。这种模式在象FFTs这样的有复数乘法应用中非常有用,复数信号通常包含实部和虚部两部份,所以乘法实现的时候可以分开乘以不同的系数值。每个部份产生的部份积被累加产生最终的结果。
混合乘法器模式中,每个时钟周期里从两组输入数据中依次选取相同的位数拼接起来,送到到RAM块的地址端口,低位先送。比如RAM块的地址端口只有四位时,那么从每个输入数据中依次选取2位来计算,直到输入数据的所有位都被送入RAM块地址端口。这样,一个16位输入总线共需要八个时钟周期送入到存储器。RAM块每个时钟周期的输出为特定一组输入位和系数的乘积之和。
图19显示了一个用RAM LUT实现两个16位输入,以及最高到15位的常系数的例子,两个输入分别标记为“Input I”和“Input Q”。根据权位每个时钟周期移位累加从RAM块得到的部份积,一共要11个时钟(其中八个时钟周期用于将输入数据移入到RAM块,外加三个时钟周期的流水延时)来完成乘法操作。每次部份积的移位累加会增加两位。最后一次(也就是第八次)部份积累加后,乘法器产生一个32位输出。输入数据的宽度决定了乘法器的输出位宽以及乘法器的延时。
图19 用M512RAM块作LUT来实现两输入混合模式乘法器(1)
注:
(1)、输入总线是16位s宽,但是输入数据每次是两位依次被送到RAM块的,这就是为什么图中的总线宽度是2位宽的原因。
(2)、用于增加系统性能的可选的流水寄存器。
(3)、Ci指输入I的系数。
(4)、Cq指输入Q的系数。
图19中的例子是两个16位输入数据。虽然M512 RAM块可以配置成32X18位,能有5位地址(2^5=32),但每次每个输入要同时送入相同的位数,故最多一次接收两位(总共是四位)。这个例子中,如果使用相同的存储器块,输入的位宽决定着乘法器的输出位宽以及乘法器的延时。增加M512块的使用数目或者换成使用更大的存储器块比如M4K RAM,就可以有效减小乘法器的延时,并且支持更大的系数位宽。
图20显示的是基于图19种例子的仿真结果。例子中有可选的流水级,两个乘数Iuput_I和Input_Q的值分别是300和55,系数Ci和Cq的值分别是10和25。这样,乘法的结果是:
(Input_I X Ci)+ (Input_Q X Cq) = (300 X 10) + (55 X 25) = 4375
提醒:设计者可以选择减少流水的级数,不过如此会减小设计结果的Fmax。
图20 混合乘法器的仿真结果
表28和表29显示了分别用StratixII和Stratix器件实现两个16位输入、15位常系数混合乘法器例子的结果。
表28 用StratixII器件实现双输入、15位常系数混合乘法器的结果
注:
(1)、Latency是指完成一个乘法运算所需的时钟周期。
表29 用Stratix器件实现双输入、15位常系数混合乘法器的结果
注:
(1)、Latency是指完成一个乘加运算所需的时钟周期。
表30和表31显示了分别用StratixII和Stratix器件实现15位变系数混合乘法器例子的结果。
表30 用StratixII器件实现双输入、15位变系数混合乘法器的结果
注:
(1)、Latency是指完成一个乘法运算所需的时钟周期。
表31 用Stratix器件实现双输入、15位变系数混合乘法器的结果
注:
(1)、Latency是指完成一个乘法运算所需的时钟周期。
5) 全变量乘法器(Fully variable multiplication)
所谓全变量乘法器模式,是指输入和系数在每个时钟周期都会变化的软乘法器。保存在RAM块中部份积是根据以下方程的代数表达式计算出来的:
(a+b)2-(a-b)2 = a2+2ab+b2-(a2-2ab+b2)
= 4ab
于是
ab = ((a+b)2/4)-((a-b)2/4)
这里a和b都是乘法器的可变输入。
图21显示的是用该等式计算,由RAM LUT实现的全变量乘法器。需要两个独立的RAM块来分别存储预先计算好的(a+b)2/4和(a-b)2/4值。前一个RAM块输入口的(a+b)以及后一个RAM块输入口的(a-b)均在前一级预先由逻辑资源计算出。乘法器的最终结果是由(a+b)RAM块结果减去(a-b)RAM块结果所得到的。全变量乘法器可以每个时钟接受一个新的输入值,一共需要三个时钟周期得到最终的乘法结果。
图21 用M4K RAM块作LUTs实现8位全变量乘法器
注:
(1)、用于增加系统性能的可选的流水寄存器。
图21中的例子实现的是两个8位数据输入。8位输入产生16位输出,需要9位寻址RAM块内的部份积。于是,对于每个部份积需要两个配置成256X16(2^9=512)模式的M4K RAM块。该乘法器模式下,输入数据的大小直接影响所需RAM块的多少。
图22显示了图21所示例子的仿真结果。
图22 全变量乘法器的仿真结果
表32和表33分别显示了用StratixII和Stratix器件实现图21所示的8位全变量乘法器例子的结果。全变量模式乘法器是一种理想的low-resolution乘法器,这种乘法器的输入和系数的位宽都不是太大。相对其他相同大小的可变软乘法器,输入和系数越大,所需的存储器资源显著增多。
表32 用StratixII器件实现8位全变量乘法器的结果
注:
(1)、Latency是指完成一个乘法运算所需的时钟周期。
表33用Stratix器件实现8位全变量乘法器的结果
注:
(1)、Latency是指完成一个乘法运算所需的时钟周期。
6. 用DSP块或者逻辑资源实现乘法器
Altera提供3种利用DSP块或者逻辑资源的QuartusII Megafunction来实现不同的乘法、乘累加和乘加函数。
● 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硬件乘法器的分解。
图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硬件乘法器的电路图。
图24 12X9硬件乘法器电路(1)
注:
(1)、用altmult_add Megafunction实现的乘法器可以允许有符号和无符号数的混和输入。
(2)、用于增加系统性能的可选的流水寄存器。
图25显示了图24中电路的仿真结果。
图25 12X9硬件乘法器的仿真结果
表34和35分别显示了用StratixII和Stratix来实现图24所示的12X9硬件乘法器电路的结果。
表34:在StratixII中实现12X9硬件乘法器的结果(1)
注:
(1)、altmult_add Megafunction可以由ALM或者LE和DSP块乘法器来实现。
(2)、这里的延时指完成一次乘法运算所需的时钟数。
表35:在Stratix中实现12X9硬件乘法器的结果(1)
注:
(1)、altmult_add Megafunction可以由ALM或者LE和DSP块乘法器来实现。
(2)、这里的延时指完成一次乘法运算所需的时钟数。
图24中的例子适合于单DSP块(或者嵌入式乘法器)的一个输入乘数的位宽超过9位。当两个乘数都超过9位的时候,如一个12X12的乘法器,乘法必须被分解成3个部份积而不再是2个。12位输入必须分块,从而在用逻辑资源来实现有符号乘法的时候最大化地利用9X9DSP块(或者嵌入式乘法器)以及尽可能地提高其利用率。于是,两个输入均被分成一个3位 MSB块和一个9位 LSB块。图26显示了12X12乘法器的分解。
图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硬件乘法器中的两级加法树。
图27 12X12硬件乘法器电路(1)
注:
(1)、用altmult_add Megafunction实现的乘法器可以允许有符号和无符号数的混和输入。
(2)、用于增加系统性能的可选的流水寄存器。
图28显示了图27所示的例子电路的仿真结果。
图28 12X12硬件乘法器的仿真结果
表36和37分别显示了用StratixII和Stratix来实现图27所示的12X12硬件乘法器电路的结果。
表35:在StratixII中实现12X12硬件乘法器的结果(1)
注:
(1)、altmult_add Megafunction可以由ALM或者LE和DSP块乘法器来实现。
(2)、这里的延时指完成一次乘法运算所需的时钟数。
表37:在Stratix中实现12X12硬件乘法器的结果(1)
注:
(1)、altmult_add Megafunction可以由ALM或者LE和DSP块乘法器来实现。
(2)、这里的延时指完成一次乘法运算所需的时钟数。
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中的嵌入式乘法器得到更高效利用
用户377235 2016-6-6 14:45
hahahahahahaha
用户593016 2015-7-20 21:51
coyoo 2014-3-26 12:11
用户1211780 2014-3-26 11:15
用户355491 2014-2-16 19:51
coyoo 2013-9-5 09:18
用户1668914 2013-9-4 22:51
用户1676793 2010-6-30 20:13