先行进位加法器.docx

上传人:牧羊曲112 文档编号:3287476 上传时间:2023-03-12 格式:DOCX 页数:8 大小:39.23KB
返回 下载 相关 举报
先行进位加法器.docx_第1页
第1页 / 共8页
先行进位加法器.docx_第2页
第2页 / 共8页
先行进位加法器.docx_第3页
第3页 / 共8页
先行进位加法器.docx_第4页
第4页 / 共8页
先行进位加法器.docx_第5页
第5页 / 共8页
亲,该文档总共8页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《先行进位加法器.docx》由会员分享,可在线阅读,更多相关《先行进位加法器.docx(8页珍藏版)》请在三一办公上搜索。

1、先行进位加法器实验四 32位先行进位加法器 一、 功能概述 串行进位加法器延时很大,每级的输出结果都要等上一级的进位到来才可以求和算出结果,这次实验对普通全加器进行改良,改良为先行进位加法器。 先行进位加法器,各级的进位彼此是独立产生,只与输入数据A,B和C_in有关,将各级间的进位级联传播给去掉了,这样就可以减小进位产生的延时。每个等式与只有三级延迟的电路对应,第一级延迟对应进位产生信号和进位传递信号,后两级延迟对应上面的积之和。通过这种进位方式实现的加法器称为超前进位加法器。因为各个进位是并行产生的,所以是一种并行进位加法器。 二、 实验原理 1、设二进制加法器第i位为Ai,Bi,输出为S

2、i,进位输入为Ci,进位输出为Ci+1,则有: Si=AiBiCi Ci+1 =Ai * Bi+ Ai *Ci+ Bi*Ci =Ai * Bi+* Ci 令Gi = Ai * Bi , Pi = Ai+Bi,则Ci+1= Gi+ Pi *Ci 当Ai和Bi都为1时,Gi = 1, 产生进位Ci+1 = 1 当Ai和Bi有一个为1时,Pi = 1,传递进位Ci+1= Ci 因此Gi定义为进位产生信号,Pi定义为进位传递信号。Gi的优先级比Pi高,也就是说:当Gi = 1时,无条件产生进位,而不管Ci是多少;当Gi=0而Pi=1时,进位输出为Ci,跟Ci之前的逻辑有关。 下面推导4位超前进位加法器

3、。设4位加数和被加数为A和B,进位输入为Cin,进位输出为Cout,对于第i位的进位产生Gi = AiBi ,进位传递Pi=Ai+Bi , i=0,1,2,3。于是这各级进位输出,递归的展开Ci,有: C0 = Cin C1=G0 + P0C0 C2=G1 + P1C1 = G1 + P1G0 + P1P0 C0 C3=G2 + P2C2 = G2 + P2G1 + P2P1G0 + P2P1P0C0 C4=G3 + P3C3 = G3 + P3G2 + P3P2G1 + P3P2P1G0 + P3P2P1P0C0 Cout=C4 由此可以看出,各级的进位彼此独立产生,只与输入数据Ai、Bi和

4、Cin有关。 2、接口说明 表1: 32位超前进位加法器接口信号说明表 序号 接口信号名称 方向 1 2 3 4 3、结构框图 A3128B3128A2724B2724A2320B2320A1916B19164位CLAC284位CLAC244位CLAC204位CLAS1916gm4pm4A1512B1512A118B1184位CLAC124位CLAC8A74B74A30B304位CLAC44位CLAS30gm0pm0C0说明 输入数据 输入数据 加法结果 备注 A31:0 B31:0 S31:0 count I I O O 最高位进位 S3128gm7pm7S2724S2320gm5pm5gm

5、6pm64位BCLAS1512S118S74gm3pm3gm2pm2gm1pm14位BCLA16位CLAgx1px1C32C16gx14位BCLAgx0px0三、 实验方案 方案一:分为两个模块:1个4位add_4和1个add_32,其中add_32调用4个add_4. 首先设计4位超前进位加法器: 框图如下: 设计好四位的之后,开始调用四位的实现32位的。 方案二:分为五个模块:计算传播值和产生值模块:pg模块 超前进位模块:cla模块 加法求和模块:sum模块 求和并按输出a,b,c_in分组:bit_slice模块 32位超前进位加法器总模块:cla_32 总框图: 四、 验证方案: 对

6、32位的两个输入赋值: 当a=32b1000_0001_0111_1011_1101_1001_1101_1000; b=32b0111_1000_0001_1000_1100_0111_0101_0001; c_in=1b0; 结果:s=32b1111_1001_1001_0100_1010_0001_0010_1001; 当 a=32b1000_0001_0111_1011_1101_1001_1101_1000; b=32b0111_1000_0001_1000_1100_0111_0101_0001; c_in=1b1; 结果:s=32b1111_1001_1001_0100_1010

7、_0001_0010_1010; 来对波形进行观察,看波形是否正确。 五、 实验代码: 方案一:add_32模块顶层模块: 4位add_4模块 方案二: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(a3:0),.b(b3:0),.c_in(gc0),.s(s3:0),.gp(gp0),.gg(

8、gg0); bit_slice b2(.a(a7:4),.b(b7:4),.c_in(gc1),.s(s7:4),.gp(gp1),.gg(gg1); bit_slice b3(.a(a11:8),.b(b11:8),.c_in(gc2),.s(s11:8),.gp(gp2),.gg(gg2); bit_slice b4(.a(a15:12),.b(b15:12),.c_in(gc3),.s(s15:12),.gp(gp3),.gg(gg3); bit_slice b5(.a(a19:16),.b(b19:16),.c_in(gc4),.s(s19:16),.gp(gp4),.gg(gg4);

9、 bit_slice b6(.a(a23:20),.b(b23:20),.c_in(gc5),.s(s23:20),.gp(gp5),.gg(gg5); bit_slice b7(.a(a27:24),.b(b27:24),.c_in(gc6),.s(s27:24),.gp(gp6),.gg(gg6); bit_slice b8(.a(a31:28),.b(b31:28),.c_in(gc7),.s(s31:28),.gp(gp7),.gg(gg7); cla c0(.p(gp3:0),.g(gg3:0),.c_in(ggc0),.c(gc3:0),.gp(ggp0),.gg(ggg0); c

10、la c1(.p(gp7:4),.g(gg7:4),.c_in(ggc1),.c(gc7:4),.gp(ggp1),.gg(ggg1); assign ggp3:2=2b11; assign ggg3:2=2b00; cla c2(.p(ggp),.g(ggg),.c_in(c_in),.c(ggc),.gp(gggp),.gg(gggg); assign count=gggg|(gggp&c_in); endmodule pg模块: module pg(a,b,p,g); input 3:0 a,b; output 3:0 p,g; assign p=ab; assign g=a&b; en

11、dmodule 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=p0; gg=g0; c0=c_in; for(i=1;i4;i=i+1) begin gp=gpπ gg=(gg&pi)|gi; ci=(ci-1&pi-1)|gi-1; end do_cla=c,

12、gp,gg; end endfunction assign c,gp,gg=do_cla(p,g,c_in); endmodule sum模块: module sum(a,b,c,s ); input 3:0 a,b,c; output 3:0 s; wire 3:0 t=ab; assign s=tc; endmodule 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:0p,g,c; pg i1(a,b,p,g);

13、cla i2(p,g,c_in,c,gp,gg); sum i3(a,b,c,s); endmodule 激励代码: module cla32_tb; / Instantiate the Unit Under Test (UUT) cla_32 uut ( .a(a), .b(b), .c_in(c_in), .s(s), / Inputs reg 31:0 a; reg 31:0 b; reg c_in; / Outputs wire 31:0 s; wire count; ); .count(count) initial begin / Initialize Inputs a = 0; b

14、 = 0; c_in = 0; / Wait 100 ns for global reset to finish #10 a=32b1000_0001_0111_1011_1101_1001_1101_1000; b=32b0111_1000_0001_1000_1100_0111_0101_0001; c_in=1b0; #10 a=32b1000_0001_0111_1011_1101_1001_1101_1000; b=32b0111_1000_0001_1000_1100_0111_0101_0001; c_in=1b1; / Add stimulus here end endmodule 六、波形图说明 1、仿真波形 2、结果说明 对于三个输入: a=32b1000_0001_0111_1011_1101_1001_1101_1000; b=32b0111_1000_0001_1000_1100_0111_0101_0001; c_in=1b0; 结果与实验方案的相同,结果仿真正确. 七、 实验总结 对于这次实验,自己在老师布置完,努力做了几个下午,不断调试才得到正确结果波形,是非常有收获的。同时我也采用了两种方案来设计,真正的对先行进位加法器有了全新的认识,对于它的内部工作原理深有体会,对自己以后的电路设计奠定了基础,自己以后会更加努力。

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号