verilog实现32位浮点加法器

先规定输入输出,以及一些中间状态寄存器

module top(ix, iy, clk, a_en, ost, oz);
    //  最高位第31位为符号位,第30~23位为偏移码(阶码),第22~0位为尾数(23位)=32位浮点数
    //ix=xm*2^xe		iy=ym*2^ye
    //  
  input ix, iy, clk, a_en;  //clk--时钟;a_en---使能;
  output oz, ost;//ost为执行结束标志
  wire[31:0] ix,iy;
  reg[31:0] oz;
  wire	clk,ost,a_en;
  reg[25:0]	xm, ym, zm;  //尾数部分用26位:1位符号+2位进位标志+23位尾数
  reg[7:0]	xe, ye, ze;  //指数部分8位:
  reg[2:0] state; //操作状态
  parameter	start=3'b000,zerock=3'b001,exequal=3'b010,addm=3'b011,infifl=3'b100,over =3'b110;

接下来进入正式计算:

  1. 对零操作数检查:两个输入数有一个为0时,直接输出另一个数
    if(ix == 0)//如果ix=0,结果为oz=iy
    begin	
      {ze, zm} <= {ye, ym};
      state <= over;//结束态
    end
    else if(iy == 0)  //如果iy=0,结果为oz=ix
    begin
      {ze, zm} <= {xe, xm};
      state <= over;
    end

     

  2. 比较阶码,完成对阶
    if(xe == ye)//如果指数已经相等了,则直接相加
      state <= addm;  //进入加状态
    else if(xe > ye)
    begin
      ye <= ye + 1;	  //iy的指数加一		
      ym[24:0] <= {1'b0, ym[24:1]}; //iy尾数右移一位
      if(ym == 0)  //如果尾数ym为0,直接输出x
      begin
        zm <= xm;
        ze <= xe;
        state <= over;
      end
    end
    else		//xe<ye
    begin
      xe <= xe + 1;	//ix的指数加一					
      xm[24:0] <= {1'b0,xm[24:1]};  //ix尾数右移一位
      if(xm == 0)	//如果尾数xm为0,直接输出y
      begin
        zm <= ym;
        ze <= ye;
        state <= over;
      end
    end

     

  3. 尾数加法
    if ((xm[25]^ym[25])==0) //第25位尾数相同(同号数相加)
    begin
      zm[25] <= xm[25];
      zm[24:0] <= xm[24:0]+ym[24:0]; //尾数相加
    end
    else						 //异号数相加实际做尾数减法
      if(xm[24:0]>ym[24:0])  //xm>ym,
      begin
        zm[25] <= xm[25]; 
        zm[24:0] <= xm[24:0]-ym[24:0];  //尾数相减
      end
    else				 //xm
    begin
      zm[25] <= ym[25];
      zm[24:0] <=ym[24:0]-xm[24:0];
    end	 
    ze <= xe;

     

  4. 尾数规格化
    if(zm[24]==1)	 //和尾数最高位为1
    begin
      zm[24:0] <= {1'b0,zm[24:1]};	  //和尾数右移一位,即小数点左移一位
      ze <= ze + 1;	//和指数增加一
      state <= over;  
    end
    else if(zm[23]==0)	//和尾数的第23位为0
    begin
      zm[24:0] <= {zm[23:0],1'b0};  //和尾数左移一位,即小数点右移一位
      ze <= ze - 1;  //和指数减少一  
      state <= infifl;	 //继续执行尾数规格化状态
    end

     

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注