当前位置:文档之家› 32位浮点数加法设计仿真实验报告

32位浮点数加法设计仿真实验报告

32位浮点数加法设计仿真实验报告
名字:李磊学号:10045116 班级:10042211
32位浮点数的IEEE-754格式
单精度格式
IEEE.754标准规定了单精度浮点数共32位,由三部分组成:23位尾数f,8位偏置指数e,1位符号位s。

将这三部分由低到高连续存放在一个32位的字里,对其进行编码。

其中[22:0]位包含23位的尾数f;[30:23]位包含8位指数e;第31位包含符号s
{s[31],e[30:23],f[22:0]}
其中偏置指数为实际指数+偏置量,单精度浮点数的偏置量为128,双精度浮点数的偏置量为1024。

规格化的数:由符号位,偏置指数,尾数组成,实际值为1.f乘2的E-128次方
非规格化的数:由符号位,非偏置指数,尾数组成,实际值为0.f乘2的E次方
特殊的数:0(全为零),+无穷大(指数全为1,尾数为0,符号位为0),-无穷大(指数
全为1,尾数为0,符号位为1),NAN(指数全为1,尾数为不全为0)
浮点数加法器设计
设计思路:
1.前端处理,还原尾数
2.指数处理,尾数移位,使指数相等
3.尾数相加
4.尾数规格化处理
5.后端处理,输出浮点数
具体设计:
设计全文:
module flowadd(ix, iy, clk, a_en, ost,oz);
input ix, iy, clk, a_en;
output oz, ost;
wire[31:0] ix,iy;
reg[31:0] oz;
wire clk,ost,a_en;
reg[25:0] xm, ym, zm;
reg[7:0] xe, ye, ze;
reg[2:0] state;
parameter start = 3'b000, //设置状态机
zerock = 3'b001,
exequal = 3'b010,
addm = 3'b011,
infifl = 3'b100,
over = 3'b110;
assign ost = (state == over) ? 1 : 0; /*后端处理,输出浮点数*/
always@(posedge ost)
begin
if(a_en)
oz <= {zm[25],ze[7:0],zm[22:0]};
end
always@(posedge clk) //状态机
begin
case(state)
start: //前端处理,分离尾数和指数,同时还原尾数
begin
xe <= ix[30:23];
xm <= {ix[31],1'b0,1'b1,ix[22:0]};
ye <= iy[30:23];
ym <= {iy[31],1'b0,1'b1,iy[22:0]};
state <= zerock;
end
zerock:
begin
if(ix == 0)
begin
{ze, zm} <= {ye, ym};
state <= over;
end
else
if(iy == 0)
begin
{ze, zm} <= {xe, xm};
state <= over;
end
else
state <= exequal;
end
exequal: //指数处理,使得指数相等begin
if(xe == ye)
state <= addm;
else
if(xe > ye)
begin
ye <= ye + 1;
ym[24:0] <= {1'b0, ym[24:1]};
if(ym == 0)
begin
zm <= xm;
ze <= xe;
state <= over;
end
else
state <= exequal;
end
else
begin
xe <= xe + 1;
xm[24:0] <= {1'b0,xm[24:1]};
if(xm == 0)
begin
zm <= ym;
ze <= ye;
state <= over;
end
else
state <= exequal;
end
end
addm: //带符号位和保留进位的尾数相加begin
if ((xm[25]^ym[25])==0)
begin
zm[25] <= xm[25];
zm[24:0] <= xm[24:0]+ym[24:0];
end
else
if(xm[24:0]>ym[24:0])
begin
zm[25] <= xm[25];
zm[24:0] <=xm[24:0]-ym[24:0];
end
else
begin
zm[25] <= ym[25];
zm[24:0] <=ym[24:0]-xm[24:0];
end
ze <= xe;
state <= infifl;
end
infifl: //尾数规格化处理
begin
if(zm[24]==1)
begin
zm[24:0] <= {1'b0,zm[24:1]};
ze <= ze + 1;
state <= over;
end
else
if(zm[23]==0)
begin
zm[24:0] <= {zm[23:0],1'b0};
ze <= ze - 1;
state <= infifl;
end
else
state <= over;
end
over:
begin
state<= start;
end
default:
begin
state<= start;
end
endcase
end
endmodule
设计结果仿真
仿真结果为41A00000H+41080000H=41E40000H
41A00000H=10D,41080000H=4.25D,41E40000H=14.25D,验证成功。

相关主题