- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
先行进位加法器精要
实验四 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
文档评论(0)