在sgbm算法中用到,算是经过考验过的,
可以到我的github页面下载modelsim仿真工程
http://github.com/tishi43/div
module div_by_shift_sum #(
parameter WidthD0=64,
parameter WidthD1=32,
parameter WidthQ=WidthD0+WidthD1)
(
input wire clk,
input wire [WidthD0-1:0] a,
input wire [WidthD1-1:0] b,
output wire [WidthD0-1:0] result
);
reg [WidthD1-1:0] b_d[0:WidthD0];
reg [WidthQ-1:0] div_result_d[0:WidthD0];
reg [WidthD1-1:0] div_sub_val[0:WidthD0];
always @ (posedge clk) begin
b_d[0] <= b;
div_result_d[0] <= {{(WidthD1-1){1'b0}}, a,1'b0};
end
integer ii;
always @(*) begin
for (ii = 0; ii <= WidthD0; ii = ii + 1) begin
div_sub_val[ii] = div_result_d[ii][WidthQ-1:WidthD0]-b_d[ii];
end
end
always @(posedge clk) begin
for (ii = 1; ii <= WidthD0; ii = ii + 1) begin
if (div_result_d[ii-1][WidthQ-1:WidthD0]>=b_d[ii-1])
div_result_d[ii] <= ({div_sub_val[ii-1],div_result_d[ii-1][WidthD0-1:0]} << 1) | 1;
else
div_result_d[ii] <= div_result_d[ii-1][WidthQ-1:0] << 1;
b_d[ii] <= b_d[ii-1];
end
end
assign result = div_result_d[WidthD0][WidthD0-1:0];
endmodule