32位加减法器设计2010012107季涛

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

带有溢出标志的32位加减法器的设计
2010012107 季涛
加法器是一个非常基本的数字运算电路,经常出现在数字电路的关键路径中。

本次作业实现的加减法器一共要实现五个基本功能:1)求补2)无符号数的加法3)无符号数的减法4)有符号数的加法5)有符号数的减法,同时对应每种功能还要给出对应的溢出标志。

虽然看起来功能有五种,但是核心的模块还是一个32位的加法器。

现在比较流行的加法器结构有很多,从最基本的一位半加器、全加器,到多位的行波进位加法器,曼彻斯特进位链加法器,旁路进位加法器,超前进位加法器,选择进位加法器,到更复杂的更多位的树结构表示的加法器,如Brent-Kung树、Kogge-Stone树等等。

由于想要实现一个速度较快的加法器,所以一般会选择后几种类型的结构,然后我之前的课程里已经实现过了超前进位加法器、Brent-Kung树结构前置进位加法器,所以本次作业我选择了Kogge-Stone树。

它的主要特点是:能获得log2N的级数,每级的扇出为2,代价是级间布线有很多的长线,PG单元更多。

Kogge-Stone树结构图如下:
结构框图如下:
设计的思路是这样的,求补的话就是对操作数进行取反然后+1,令加法器的一个输入为1,另一个输入为~a即可;无符号数和有符号数的加法的输入是一样的;减法的时候只要对第二个操作数求补即可。

然后溢出标志的获取我是对四种功能分别考虑,无符号数的加法,只有在最高位的进位信号为1的时候表示超过了数的表示范围,溢出信号为1,其余情况都为0;无符号数的减法只有在第一个操作数比第二个操作数小的时候溢出信号为1,其余为0;有符号数的加法只有在两个操作数的符号相同而和的最高位符号与他们不同时为1.其余为0;有符号数的减法只有在两个操作数的符号位不同而差的最高位和第二个操作数符号位相同时为1,其余为0。

这样就基本实现了功能。

总结:第一次作业主要让我又回顾了modelsom、DC等软件的使用方法,时隔一年没用有些东西确实都生疏了,甚至安装modelsim软件、DC综合的过程中也产生了不少问题,好在在同学和助教姐姐的帮助下都克服了困难。

感觉自己这次做的加法器还有很多有待完善的地方,比较溢出标志的实现应该有更好的算法去实现,但由于时间关系,我只是用了最简单粗暴的办法,比如无符号数的减法溢出情况我直接使用了一个32位比较器这会产生不小的面积,如果时间充裕的话我可以再考虑下更好的溢出标志的问题。

还有整个模块的框图也不是很完美,求补的功能和加法的功能是独立的,这样做减法的时候我其实并没有使用自己的求补功能,感觉这样面积又被浪费了。

然后最核心的加法器模块用的Kogge-Stone算法也是现成的,我只是简单实现了而已,并没有什么创新的地方,实在是太水了TT。

时延报告
max_delay 2.30 2.30
output external delay 0.00 2.30
data required time 2.30
-----------------------------------------------------------
data required time 2.30
data arrival time -2.30
-----------------------------------------------------------
slack (MET)
面积报告
Number of ports: 101
Number of nets: 1083
Number of cells: 1016
Number of references: 99
Combinational area: 16818.278624
Noncombinational area: 0.000000
Net Interconnect area: undefined (No wire load specified)
Total cell area: 16818.278624
功耗报告
Cell Internal Power = 2.2584 mW (53%)
Net Switching Power = 2.0057 mW (47%)
Total Dynamic Power = 4.2641 mW (100%)
Cell Leakage Power = 1.6054 uW
附:
add_32.v
module add_32(a,b,s,co);
input [31:0] a,b;
output [31:0] s;
output co;
reg [31:0] G1,P1,G2,P2,G3,P3,G4,P4,G5,P5;
wire[31:0] s,G0,P0;
assign P0=a^b;
assign G0=a&b;
assign s=P0^{G5[30:0],1'b0};
assign co=G5[31];
always @(P0 or G0 or P1 or G1 or P2 or G2 or P3 or G3 or P4 or G4 or P5 or G5 ) begin
P1[31:1]=P0[31:1]&P0[30:0];
G1[31:1]=G0[31:1]|P0[31:1]&G0[30:0];
G1[0]=G0[0]; P1[0]=P0[0];
P2[31:2]=P1[31:2]&P1[29:0];
G2[31:2]=G1[31:2]|P1[31:2]&G1[29:0];
G2[1:0]=G1[1:0]; P2[1:0]=P1[1:0];
P3[31:4]=P2[31:4]&P2[27:0];
G3[31:4]=G2[31:4]|P2[31:4]&G2[27:0];
G3[3:0]=G2[3:0]; P3[3:0]=P2[3:0];
P4[31:8]=P3[31:8]&P3[23:0];
G4[31:8]=G3[31:8]|P3[31:8]&G3[23:0];
G4[7:0]=G3[7:0]; P4[7:0]=P3[7:0];
P5[31:16]=P4[31:16]&P4[15:0];
G5[31:16]=G4[31:16]|P4[31:16]&G4[15:0];
G5[15:0]=G4[15:0]; P5[15:0]=P4[15:0];
end
endmodule
topmodule.v
module topmodule(a,b,sum,cout,xx,yc);
input [31:0] a,b;
input [2:0]xx;
output reg yc;
output wire cout;
output wire [31:0]sum;
reg [31:0]x,y;
always@(*)
begin
if (xx==3'd0)
begin
x<=32'b1;
y<=~a;
end
else if(xx==3'd1)
begin
x<=a;
y<=b;
end
else if(xx==3'd2)
begin
x<=a;
y<=~b+32'b1;
end
else if(xx==3'd3)
begin
x<=a;
y<=b;
end
else
begin
x<=a;
y<=~b+32'b1;
end
end
add_32 kst32(x,y,sum,cout);
always@(*)
begin
if (xx==3'd0)
begin
yc<=1'b0;
end
else if(xx==3'd1)
begin
if(cout==1'b1)
yc<=1'b1;
else
yc<=1'b0;
end
else if(xx==3'd2)
begin
if(a<b)
yc<=1'b1;
else
yc<=1'b0;
end
else if(xx==3'd3)
begin
if(a[31]==b[31]&&a[31]!=sum[31])
yc<=1'b1;
else
yc<=1'b0;
end
else
begin
if((a[31]==1'b0&&b[31]==1'b1&&sum[31]==1'b1)||(a[31]==1'b1&&b[31]==1'b0&&sum[3 1]==1'b0))
yc<=1'b1;
else
yc<=1'b0;
end
end
endmodule。

相关文档
最新文档