`timescale 1ns / 1ps
|
`timescale 1ns / 1ps
|
//////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////
|
// Company:
|
// Company:
|
// Engineer:
|
// Engineer:
|
//
|
//
|
// Create Date: 19:39:14 08/24/2011
|
// Create Date: 19:39:14 08/24/2011
|
// Design Name:
|
// Design Name:
|
// Module Name: divider
|
// Module Name: divider
|
// Project Name:
|
// Project Name:
|
// Target Devices:
|
// Target Devices:
|
// Tool versions:
|
// Tool versions:
|
// Description:
|
// Description:
|
//
|
//
|
// Dependencies:
|
// Dependencies:
|
//
|
//
|
// Revision:
|
// Revision:
|
// Revision 0.01 - File Created
|
// Revision 0.01 - File Created
|
// Additional Comments:
|
// Additional Comments:
|
//
|
//
|
//////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////
|
|
|
module qdiv(
|
module qdiv(
|
input [N-1:0] dividend,
|
input [N-1:0] dividend,
|
input [N-1:0] divisor,
|
input [N-1:0] divisor,
|
input start,
|
input start,
|
input clk,
|
input clk,
|
output [N-1:0] quotient_out,
|
output [N-1:0] quotient_out,
|
output complete
|
output complete
|
);
|
);
|
|
|
//Parameterized values
|
//Parameterized values
|
parameter Q = 15;
|
parameter Q = 15;
|
parameter N = 32;
|
parameter N = 32;
|
|
|
reg [N-1:0] quotient;
|
reg [N-1:0] quotient;
|
reg [N-1:0] dividend_copy;
|
reg [N-1:0] dividend_copy;
|
reg [2*(N-1)-1:0] divider_copy;
|
reg [2*(N-1)-1:0] divider_copy;
|
|
|
reg [5:0] bit;
|
reg [5:0] bit;
|
reg done;
|
reg done;
|
|
|
initial done = 1;
|
initial done = 1;
|
|
|
assign quotient_out = quotient;
|
assign quotient_out = quotient;
|
assign complete = done;
|
assign complete = done;
|
|
|
always @( posedge clk )
|
always @( posedge clk )
|
begin
|
begin
|
if( done && start ) begin
|
if( done && start ) begin
|
|
|
done <= 1'b0;
|
done <= 1'b0;
|
bit <= N+Q-2;
|
bit <= N+Q-2;
|
quotient <= 0;
|
quotient <= 0;
|
dividend_copy <= {1'b0,dividend[N-2:0]};
|
dividend_copy <= {1'b0,dividend[N-2:0]};
|
|
|
divider_copy[2*(N-1)-1] <= 0;
|
divider_copy[2*(N-1)-1] <= 0;
|
divider_copy[2*(N-1)-2:N-2] <= divisor[N-2:0];
|
divider_copy[2*(N-1)-2:N-2] <= divisor[N-2:0];
|
divider_copy[N-3:0] <= 0;
|
divider_copy[N-3:0] <= 0;
|
|
|
//set sign bit
|
//set sign bit
|
if((dividend[N-1] == 1 && divisor[N-1] == 0) || (dividend[N-1] == 0 && divisor[N-1] == 1))
|
if((dividend[N-1] == 1 && divisor[N-1] == 0) || (dividend[N-1] == 0 && divisor[N-1] == 1))
|
quotient[N-1] <= 1;
|
quotient[N-1] <= 1;
|
else
|
else
|
quotient[N-1] <= 0;
|
quotient[N-1] <= 0;
|
end
|
end
|
else if(!done) begin
|
else if(!done) begin
|
|
|
//compare divisor/dividend
|
//compare divisor/dividend
|
if(dividend_copy >= divider_copy) begin
|
if(dividend_copy >= divider_copy) begin
|
//subtract
|
//subtract
|
dividend_copy <= dividend_copy - divider_copy;
|
dividend_copy <= dividend_copy - divider_copy;
|
//set quotient
|
//set quotient
|
quotient[bit] <= 1'b1;
|
quotient[bit] <= 1'b1;
|
end
|
end
|
|
|
//reduce divisor
|
//reduce divisor
|
divider_copy <= divider_copy >> 1;
|
divider_copy <= divider_copy >> 1;
|
|
|
//reduce bit counter
|
|
bit <= bit - 1;
|
|
|
|
//stop condition
|
//stop condition
|
if(dividend_copy == 0)
|
if(bit == 0)
|
done <= 1'b1;
|
done <= 1'b1;
|
|
|
|
//reduce bit counter
|
|
bit <= bit - 1;
|
end
|
end
|
end
|
end
|
endmodule
|
endmodule
|
|
|
No newline at end of file
|
No newline at end of file
|