当前位置:文档之家› 先行进位加法器教材

先行进位加法器教材

实验四32 位先行进位加法器一、功能概述串行进位加法器延时很大,每级的输出结果都要等上一级的进位到来才可以求和算出结果,这次实验对普通全加器进行改良,改良为先行进位加法器。

先行进位加法器,各级的进位彼此是独立产生,只与输入数据A, B 和C_in 有关,将各级间的进位级联传播给去掉了,这样就可以减小进位产生的延时。

每个等式与只有三级延迟的电路对应,第一级延迟对应进位产生信号和进位传递信号,后两级延迟对应上面的积之和。

通过这种进位方式实现的加法器称为超前进位加法器。

因为各个进位是并行产生的,所以是一种并行进位加法器。

二、实验原理1、设二进制加法器第i位为A i, B i,输出为S,进位输入为C i, 进位输出为C i+i,则有:S=A i ㊉B i ㊉C i(1-1)C i+1 =A i * B i+ A i *C i+ B i*C i =A i * B i+(A i+B i)* C i(1-2)令G i = A i * B i , P i = A i+B i,贝y C i+1= G i+ P i *C i当A i和B i都为1时,G i = 1 ,产生进位C i+i = 1当A i和B i有一个为1时,P i = 1,传递进位C i+i= C i因此G i定义为进位产生信号,P i定义为进位传递信号。

G i的优先级比P i 高,也就是说:当G i = 1时(当然此时也有P i = 1),无条件产生进位,而不管C i 是多少;当G i=0 而P i=1 时,进位输出为C i,跟C i之前的逻辑有关。

下面推导 4 位超前进位加法器。

设 4 位加数和被加数为 A 和B,进位输入为C in,进位输出为C out,对于第i位的进位产生G i = A i •B i,进位传递P i=A i+B i , i=0,1,2,3。

于是这各级进位输出,递归的展开Ci,有:C0 = C inG=G o + P o •C oC2=G 1 + P1 •C 1 = G 1 + P1 •G 0 + P1 •P o ?C oC3=G 2 + P2 •C 2 = G2 + P2, G 1 + P2 •P1 •G o +P2 •P1 •P o •C oC4=G 3 + P3 •C 3 = G3 + P3, G 2 + P3 •P2 •G 1 +P3 •P 2 •P1 •G o + P 3 P2 •P1•P o •C o (1-3)C out=C4由此可以看出,各级的进位彼此独立产生,只与输入数据Ai、Bi 和Cin 有关。

2、接口说明序号 接口信号名称方向说明备注1 A[31:0] I 输入数据2 B[31:0] I 输入数据3 S[31:0] O 加法结果4countO最高位进位3、结构框图三、实验方案方案一:分为两个模块:1个4位add_4和1个add_32,其中add_32 调用4个add_4.首先设计4位超前进位加法器:框图如下:设计好四位的之后,开始调用四位的实现32位的方案二:分为五个模块:(1)计算传播值和产生值模块:|L —7 \4位 ^28 4位C^4 4位 - 4位CLACLAA15~12 B 15~12 A11~8 B11~8 A7~4 B 7-4 A3~o B 3~014位L CLAC 12 4位 CLA4位 CLAC4<-l 4位 CLA1 F 1 r卄* g x1 p x1 C 16g x1g x0 Px0C s24位 BCLApgr 5 CLA CLA 9~16g m4 P m4g m7 P m7P m6 gm5 pm54位 BCLAA31~28 B 31~28 A27~24 B 27~24 A23~20 B23~20 A19~16 B 19~161~8gm0 P mO16 位1 f f S7~4gm2Pm24位 BCLAmlPm1* * Si5~i2 g m3P m31 T S3~0模块(2)超前进位模块:cla 模块(3)加法求和模块:sum 模块(4)求和并按输出a,b,c_in 分组:bit_slice 模块(5)32 位超前进位加法器总模块:cla_32 总框图:四、验证方案:对32 位的两个输入赋值:当a=32'b1000_0001_0111_1011_1101_1001_1101_1000;b=32'b0111_1000_ 0001_ 1000_ 1100_ 0111_ 0101_ 0001;c_in=1'b0;结果:s=32'b11111001;_1001 _1001 _0100 _1010 _0001 _0010_当a=32'b1000_0001_1000;0111_ 1011_ 1101_ 1001_ 1101_0001;b=32'b0111_1000_0001_ 1000_ 1100_ 0111_ 0101_c_in=1'b1;结果:s=32'b1111 _1001 _1001 _0100 _1010 _0001 _0010_ 1010; 来对波形进行观察,看波形是否正确。

五、实验代码:方案一:(1)add_32 模块顶层模块:(2) 4位add_4模块方案二:(1) cla_32顶层模块:module cla_32(a,b,c_in,s,count ); input [31:0] a,b;input c_in;output [31:0] s;output count;wire [7:0] gg,gp,gc;wire [3:0] ggg,ggp,ggc;wire gggg,gggp;bit_sliceb1(.a(a[3:0]),.b(b[3:0]),.c_in(gc[0]),.s(s[3:0]),.gp(gp[0]),.gg(gg[0 ])); bit_sliceb2(.a(a[7:4]),.b(b[7:4]),.c_in(gc[1]),.s(s[7:4]),.gp(gp[1]),.gg(gg[1 ])); bit_sliceb3(.a(a[11:8]),.b(b[11:8]),.c_in(gc[2]),.s(s[11:8]),.gp(gp[2]),.gg(g g[2]) );bit_sliceb4(.a(a[15:12]),.b(b[15:12]),.c_in(gc[3]),.s(s[15:12]),.gp(gp[3]),.g g(g g[3]));bit_sliceb5(.a(a[19:16]),.b(b[19:16]),.c_in(gc[4]),.s(s[19:16]),.gp(gp[4]),.g g(g g[4]));bit_sliceb6(.a(a[23:20]),.b(b[23:20]),.c_in(gc[5]),.s(s[23:20]),.gp(gp[5]),.gg(gg[5]));bit_sliceb7(.a(a[27:24]),.b(b[27:24]),.c_in(gc[6]),.s(s[27:24]),.gp(gp[6]), .gg(g g[6]));bit_sliceb8(.a(a[31:28]),.b(b[31:28]),.c_in(gc[7]),.s(s[31:28]),.gp(gp[7]), .gg(g g[7]));clac0(.p(gp[3:0]),.g(gg[3:0]),.c_in(ggc[0]),.c(gc[3:0]),.gp(ggp[0]),.gg (ggg[ 0]));clac1(.p(gp[7:4]),.g(gg[7:4]),.c_in(ggc[1]),.c(gc[7:4]),.gp(ggp[1]),.gg (ggg[1]));assign ggp[3:2]=2'b11;assign ggg[3:2]=2'b00;cla c2(.p(ggp),.g(ggg),.c_in(c_in),.c(ggc),.gp(gggp),.gg(gggg)); assign count=gggg|(gggp&c_in);endmodule2)pg 模块:module pg(a,b,p,g);input [3:0] a,b;output [3:0] p,g;assign p=a A b;assign g=a&b;endmodule(3) cla 模块:module cla(p,g,c_in,c,gp,gg); input [3:0] p,g;input c_in;output [3:0] c;output gp,gg;function [99:0] do_cla;input [3:0] p,g;input c_in;begin:labelinteger i;reg gp,gg;reg [3:0] c;gp=p[0];gg=g[0];c[0]=c_in;for(i=1;i<4;i=i+1)begingp=gp&p[i];gg=(gg&p[i])|g[i]; c[i]=(c[i-1]&p[i-1])|g[i-1]; end do_cla={c,gp,gg};endendfunctionassign {c,gp,gg}=do_cla(p,g,c_in);endmodule( 4) sum 模块:module sum(a,b,c,s );input [3:0] a,b,c;output [3:0] s;wire [3:0] t=a A b;assign s=tAc;endmodule5) bit_slice 模块:module bit_slice(a,b,c_in,s,gp,gg ); input [3:0] a,b;input c_in;output [3:0] s;output gp,gg;wire [3:0]p,g,c;pg i1(a,b,p,g);cla i2(p,g,c_in,c,gp,gg);sum i3(a,b,c,s);endmodule(6)激励代码:module cla32_tb;// Inputsreg [31:0] a;reg [31:0] b;reg c_in;// Outputswire [31:0] s;wire count;// Instantiate the Unit Under Test (UUT) cla_32 uut ( .a(a),.b(b),.c_in(c_in),.s(s),.count(count));initial begin// Initialize Inputsa = 0;b = 0;c_in = 0;// Wait 100 ns for global reset to finish#10a=32'b1000_ 0001 0111 1011_ 1101_ 1001 1101 _1000;b=32'b0111_ 1000 0001 1000_ 1100_ 0111 0101 _0001;c_in=1'b0;#10a=32'b1000_ 0001 0111 1011_ 1101_ 1001 1101 _1000;b=32'b0111_ 1000 0001 1000_ 1100_ 0111 0101 _0001;c_in=1'b1;// Add stimulus here end endmodule 六、波形图说明1、仿真波形2、结果说明对于三个输入:a=32'b1000_0001_0111_1011_1101_1001_1101_1000;b=32'b0111_1000_0001_1000_1100_0111_0101_0001; c_in=1'bO;结果与实验方案的相同,结果仿真正确.七、实验总结 对于这次实验,自己在老师布置完,努力做了几个下午,不 断调试才得到正确结果波形,是非常有收获的。

相关主题