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

Subversion Repositories theia_gpu

[/] [theia_gpu/] [trunk/] [rtl/] [Module_FixedPointSquareRoot.v] - Diff between revs 152 and 154

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 152 Rev 154
Line 1... Line 1...
 
`timescale 1ns / 1ps
 
`include "aDefinitions.v"
 
 
 No newline at end of file
 No newline at end of file
 
//Square Root State Machine Constants
 
`define SQUARE_ROOT_LOOP                                        1
 
`define WRITE_SQUARE_ROOT_RESULT                        2
 
 
 
 
 
`define SR_AFTER_RESET_STATE 0
 
//-----------------------------------------------------------------
 
/*
 
 
 
        Calcualtes the SquareRoot of a Fixed Point Number
 
        Input:  Q32.32
 
        Output: Q16.16
 
        Notice that the result has half the precicion as the operands!!
 
*/
 
module FixedPointSquareRoot
 
(
 
        input wire                                                      Clock,
 
        input wire                                                      Reset,
 
        input wire[`LONG_WIDTH-1:0]      Operand,
 
        input wire                                                      iInputReady,
 
        output  reg                                             OutputReady,
 
        output  reg [`WIDTH-1:0]         Result
 
);
 
 
 
reg[63:0]                        x;
 
reg[0:`WIDTH-1]  group,sum,diff;
 
reg[0:`WIDTH-1]          temp1,temp2;
 
reg     [5:0]                    CurrentState, NextState;
 
 
 
reg myInputReady;
 
 
 
//----------------------------------------
 
always @(posedge Clock)
 
begin
 
        myInputReady = iInputReady;
 
end
 
//----------------------------------------
 
//Next states logic
 
always @(negedge Clock)
 
begin
 
        if( Reset!=1 )
 
           CurrentState = NextState;
 
                         else
 
                                CurrentState = `SR_AFTER_RESET_STATE;
 
end
 
//----------------------------------------
 
 
 
always @ (posedge Clock)
 
begin
 
        case (CurrentState)
 
        //----------------------------------------
 
        `SR_AFTER_RESET_STATE:
 
        begin
 
                OutputReady = 0;
 
                Result          = 0;
 
                sum                     = 0;
 
                diff                    = 0;
 
                group=32;                               //WAS 16
 
                x = 0;
 
                if ( myInputReady == 1  )
 
                begin
 
                  // x[31:0] = Operand;
 
                  x = Operand;
 
                        x = x << `SCALE;
 
                        NextState = `SQUARE_ROOT_LOOP;
 
                end else
 
                        NextState = `SR_AFTER_RESET_STATE;
 
 
 
        end
 
        //----------------------------------------
 
        `SQUARE_ROOT_LOOP:
 
        begin
 
 
 
 
 
 
 
                sum = sum << 1;
 
                sum = sum +  1;
 
                temp1 = diff << 2;
 
                //diff = diff + (x>>(group*2)) &3;
 
                temp2 = group << 1;                             //group * 2 ??
 
                diff = temp1 + ((x >> temp2) &3);
 
 
 
                if (sum > diff)
 
                begin
 
                        sum = sum -1;
 
                end
 
                else
 
                begin
 
                        Result = Result + (1<<group);
 
                        diff = diff - sum;
 
                        sum = sum + 1;
 
                end//if
 
 
 
 
 
                if ( group != 0 )
 
                begin
 
                        group = group - 1;
 
                        NextState = `SQUARE_ROOT_LOOP;
 
                end
 
                else
 
                begin
 
                        NextState       = `WRITE_SQUARE_ROOT_RESULT;
 
 
 
                end
 
        end
 
        //----------------------------------------
 
        `WRITE_SQUARE_ROOT_RESULT:
 
        begin
 
                OutputReady = 1;
 
                NextState = (iInputReady == 0) ?
 
                 `SR_AFTER_RESET_STATE : `WRITE_SQUARE_ROOT_RESULT;
 
        end
 
        //----------------------------------------
 
endcase
 
end //always
 
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.