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

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

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

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, 并且没有进位和借位
例如
继承事业,薪火相传
返回列表