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

Spartan3硬件乘法器使用详解

Spartan3硬件乘法器使用详解

自从开始学FPGA起,关于硬件乘法器与软件乘法器的概念就一直有点困惑。明明FPGA已经自带了18*18位的硬件乘法器(大概总结了一下,Spartan6系列的硬件乘法器数量如图1所示,Spartan3的如图2所示),好多书籍却要花费较多经历来讲如何用HDL语言来实现乘法;这是一个非常复杂的过程,感觉会让初学者不知所措(感觉使用Core Generator来产生乘法器要比用HDL语言要容易一些)。在硬件乘法器足够使用的情况下,为什么不直接使用硬件乘法器,来简化设计、提高性能呢?仔细阅读了Xilinx关于硬件乘法器的资料,没想到它的用法、用途还是这么丰富。于是在此和大家分享一下心得。

图1 Spartan6系列的硬件乘法器

图2 Spartan3系列的硬件乘法器
1. 简介
Xilinx FPGA一般都带有多个18*18的硬件乘法器(一般用MULT18*18原语来指代,在高端器件里面乘法器、加法器和累加器集成为DSP48、DSP48E等模块),一般我们都用它们来完成有符号或者无符号的乘法运算。其实,使用Xilinx FGPA自带的硬件乘法器,不光可以完成这些基本的操作,还可以被用来进行移位、产生一个数值的二进制补码等(如Xilinx Application Note 467)。另外,硬件乘法器还可以互相进行级联或者与CLB逻辑进行级联以进行更为复杂的功能求解。下面就具体问题具体分析,来展示一下Xilinx FPGA硬件乘法器的强大功能。
Xilinx FPGA硬件乘法器是独立于逻辑资源之外的,所以它不占用逻辑资源,可以以最小的硬件代价实现较为复杂的算术运算(当然布线资源还是要占用的)。总结了一下,包括有符号*有符号,有符号*无符号,逻辑运算与算术运算、二进制补码、幅值返回等都可以使用MULT18*18来实现。

2. 基于二的补码的有符号乘法器

图3嵌入式乘法器示例

一个基本的MULT18*18有两个独立的动态输入端口:18位的有符号数或者17位的无符号数。而把四个MULT18*18、一个36位的加法器和进行一个53位的加法器级联,就可以得到35*35位的乘法器,它的基本原理框图如图4所示。

图4 35*35位的有符号乘法器
二进制乘法与常规的乘法在本质上是一样的,它就像是只有0和1的十进制乘法(简直太简单了,可以参考《编程卓越之道第一卷:深入理解计算机》这本书,讲的很深刻)。以下是掌握二进制乘法需要知道的规则:
0 × 0 = 0
0 × 1 = 0
1 × 0 = 0
1 × 1 = 1
使用这四条规则,二进制乘法按照与十进制乘法相同的方式工作(事实上,如果按照十进制乘法的规则来对二进制数进行操作,结果完全正确,因为在十进制乘法中,与数字0和1相关的规则与二进制乘法是一样的,只是进位的数不一样而已,十进制的是到十才进位这里是到2就进了)。

3.时序考虑
在乘法器的计算中,LSB的产生要比MSB快,因为MSB需要更多层的加法,所欲时序考虑与36位输出的乘法器是不一样的。举个例子来说,如果两个无符号的的数其乘积永远不超过2的35次方,则输出结果的 P[35]将永远是0。对于其中任意有符号的n位相乘,如果不出现(-2^(n-1))* (-2^(n-1))的情况,则MSB永远与下一个低bit位相同(即p[2n-1]=p[2n-2])。同时考虑到,如果某些情况下要求输出没有位之间相对的布线延迟,则应增加LSB的延时以便和MSB的延时进行平衡。
因为器件制造等原因,在流水线式的MULT上,输入数据的建立时间中MSB的往往比LSB的要短,但是器件的管脚延时却没有区别。为了保证设计中的额外的安全裕量,MSB应该接受一个相对较慢的输入。复位与时钟使能必须比所有的输入数据的建立时间都快,并且等待时间必须为零。时序约束中的参数tmulidck(乘法器输入数据到时钟)用来同时约束数据与控制输入,但是对它们两种类型却具有不同的数值。

4.库中的原语
表1 MULT18*18和MULT18*18S的原语

经常用原语的朋友对此应该不陌生了,MULT18*18是普通的乘法器,MULT18*18S是带有控制端的(如时钟使能C、复位信号等)。使用库中的原语与使用Xilinx的实现工具,如FPGA Editor时,管脚的定义是一样的。乘法器原语的示意图如图5所示。

图5 乘法器原语的示意图
在ISE中打开Language-template,verilog— device primitive--- Spartan3--- Arithmetic functions, 就可以看到MULT18*18和MULT18*18S的原语调用代码了。例如MULT18*18的就是
// MULT18X18 : In order to incorporate this function into the design,
// Verilog : the following instance declaration needs to be placed
// instance : in the body of the design code. The instance name
// declaration : (MULT18X18_inst) and/or the port declarations within the
// code : parenthesis may be changed to properly reference and
// : connect this function to the design. All inputs
// : and outputs must be connected.

// <-----Cut code below this line---->
// MULT18X18: 18 x 18 signed asynchronous multiplier
// Spartan-3
// Xilinx HDL Language Template, version 12.1

MULT18X18 MULT18X18_inst (
.P(P), // 36-bit multiplier output
.A(A), // 18-bit multiplier input
.B(B) // 18-bit multiplier input
);

// End of MULT18X18_inst instantiation
前面已经介绍了Spartan3系列FPGA中硬件乘法器的用途、调用方法、结构特定等等,对Xilinx FPGA中基本的硬核乘法器有了初步的认识。接下来对它的一些具体使用方法做更深入的介绍。
继承事业,薪火相传
返回列表