各种乘法器比较
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
各种乘法器⽐较
各种乘法器⽐较
韦其敏08321050
引⾔:乘法器频繁地使⽤在数字信号处理和数字通信的各种算法中,并往往影响着整个系统的运⾏速度。
如何实现快速⾼效的乘法器关系着整个系统的运算速度和资源效率。
本位⽤如下算法实现乘法运算:并⾏运算、移位相加、查找表、加法树。
并⾏运算是纯组合逻辑实现乘法器,完全由逻辑门实现;移位相加乘法器将乘法变为加法,通过逐步移位相加实现;查找表乘法器将乘积结果存储于存储器中,将操作数作为地址访问存储器,得到的输出数据就是乘法运算结果;加法树乘法器结合移位相加乘法器和查找表乘法器的优点,增加了芯⽚耗⽤,提⾼运算速度。
注:笔者使⽤综合软件为Quartus II 9.1,选⽤器件为EP2C70,选⽤ModelSim SE 6.1b进⾏仿真,对于其他的软硬件环境,需视具体情况做对应修改。
汇总的⽐较:
详细实现过程:
1.并⾏乘法器
源代码:
module Mult1(outcome,a,b);
parameter MSB=8;
input [MSB:1] a,b;
output [2*MSB:1] outcome;
assign outcome=a*b;
endmodule
资源耗⽤情况:
ModelSim测试激励⽂件源代码:`timescale 10ns/1ns module Mult1_test();
reg [8:1] a,b;
wire [16:1] outcome;
Mult1 u1(outcome,a,b); parameter delay=2;
initial
begin
a=1;
b=0;
end
initial forever
begin
#delay
a=a+1;
b=b+1;
if(outcome>=16'h0FFF)
$stop;
end
endmodule
仿真时序波形:
DE2-70拥有300个嵌⼊式硬件乘法器单元,Quartus II综合并⾏乘法器时⾃动采⽤嵌⼊式乘法器来实现,因此中和报表中仅耗⽤了⼀个LE单元和⼀个九位的嵌⼊式乘法器单元。
如果把器件改成Cyclone系列的EP1C3,则由于该器件没有内嵌硬件乘法器,综合实现并⾏乘法器所耗⽤的LE单元数需要106个,如下图所⽰:
并⾏乘法器可以看作是纯组合逻辑电路,依靠组合逻辑实现两数相乘,这种⽅法能在输⼊数据改变时⽴即得到相乘结果,延时很短,但是耗⽤的资源随操作数位数的增加⽽迅速变多。
并⾏乘法器实现代码⾮常简短,适⽤于器件内有嵌⼊式硬件乘法器的情况。
2.移位相加乘法器
源代码:
module shifta(r,l,e,clk,q);
input [7:0] r;
input l,e,clk;
output reg [15:0] q;
integer k;
wire [15:0] r16;
assign r16={{8{1'b0}},r};
always@(posedge clk)
begin
if(l) q<=r16;
else if(e)
begin q[0]<=1'b0;
for(k=1;k<16;k=k+1)q[k]<=q[k-1];
end
end
endmodule
module shiftb(r,l,e,clk,q0,z);
input [7:0] r;
input l,e,clk;
output q0,z;
reg [7:0] q;
always@(posedge clk)
begin
if(l) q<=r;
else if(e)
begin
for(k=7;k>0;k=k-1)
q[k-1]<=q[k];
q[7]<=1'b0;
end
end
assign z=(q==0);
assign q0=q[0];
endmodule
module sum(a,p,psel,sum);
input [15:0] a,p;
input psel;
output [15:0] sum;
reg [15:0] sum;
wire [15:0] ap_sum;
integer k;
assign ap_sum=a+p;
always @(psel or ap_sum)
begin sum=psel?ap_sum:16'b0; end endmodule module reg16(r,clk,rst,e,q);
input [15:0] r;
input clk,rst,e;
output reg [15:0] q;
always@(posedge clk or negedge rst) begin
if(rst==0) q<=0;
else if(e) q<=r;
end
endmodule
module Mult2(clock,reset,s,z,b0,ea,eb,ep,psel,done); input clock,reset,s,z,b0;
output reg done;
output reg ea,eb,ep,psel;
reg [1:0] t,y;
parameter S1=2'b00,S2=2'b01,S3=2'b10;
always @(s or t or z)
begin: state_table
case(t)
S1: if(s==0) y=S1; else y=S2;
S2: if(z==0) y=S2; else y=S3;
S3: if(s==1) y=S3; else y=S1;
default: y=2'bxx;
endcase
end
always@(posedge clock or negedge reset)
begin: state_flipflops
if(reset==0) t<=S1;
else t<=y;
end
always@(s or t or b0)
begin: fsm_outputs
ea=0;eb=0;ep=0;done=0;psel=0;
case(t)
S1:ep=1;
S2:begin ea=1;eb=1;psel=1;if(b0) ep=1;else ep=0;end S3:done=1;
endcase
end
endmodule
顶层原理图:
也可以使⽤Verilog HDL例化模块代替顶层原理图,代码如下:
module Mult2(DataA,LA,DataB,LB,clk,reset,start,p,Done);
input [7:0] DataA,DataB;
input LA,LB,clk,reset,start;
output [15:0] p;
output Done;
wire EA,EB,EP,ER,psel,qb,zb;
wire [15:0] qa,sum;
multshift_cntrl
f0(.clock(clk),.reset(reset),.s(start),.z(zb),.b0(qb),.ea(EA),.eb(EB),.ep(EP),.psel(psel),.done(Done)); shifta f1(.r(DataA),.l(LA),.e(EA),.clk(clk),.q(qa));
shiftb f2(.r(DataB),.l(LB),.e(EB),.clk(clk),.q0(qb),.z(zb));
sum f3(.a(qa),.p(p),.psel(psel),.sum(sum));
reg16 f4(.r(sum),.clk(clk),.rst(reset),.e(EP),.q(p));
endmodule
资源耗⽤情况:
RTL图:
顶层:
Shifta: shiftb:
ModelSim测试激励⽂件源代码:`timescale 10ns/1ns
module Mult2_test();
reg [7:0] a,b;
reg reset,clk,start,la,lb;
wire done;
wire [15:0] outcome;
u1(.DataA(a),.LA(la),.DataB(b),.LB(lb),.clk(clk),.reset(reset),.start(start),.p(outcome),.Done(done)); parameter delay=2; integer i;
initial
begin
a=0;
b=0;
reset=0;
start=0;
la=0;
lb=0;
clk=0;
i=0;
end
initial forever
begin
#delay
clk=~clk;
i=i+1;
if(i==50)
$stop;
end
initial
begin
#delay
#delay
#delay
#delay
#delay
reset=1;
#delay
a=62;
b=40;
start=1;
la=1;
#delay
#delay
start=0;;
la=0;
lb=0;
#delay
#delay
a=0;
b=0;
end
endmodule
ModelSim仿真结果波形图:
结果分析:
在综合报表中可以看到,移位相加乘法器实现⼋位乘法器仅仅使⽤了50个LE单元和43个寄存器。
在不使⽤嵌⼊式硬件乘法器的情况下,移位相加乘法器相⽐于并⾏乘法器更节省资源,这随操作数位数的增加⽽越发明显。
⽽其缺点则在于,由于需要进⾏逐步移位,因⽽需要⼀定的时间来完成两数相乘操作。
从ModelSim仿真波形可以看出,从开始到完成需要经历8个时钟周期。
3.查找表乘法器
顶层原理图:
LMP_ROM模块是使⽤Quartus II⾃带宏模块⾃动⽣成的,其中包含了⼀个256字节的ROM 存储器。
存储器内存放乘积结果,需要使⽤⽂件(Mult3_rom.mif)进⾏初始化,⽤来实现乘法功能。
mif⽂件⽣成⽅法有很多种,常⽤的有Matlab,C语⾔等,也可以直接⽤⽂本编辑软件(如记事本)按照规律直接输⼊。
笔者使⽤LabVIEW软件⽣成该mif⽂件,程序如下图所⽰。
程序运⾏后会在程序所在⽬录⽣成所需⽂件(Mult3_rom.mif)。
也可以使⽤Verilog HDL例化模块代替顶层原理图,代码如下:module Mult3(a,b,clk,outcome);
input [3:0] a,b;
input clk;
output [7:0] outcome;
wire [7:0] din;
assign din[7:4]=a;
assign din[3:0]=b;
LMP_ROM u1(.address(din),.clock(clk),.q(outcome)); Endmodule
资源耗⽤情况:
RTL图:
由于需要调⽤Quartus II内置的LPM_ROM宏模块,所以⽆法⽤ModelSim进⾏仿真。
使⽤直接使⽤Quartus II进⾏时序仿真,结果如下图:
结果分析:
查找表乘法器将乘积结果直接存放在存储器中,将操作数作为地址访问存储器,得到的输出数据就是乘法的结果。
查找表乘法器速度只局限于是使⽤的存储器的存取速度,查找表的规模随操作数位数的增加⽽迅速增⼤。
如上述例⼦所⽰,实现四位操作数乘法需要ROM⼤⼩为256字节;若⽤查找表⽅式实现⼋位操作数乘法,则需要存储器⼤⼩须增⾄256K字节。
因此,查找表法只适合于操作数位数⽐较⼩的情况。
4.加法树乘法器
源代码:
module Mult4(outcome,a,b,clk);
input [7:0] a,b;
input clk;
output wire [15:0]outcome;
wire [14:0] out1,c1;
wire [12:0] out2;
wire [10:0] out3,c2;
wire [8:0] out4;
reg [14:0] temp0;
reg [13:0] temp1;
reg [12:0] temp2;
reg [11:0] temp3;
reg [10:0] temp4;
reg [9:0] temp5;
reg [8:0] temp6;
reg [7:0] temp7;
function [7:0] mult8x1;
input [7:0] operand;
input sel;
begin
mult8x1=(sel)?(operand):8'b0; end
endfunction
always@(posedge clk)
begin
temp7<=mult8x1(a,b[0]);
temp6<=((mult8x1(a,b[1]))<<1); temp5<=((mult8x1(a,b[2]))<<2); temp4<=((mult8x1(a,b[3]))<<3); temp3<=((mult8x1(a,b[4]))<<4); temp2<=((mult8x1(a,b[5]))<<5); temp1<=((mult8x1(a,b[6]))<<6); temp0<=((mult8x1(a,b[7]))<<7); end assign out1=temp0+temp1; assign out2=temp2+temp3; assign out3=temp4+temp5; assign out4=temp6+temp7;
assign c1=out1+out2;
assign c2=out3+out4;
assign outcome=c1+c2; endmodule
资源耗⽤情况:
RTL图:
ModelSim仿真激励⽂件源代码:`timescale 10ns/1ns module Mult4_test();
reg [7:0] a,b;
reg clk;
wire [15:0] outcome;
Mult4 u1(outcome,a,b,clk); parameter delay=2; initial
begin
a=0;
b=0;
clk=0;
end
initial forever
begin
#delay
clk=~clk;
if(b==16)
$stop;
end
initial forever
begin
#delay
#delay
a=a+1;
end
initial forever
begin
#delay
#delay
#delay
#delay
b=b+1;
end
endmodule
ModelSim仿真结果波形图:
结果分析:
加法树乘法器结合了移位相加乘法器和查找表乘法器的有点,能在⼀个时钟周期内完成两数相乘,提⾼了运算速度。
但是加法器乘法器需要增加若⼲个寄存器以暂存数据,增加了芯⽚资源耗⽤。