OpenCores
URL https://opencores.org/ocsvn/fixed_point_arithmetic_parameterized/fixed_point_arithmetic_parameterized/trunk

Subversion Repositories fixed_point_arithmetic_parameterized

[/] [fixed_point_arithmetic_parameterized/] [trunk/] [src/] [qdiv.v] - Diff between revs 2 and 3

Only display areas with differences | Details | Blame | View Log

Rev 2 Rev 3
`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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.