先行进位加法器

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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、结构框图

B A B A B A B A B A B A B A B A

三、 实验方案

方案一:分为两个模块: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(g g[3]));

bit_slice

b5(.a(a[19:16]),.b(b[19:16]),.c_in(gc[4]),.s(s[19:16]),.gp(gp[4]),.gg(g g[4]));

bit_slice

b6(.a(a[23:20]),.b(b[23:20]),.c_in(gc[5]),.s(s[23:20]),.gp(gp[5]),.gg(g

相关文档
最新文档