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

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

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

前几天一直在忙,这几天终于有点时间可以写点东西了。上次简要提了一下对Spartan3中硬件乘法器的认识。虽然介绍Xilinx器件与开发应用的书籍、资料非常多,但是仔细查了一下,并没有专门介绍其硬件乘法器的,所以个人认为总结一下介绍给大家还是很有必要的。
虽然最新的7系列FPGA已经面世了,不过Spartan系列因为其高性价比、广泛使用的人群、大量已有的程序、资料,在一定的时间段内还是有其存在的价值的(估计Altera的CycloneIII不停产,Xilinx的Spartan3就不会停产把:))。我觉得把它搞清楚了,以后过渡到高端器件,对整个开发的流程、器件的来龙去脉还是比较容易的。好了接下来继续上文的讨论。
1.硬件乘法器调用的设置
上次提到了可以直接在ISE中使用函数模板来调用硬核乘法器的原语。为了对原语进行约束控制,需要在Project Navigator中进行设置。一般情况下,XST综合工具默认使用最优的实现方案;为了确保使用嵌入的硬件乘法器,需要额外进行设置。设置的方法比较多,例如使用XST的命令行、使用图形窗口等。为了操作简便,使用Project Navigator中的选项进行设置,如图1所示。(操作步骤是,在ISE Project Navigator首先选择顶层文件,然后点击Synthesize XST ,再点击菜单栏Process下面的Process Properties就可打开此界面)。这里面有Auto、Block、LUT、Pipe_LUT四个选项,默认的是Auto,即由XST决定采用何种方式;必须选中Block时才能告诉综合工具在综合时使用硬件乘法器来处理乘法。

图1 综合工具中的配置选项.JPG
在使用Synplify进行综合时则稍有变化,需要在Synplify中进行配置。Synplify默认对Xilinx器件使用硬件乘法器(帮助中说The default implementation uses block multipliers (this corresponds to the attribute value block_mult.))。在Synplify中改非常麻烦,不像XST的设置中提供了现成的选项供设置,如图2所示(可参考Synopsys FPGA Synthesis User Guide)。

图2 Synplify中使用Xilinx乘法器的方法
其实只要在源程序里面加注释就可以使得Synplify识别,例如
input [7:0] a;
input [1:0] b;
output [9:0] c; /* synthesis syn_multstyle = "block_mult" */
assign c = {2'b0, a} * {6'b0, b};
就可以在求c时使用block模式,即硬件的乘法器了。
在System Generator中的配置则非常简单,只要在Simulink Library Browser中选择Xilinx Blocket,选择math,拖出Mult模块,双击它打开属性,改变“Use embeded multipliers”的选项就可选择使用何种方式的硬件乘法器,如图3所示。

图3 在System generator中的配置方法
在EDK开发中,若使用MicroBlaze软核,则应该将Processor Version Register 0的MUL位置为1。这个功能目前我还没有用到,所以不好做更详细的讲述,以免误导了大家。具体的讲述可以参考MicroBlaze Processor Reference Guide (UG081.pdf)。

2. Spartan-3 FPGA硬件乘法器的结构
Spartan-3 FPGA硬件乘法器的结构框图如图4所示(DS099.pdf)。从图中可以看出,硬件乘法器与块RAM相邻,从而可以很方便地使用快RAM存储输入、输出结果。一般每个芯片中有两列或者四列乘法器。在两排的结构下,每个乘法器又紧邻两排CLB,从而可以使用CLB或者IOB逻辑来方便地驱动硬件乘法器。一般在每个乘法器模块的周围有4个CLB,或者16个slice和32个LUT,可以允许32位的输入和输出信号实时链接到邻近的硬件乘法器。在高速布局中,一种可行的方案是,把A[15:0] 放在一端,B[15:0]放在另一端,P[31:0]同时分布于两边。对于一个全尺寸的18*18乘法器,额外的输入和输出可以链接到除已使用CLB之外最近的CLB上(因为CLB广泛分布于硬件乘法器四周,从图上也可以看出)。为了达到最佳的性能,在邻近的CLB中,需要对输入使用寄存器的流水线结构进行处理。

图4 Spartan-3 FPGA硬件乘法器的结构
Spartan3中的硬件乘法器之所以默认选择18位这个不寻常的数,是因为这正好与块RAM的18位相匹配,其中包含了校验位(块RAM的默认位宽为18bit,深度为1024bit)。标准的8位或者16位的乘法器可以使用硬件乘法器的一部分来实现,而32位的乘法器可以通过级联两个硬件乘法器得到。Xilinx硬件乘法器的这种结构可以实现任意非标准宽度(8位或者16位)的乘法器,这可以满足各种实现的要求。没有用到的乘法器的输入端被连接到未使用的LUT中,也即被置零。不过根据我所做过的含有数学运算的FPGA工程,18个乘法器的占用率经常是100%占用。
今天先写到这儿了。最后,给出Spartan3系列的硬件乘法器分布,如图5所示。

图5 Spartan3系列的乘法器分布.

附件大小Tu_1_Zong_He_Gong_Ju_Zhong_De_Pei_Zhi_Xuan_Xiang_.JPG219.38 KBTu_2_SynplifyZhong_Shi_Yong_XilinxCheng_Fa_Qi_De_Fang_Fa_.jpg134.65 KBTu_3_Zai_System_generatorZhong_De_Pei_Zhi_Fang_Fa_.JPG50.21 KBTu_4_Spartan3_Ying_Jian_Cheng_Fa_Qi_Jie_Gou_.jpg45.8 KBTu_5_Spartan3Xi_Lie_De_Cheng_Fa_Qi_Fen_Bu_.jpg36.28 KB
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表