当前位置:文档之家› 数字电路课程设计之乘法器

数字电路课程设计之乘法器

基于Verilog 的乘法器设计一、设计目标使用Verilog 语言实现4bit*4bit 乘法器设计,并使用Quartes 编写程序,使用modelsin 进行仿真验证设计二、基本原理2.1半加器半加器是为两输入两输出的加法电路,输入无进位,真值表如下图所示,输入X,Y,输出C,SX Y C S 0 0 0 0 0 1 0 1 1 0 0 1 111最简积之和式为 S=X`Y+XY`=X ○+Y;C=XY. 电路图为:2.2全加器全加器是为三输入两输出,输入存在进位,真值表如下图所示,输入X,Y,Z,输出C,SX Y Z C S 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 11111化简最简积之和式为:S=X`Y`Z+X`YZ`+XY`Z`+XYZ; C=XY+XZ+YZ; 通过使用半加器组成全加器进行化简为:S=Z(X`Y`+XY)+Z`(X`Y+XY`)=Z(X ○+Y)`+Z`(X ○+Y)=X ○+Y ○+Z123YX C123123Y X`X Y`123S123C123X YSguan tian liangC 的卡诺图如下图X YZ 00 01 11 10 0 0 0 1 0 1111按两两结合 C=XY+YZ+XZ 换一种结合方式 C= XY+XY`Z+X`YZ=Z(XY`+X`Y)+XY=Z(X ○+Y)+XY 电路图如下所示(使用两个半加器与一个或门)123123X Y123123SZ123C多位二进制加法实现 2.2.1 行波进位加法器B2A3B3C3C4C2C1C0S0S1S2S3FA FALL_ADD A1B2Cout 3Cin4S5FA FALL_ADD A1B2Cout 3Cin4S5FAFALL_ADDA1B2Cout 3Cin4S5FAFALL_ADD A1B 2Cout 3Cin4S5A0B0A1B1A2行波进位加法器优点在于结构逻辑简单,缺点速度很慢,在最坏情况下,进位必须从最低有效位传到最高有效加法器,假设同时给出所有加数位,则总的最长延迟为:CinSCinCout ABCout ADD t t n t t +⨯−+=)2(ABCoutt 为最低有效级上从A 或B 到Cout 的延迟,CinCoutt 为中间级上Cin 与Cout 的延迟,CinSt 为最高有效位上从Cin 到S 的延迟。

2.2.2超前进位加法器Gi 123123BiAi 123123PiSiCi123Ci+1从上图可以得到以下表达式Pi=Ai ○+Bi ; Gi=AiBi ;可以得到输出与进位表达Si=Pi ○+Ci ; Ci+1=Gi+PiCi ;Gi 为进位产生,不管输入进位Ci 为什么,只要Ai 与Bi 为1时,它将产生进位。

Pi 称为进位传输,因为它与从Ci 到Ci+1的进位传输有关输入进位=0C 0001C P G C +=001011000111112)(C P P G P G C P G P G C P G C ++=++=+=0012012122111222223)(C P P P G P P G P G C P G P G C P G C +++=++=+=0012301231232333334C P P P P G P P P G P P G P G C P G C ++++=+=注意C4并不需要等待C3,实际上C4,C3,C2,C1同时传输 超前进位产生的电路逻辑图123412341234512345123456G2G3C0P3P2G0123123123P11231231234P012345123456C1C2C3C4G11234带超前进位的四位加法器P0A0S1S2S3C0P1A1G1123123B1A2P2G2123123B2123A3P3G3123123B3123123123C0C1C2C3C4G0P0G1C0P1P0G2C1P1P2C2超前进位产生电路U?CLAP31G32P23G24P15G16P07G08C09C010C111C212C313C414P2G3C3P3P3S0123G0123B02.3乘法器原理:2*2位普通二进制乘法器与十进制数乘法操作类似如下图B0 B1 A0 A1A1B0 A1B1A0B0 A0B1 C3C2 C1 C02*2乘法器中HF 为半加器123123123123A1A0B0B1B0B1A1B0A1B1C0A0B1A0B0HAa1b2s 3c4HAa1b2s3c4C1C2C3多位二进制乘法器的组合电路可以用类似方式来构造.一位乘数和被乘数的每位相与,乘数多少位就有多少级门电路。

每一级与门的二进制输出与前一级的部分积相加,产生一个新的部分积。

最后一级就是乘积。

对于J 位乘数和K 位被乘数,我们需要J*K 个与门和(J-1)个K 位加法器来产生J+K 位的乘积4bit*4bit 乘法器逻辑图如下图所示C2C7123123123B0B1123B2B3A3四位加法器A 01A 12A 23A 34B 05B 16B 27B 38C 09C 110C 211C 312C 413C1四位加法器A 01A 12A 23A 34B 05B 16B 27B 38C 09C 110C 211C 312C 4130B0123123123123B0B1B1B2123123123123B1B0B3B2A2B3B2四位加法器A 01A 12A 23A 34B 05B 16B 27B 38C 09C 110C 211C 312C 413B3A0A1123C3C0C4123C5123C6123三、程序结构3.1半加器程序设计module Half_Add (a,b,s,c); input a,b; outputs,c;assign s=a ^ b;assignc=a & b;endmodule 3.2全加器程序设计//module Fall_Add (cin,a,b,s,cout); // input cin,a,b; // output s,cout;//assign{cout,s}=a+b+cin;//endmodule//调用半加器实现全加器 module Fall_Add (cin,a,b,s,cout); input cin,a,b;outputs,cout;wire w1,w2,w3;Half_Add U1 ( .s(w1),.c(w2),.a(a),.b(b));Half_Add U2 ( .s(s),.c(w3),.a(w1),.b(cin));or U3 (cout,w3,w2);endmodule3.3超前进位产生电路程序设计module carry_look (C0,P0,G0,P1,G1,P2,G2,P3,G3,C1,C2,C3,C4);input C0,P0,G0,P1,G1,P2,G2,P3,G3;output C1,C2,C3,C4;assign C1=G0|(P0&C0);assign C2=G1|(P1&G0)|(P1&P0&C0);assign C3=G2|(P2&G1)|(P2&P1&G0)|(P2&P1&P0&C0);assign C4=G3|(P3&G2)|(P3&P2&G1)|(P3&P2&P1&G0)|(P3&P2&P1&P0&C0);endmodule3.4 超前进位全加器程序设计module carry_look_add(A,B,Cin,Cout,S);input [3:0] A,B;input Cin;output [3:0] S;output Cout;wire v1,v2,v3,v4,v5,v6,v7,v8;wire o1,o2,o3;Half_Add H1(.a(A[0]),.b(B[0]),.s(v2),.c(v1));Half_Add H2(.a(A[1]),.b(B[1]),.s(v4),.c(v3));Half_Add H3(.a(A[2]),.b(B[2]),.s(v6),.c(v5));Half_Add H4(.a(A[3]),.b(B[3]),.s(v8),.c(v7));carry_lookCL1(.C0(Cin),.P0(v2),.G0(v1),.P1(v4),.G1(v3),.P2(v6),.G2(v5),.P3(v8),.G3(v7),.C1(o1),.C2(o2),.C3(o3),.C4(Cout));xor (S[0],Cin,v2);xor (S[1],o1,v4);xor (S[2],o2,v6);xor (S[3],o3,v8);endmodule3.5 4bit*4bit乘法器程序设计module mul (A,B,S);input [3:0] A,B;output[7:0] S;wire [3:0] v,w,z,x;wire [4:0] d,d1,d2;not no1 (w[3],1'd1);and (S[0],A[0],B[0]);and (w[0],A[0],B[1]);and (w[1],A[0],B[2]);and (w[2],A[0],B[3]);and (v[0],A[1],B[0]);and (v[1],A[1],B[1]);and (v[2],A[1],B[2]);and (v[3],A[1],B[3]);carry_look_add cla1 (.A(v),.B(w),.Cin(0),.Cout(d[4]),.S(d[3:0]));assign S[1]= d[0];and (z[0],A[2],B[0]);and (z[1],A[2],B[1]);and (z[2],A[2],B[2]);and (z[3],A[2],B[3]);carry_look_add cla2 (.A(d[4:1]),.B(z),.Cin(0),.Cout(d1[4]),.S(d1[3:0]));assign S[2]=d1[0];and (x[0],A[3],B[0]);and (x[1],A[3],B[1]);and (x[2],A[3],B[2]);and (x[3],A[3],B[3]);carry_look_add cla3 (.A(d1[4:1]),.B(x),.Cin(0),.Cout(d2[4]),.S(d2[3:0]));assign S[7:3]=d2[4:0];endmodule3.6 Verilog测试平台语言编写`timescale 1ns/1psmodule mul_tb();reg[3:0] A,B;wire [7:0] S;mul mu (.A(A),.B(B),.S(S));initial begin#10 A=4'd0;B=4'd0;#10 A=4'd11;B=4'd1;#10 A=4'd10;B=4'd12;#10 A=4'd11;B=4'd4;#10 A=4'd15;B=4'd15;#100$stop;endendmodule四、RTL_view4.1整体结构4.2 超前进位全加器结构4.3超前进位产生电路结构4.4半加器程序结构五、仿真结果对比仿真结果与理论计算,此实验成功六、结语本次课程设计加强了加法器的基本模块熟悉程度,使用半加器,全加器,超前进位加法器实现一个4bit*4bit乘法器,此次实验非常重要,具有非常高的理论性极大的锻炼了动手能力;本次课设使用Verilog 语言在quartus-ii软件调试,最终在modelsim实现,感觉老师的支持,在调试过程中犯了许多小问题,如将英文逗号写成中文逗号将调试不能通过。

相关主题