anderson_Earle_Goldschmidt_Powers算法

//=========================================================
//文件名:  div_aegp_module.v
//功能:   收敛除法
/*
  (1)标准化Numerator和Denominator,令Denominator接近于1,利用标准化
      区间,如用于浮点尾数的0.5<=Denominator<1或1<=Denominator<2。
  (2)初始化x0=Numerator和t0=Denominator。
  (3)重复如下循环,直到xk满足所需要的精度
    fk=2-tk;
    x(k+1)=xk*fk
    t(k+1)tk*fk
*/
//=========================================================
module div_aegp_module (
     clk,reset,
     Numerator,
     Denominator,
     Quotient);
//--------------------------------------------------------------------------------------------------------
//端口列表
//--------------------------------------------------------------------------------------------------------
input    clk;
input    reset;
input [8:0]  Numerator;     //被除数
input [8:0]  Denominator;     //除数
output [8:0]  Quotient;      //商
//--------------------------------------------------------------------------------------------------------
//内部变量声明
//-------------------------------------------------------------------------------------------------------- 
reg  [8:0]  f;        //近似因子
reg  [17:0] Numerator_reg;    //被除数寄存
reg  [17:0] Numerator_reg_n;    //Numerator_reg下一状态
reg  [17:0] Denominator_reg;    //除数寄存
reg  [17:0] Denominator_reg_n;   //Denominator_reg下一状态
reg  [1:0]  Calculate_step_count;   //计算步数记录
reg  [2:0]  Fsm_state;
reg  [2:0]  Fsm_next_state;
//--------------------------------------------------------------------------------------------------------
//内部常量声明
//--------------------------------------------------------------------------------------------------------
localparam  START   =3'b001;     //开始状态
localparam  Calculate  =3'b010;     //结果计算状态
localparam  Done   =3'b100;     //计算结束状态
//--------------------------------------------------------------------------------------------------------
//逻辑功能实现
//--------------------------------------------------------------------------------------------------------
//状态机状态转移
always@(posedge clk or negedge reset)
begin
 if(!reset)
  Fsm_state<=START;
 else
  Fsm_state<=Fsm_next_state;
end
//组合电路,实现状态转移
always@(*)
begin
 case(Fsm_state)
  START:
   Fsm_next_state=Calculate;
  Calculate:
   begin
    if(Calculate_step_count==2'd2)
     Fsm_next_state=Done;
    else
     Fsm_next_state=Calculate;
   end
  Done:
   Fsm_next_state=START;
  default:
   Fsm_next_state=START;
 endcase
end
//===========================================
//近似因子赋值
always@(posedge clk or negedge reset)
begin
 if(!reset)
  f<=9'd0;
 else
 begin
  case(Fsm_state)
   START:
    f<=~Denominator+1'b1;
   Calculate:
    f<=~Denominator_reg_n[16:8]+1'b1;
   default:
    f<=f;
  endcase
 end 
end
//===========================================
//被除数寄存
always@(posedge clk or negedge reset)
begin
 if(!reset)
  Numerator_reg<=18'd0;
 else
  Numerator_reg<=Numerator_reg_n;
end
//组合电路,确定除数寄存器的值
always@(*)
begin
 case(Fsm_state)
  START:
   Numerator_reg_n={1'b0,Numerator,8'd0};
  Calculate:
   Numerator_reg_n=Numerator_reg[16:8]*f;
  default:
   Numerator_reg_n=Numerator_reg;
 endcase
end
//===========================================
//除数寄存
always@(posedge clk or negedge reset)
begin
 if(!reset)
  Denominator_reg<=18'd0;
 else
  Denominator_reg<=Denominator_reg_n;
end
//组合电路,实现除数寄存器的赋值
always@(*)
begin
 case(Fsm_state)
  START:
   Denominator_reg_n={1'b0,Denominator,8'd0};
  Calculate:
   Denominator_reg_n=Denominator_reg[16:8]*f;
  default:
   Denominator_reg_n=Denominator_reg;
 endcase
end
//===========================================
//计算步数记录
always@(posedge clk or negedge reset)
begin
 if(!reset)
  Calculate_step_count<=2'd0;
 else if(Fsm_state==START)
  Calculate_step_count<=2'd0;
 else if(Fsm_state==Calculate)
  Calculate_step_count<=Calculate_step_count+1'b1;
 else
  Calculate_step_count<=Calculate_step_count;
end
assign Quotient=Numerator_reg[16:8];
endmodule
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值