2)    半并行乘法器Semi-parallel multiplication

半并行乘法器将输入乘数的部份位乘上被乘数或者系数,然后将每次得到的部份积移位累加后得到乘法结果。

举个例子,一个16位输入总线可以被分成四组四位,四组数据被依次送到RAM块的地址端口,每个时钟送入

一组,低四位先送。在每个时钟周期,RAM块依次输出每一组数据和系数相乘的结果。图10显示了是如何分

解一个16位输入、14位系数来实现半并行乘法操作的。

乘法器之三(半并行乘法器)-冯金伟博客园

图11显示了用一个M512RAM LUT实现图10所示的半并行乘法器。实现方法是在每个时钟周期加载四位输

入到RAM块,根据权位通过移位累加每个时钟周里RAM块输出的部份积,在六个时钟周期(四个时钟用于

加载输入值到RAM块,两个时钟用于流水延迟)后完成一个乘法操作。每次部份积移位相加后输出会增加4

位,在第四次部份积累加完成后,乘法器产生一个30位的输出。

乘法器之三(半并行乘法器)-冯金伟博客园

 图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。

乘法器之三(半并行乘法器)-冯金伟博客园

sload_data信号和MegaWizard窗口右下方显示的信息指示altmemmult Megafunction实现的是半并行或者并行模式软乘法

器。半并行软乘法器有sload_data信号且要多个时钟周期才能接受一次新的输入图11中的半并行乘法器是将16位输入分成

4组4位s小块。因为必须花费4个时钟周期才能将一个完整的16位输入加载到RAM块中,所以在加载新的输入之前当前的输入

必须稳定地保持4个时钟周期的时间。sload_data信号上出现一个时钟周期的高电平表示可以开始加载新输入数据块。

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

乘法器之三(半并行乘法器)-冯金伟博客园 

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

乘法器之三(半并行乘法器)-冯金伟博客园

乘法器之三(半并行乘法器)-冯金伟博客园 

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

乘法器之三(半并行乘法器)-冯金伟博客园

乘法器之三(半并行乘法器)-冯金伟博客园