verilog-32位浮点加法器程序及代码解释.pdf
臣心一片磁针石,不指南方不肯休。——文天祥
verilog-32位浮点加法器程序及代码解释
moduleflowadd(ix,iy,clk,a_en,ost,oz);
inputix,iy,clk,a_en;
outputoz,ost;
wire[31:0]ix,iy;
reg[31:0]oz;
wireclk,ost,a_en;
reg[25:0]xm,ym,zm;
reg[7:0]xe,ye,ze;
reg[2:0]state;
parameter
start=3b000,zerock=3b001,exequal=3b010,addm=3b011,infifl
=3b100,over=3b110;
assignost=(state==over)?1:0;/*后端处理,输出浮点数*/
always@(posedgeost)
begin
if(a_en)
oz={zm[25],ze[7:0],zm[22:0]};
end
always@(posedgeclk)//状态机
begin
case(state)
start://前端处理,分离尾数和指数,同时还原尾数
begin
xe=ix[30:23];
xm={ix[31],1b0,1b1,ix[22:0]};
ye=iy[30:23];
ym={iy[31],1b0,1b1,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(xeye)