文档详情

先行进位加法器精要.doc

发布:2017-03-21约4.6千字共11页下载文档
文本预览下载声明
实验四 32位先行进位加法器 功能概述 串行进位加法器延时很大,每级的输出结果都要等上一级的进位到来才可以求和算出结果,这次实验对普通全加器进行改良,改良为先行进位加法器。 先行进位加法器,各级的进位彼此是独立产生,只与输入数据A,B和C_in有关,将各级间的进位级联传播给去掉了,这样就可以减小进位产生的延时。每个等式与只有三级延迟的电路对应,第一级延迟对应进位产生信号和进位传递信号,后两级延迟对应上面的积之和。设二进制加法器第i位为Ai,Bi,输出为Si,进位输入为Ci,进位输出为Ci+1则有: Si=Ai⊕Bi⊕Ci (1-1) Ci+1?=Ai *?Bi+ Ai *Ci+ Bi*Ci?=Ai *?Bi+(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时(当然此时也有Pi = 1),无条件产生进位,而不管Ci是多少当Gi=0而Pi=1时,进位输出为Ci跟Ci之前的逻辑有关。下面推导4位超前进位加法器。设4位加数和被加数为A和B,进位输入为Cin进位输出为Cout,对于第i位的进位产生Gi = Ai·Bi ,进位传递Pi=Ai+Bi , i=0,1,2,3于是这各级进位输出,递归的展开Ci,有: C0 = Cin 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 Cout=C4 由此可以看出,各级的进位彼此独立产生,只与输入数据和Cin有关 实验方案 方案一:分为两个模块: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=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_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
显示全部
相似文档