先行进位加法器课件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四32位先行进位加法器
一、功能概述
串行进位加法器延时很大,每级的输出结果都要等上一级的进位到来才可以求和算出结果,这次实验对普通全加器进行改良,改良为先行进位加法器。
先行进位加法器,各级的进位彼此是独立产生,只与输入数据A,B 和C_in有关,将各级间的进位级联传播给去掉了,这样就可以减小进位产生的延时。
每个等式与只有三级延迟的电路对应,第一级延迟对应进位产生信号和进位传递信号,后两级延迟对应上面的积之和。
通过这种进位方式实现的加法器称为超前进位加法器。
因为各个进位是并行产生的,所以是一种并行进位加法器。
二、实验原理
1、设二进制加法器第i位为A i,B i,输出为S i,进位输入为C i,进位输出为C i+1,则有:
S i=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,则C i+1= G i+ P i *C i
当A i和B i都为1时,G i = 1,产生进位C i+1 = 1
当A i和B i有一个为1时,P i = 1,传递进位C i+1= 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 in
C1=G0 + P0·C0
C2=G1 + P1·C1 = G1 + P1·G0 + P1·P0▪C0
C3=G2 + P2·C2 = G2 + P2·G1 + P2·P1·G0 + P2·P1·P0·C0
C4=G3 + P3·C3 = G3 + P3·G2 + P3·P2·G1 + P3·P2·P1·G0 + P3·P2·P1·P0·C0 (1-3)
C out=C4
由此可以看出,各级的进位彼此独立产生,只与输入数据Ai、Bi和Cin有关。
2、接口说明
表1:32位超前进位加法器接口信号说明表
3、结构框图
三、实验方案
方案一:分为两个模块:1个4位add_4和1个add_32,其中add_32调
用4个add_4.
首先设计4位超前进位加法器:
框图如下:
设计好四位的之后,开始调用四位的实现32位的。
方案二:分为五个模块:(1)计算传播值和产生值模块:pg模块(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'b1111_1001_1001_0100_1010_0001_0010_1001;
当a=32'b1000_0001_0111_1011_1101_1001_1101_1000;
b=32'b0111_1000_0001_1000_1100_0111_0101_0001;
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_slice b1(.a(a[3:0]),.b(b[3:0]),.c_in(gc[0]),.s(s[3:0]),.gp(gp[0]),.gg(gg[0])); bit_slice b2(.a(a[7:4]),.b(b[7:4]),.c_in(gc[1]),.s(s[7:4]),.gp(gp[1]),.gg(gg[1])); bit_slice
b3(.a(a[11:8]),.b(b[11:8]),.c_in(gc[2]),.s(s[11:8]),.gp(gp[2]),.gg(gg[2]));
bit_slice
b4(.a(a[15:12]),.b(b[15:12]),.c_in(gc[3]),.s(s[15:12]),.gp(gp[3]),.gg(gg[3])); bit_slice
b5(.a(a[19:16]),.b(b[19:16]),.c_in(gc[4]),.s(s[19:16]),.gp(gp[4]),.gg(gg[4])); bit_slice
b6(.a(a[23:20]),.b(b[23:20]),.c_in(gc[5]),.s(s[23:20]),.gp(gp[5]),.gg(gg[5])); bit_slice
b7(.a(a[27:24]),.b(b[27:24]),.c_in(gc[6]),.s(s[27:24]),.gp(gp[6]),.gg(gg[6])); bit_slice
b8(.a(a[31:28]),.b(b[31:28]),.c_in(gc[7]),.s(s[31:28]),.gp(gp[7]),.gg(gg[7])); cla
c0(.p(gp[3:0]),.g(gg[3:0]),.c_in(ggc[0]),.c(gc[3:0]),.gp(ggp[0]),.gg(ggg[0])); cla
c1(.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);
endmodule
(2)pg模块:
module pg(a,b,p,g);
input [3:0] a,b;
output [3:0] p,g;
assign p=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:label
integer 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)
begin
gp=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};
end
endfunction
assign {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^b;
assign s=t^c;
endmodule
(5)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;
// Inputs
reg [31:0] a;
reg [31:0] b;
reg c_in;
// Outputs
wire [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 Inputs
a = 0;
b = 0;
c_in = 0;
// Wait 100 ns for global reset to finish
#10
a=32'b1000_0001_0111_1011_1101_1001_1101_1000;
b=32'b0111_1000_0001_1000_1100_0111_0101_0001;
c_in=1'b0;
#10
a=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'b0;
结果与实验方案的相同,结果仿真正确.
七、实验总结
对于这次实验,自己在老师布置完,努力做了几个下午,不断调试才得到正确结果波形,是非常有收获的。
同时我也采用了两种方案来设计,真正的对先行进位加法器有了全新的认识,对于它的内部工作原理深有体会,对自己以后的电路设计奠定了基础,自己以后会更加努力。