各种乘法器比较.pdf

上传人:李医生 文档编号:6083652 上传时间:2020-09-06 格式:PDF 页数:14 大小:456.13KB
返回 下载 相关 举报
各种乘法器比较.pdf_第1页
第1页 / 共14页
各种乘法器比较.pdf_第2页
第2页 / 共14页
各种乘法器比较.pdf_第3页
第3页 / 共14页
各种乘法器比较.pdf_第4页
第4页 / 共14页
各种乘法器比较.pdf_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《各种乘法器比较.pdf》由会员分享,可在线阅读,更多相关《各种乘法器比较.pdf(14页珍藏版)》请在三一文库上搜索。

1、各种乘法器比较各种乘法器比较 韦其敏 08321050 引言:乘法器频繁地使用在数字信号处理和数字通信的各种算法中,并往往影响着整个 系统的运行速度。如何实现快速高效的乘法器关系着整个系统的运算速度和资源效率。 本位用如下算法实现乘法运算:并行运算、移位相加、查找表、加法树。并行运算是纯 组合逻辑实现乘法器,完全由逻辑门实现;移位相加乘法器将乘法变为加法,通过逐步 移位相加实现;查找表乘法器将乘积结果存储于存储器中,将操作数作为地址访问存储 器,得到的输出数据就是乘法运算结果;加法树乘法器结合移位相加乘法器和查找表乘 法器的优点,增加了芯片耗用,提高运算速度。 注:笔者使用综合软件为 Quar

2、tus II 9.1,选用器件为 EP2C70,选用 ModelSim SE 6.1b 进 行仿真,对于其他的软硬件环境,需视具体情况做对应修改。 汇总的比较汇总的比较: RTL 图图 耗用资源耗用资源 仿真结果仿真结果 优缺点比较优缺点比较 并行乘法器并行乘法器 8X8 嵌入式硬件 乘法器 1 个逻辑单 元 1 个硬件乘 法器 输入数据变化 时输出结果马 上更新 速度快, 实现代码简 单明了 操作数位数较宽时, 不适用没有硬件乘 法器的器件 移位相加乘法器移位相加乘法器 8X8 数据选择器 数据寄存器 加法器 状态机 50 个逻辑单 元 43 个寄存器 对于 8 位的操 作数,需要 8 个时

3、钟周期进 行运算 耗用资源相对较少 运算速度比较慢 查找表乘法器查找表乘法器 4X4 ROM 数据存 储器 256 字节的 ROM 需要大约两个 半时钟周期 速度仅取决于 ROM 存取速度 位数较宽时需要非 常大的 ROM 加法树乘法器加法树乘法器 8X8 数据选择器 数据寄存器 加法器 126 个逻辑 单元 64 个寄存器 运算结果在一 个时钟周期内 完成更新 结合了查找表和移 位相加的优点, 速度 比较快 增加了芯片耗用 详细实现过程:详细实现过程: 1. 并行乘法器并行乘法器 源代码: module Mult1(outcome,a,b); parameter MSB=8; input M

4、SB:1 a,b; output 2*MSB:1 outcome; assign outcome=a*b; endmodule 资源耗用情况: RTL 图: 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=16h0F

5、FF) $stop; x A7.0 B7.0 MULTIPLIER Mult0 outcome16.1 a8.1 b8.1 end endmodule 仿真时序波形: 结果分析: DE2-70 拥有 300 个嵌入式硬件乘法器单元,Quartus II 综合并行乘法器时自动采用嵌入式乘 法器来实现,因此中和报表中仅耗用了一个 LE 单元和一个九位的嵌入式乘法器单元。如果 把器件改成 Cyclone 系列的 EP1C3,则由于该器件没有内嵌硬件乘法器,综合实现并行乘法 器所耗用的 LE 单元数需要 106 个,如下图所示: 并行乘法器可以看作是纯组合逻辑电路, 依靠组合逻辑实现两数相乘, 这种方

6、法能在输入数 据改变时立即得到相乘结果,延时很短,但是耗用的资源随操作数位数的增加而迅速变多。 并行乘法器实现代码非常简短,适用于器件内有嵌入式硬件乘法器的情况。 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=81b0,r; always(posedge clk) begin if(l) q=r16; else if(e) begin q0=1b0; for(k=1;k16

7、;k=k+1)qk=qk-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; integer k; always(posedge clk) begin if(l) q0;k=k-1) qk-1=qk; q7=1b0; end end assign z=(q=0); assign q0=q0; endmodule module sum(a,p,psel,sum); input 15:0 a,p; input psel; output 15:0

8、 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:16b0; 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 m

9、odule 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=2b00,S2=2b01,S3=2b10; 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=

10、S1; default: y=2bxx; 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 顶

11、层原理图: 也可以使用 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(E

12、A),.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 资源耗用情况: VCC LA INPUT VCC LB INPUT VCC

13、clk INPUT VCC reset INPUT VCC start INPUT VCC DataA7.0 INPUT VCC DataB7.0 INPUT P15.0 OUTPUT Done OUTPUT S100Unsigned Binary S201Unsigned Binary S310Unsigned Binary Parameter ValueType clock reset s z b0 ea eb ep psel done multshift_cntrl inst r15.0 clk rst e q15.0 reg16 inst1 r7.0 l e clk q15.0 shi

14、fta inst2 r7.0 l e clk q0 z shiftb inst3 a15.0 p15.0 psel sum15.0 sum inst4 RTL 图: 顶层: Shifta: shiftb: multshift_cntrl: t: Sum: Reg16: b0 clock reset s z done ea eb ep psel clk e l r7.0 q15.0 clk e l r7.0 q0 z psel a15.0 p15.0 sum15.0 clk e rst r15.0 q15.0 multshift_cntrl:f0 shifta:f1 shiftb:f2 sum:

15、f3 reg16:f4 LA LB clk reset start Done DataA7.0 DataB7.0 p15.0 DQ PRE ENA CLR SEL DATAA DATAB OUT0 MUX21 SEL DATAA DATAB OUT0 MUX21 l e clk r7.0 q15.0 q15.0reg0 q31.16 8 h00 - q15.0 1 h0 - = A7.0 B7.0 EQUAL DQ PRE ENA CLR SEL DATAA DATAB OUT0 MUX21 SEL DATAA DATAB OUT0 MUX21 Equal0 8 h00 - q7.0 q15.

16、8 l e clk q0 z r7.0 q7.0 1 h0 - clk reset s z S1 S2 S3 SEL2.0 DATA2.0 OUT SELECTOR Selector3 1 h1 - 1 h0 - clock reset s z ea eb ep psel done b0 t S1S2S3 t1 + A15.0 B15.0 ADDER SEL DATAA DATAB OUT0 MUX21 Add0 psel a15.0 p15.0 sum15.0 sum15.0 16 h0000 - DQ PRE ENA CLR q15.0reg0 clk rst e r15.0q15.0 M

17、odelSim 测试激励文件源代码: timescale 10ns/1ns module Mult2_test(); reg 7:0 a,b; reg reset,clk,start,la,lb; wire done; wire 15:0 outcome; Mult2 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;

18、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; lb=1; #delay #delay start=0; la=0; lb=0; #delay #delay a=0; b=0; end endmodule ModelSim 仿真结果波形图: 结果分析: 在综合

19、报表中可以看到,移位相加乘法器实现八位乘法器仅仅使用了 50 个 LE 单元和 43 个 寄存器。 在不使用嵌入式硬件乘法器的情况下, 移位相加乘法器相比于并行乘法器更节省资 源,这随操作数位数的增加而越发明显。而其缺点则在于,由于需要进行逐步移位,因而需 要一定的时间来完成两数相乘操作。从 ModelSim 仿真波形可以看出,从开始到完成需要经 历 8 个时钟周期。 3. 查找表查找表乘法器乘法器 顶层原理图: LMP_ROM 模块是使用 Quartus II 自带宏模块自动生成的,其中包含了一个 256 字节的 ROM 存储器。存储器内存放乘积结果,需要使用文件(Mult3_rom.mif

20、)进行初始化,用来实现 乘法功能。mif 文件生成方法有很多种,常用的有 Matlab,C 语言等,也可以直接用文本编 辑软件(如记事本)按照规律直接输入。笔者使用 LabVIEW 软件生成该 mif 文件,程序如下 图所示。程序运行后会在程序所在目录生成所需文件(Mult3_rom.mif) 。 VCC a3.0 INPUT VCC b3.0 INPUT VCC clk INPUT 8 bits 256 words Block type: AUTO address7.0 clock q7.0 LMP_ROM inst outcome7.0 OUTPUT din3.0 din7.0 din7.

21、4 也可以使用 Verilog HDL 例化模块代替顶层原理图,代码如下: module Mult3(a,b,clk,outcome); input 3:0 a,b; input clk; output 7:0 outcome; wire 7:0 din; assign din7:4=a; assign din3:0=b; LMP_ROM u1(.address(din),.clock(clk),.q(outcome); Endmodule 资源耗用情况: RTL 图: clock address7.0 q7.0 LMP_ROM:u1 clk a3.0 b3.0 outcome7.0 由于需要

22、调用 Quartus II 内置的 LPM_ROM 宏模块, 所以无法用 ModelSim 进行仿真。 使用直 接使用 Quartus II 进行时序仿真,结果如下图: 结果分析: 查找表乘法器将乘积结果直接存放在存储器中, 将操作数作为地址访问存储器, 得到的输出 数据就是乘法的结果。 查找表乘法器速度只局限于是使用的存储器的存取速度, 查找表的规 模随操作数位数的增加而迅速增大。如上述例子所示,实现四位操作数乘法需要 ROM 大小 为 256 字节;若用查找表方式实现八位操作数乘法,则需要存储器大小须增至 256K 字节。 因此,查找表法只适合于操作数位数比较小的情况。 4. 加法树乘法器

23、加法树乘法器 源代码: module Mult4(outcome,a,b,clk); input 7:0 a,b; input clk; output wire 15:0outcome; 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

24、 mult8x1; input 7:0 operand; input sel; begin mult8x1=(sel)?(operand):8b0; end endfunction always(posedge clk) begin temp7=mult8x1(a,b0); temp6=(mult8x1(a,b1)1); temp5=(mult8x1(a,b2)2); temp4=(mult8x1(a,b3)3); temp3=(mult8x1(a,b4)4); temp2=(mult8x1(a,b5)5); temp1=(mult8x1(a,b6)6); temp0=(mult8x1(a,b

25、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;

26、Mult4 u1(outcome,a,b,clk); parameter delay=2; initial begin a=0; b=0; clk=0; end initial forever + A14.0 B14.0 ADDER + A12.0 B12.0 ADDER + A10.0 B10.0 ADDER + A8.0 B8.0 ADDER + A14.0 B14.0 ADDER + A10.0 B10.0 ADDER + A15.0 B15.0 ADDER DQ PRE ENA CLR DQ PRE ENA CLR DQ PRE ENA CLR DQ PRE ENA CLR DQ PR

27、E ENA CLR DQ PRE ENA CLR DQ PRE ENA CLR DQ PRE ENA CLR SEL DATAA DATAB OUT0 MUX21 SEL DATAA DATAB OUT0 MUX21 SEL DATAA DATAB OUT0 MUX21 SEL DATAA DATAB OUT0 MUX21 SEL DATAA DATAB OUT0 MUX21 SEL DATAA DATAB OUT0 MUX21 SEL DATAA DATAB OUT0 MUX21 SEL DATAA DATAB OUT0 MUX21 Add0 1 h0 - Add1 1 h0 - Add2

28、1 h0 - Add3 1 h0 - Add4 2 h0 - Add5 2 h0 - Add6 1 h0 - 5 h00 - temp014.0 7 h00 - temp113.0 6 h00 - temp212.0 5 h00 - temp311.0 4 h0 - temp410.0 3 h0 - temp59.0 2 h0 - temp68.0 1 h0 - temp77.0 mult8x17.0 8 h00 - mult8x115.8 8 h00 - mult8x123.16 8 h00 - mult8x139.32 8 h00 - mult8x147.40 8 h00 - mult8x

29、155.48 8 h00 - mult8x163.56 8 h00 - clk outcome15.0 a7.0 mult8x131.24 8 h00 - b7.0 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 仿真结果波形图: 结果分析: 加法树乘法器结合了移位相加乘法器和查找表乘法器的有点, 能在一个时钟周期内完成两数 相乘,提高了运算速度。但是加法器乘法器需要增加若干个寄存器以暂存数据,增加了芯片 资源耗用。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1