当前位置:文档之家› 各种乘法器比较

各种乘法器比较

各种乘法器比较韦其敏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/1nsmodule Mult1_test();reg [8:1] a,b;wire [16:1] outcome;Mult1 u1(outcome,a,b); parameter delay=2;initialbegina=1;b=0;endinitial foreverbegin#delaya=a+1;b=b+1;if(outcome>=16'h0FFF)$stop;endendmodule仿真时序波形:结果分析: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)beginif(l) q<=r16;else if(e)begin q[0]<=1'b0;for(k=1;k<16;k=k+1)q[k]<=q[k-1];endendendmodulemodule shiftb(r,l,e,clk,q0,z);input [7:0] r;input l,e,clk;output q0,z;reg [7:0] q;integer k;always@(posedge clk)beginif(l) q<=r;else if(e)beginfor(k=7;k>0;k=k-1)q[k-1]<=q[k];q[7]<=1'b0;endendassign z=(q==0);assign q0=q[0];endmodulemodule 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 endmodulemodule 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) beginif(rst==0) q<=0;else if(e) q<=r;endendmodulemodule 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_tablecase(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;endcaseendalways@(posedge clock or negedge reset)begin: state_flipflopsif(reset==0) t<=S1;else t<=y;endalways@(s or t or b0)begin: fsm_outputsea=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;endS3:done=1;endcaseendendmodule顶层原理图:也可以使用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_cntrlf0(.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/1nsmodule Mult2_test();reg [7:0] a,b;reg reset,clk,start,la,lb;wire done;wire [15:0] outcome;Mult2u1(.DataA(a),.LA(la),.DataB(b),.LB(lb),.clk(clk),.reset(reset),.start(start),.p(outcome),.Done(done)); parameter delay=2;integer i;initialbegina=0;b=0;reset=0;start=0;la=0;lb=0;clk=0;i=0;endinitial foreverbegin#delayclk=~clk;i=i+1;if(i==50)$stop;endinitialbegin#delay#delay#delay#delay#delayreset=1;#delaya=62;b=40;start=1;la=1;lb=1;#delay#delaystart=0;;la=0;lb=0;#delay#delaya=0;b=0;endendmoduleModelSim仿真结果波形图:结果分析:在综合报表中可以看到,移位相加乘法器实现八位乘法器仅仅使用了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进行时序仿真,结果如下图:结果分析:查找表乘法器将乘积结果直接存放在存储器中,将操作数作为地址访问存储器,得到的输出数据就是乘法的结果。

相关主题