FPGAExpress:在VHDL或Verilog中实现高效乘法器

描述

关键词:Express、Mult、乘法、VHDL、Verilog、基础Express

紧迫:热

一般描述:
FPGA Express使用特定的Xilinx特性来计算算术函数
实施设计。但是,乘法器的实现不是最优的。
性能(VIETEX除外)。这些结果有了很大的提高。
V3.2的FPGAExpress,所以这个解决方案应适用于使用时
表示v3.1和更早。

使用包含乘法器函数的以下VHDL包来实现
XC4000和Spartan架构的更有效的乘法器。

解决方案

将解决方案2中列出的VHDL代码复制到称为MultUpPigaG.VHD的VHDL文件中。
先在Express项目中分析这个包文件,然后再进行设计
文件夹。或者,创建一个新的库并将该包文件添加到该库。

然后,在VHDL的库声明部分中引用这个包
代码。这个包裹的名字是“MyAyrthe”,而库将是“工作”。
除非你创造了你自己。然后,调用“MyuMult”函数
VHDL代码使用以下代码。将以下代码复制到一个名为
VHD并将其添加到Express项目中。

–将此文件保存为多重VHD。
库IEEE;
使用IEEE.STDYLogiCy1164.ALL;
使用IEEE.STDLogLogic UNSIGNED;
使用IEEE.STDLogLogic;
使用Work.MyActh.ALL;-引用解决方案2中列出的包

实体乘法是
端口(A:在STdLogLogic向量中(20下降到0);-lt;-改变这些边界
在StdLogLogic向量中(13下降到0);-lt;-改变大小
PROD:Out-StdLogLogic向量(34下降到0);乘数的-lt;
结束乘法;

乘法建筑
开始
=Myul-Mult(a,b);乘以“a”和“b”产生“PROD”
结束美好;

对于VHDL设计,MyuMult函数可以在任何文件中使用,如上文所示。

对于Verilog设计,实例化“乘法”来调用函数如下:

乘积U1(a(x),.b(y),pod(z));

注意:在一个顺序块(VHDL’进程或verilog‘始终’)中,执行一个
从临时信号分配,然后实例化乘法器外部
以临时信号为输出的顺序块。
乘法器实例化。

例子:

总是@(POSEDGE CLK)
QUT和LT;

乘以U1(a(x),b(y),PROD(TEMP));

–将此文件保存为MultTyP包装。
——————————————
——
— Copyright(C)1998由SyopysInc.公司保留所有权利。
——
-此源文件可以不受限制地使用和分发。
-如果此版权声明不从文件中移除
——任何衍生作品都包含版权声明。
——
-包名:MyAlaRITH
——
目的:这个包定义了一个更有效的实现方式
——乘法算子
——
-作者:Ramine Roane(RROANEH:Syopopyscom)
——
算法:
-循环:π=(y==1)?十一:0
-环:Qi= p(2i)+p(2I+ 1)& lt;lt;1。
-环:Ri=q(2i)+q(2I+ 1)& lt;lt;2。
——如果长度>7
-环:Ti=R(2i)+R(2I+ 1)& lt;lt;4。
-循环:q+= Ti & lt;&;(8i)
–否则
-循环:q+= RI& lt;& lt;(4i)
如果结束
——
注:部分积齐并行计算
——并行计算的部分积RI
-部分乘积Ti(如果应用)并行计算
——
——
——————————————
库IEEE;
使用IEEE.STDYLogiCy1164.ALL;
使用IEEE.STDLogLogic UNSIGNED;
使用IEEE.STDLogLogic;

包装袋
函数MyO-Mult(s,L:STdLogLogic向量)返回STdLogLogic向量;
结束;

包装体MyaAlthe是

函数最大(x,y:整数)返回整数为
开始
如果x & gt;y,则返回x;
否则返回Y;
如果结束;
结束;

函数最小(x,y:整数)返回整数为
开始
如果x和lt;y,则返回x;
否则返回Y;
如果结束;
结束;

函数MyuMult(s,L:STdLogLogic向量)返回STdLogLogic向量
常数ls:整数:=最小(s长度,L’长度);
常数LL:整数:=最大(长度,长度);

中间产品的数量p,q,r
常数NP:整数:=ls;
常数NQ:整数:=(NP+ 1)/ 2;
常数NR:整数:=(NQ+ 1)/ 2;
常数NT:整数:=(NR + 1)/ 2;

p,q,r的长度和最终结果
常数Lp:整数:=LL;
常数LQ:整数:=Lp+2;
常数LR:整数:=LQ+3;
常数lt:整数:=LR+5;
常数n:整数:=LS+LP;

Pype类型是STdLogLogic向量(LP-1下降到0)的数组(NP-1下降到0);
QuyType是STdLogLogic向量(LQ-1下降到0)的数组(NQ-1下降到0);
类型RiyType是STdLogLogic向量(LR-1下降到0)的数组(NR-1下降到0);
Type型是STdLogLogic矢量(NT-1下降到0)(LT-1下降到0);

变量p:π型;
变量Q:QiyType;
变量R:RIIO型;
变量t:TIYE型;
变量结果:STDYLogLogic向量(N-1下降到0);
变量小:STdLogLogic向量(LS-1下降到0);
变量大:StdLogLogic向量(LL-1下降到0);

开始

如果(s长度lt’长度)
小:= S;
大型:
其他的
小:= L;
大的:= S;
如果结束;

–计算皮
对于I在0到NP-1回路
如果(小(i)=‘0’),则p(i):=(其他=& gt;‘0’);
否则p(i):=大;
如果结束;
结束环;

–计算齐
对于I在0到NP/2-1回路
q(i)=(Ext(P(2×I)(LP-1下降1),LQ-1)+EXT(P(2×I+1),LQ-1))和P;(2×I)(0);
结束环;
如果(NP mod 2)=1
Q(NQ-1):=EXT(P(NP-1),LQ);
如果结束;

–计算Ri
对于I在0到NQ/2-1回路
R(I):=(Ext(q(2×i)(LQ-1下降到2),LR-2)+EXT(Q(2×I + 1),LR-2))和(Q)(2×I)
(1下降至0);
结束环;
如果(nq mod 2)=1,则
R(NR-1):=EXT(Q(NQ-1),LR);
如果结束;

如果(ls & gt;=8)那么
–计算Ti
对于I在0到NR/2-1回路
T(I):=(Ext(R(2×I)(LR-1下降4),LT-4)+EXT(R(2×I + 1),LT-4))和AMP;
R(2×I)(3下降到0);
结束环;
如果(NR mod 2)=1
T(NT-1):=EXT(R(NR-1),LT);
如果结束;

–计算最终产品
结果:(t)(t(0),n);
对于i在1到NT-1循环——跳过i=0
结果:=结果+(Ext(t(i));(0),8(i),n);
结束环;
其他的

–计算最终产品
结果:EXT(R(0),n);
对于i在1到nr-1循环——跳过i=0
结果:=结果+(Ext(R)(I)和AMP;Ext(0),4×I),n);
结束环;
如果结束;

返回结果;
结束;

结束;

请登录后发表评论

    没有回复内容