//=========================================================
//文件名: 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
//文件名: 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
endmodule