首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Spartan3硬件乘法器使用详解(5)

Spartan3硬件乘法器使用详解(5)

前面已经介绍了Spartan3系列FPGA中硬件乘法器的用途、调用方法、结构特、使用一个专用硬件乘法器同时处理两个乘法的方法、使用Xilinx CORE Generator来生成带控制端的IP核00等等。接下来对它的一些具体使用方法做更深入的介绍。
1. 乘法器子模块
Spartan3系列FPGA中专用硬件乘法器是18*18位的,因为块RAM的宽度是18位的,二者匹配可以提高运算的性能。不过我们的程序中,并不总是这么巧需要18*18位的;以两个数相乘相乘为例,假如是有符号的整数9乘以有符号的整数9,那只是一个5*5的乘法,还剩余了很多的计算能力。为此,可以把一个大的18*18位的专用硬件乘法器划分为多个子模块。图1给出了这样的一个示例。

图1 乘法器自模块的划分方法
图2、图3分别给出了4*4有符号和无符号的乘法器子模块。

图2 4乘4有符号子模块

图3 4乘4无符号子模块
MAGNTD_18子模块可以返回一个数值的幅值(例如绝对值,以二进制补码表示)。一个负的输入返回的是正值,而正的输入保持不变。TWOS_CMP18和TWOS_CMP9可以求取输入的二进制补码。也可以使用一些额外的slice逻辑来与这些模块一起进行求取幅值、补码等操作。图4给出了使用MULT18*18专用硬件乘法器来生产两个TWOS_CMP9子模块的示意图。

图4 使用MULT18*18产生两个TWOS_CMP9子模块的示意图

2. 乘法器模块的位置约束
MULT18*18专用硬件乘法器可以有它们自己的LOC属性,即ucf用户约束文件中的位置约束。但是要注意到,MULT18*18的位置与平时我们所说的CLB的位置命名规则是不同的,例如
LOC= MULT18*18_X0Y0
代表的是位于器件最左下角的位置。为了清楚的说明,在PlanAhead的左下角找到了MULT18*18_X0Y0,如图5所示。

图5 PlanAhead中的MULT18*18位置

3. 乘法器的其它用途
3.1 移位操作
因为乘以2的n次方与移位n位的效果是一样的,所以乘法器也可以用作移位器,或者其它目的的通用资源。在一个系统中,假如硬件乘法器有富余,那用它们来做一些这样的操作是非常适宜的。
例如,把专用的硬件乘法器作为移位器使用时,把要被移位的数作为一个输入,而把要移动的位数n变为2的n次方作为另一个输入送入乘法器即可。因为MSB不能用来控制移位(因为MSB是符号位,如果把它移没了整个输出结果就是错误的),所以18*18位的乘法器处理0到16位的移位。在输出的36位数之中,多余的位被自动填零或者1(根据MSB的状态来决定)。这也符合了2进制移位对空余位的处理方式。

3.2 幅值返回
为了通过乘法操作来求一个输入的幅值,如果它是正数(MSB是0),则应该把它乘以1;如果它是负数(MSB是1),则应该把它乘以-1。在二进制补码表示中,1除了LSB是1外,其余的各位都是0;而-1的各位都是1,包括LSB上的值。所以,一个幅值或者绝对值返回的操作可以通过把输入乘以这样的一个数得到:它的LSB是1,而其余各位与输入的同次位上的数值相同。图6给出了这样操作的原理框图。

图6 幅值返回原理框图

3.3 二进制补码返回
一般情况下,求取一个数的二进制补码,需要使用带进位逻辑的LUT来实现。如果LUT资源比较紧张,而MULT资源富余的话,可以用MULT来求取二进制补码。把输入的数乘以同样多位数的全1的数就可以得到输入的二进制补码,是这样会产生同样多位数的冗余位,应该把它们剔除掉。图7给出了使用乘法器求取输入信号的二进制补码返回原理框图。

图7 使用乘法器求取输入信号的二进制补码返回原理框图

3.4 复数乘法
复数的乘法,例如(a+ib)*(c+id),它的结果也分为两部分,实部是ac-bd,虚部是(a+b)(c+d)-ac-bd。这样的复数乘法在数字信号处理中应用极多,例如快速傅里叶变换FFT、滑动傅里叶变换DFT等等。复数的乘法在前面讲system Generator和昨天的博文讲乘法器的IP核调用时都提到了,所以在这里不详细叙述了。

3.5 矩阵乘法中时间共享
矩阵的乘法在实际系统中应用非常广泛,例如语音、图形、数据处理中都要用到,而且其规模往往非常大,运算很复杂。一个3*3的矩阵操作就需要27次乘法和18次加法,而最后仅仅得到的是3*3的矩阵,共9个数。图像处理中的3*3的矩阵操作稍微简单一些,但是仍需要9个乘法和6个加法操作。
Spartan3系列FPGA使用“时间共享”的概念来处理矩阵乘法。不过我还是不是非常明白,有兴趣的朋友可以参考XAPP284(Matrix Math, Graphics, and Video)这个应用笔记,Xilinx网站上的应用笔记是非常好的资料,我正准备把相关的都仔细读一下;以后也会经常来分享一下自己的心得。

3.6 浮点运算
前面博文提到了,在实际开发中,一个主要的困难就在于浮点的运算。为了提高计算的精度,例如10000.51234*2000.69875454这样的操作,需要用非常大的位宽才能保证运算结果的精度,这样造成了芯片资源的极度紧张。而这样的一个浮点运算,在含有FPU的DSPs之中,例如TI的TMS320F28335(指令周期6.67ns)中,仅仅需要十几个周期,即几十纳秒的时间就可以处理完了。希望Xilinx有一天可以推出带有FPU的FPGA,这样再做浮点乘法就很轻松了。
关于Spartan3中专用硬件乘法器的使用,目前我只理解到这样的程度,所以暂时不能和大家分享更多了,欢迎来讨论。
最后,附上二进制补码的乘法运算规则:
0 x 0 = 0
0 x 1 = 0
1 x 0 = 0
1 x 1 = 1, 并且没有进位和借位
例如

附件大小Tu_1_Cheng_Fa_Qi_Zi_Mo_Kuai_De_Hua_Fen_Fang_Fa_.jpg54.92 KBTu_2_4Cheng_4You_Fu_Hao_Zi_Mo_Kuai_.jpg20.31 KBTu_3_4Cheng_4Wu_Fu_Hao_Zi_Mo_Kuai_.jpg15.4 KBTu_4_Shi_Yong_MULT1818Chan_Sheng_Liang_Ge_TWOS_CMP9Zi_Mo_Kuai_.jpg12.64 KBTu_5_PlanAheadZhong_De_MULT1818Wei_Zhi_.JPG198.11 KBTu_7_MULTQiu_Bu_Ma_.jpg10.68 KBTu_8_Er_Jin_Zhi_Bu_Ma_Yuan_Li_Shi_Yi_.jpg6.13 KBTu_6_Fu_Zhi_Fan_Hui_Yuan_Li_Kuang_Tu_.jpg9.96 KB
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表