原创 FPGA中乘法器的实现

2009-2-18 13:46 20152 17 25 分类: FPGA/CPLD

个人翻译了Altera的AN306文档,英文水平有限,错漏难免。


 


 


1.     简介<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


StratixIIStratixStratixGXCycloneIICyclone系列器件中都有专用的结构来实现高效的乘法器。StratixIIStratixStratixGX可以用DSP块来实现高性能的乘累加器(MACs)。DSP块的数据运算速率可达300MSPS(million samples per second)以上,这样,StratixIIStratixStratixGX成为了理想的高速DSP应用选择。CyclonII可以用内嵌的乘法器来实现DSP


除了专用的DSP块,设计者还可以用StratixIIStratixStratixGXTriMatrix存储器块来实现高性能的、可变深度宽度的软乘法器。例如,设计者可以用TriMatrix存储器块作为查找表来存放事先计算好的乘法运算结果,即输入数据和系数之乘积CycloneIICyclone可以利用其M4K存储器块来实现类似的高性能、低成本的和大量的DSP应用。


StratixIIStratixStratixGXCycloneIICyclone能实现的乘法器的种类见表1


1:支持的乘法器类型



注:


1)、Cyclone只能用逻辑资源来实现这些乘法器。


2到表4显示StratixIIStratixStratixGX中可以得到由DSP块和软乘法器实现的乘法器总数目,表5显示了在CycloneII器件中由嵌入式乘法器和软乘法器组成的总的乘法器的数目,表6显示的是Cyclone器件中总的软乘法器的数目。


 


 


 


 


 


2StratixII器件中乘法器数目



注:


1)、软乘法器以乘积和的模式实现RAM块配置成18位数据宽度,系数的和最高18位。


2)、圆括号内显示的是增量因,该因由包括软乘法器在内的总乘法器个数除以DSP块可实现的18X18乘法器个数得到。


3)、乘法器的总数会因为乘法器的模式不同而不同。


3Stratix器件中乘法器数目



注:


1)、软乘法器以乘积和的模式实现RAM块配置成18位数据宽度,系数的和最高18位。


2)、圆括号内显示的是增量因,该因由包括软乘法器在内的总乘法器个数除以DSP块可实现的18X18乘法器个数得到。


3)、乘法器的总数会因为乘法器的模式不同而不同。


4StratixGX器件中乘法器数目



注:


1)、软乘法器以乘积和的模式实现RAM块配置成18位数据宽度,系数的和最高18位。


2)、圆括号内显示的是增量因,该因由包括软乘法器在内的总乘法器个数除以DSP块可实现的18X18乘法器个数得到。


3)、乘法器的总数会因为乘法器的模式不同而不同。


5CycloneII器件中乘法器数目



注:


1)、软乘法器以乘积和的模式实现RAM块配置成18位数据宽度,系数的和最高18位。


2)、圆括号内显示的是增量因,该因由包括软乘法器在内的总乘法器个数除以DSP块可实现的18X18乘法器个数得到。


3)、乘法器的总数会因为乘法器的模式不同而不同。


6Cyclone器件中的乘法器数目



注:


1)、圆括号内显示的是增量因,该因由包括软乘法器在内的总乘法器个数除以DSP块可实现的18X18乘法器个数得到。


2)、乘法器的总数会因为乘法器的模式不同而不同。


 


本应用手册,将你描述专用存储器和DSP块、所支持的乘法器类型以及各类乘法器实现的一个实例。


 


2.     存储器块


StratixIIStratixStratixGXTriMatrix存储器块包括三种类型的RAM块:M512M4KM-RAMM512M4K RAM块的最大存储器宽度分别是18位和36位,最大的运行速度可以达到300Mhz左右,非常适合实现软乘法器。


79分别显示了StratixIIStratixStratixGX器件中TriMatrix存储器的数量。


 


7StratixII中的TriMatrix存储器数量



 


8Stratix中的TriMatrix存储器数量



 


9StratixGX中的TriMatrix存储器数量



 


CycloneIICycloneM4K可以有最大到36位的存储器宽度,其最大运行速度达到250MhzCyclone的最大运行速度可到200Mhz)。表10和表11分别显示了CycloneIICyclone系列各个器件中M4K的数量。


10CycloneIIM4K存储器块的数量



11CycloneM4K存储器数量



 


12显示的是在StratixIIStratixStratixGXCycloneIICycloneM512M4KM-RAM的配置。


12M512M4KM-RAM的配置



 


3.     DSP


StratixIIStratixStratixGX器件中有专用的DSP块可以执行高速的乘法器功能,表1315分别显示了StratixIIStratixStratixGX器件中DSP块的个数。


 


 


 


 


 


 


13StratixII中的DSP块个数





注:


1)、表中显示了每个器件可分别实现9X918X1836X36的乘法器的个数,每个器件可实现的乘法器总数并不是这三者之和。


 


 


 


 


14StratixDSP块个数



注:


1)、表中显示了每个器件可分别实现9X918X1836X36的乘法器的个数,每个器件可实现的乘法器总数并不是这三者之和。


 


15StratixGXDSP块个数



注:


1)、表中显示了每个器件可分别实现9X918X1836X36的乘法器的个数,每个器件可实现的乘法器总数并不是这三者之和。


 


4.     DSP算法结构


DSP富含乘法运算,为了取得更快的运算速度,需设法加速乘法运算的操作。本节将介绍通用DSP算法的数学理论和算法实现


1)      乘法(Multiplacation


一般DSP算法的基础是一个乘数乘以一个被乘数。在乘法操作中乘数的每一位乘以被乘数的每一位。每次相乘的部份积依据其权位进行累加,这里权位指示了一个二进制位相对于其它位的位置。例如,如果二进制位47的部份积加上二进制位03的部份积的时候,位47的部份积要偏移相对于其权位以后再加前面的部份积。图1显示了一个简单2X2乘法,其中乘数是a<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1a0,被乘数是b1b0



1:两个2位二进制数乘法


 


2)      分布式算法(DA


分布式算法是通过基于LUTs分布式操作来实现乘法的一种方法。分布式算法与传统算法实现乘加运算的不同在于执行部份积运算的先后顺序不同。分布式算法在实现乘加功能时,是通过各输入数据的每一对应位产生的部份积预先进行相加形成相应的部份积,然后再对各个部份积累加形成最终结果,而传统算法是等到所有乘积已经产生之后再来相加完成乘加运算的。与传统串行算法相比,分布式算法可极大地减少硬件电路地规模,提高电路地执行速度。图2是一个4路常数累加分布式算法示意图。



24常量被乘数DA结构


 


 


 


3)      LUT实现DA算法


3显示了如何用LUTs来实现DA算法。用LUT实现,可以减少组合积和加法树。在图3例子中,LUT存放了所有常系数输入的各种可能组合的和LUT输出之和在比例加法器中相加并且根据相应的权位移位输出。



          3   常系数4 乘法器(注1


注:


1)、c0c3是常系数。


3中的LUT寻址方式和存储值适用于所有乘法操作模式。寻址方式LUT存储的数据依据乘法操作模式的不同而不同。


5.用存储器块实现软乘法器


可以用StratixIIStratixStratixGX M512或者M4K CycloneIICycloneM4K RAM存储器块作为LUTs实现DSP应用中的乘法器。所有系数的组合会预先算好并保存在M512或者M4K中。RAM块的地址对应乘法器的一个操作数,每个地址内存放一个唯一的计算结果,这个结果是基于实现的乘法器的类型由输入操作数和一个已知的参数计算得到的。


StratixIIStratixStratixGXCycloneIICyclone器件支持的5种软乘法器的类型是:


       并行乘法器(Parallel multiplication)-每个时钟周期存储器块产生一个乘法结果。该模式在高速数据应用中非常有用。


       半并行乘法器(Semi-parallel multiplication)-每个存储器块多个时钟周期产生一个乘法器结果。该模式在最小均方值(LMS更新和参数均衡中非常有用。


       乘加器Sum of multiplication)-一个存储器或者一组存储器块产生一组乘法器结果。该模式多用于FIR滤波器和DCTs


       混和式乘法器(Hybrid multiplication)-这是半并行模式和群式乘法器的结合和优化。改模式非常适合用于复数乘法,比如复数FFTIIR滤波器。


       全变量乘法器(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可存放这种系数的最大地址位数是82^8256个地址)。输入总线和系数尺寸直接影响了用于实现乘法器的RAM块的数目以及其配置形式。并行乘法模式能达到最大的数据吞吐量(例如每周期允许更新一次数据值)。


可以用QuartusII Megafunction函数altmenmult来实现并行定系数乘法器。可以MegaWizard Plug-In Manager参数化配置altmenmult来定制一个并行、定系数软乘法器。通过设定altmenmult输入和系数的位宽、RAM块的类型来选定实现一个半并行或并行模式软乘发器。6和图7分别显示了用M4K RAM块来实现图5所示的16位输入10位系数并行乘法器MSBLSB部份所需的设置,本例中乘法器的系数是一个常数值5



6 MSB RAM16位输入、10位系数并行乘法器的altmemmult MegaWizard设置



7 LSB RAM16位输入、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分别显示了在StratixIIStratix器件中实现并行常系数乘法器的结果。例中乘法器是用altmemmult Megafunction实现的。


16 StratixII器件实现16位输入,10位常系数并行乘法器的结果



注:


1)、Latency是指完成单个乘法运算所需的时钟周期。


17 Stratix器件实现16位输入,10位常系数并行乘法器的结果




注:


1)、Latency是指完成单个乘法运算所需的时钟周期。


 


b、可变系数乘法器


实现定系数乘法器的时候,可以把StratixIIStratixStratixGXCycloneIICyclone中的存储器用作ROM。对于变系数乘法器,存储器块必须被实现为RAM块,如此可以写入或者更新预先计算出的系数。图9显示了一个用M4K单口RAM块实现一个变系数并行乘法器的例子。用此方法,当系数更新的时候,乘法器会暂停工作。但如果用多组RAM块来存储不同的预系数的时候,可以使乘法器在一个时钟周期内在两组不同系数之间换。实现这个功能的一种方法是将RAM块分区,不同区存储不同的系数,并用MSB地址位来选择哪一系数被使用。此外使用双口RAM块,可以在一个RAM区写入或者更新系数,同时用另一个RAM区的系数来实现乘法运算



9 M4K单口RAMLUTs来实现16位输入、10位变系数并行乘法器


注:


1)、用于增加系统性能的可选的流水寄存器。


提醒:altmemmult兆核也可以通过在MegaWizard窗口中使能“Create ports to allow loading coefficients”选项来支持变系数并行和半并行软乘法器


18和表19分别显示了在StratixIIStratix器件中实现并行变系数乘法器的结果。


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位输入被分成44的例子。在本例中,对于同一个存储器块的使用,输入总线的位宽将决定输出的位宽以及乘法器的延迟。增大分的位宽(比如实现一个大于4位位宽的分组)可以减小乘法器的延时。但这样也许会需要更多的M512块或者使用大的RAMM4K


也可以用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位输入分成44s小块。因为必须花费4个时钟周期才能将一个完整的16位输入加载到RAM块中,所以在加载新的输入之前当前的输入必须稳定地保持4个时钟周期的时间。sload_data信号上出现一个时钟周期的高电平表示可以开始加载新输入数据块。


13显示了图11中例子的仿真结果。例中,输入是一个十进制的数10,系数是一个常数2



13半并行模式的仿真结果


20和表21分别给出了在StratixIIStratix器件中实现半并行定系数乘法器的结果。


20 StratixII器件中实现16位输入、14位常系数半并行乘法器的结果



注:


1)、Latency是指完成单个乘法运算所需的时钟周期。


21 Stratix器件中实现16位输入、14位常系数半并行乘法器结果



注:


1)、Latency是指完成单个乘法运算所需的时钟周期。


22和表23分别显示了在StratixIIStratix器件中实现半并行可变系数乘法时的结果。


22 StratixII器件中实现16位输入、14位变系数乘法器的结果



注:


1)、Latency是指完成单个乘法运算所需的时钟周期。


 


23 Stratix器件中实现16位输入、14位变系数乘法器的结果



注:


1)、Latency是指完成单个乘法运算所需的时钟周期。


 


3)      乘加器Sum of multiplication


乘加模式乘法器的运算结果就是一系列输入数据(乘数)乘以一系列被乘数所产生的部份积的和。这种乘加结构易于实现MAC(乘累加)函数乘累加运算FIR滤波器应用中非常常见。乘法器的每个输入数据(乘数)一个特定的系数(或者叫被乘数)相乘得到一个乘积项所有乘积项相加后得到最终的乘法结果。


在乘加器模式下,输入总线每个时钟周期送入一位到存储器的地址端口,低位先送。如果乘法器块有四个输入总线(分别是ABCD),那么第一个时钟送入的四个输入的最低位形成一个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块实现图中的系数时支持的最大输入位宽是52^5=32)。根据乘法器的输入数目、位宽,系数的数目、位宽以及需要的执行速度的不同,所需的RAM块的数目也是不一样的。图14是一个只需一个M512 RAM块的例子。


16显示了基于图14所示的例子的仿真结果。该例子有一级可选的流水进程,输入A的值是二进制数“0001”,系数c0的值是3


提醒:设计者可以选择减少流水的级数,不过如此会减小设计结果的Fmax



16乘加模式乘法器的仿真结果


24和表25分别显示了用StratixIIStratix器件实现图14所示的四输入、16位定系数乘加模式乘法器的结果。


24 StratixII实现四输入、16位定系数乘加模式乘法器的结果




注:


1)、Latency是指完成一个完整的乘加运算所需的时钟周期


 


25Stratix实现四输入、16位定系数乘加模式乘法器的结果



注:


1)、Latency是指完成一个完整的乘加运算所需的时钟周期


26和表27分别显示了用StratixIIStratix器件实现四输入、16位变系数乘加模式乘法器的结果。


26StratixII实现四输入、16位变系数乘加模式乘法器的结果



注:


1)、Latency是指完成一个完整的乘加运算所需的时钟周期


27Stratix实现四输入、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)、输入总线是16s宽,但是输入数据每次是两位依次送到RAM,这就是为什么图中的总线宽度是2原因


2用于增加系统性能的可选的流水寄存器。


3)、Ci指输入I的系数。


4)、Cq指输入Q的系数。


19中的例子是两个16位输入数据。虽然M512 RAM块可以配置成32X18位,能有5位地址(2^5=32),但每次每个输入要同时送入相同的位数,故最多一次接收两位(总共是四位)。这个例子中,如果使用相同的存储器块,输入的位宽决定着乘法器的输出位宽以及乘法器的延时。增加M512块的使用数目或者换成使用更大的存储器块比如M4K RAM,就可以有效减小乘法器的延时,并且支持更大的系数位宽。


20显示的是基于图19种例子的仿真结果。例子中有可选的流水级,两个乘数Iuput_IInput_Q的值分别是30055,系数CiCq的值分别是1025。这样,乘法的结果是:


Input_I X Ci+ (Input_Q X Cq) = (300 X 10) + (55 X 25) = 4375


提醒:设计者可以选择减少流水的级数,不过如此会减小设计结果的Fmax



20 混合乘法器的仿真结果


28和表29显示了分别用StratixIIStratix器件实现两个16位输入、15位常系数混合乘法器例子的结果。


28 StratixII器件实现双输入、15位常系数混合乘法器的结果



注:


1)、Latency是指完成一个乘法运算所需的时钟周期。


29 Stratix器件实现双输入、15位常系数混合乘法器的结果



注:


1)、Latency是指完成一个乘加运算所需的时钟周期。


30和表31显示了分别用StratixIIStratix器件实现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


这里ab都是乘法器的可变输入。


21显示的是用该等式计算,RAM LUT实现的全变量乘法器。需要两个独立的RAM块来分别存储预先计算好的(a+b2/4和(a-b2/4值。前一个RAM块输入口的(a+b)以及后一个RAM块输入口的(a-b均在前一级预先由逻辑资源计算出。乘法器的最终结果是由(a+bRAM块结果减去(a-bRAM块结果所得到的。全变量乘法器可以每个时钟接受一个新的输入值,一共需要三个时钟周期得到最终的乘法结果。



21 M4K RAM块作LUTs实现8位全变量乘法器


注:


1)、用于增加系统性能的可选的流水寄存器。


21中的例子实现的是两个8位数据输入。8位输入产生16位输出,需要9位寻址RAM块内的部份积。于是,对于每个部份积需要两个配置成256X162^9=512)模式的M4K RAM块。该乘法器模式下,输入数据的大小直接影响所需RAM块的多少。


22显示了图21所示例子的仿真结果。



22 全变量乘法器的仿真结果


32和表33分别显示了用StratixIIStratix器件实现图21所示的8位全变量乘法器例子的结果。全变量模式乘法器是一种理想的low-resolution乘法器,这种乘法器的输入和系数的位宽都不是太大。相对其他相同大小的可变软乘法器,输入和系数越大,所需的存储器资源显著增多。


32 StratixII器件实现8位全变量乘法器的结果



注:


1)、Latency是指完成一个乘法运算所需的时钟周期。


33Stratix器件实现8位全变量乘法器的结果



注:


1)、Latency是指完成一个乘法运算所需的时钟周期。


 


6.       DSP块或者逻辑资源实现乘法器


Altera提供3种利用DSP块或者逻辑资源的QuartusII Megafunction来实现不同的乘法、乘累加和乘加函数。


       lpm_mult Megafunction只实现乘法功能。


       altmult_add Megafunction可以实现乘法或者乘加功能。


       altmult_accum Megafunction只能实现乘累加功能。


 


7.     硬件乘法器


StratixIIStratixStratixGX器件中的硬件乘法器由DSP块和逻辑资源联合实现,而CycloneII器件中的硬件乘法器则由嵌入式乘法器和逻辑资源联合实现。硬件乘法器可以提高StratixIIStratixStratixGXCycloneII器件中的DSP块和嵌入式乘法器的利用率。StratixIIStratixStratixGX中的DSP块支持36X3618X189X9的乘法器,CycloneII中的嵌入式乘法器支持18X189X9操作。有时候为了实现不同宽度的乘法,DSP块(或者嵌入式乘法器)可能只会被部份利用。例如一个12X9的乘法,必须用29X9DSP块(或者嵌入式乘法器)来实现,因为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硬件乘法器的仿真结果


3435分别显示了用StratixIIStratix来实现图24所示的12X9硬件乘法器电路的结果。


34:在StratixII中实现12X9硬件乘法器的结果1



注:


1)、altmult_add Megafunction可以由ALM或者LEDSP块乘法器来实现。


2)、这里的延时指完成一次乘法运算所需的时钟数。


35:在Stratix中实现12X9硬件乘法器的结果1



注:


1)、altmult_add Megafunction可以由ALM或者LEDSP块乘法器来实现。


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硬件乘法器的仿真结果


3637分别显示了用StratixIIStratix来实现图27所示的12X12硬件乘法器电路的结果。


35:在StratixII中实现12X12硬件乘法器的结果1



注:


1)、altmult_add Megafunction可以由ALM或者LEDSP块乘法器来实现。


2)、这里的延时指完成一次乘法运算所需的时钟数。


 


 


 


 


 


 


37:在Stratix中实现12X12硬件乘法器的结果1



注:


1)、altmult_add Megafunction可以由ALM或者LEDSP块乘法器来实现。


2)、这里的延时指完成一次乘法运算所需的时钟数。


 


8.     结论

StratixIIStratixStratixGXDSP块以及CycloneII器件内的嵌入式乘法器可以用来实现DSP应用。如果当你的设计需要的乘法器超出DSP块和嵌入式乘法器所能提供的数目的时候,可以利用StratixIIStratixStratixGX中的TriMatrixM512M4K RAM块)及CycloneIICyclone中的M4K获得更多的乘法器。例如:当利用软乘法器的时候,可以增加Stratix器件EP1S80中的16X16乘法器个数多达表14中所显示数量的7。另一个例子是,全变量软乘法器是实现较小的变系数乘法器的理想选择。其它模式的软乘法更适合于系数不频繁更新的场合,其应用效率更高。硬件乘法器可以在使用DSP块或者嵌入式乘法器与ALM或者基于LE之间平衡,这样可以使StratixIIStratixStratixGX中的DSP块以及CycloneII中的嵌入式乘法器得到更高效利用
PARTNER CONTENT

文章评论8条评论)

登录后参与讨论

用户377235 2016-6-6 14:45

hahahahahahaha

用户593016 2015-7-20 21:51

很好!

coyoo 2014-3-26 12:11

是滴是滴,以前是有点,后来EDN升了一次级,就变这样了。

用户1211780 2014-3-26 11:15

无图无真相啊,哈哈。

用户355491 2014-2-16 19:51

翻译的不错,对于掌握乘法器的设计非常有用,赞一个!

coyoo 2013-9-5 09:18

很早以前的文章,得翻以前的电脑

用户1668914 2013-9-4 22:51

写的很好,但是看不到图片,能不能给我发一份,小弟邮箱:jingfengtang@126.com。谢谢啦

用户1676793 2010-6-30 20:13

对乘法器在FPGA中的实现说的很透彻,谢谢 啊。小弟又进步了,,可惜这些图都显示不出来。12X12乘法器的分解中为什么2个MSB不用再做一次乘法运算啊 ?
相关推荐阅读
coyoo 2024-12-25 14:13
ALTERA Cyclone 10器件的使用-8:特定的上电顺序
概述 Intel 要求用户为其10代FPGA器件使用特定的上电和掉电顺序,这就要求用户在进行FPGA硬件设计的时候必须选择恰当的FPGA供电方案,并合理控制完整的供电上电顺序。经过在Cyclone 1...
coyoo 2024-12-22 11:46
AD9218子板在新处理板上表现的问题
概述 新的数据处理板融合了数字和数据处理功能模块,计划采用ADI的4通道串行ADC芯片代替之前的并行ADC。由于初次使用,所以初次设计时预留了AD9218的子板的插槽。 在调试AD9633功能的同时并...
coyoo 2024-12-14 17:15
在Cyclone 10 GX器件上实现高精度TDC探索
概述 Cyclone 10 GX器件的ALM结构与Cyclone V类似,所以在Cyclone 10 GX器件上实现TDC功能理论上是可以完全参考甚至移植自Cyclone V系列的成功案例。但是,现实...
coyoo 2024-12-10 13:28
Cyclone V GX FPGA设计TDC的优化问题
概述 通过前面的研究学习,已经可以在CycloneVGX器件中成功实现完整的TDC(或者说完整的TDL,即延时线),测试结果也比较满足,解决了超大BIN尺寸以及大量0尺寸BIN的问题,但是还是存在一些...
coyoo 2024-12-03 12:20
比较器检测模拟脉冲说明(四)
概述 说明(三)探讨的是比较器一般带有滞回(Hysteresis)功能,为了解决输入信号转换速率不够的问题。前文还提到,即便使能滞回(Hysteresis)功能,还是无法解决SiPM读出测试系统需要解...
coyoo 2024-11-16 13:54
不同ADC采样同一前端模拟信号时转换用时差异分析
概述 同一组前端模拟信号接入由不同型号ADC组成的模数转换电路时,采样后在FPGA中发现采样用时差异较大。本文主要分析这个时间差异形成的原因,并记录该差异产生对系统造成的影响。系统数字化简介 项目前端...
EE直播间
更多
我要评论
8
17
关闭 站长推荐上一条 /3 下一条