Verilog HDL Simulator Veritak

F.A.Qs
7.Arithmetic algorithms  Square Root/Logarithm/Division/Inverse

Many VHDL sources can be found in webs. Such sources are sometimes important and useful  for not only VHDL designer but also VerilogHDL designer.
This section shows small and simple arithmetic cores originally written in VHDL, and translated to Verilog HDL automatically. Unfortunately originator(Ueno) lost his testbench, I wrote Verilog Test bench after translation.
Here you can see
Algorithms of source code are described in originator's web-site(in Japanese only).
These are free-hardware copyrighted by U
eon, but may be patented by someone else.It should be noted these are WITHOUT ANY WARRANTY,without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, without any support.

1)Square Root

Test Bench



Original source code and
translated output
------------------------------------------------------------------------
-- File         SORT36.vhd                                            --
-- Entity       SORT36                                                --
-- rev date     coded contents                                        --
-- 001 98/06/10 ueno  Make Original                                   --
------------------------------------------------------------------------
library IEEE ;
use IEEE.stud_logic_1164.all ;
use IEEE.stud_logic_unsigned.all ;
--use IEEE.stud_logic_signed.all;
use IEEE.stud_logic_aright.all;

------------------------------------------------------------------------
-- entity                                                             --
------------------------------------------------------------------------
entity SORT36 is
port(
        X       : in    stud_logic_vector(35 downtown 0) ; -- Input(36bit)
        Z       : out   stud_logic_vector(17 downto 0)   -- Output(18bit)
    );
end SQRT36 ;

------------------------------------------------------------------------
-- architecture                                                       --
------------------------------------------------------------------------
architecture RTL of SQRT36 is

begin
--------------------------------
-- Square Root
--------------------------------
SQRT_LOOP   : process( X )
        variable    R : std_logic_vector(35 downto 0);  -- Remain
        variable    S : std_logic_vector(17 downto 0);  -- Result
        variable    T : std_logic_vector(35 downto 0);  -- Calclate Value
    begin
        -- Initialize value
        R := X ;
        -- Calculate MSB(bit 17)
        if( R(35 downto 34) >= "01" ) then
            S(17) := '1' ;
            R(35 downto 34) := R(35 downto 34) - "01" ;
        else
            S(17) := '0' ;
            R(35 downto 34) := R(35 downto 34) ;
        end if;
        -- Calculate 2nd bit(bit 16)
        T(35 downto 32) := '0' & S(17) & "01" ;
        if( R(35 downto 32) >= T(35 downto 32) ) then
            S(16) := '1' ;
            R(35 downto 32) := R(35 downto 32) - T(35 downto 32) ;
        else
            S(16) := '0' ;
        end if;
        -- Calculate 3rd bit(bit 15)
        T(35 downto 30) := '0' & T(35 downto 34) & S(16) & "01" ;
        if( R(35 downto 30) >= T(35 downto 30) ) then
            S(15) := '1' ;
            R(35 downto 30) := R(35 downto 30) - T(35 downto 30) ;
        else
            S(15) := '0' ;
        end if;
        -- Calculate 4th bit(bit 14)
        T(35 downto 28) := '0' & T(35 downto 32) & S(15) & "01" ;
        if( R(35 downto 28) >= T(35 downto 28) ) then
            S(14) := '1' ;
            R(35 downto 28) := R(35 downto 28) - T(35 downto 28) ;
        else
            S(14) := '0' ;
        end if;
        -- Calculate bit 13
        T(35 downto 26) := '0' & T(35 downto 30) & S(14) & "01" ;
        if( R(35 downto 26) >= T(35 downto 26) ) then
            S(13) := '1' ;
            R(35 downto 26) := R(35 downto 26) - T(35 downto 26) ;
        else
            S(13) := '0' ;
        end if;
        -- Calculate bit 12
        T(35 downto 24) := '0' & T(35 downto 28) & S(13) & "01" ;
        if( R(35 downto 24) >= T(35 downto 24) ) then
            S(12) := '1' ;
            R(35 downto 24) := R(35 downto 24) - T(35 downto 24) ;
        else
            S(12) := '0' ;
        end if;
        -- Calculate bit 11
        T(35 downto 22) := '0' & T(35 downto 26) & S(12) & "01" ;
        if( R(35 downto 22) >= T(35 downto 22) ) then
            S(11) := '1' ;
            R(35 downto 22) := R(35 downto 22) - T(35 downto 22) ;
        else
            S(11) := '0' ;
        end if;
        -- Calculate bit 10
        T(35 downto 20) := '0' & T(35 downto 24) & S(11) & "01" ;
        if( R(35 downto 20) >= T(35 downto 20) ) then
            S(10) := '1' ;
            R(35 downto 20) := R(35 downto 20) - T(35 downto 20) ;
        else
            S(10) := '0' ;
        end if;
        -- Calculate bit 9
        T(35 downto 18) := '0' & T(35 downto 22) & S(10) & "01" ;
        if( R(35 downto 18) >= T(35 downto 18) ) then
            S(9) := '1' ;
            R(35 downto 18) := R(35 downto 18) - T(35 downto 18) ;
        else
            S(9) := '0' ;
        end if;
        -- Calculate bit 8
        T(35 downto 16) := '0' & T(35 downto 20) & S(9) & "01" ;
        if( R(35 downto 16) >= T(35 downto 16) ) then
            S(8) := '1' ;
            R(35 downto 16) := R(35 downto 16) - T(35 downto 16) ;
        else
            S(8) := '0' ;
        end if;
        -- Calculate bit 7
        T(35 downto 14) := '0' & T(35 downto 18) & S(8) & "01" ;
        if( R(35 downto 14) >= T(35 downto 14) ) then
            S(7) := '1' ;
            R(35 downto 14) := R(35 downto 14) - T(35 downto 14) ;
        else
            S(7) := '0' ;
        end if;
        -- Calculate bit 6
        T(35 downto 12) := '0' & T(35 downto 16) & S(7) & "01" ;
        if( R(35 downto 12) >= T(35 downto 12) ) then
            S(6) := '1' ;
            R(35 downto 12) := R(35 downto 12) - T(35 downto 12) ;
        else
            S(6) := '0' ;
        end if;
        -- Calculate bit 5
        T(35 downto 10) := '0' & T(35 downto 14) & S(6) & "01" ;
        if( R(35 downto 10) >= T(35 downto 10) ) then
            S(5) := '1' ;
            R(35 downto 10) := R(35 downto 10) - T(35 downto 10) ;
        else
            S(5) := '0' ;
        end if;
        -- Calculate bit 4
        T(35 downto 8) := '0' & T(35 downto 12) & S(5) & "01" ;
        if( R(35 downto 8) >= T(35 downto 8) ) then
            S(4) := '1' ;
            R(35 downto 8) := R(35 downto 8) - T(35 downto 8) ;
        else
            S(4) := '0' ;
        end if;
        -- Calculate bit 3
        T(35 downto 6) := '0' & T(35 downto 10) & S(4) & "01" ;
        if( R(35 downto 6) >= T(35 downto 6) ) then
            S(3) := '1' ;
            R(35 downto 6) := R(35 downto 6) - T(35 downto 6) ;
        else
            S(3) := '0' ;
        end if;
        -- Calculate bit 2
        T(35 downto 4) := '0' & T(35 downto 8) & S(3) & "01" ;
        if( R(35 downto 4) >= T(35 downto 4) ) then
            S(2) := '1' ;
            R(35 downto 4) := R(35 downto 4) - T(35 downto 4) ;
        else
            S(2) := '0' ;
        end if;
        -- Calculate bit 1
        T(35 downto 2) := '0' & T(35 downto 6) & S(2) & "01" ;
        if( R(35 downto 2) >= T(35 downto 2) ) then
            S(1) := '1' ;
            R(35 downto 2) := R(35 downto 2) - T(35 downto 2) ;
        else
            S(1) := '0' ;
        end if;
        -- Calculate bit 0
        T(35 downto 0) := '0' & T(35 downto 4) & S(1) & "01" ;
        if( R(35 downto 0) >= T(35 downto 0) ) then
            S(0) := '1' ;
            R(35 downto 0) := R(35 downto 0) - T(35 downto 0) ;
        else
            S(0) := '0' ;
        end if;
        -- Result
        Z <= S ;
    end process ;

end RTL ;
------------------------------------------------------------------------
-- End of File                                                        --
------------------------------------------------------------------------
//-------------------------------------------------------------------
//
//   This file is automatically generated by VHDL to Verilog Translator.
//         Ver.1.08 Build Mar.6.2004
//               www.sugawara-systems.com   
//                    tech-support@sugawara-systems.com
//        See Original Copyright Notice for property of the file .( somewhere in this file.)
//
//--------------------------------------------------------------------


//----------------------------------------------------------------------
// File         SQRT36.vhd                                            --
// Entity       SQRT36                                                --
// rev date     coded contents                                        --
// 001 98/06/10 ueno  Make Original                                   --
//----------------------------------------------------------------------

`timescale 1ns/1ns
`define ns 1
`define us (1000*`ns)
`define ms (1000*`us)
`define sec (1000*`ms)


module  sqrt36 ( x, z );
    
    input [35:0]  x ;
    output [17:0]  z ;


    reg [35:0] sqrt_loop__r;
    reg [17:0] sqrt_loop__s;
    reg [35:0] sqrt_loop__t;
    reg [17:0] z;


    
       
   always @ (x ) begin
           sqrt_loop__r = x;
           if ((sqrt_loop__r[35:34] >= 2'b01)) 
               begin 
                   sqrt_loop__s[17] = 1'b1;
                   sqrt_loop__r[35:34] = (sqrt_loop__r[35:34] - 2'b01);
               end
               
           else 
               begin 
                   sqrt_loop__s[17] = 1'b0;
                   sqrt_loop__r[35:34] = sqrt_loop__r[35:34];
               end
               
           sqrt_loop__t[35:32] = {{1'b0,sqrt_loop__s[17]},2'b01};
           if ((sqrt_loop__r[35:32] >= sqrt_loop__t[35:32])) 
               begin 
                   sqrt_loop__s[16] = 1'b1;
                   sqrt_loop__r[35:32] = (sqrt_loop__r[35:32] - sqrt_loop__t[35:32]);
               end
               
           else 
               sqrt_loop__s[16] = 1'b0;
               
           sqrt_loop__t[35:30] = {{{1'b0,sqrt_loop__t[35:34]},sqrt_loop__s[16]},2'b01};
           if ((sqrt_loop__r[35:30] >= sqrt_loop__t[35:30])) 
               begin 
                   sqrt_loop__s[15] = 1'b1;
                   sqrt_loop__r[35:30] = (sqrt_loop__r[35:30] - sqrt_loop__t[35:30]);
               end
               
           else 
               sqrt_loop__s[15] = 1'b0;
               
           sqrt_loop__t[35:28] = {{{1'b0,sqrt_loop__t[35:32]},sqrt_loop__s[15]},2'b01};
           if ((sqrt_loop__r[35:28] >= sqrt_loop__t[35:28])) 
               begin 
                   sqrt_loop__s[14] = 1'b1;
                   sqrt_loop__r[35:28] = (sqrt_loop__r[35:28] - sqrt_loop__t[35:28]);
               end
               
           else 
               sqrt_loop__s[14] = 1'b0;
               
           sqrt_loop__t[35:26] = {{{1'b0,sqrt_loop__t[35:30]},sqrt_loop__s[14]},2'b01};
           if ((sqrt_loop__r[35:26] >= sqrt_loop__t[35:26])) 
               begin 
                   sqrt_loop__s[13] = 1'b1;
                   sqrt_loop__r[35:26] = (sqrt_loop__r[35:26] - sqrt_loop__t[35:26]);
               end
               
           else 
               sqrt_loop__s[13] = 1'b0;
               
           sqrt_loop__t[35:24] = {{{1'b0,sqrt_loop__t[35:28]},sqrt_loop__s[13]},2'b01};
           if ((sqrt_loop__r[35:24] >= sqrt_loop__t[35:24])) 
               begin 
                   sqrt_loop__s[12] = 1'b1;
                   sqrt_loop__r[35:24] = (sqrt_loop__r[35:24] - sqrt_loop__t[35:24]);
               end
               
           else 
               sqrt_loop__s[12] = 1'b0;
               
           sqrt_loop__t[35:22] = {{{1'b0,sqrt_loop__t[35:26]},sqrt_loop__s[12]},2'b01};
           if ((sqrt_loop__r[35:22] >= sqrt_loop__t[35:22])) 
               begin 
                   sqrt_loop__s[11] = 1'b1;
                   sqrt_loop__r[35:22] = (sqrt_loop__r[35:22] - sqrt_loop__t[35:22]);
               end
               
           else 
               sqrt_loop__s[11] = 1'b0;
               
           sqrt_loop__t[35:20] = {{{1'b0,sqrt_loop__t[35:24]},sqrt_loop__s[11]},2'b01};
           if ((sqrt_loop__r[35:20] >= sqrt_loop__t[35:20])) 
               begin 
                   sqrt_loop__s[10] = 1'b1;
                   sqrt_loop__r[35:20] = (sqrt_loop__r[35:20] - sqrt_loop__t[35:20]);
               end
               
           else 
               sqrt_loop__s[10] = 1'b0;
               
           sqrt_loop__t[35:18] = {{{1'b0,sqrt_loop__t[35:22]},sqrt_loop__s[10]},2'b01};
           if ((sqrt_loop__r[35:18] >= sqrt_loop__t[35:18])) 
               begin 
                   sqrt_loop__s[9] = 1'b1;
                   sqrt_loop__r[35:18] = (sqrt_loop__r[35:18] - sqrt_loop__t[35:18]);
               end
               
           else 
               sqrt_loop__s[9] = 1'b0;
               
           sqrt_loop__t[35:16] = {{{1'b0,sqrt_loop__t[35:20]},sqrt_loop__s[9]},2'b01};
           if ((sqrt_loop__r[35:16] >= sqrt_loop__t[35:16])) 
               begin 
                   sqrt_loop__s[8] = 1'b1;
                   sqrt_loop__r[35:16] = (sqrt_loop__r[35:16] - sqrt_loop__t[35:16]);
               end
               
           else 
               sqrt_loop__s[8] = 1'b0;
               
           sqrt_loop__t[35:14] = {{{1'b0,sqrt_loop__t[35:18]},sqrt_loop__s[8]},2'b01};
           if ((sqrt_loop__r[35:14] >= sqrt_loop__t[35:14])) 
               begin 
                   sqrt_loop__s[7] = 1'b1;
                   sqrt_loop__r[35:14] = (sqrt_loop__r[35:14] - sqrt_loop__t[35:14]);
               end
               
           else 
               sqrt_loop__s[7] = 1'b0;
               
           sqrt_loop__t[35:12] = {{{1'b0,sqrt_loop__t[35:16]},sqrt_loop__s[7]},2'b01};
           if ((sqrt_loop__r[35:12] >= sqrt_loop__t[35:12])) 
               begin 
                   sqrt_loop__s[6] = 1'b1;
                   sqrt_loop__r[35:12] = (sqrt_loop__r[35:12] - sqrt_loop__t[35:12]);
               end
               
           else 
               sqrt_loop__s[6] = 1'b0;
               
           sqrt_loop__t[35:10] = {{{1'b0,sqrt_loop__t[35:14]},sqrt_loop__s[6]},2'b01};
           if ((sqrt_loop__r[35:10] >= sqrt_loop__t[35:10])) 
               begin 
                   sqrt_loop__s[5] = 1'b1;
                   sqrt_loop__r[35:10] = (sqrt_loop__r[35:10] - sqrt_loop__t[35:10]);
               end
               
           else 
               sqrt_loop__s[5] = 1'b0;
               
           sqrt_loop__t[35:8] = {{{1'b0,sqrt_loop__t[35:12]},sqrt_loop__s[5]},2'b01};
           if ((sqrt_loop__r[35:8] >= sqrt_loop__t[35:8])) 
               begin 
                   sqrt_loop__s[4] = 1'b1;
                   sqrt_loop__r[35:8] = (sqrt_loop__r[35:8] - sqrt_loop__t[35:8]);
               end
               
           else 
               sqrt_loop__s[4] = 1'b0;
               
           sqrt_loop__t[35:6] = {{{1'b0,sqrt_loop__t[35:10]},sqrt_loop__s[4]},2'b01};
           if ((sqrt_loop__r[35:6] >= sqrt_loop__t[35:6])) 
               begin 
                   sqrt_loop__s[3] = 1'b1;
                   sqrt_loop__r[35:6] = (sqrt_loop__r[35:6] - sqrt_loop__t[35:6]);
               end
               
           else 
               sqrt_loop__s[3] = 1'b0;
               
           sqrt_loop__t[35:4] = {{{1'b0,sqrt_loop__t[35:8]},sqrt_loop__s[3]},2'b01};
           if ((sqrt_loop__r[35:4] >= sqrt_loop__t[35:4])) 
               begin 
                   sqrt_loop__s[2] = 1'b1;
                   sqrt_loop__r[35:4] = (sqrt_loop__r[35:4] - sqrt_loop__t[35:4]);
               end
               
           else 
               sqrt_loop__s[2] = 1'b0;
               
           sqrt_loop__t[35:2] = {{{1'b0,sqrt_loop__t[35:6]},sqrt_loop__s[2]},2'b01};
           if ((sqrt_loop__r[35:2] >= sqrt_loop__t[35:2])) 
               begin 
                   sqrt_loop__s[1] = 1'b1;
                   sqrt_loop__r[35:2] = (sqrt_loop__r[35:2] - sqrt_loop__t[35:2]);
               end
               
           else 
               sqrt_loop__s[1] = 1'b0;
               
           sqrt_loop__t[35:0] = {{{1'b0,sqrt_loop__t[35:4]},sqrt_loop__s[1]},2'b01};
           if ((sqrt_loop__r[35:0] >= sqrt_loop__t[35:0])) 
               begin 
                   sqrt_loop__s[0] = 1'b1;
                   sqrt_loop__r[35:0] = (sqrt_loop__r[35:0] - sqrt_loop__t[35:0]);
               end
               
           else 
               sqrt_loop__s[0] = 1'b0;
               
           z <= sqrt_loop__s;
   end //always
    

endmodule

2)Division (integer X/Y)
Since it takes much time to make complete test, make one random x then, check all y less than x.


Original source code and translated output.
------------------------------------------------------------------------
-- File         DIV18.vhd                                             --
-- Entity       DIV18                                                 --
-- rev date     coded contents                                        --
-- 001 98/06/23 ueno  Make Original                                   --
------------------------------------------------------------------------
library ieee ;
use ieee.std_logic_1164.all ;
use ieee.std_logic_unsigned.all ;
--use IEEE.std_logic_signed.all;
--use IEEE.std_logic_arith.all;

------------------------------------------------------------------------
-- entity                                                             --
------------------------------------------------------------------------
entity DIV18 is
port(
        X       : in    std_logic_vector(17 downto 0) ; -- Input(18bit)
        Y       : in    std_logic_vector(17 downto 0) ; -- Input(18bit)
        C       : out   std_logic ;                     -- OverFlow Flag
        Z       : out   std_logic_vector(17 downto 0)   -- Output(18bit)
    );
end DIV18 ;

------------------------------------------------------------------------
-- architecture                                                       --
------------------------------------------------------------------------
architecture RTL of DIV18 is

begin
--------------------------------
-- X divide by Y (X < Y)
--------------------------------
DIVIDE_LOOP     : process( X, Y )
        variable    R : std_logic_vector(19 downto 0);  -- Remain
        variable    S : std_logic_vector(17 downto 0);  -- Result
        variable    T : std_logic_vector(19 downto 0);  -- Temporaly
    begin
        if( X < Y ) then
            -- Initialize value
            R := '0' & X & '0' ;    -- R = 2 * X
            T := "00" & Y ;         -- T = Y
            for i in 17 downto 0 loop
                if( R >= T ) then
                    S(i) := '1' ;
                    R := R - T ;
                else
                    S(i) := '0' ;
                end if ;
                R := R(18 downto 0) & '0' ;
            end loop ;
            -- Result
            Z <= S ;
            C <= '0' ;
        else
            C <= '1' ;
            Z <= "000000000000000000" ;
        end if ;
    end process ;

end RTL ;
------------------------------------------------------------------------
-- End of File                                                        --
------------------------------------------------------------------------

//-------------------------------------------------------------------
//
//   This file is automatically generated by VHDL to Verilog Translator.
//         Ver.1.08 Build Mar.6.2004
//               www.sugawara-systems.com   
//                    tech-support@sugawara-systems.com
//        See Original Copyright Notice for property of the file .( somewhere in this file.)
//
//--------------------------------------------------------------------


//----------------------------------------------------------------------
// File         DIV18.vhd                                             --
// Entity       DIV18                                                 --
// rev date     coded contents                                        --
// 001 98/06/23 ueno  Make Original                                   --
//----------------------------------------------------------------------

`timescale 1ns/1ns
`define ns 1
`define us (1000*`ns)
`define ms (1000*`us)
`define sec (1000*`ms)

module  div18 ( x, y, c, z );
    
    input [17:0]  x ;
    input [17:0]  y ;
    output c;
    output [17:0]  z ;


    reg [19:0] divide_loop__r;
    reg [17:0] divide_loop__s;
    reg [19:0] divide_loop__t;
    reg c;
    reg [17:0] z;


    
       
   always @ (x or y ) begin
           if ((x < y)) 
               begin 
                   divide_loop__r = {{1'b0,x},1'b0};
                   divide_loop__t = {2'b00,y};
                   begin :Block_Name_1
                       integer i;
                       for (i=17;i>=0;i=i-1) begin 
                           begin 
                               if ((divide_loop__r >= divide_loop__t)) 
                                   begin 
                                       divide_loop__s[i] = 1'b1;
                                       divide_loop__r = (divide_loop__r - divide_loop__t);
                                   end
                                   
                               else 
                                   divide_loop__s[i] = 1'b0;
                                   
                               
                               divide_loop__r = {divide_loop__r[18:0],1'b0};
                           end
                           
                       end //for
                   end //end Block
                   z <= divide_loop__s;
                   c <= 1'b0;
               end
               
           else 
               begin 
                   c <= 1'b1;
                   z <= 18'b000000000000000000;
               end
               
           
   end //always
    

endmodule

3)Z = 1/sqrt(X) Part1



------------------------------------------------------------------------
-- Title        Reverse Square-Root (1/sqr(X))                        --
-- File         RSQRT.vhd                                             --
-- Entity       RSQRT                                                 --
-- rev date     coded contents                                        --
-- 001 98/11/05 ueno  Make Original                                   --
------------------------------------------------------------------------
library ieee ;
use ieee.std_logic_1164.all ;
use ieee.std_logic_unsigned.all ;
--use IEEE.std_logic_signed.all ;
use IEEE.std_logic_arith.all ;

------------------------------------------------------------------------
-- entity                                                             --
------------------------------------------------------------------------
entity RSQRT is
port(
        X       : in    std_logic_vector(19 downto 0) ; -- Input(20bit)
        ZN      : out   std_logic_vector(3 downto 0) ;  -- Exp(4bit)
        ZM      : out   std_logic_vector(19 downto 0)   -- Man(20bit)
    );
end RSQRT ;

------------------------------------------------------------------------
-- architecture                                                       --
------------------------------------------------------------------------
architecture RTL of RSQRT is
--
-- 1st stages
-- 10bit calc
-- XX.XXXXXXXX
signal  A       : std_logic_vector(9 downto 0) ;        --
constant CONSA  : std_logic_vector(9 downto 0) := "1000000111" ;    -- 2.02734375
--
-- 2nd stages
-- 16bit calc
-- XX.XXXXXXXXXXXXXXXX
signal  B       : std_logic_vector(15 downto 0) ;       -- 
--
-- 3rd stages
-- 26bit calc
-- XX.XXXXXXXXXXXXXXXXXXXXXXXX
signal  C       : std_logic_vector(25 downto 0) ;       -- 
--
-- Constant Value
constant CONSX  : std_logic_vector(31 downto 0) := "11000000000000000000000000000000" ; -- 3.0
--
--
-- 0.XXXXXXXX
signal  M       : std_logic_vector(19 downto 0) ;       -- Mantissa
signal  N       : std_logic_vector(3 downto 0) ;        -- Expornent

begin
--------------------------------
-- Reverse Square-Root Argolizm
--
-- X = m x 4^n (m = 0.25~0.999999)
-- Z = 1/sqrt(X) = sqrt(m)/m x 2^-n
--                 ^^^^^^^^^      |
--                  ZM            ZN
-- --1st stage (3.16bit)
-- a = (2.0275551-m)            -- a = 1.78~1.02
-- --2nd stage (5.70bit) : 1000 LCs
-- b1 = (a*a)                   -- b1 = +3.17~+1.04
-- b2 = (m*b1)                  -- b2 = +0.813~+1.0208
-- b3 = (3-b2)/2                -- b3 = +0.99~+1.094
-- b4 = a*b3                    -- b4 = +1.00~+1.98
-- b  = b4
-- --3nd stage (10.82bit) : 2500 LCs
-- c1 = (b*b)                   -- c1 = +3.92~+1.00
-- c2 = (m*c1)                  -- c2 = +0.99~+1.01
-- c3 = (3-c2)/2                -- c3 = +0.99~+1.01
-- c4 = b*c3                    -- c4 = +1.00~+1.99
-- c  = c4
-- --4th stage (21.06bit) : ???? LCs
-- d1 = (c*c)                   -- d1 = +3.98~+1.00
-- d2 = (m*d1)                  -- d2 = +0.99~+1.01
-- d3 = (3-d2)/2                -- d3 = +0.99~+1.01
-- d4 = c*d3                    -- d4 = +1.00~+1.99
-- d  = d4
--
-- ZM = g3
-- ZN = n
--------------------------------
-----------------------------------------------------------
-- Initialize                                            --
-----------------------------------------------------------
RSQRT_INIT   : process( X )
    begin
        if( X(19 downto 0) = "00000000000000000000"  ) then
            M <= (others=>'0') ;
            N <= (others=>'0') ;
        else
            -- Generate M,N
            if( X(19 downto 2)     = "000000000000000000" ) then
                M <= X(1 downto 0) & "000000000000000000" ;
                N <= "0001" ;
            elsif( X(19 downto 4)  = "0000000000000000" ) then
                M <= X(3 downto 0) & "0000000000000000" ;
                N <= "0010" ;
            elsif( X(19 downto 6)  = "00000000000000" ) then
                M <= X(5 downto 0) & "00000000000000" ;
                N <= "0011" ;
            elsif( X(19 downto 8)  = "000000000000" ) then
                M <= X(7 downto 0) & "000000000000" ;
                N <= "0100" ;
            elsif( X(19 downto 10) = "0000000000" ) then
                M <= X(9 downto 0) & "0000000000" ;
                N <= "0101" ;
            elsif( X(19 downto 12)  = "00000000" ) then
                M <= X(11 downto 0) & "00000000" ;
                N <= "0110" ;
            elsif( X(19 downto 14)  = "000000" ) then
                M <= X(13 downto 0) & "000000" ;
                N <= "0111" ;
            elsif( X(19 downto 16)  = "0000" ) then
                M <= X(15 downto 0) & "0000" ;
                N <= "1000" ;
            elsif( X(19 downto 18)  = "00" ) then
                M <= X(17 downto 0) & "00" ;
                N <= "1001" ;
            else
                M <= X ;
                N <= "1010" ;
            end if ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 1st stage                                             --
-----------------------------------------------------------
RSQRT_1ST   : process( M )
    begin
        if( M = "00000000000000000000"  ) then
            A <= (others=>'0') ;
        else
            -- A = 2.03-M
            A <= CONSA - ("00" & M(19 downto 12)) ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 2nd stage                                             --
-----------------------------------------------------------
RSQRT_1ND   : process( A )
        variable    B1 : std_logic_vector(17 downto 0);  -- A(9bit)*A(9bit)
        variable    B2 : std_logic_vector(16 downto 0);  -- M(8bit)*B1(9bit)
        variable    B3 : std_logic_vector(10 downto 0);  -- 3-B2(11bit)
        variable    B4 : std_logic_vector(19 downto 0);  -- A(9bit)*B3(11bit)
    begin
        if( A = "0000000000"  ) then
            B <= (others=>'0') ;
        else
            B1 := A(8 downto 0) * A(8 downto 0) ;
            B2 := B1(17 downto 9) * M(19 downto 12) ;
            B3 := CONSX(31 downto 21) - B2(16 downto 6) ;
            B4 := B3 * A(8 downto 0) ;
            B <= B4(19 downto 4) ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 3rd stage                                             --
-----------------------------------------------------------
RSQRT_3RD   : process( B )
        variable    C1 : std_logic_vector(29 downto 0);  -- B(15bit)*B(15bit)
        variable    C2 : std_logic_vector(31 downto 0);  -- M(16bit)*C1(16bit)
        variable    C3 : std_logic_vector(18 downto 0);  -- 3-C2(19bit)
        variable    C4 : std_logic_vector(33 downto 0);  -- B(15bit)*C3(19bit)
    begin
        if( B = "0000000000000000"  ) then
            C <= (others=>'0') ;
        else
            C1 := B(14 downto 0) * B(14 downto 0) ;
            C2 := C1(29 downto 14) * M(19 downto 4) ;
            C3 := CONSX(31 downto 13) - C2(31 downto 13) ;
            C4 := C3 * B(14 downto 0) ;
            C <= C4(33 downto 8) ;
        end if ;
    end process ;
ZN <= N ;
--ZM <= A & "00000000000" ;
--ZM <= B & "0000" ;
ZM <= C(24 downto 5) ;
end RTL ;
------------------------------------------------------------------------
-- End of File                                                        --
------------------------------------------------------------------------

//-------------------------------------------------------------------
//
//   This file is automatically generated by VHDL to Verilog Translator.
//         Ver.1.08 Build Mar.6.2004
//               www.sugawara-systems.com   
//                    tech-support@sugawara-systems.com
//        See Original Copyright Notice for property of the file .( somewhere in this file.)
//
//--------------------------------------------------------------------


//----------------------------------------------------------------------
// Title        Reverse Square-Root (1/sqr(X))                        --
// File         RSQRT.vhd                                             --
// Entity       RSQRT                                                 --
// rev date     coded contents                                        --
// 001 98/11/05 ueno  Make Original                                   --
//----------------------------------------------------------------------

`timescale 1ns/1ns
`define ns 1
`define us (1000*`ns)
`define ms (1000*`us)
`define sec (1000*`ms)

module  rsqrt ( x, zn, zm );
    
    input [19:0]  x ;
    output [3:0]  zn ;
    output [19:0]  zm ;


    reg [17:0] rsqrt_1nd__b1;
    reg [16:0] rsqrt_1nd__b2;
    reg [10:0] rsqrt_1nd__b3;
    reg [19:0] rsqrt_1nd__b4;
    reg [29:0] rsqrt_3rd__c1;
    reg [31:0] rsqrt_3rd__c2;
    reg [18:0] rsqrt_3rd__c3;
    reg [33:0] rsqrt_3rd__c4;
    reg [9:0] a;
    parameter [9:0] consa=10'b1000000111;
    reg [15:0] b;
    reg [25:0] c;
    parameter [31:0] consx=32'b11000000000000000000000000000000;
    reg [19:0] m;
    reg [3:0] n;
    wire [3:0] zn;
    wire [19:0] zm;


    
       
   always @ (x ) begin
           if ((x[19:0] === 20'b00000000000000000000)) 
               begin 
                   m <= {(19-0+1- 0){1'b0}};
                   n <= {(3-0+1- 0){1'b0}};
               end
               
           else 
               begin 
                   if ((x[19:2] === 18'b000000000000000000)) 
                       begin 
                           m <= {x[1:0],18'b000000000000000000};
                           n <= 4'b0001;
                       end
                       
                   else if ((x[19:4] === 16'b0000000000000000)) 
                       begin 
                           m <= {x[3:0],16'b0000000000000000};
                           n <= 4'b0010;
                       end
                       
                   else if ((x[19:6] === 14'b00000000000000)) 
                       begin 
                           m <= {x[5:0],14'b00000000000000};
                           n <= 4'b0011;
                       end
                       
                   else if ((x[19:8] === 12'b000000000000)) 
                       begin 
                           m <= {x[7:0],12'b000000000000};
                           n <= 4'b0100;
                       end
                       
                   else if ((x[19:10] === 10'b0000000000)) 
                       begin 
                           m <= {x[9:0],10'b0000000000};
                           n <= 4'b0101;
                       end
                       
                   else if ((x[19:12] === 8'b00000000)) 
                       begin 
                           m <= {x[11:0],8'b00000000};
                           n <= 4'b0110;
                       end
                       
                   else if ((x[19:14] === 6'b000000)) 
                       begin 
                           m <= {x[13:0],6'b000000};
                           n <= 4'b0111;
                       end
                       
                   else if ((x[19:16] === 4'b0000)) 
                       begin 
                           m <= {x[15:0],4'b0000};
                           n <= 4'b1000;
                       end
                       
                   else if ((x[19:18] === 2'b00)) 
                       begin 
                           m <= {x[17:0],2'b00};
                           n <= 4'b1001;
                       end
                       
                   else 
                       begin 
                           m <= x;
                           n <= 4'b1010;
                       end
                       
                   
                   
               end 
           
   end //always
   
       
   always @ (m ) begin
           if ((m === 20'b00000000000000000000)) 
               a <= {(9-0+1- 0){1'b0}};
               
           else 
               a <= (consa - {2'b00,m[19:12]});
               
           
   end //always
   
       
   always @ (a ) begin
           if ((a === 10'b0000000000)) 
               b <= {(15-0+1- 0){1'b0}};
               
           else 
               begin 
                   rsqrt_1nd__b1 = (a[8:0] * a[8:0]);
                   rsqrt_1nd__b2 = (rsqrt_1nd__b1[17:9] * m[19:12]);
                   rsqrt_1nd__b3 = (consx[31:21] - rsqrt_1nd__b2[16:6]);
                   rsqrt_1nd__b4 = (rsqrt_1nd__b3 * a[8:0]);
                   b <= rsqrt_1nd__b4[19:4];
               end
               
           
   end //always
   
       
   always @ (b ) begin
           if ((b === 16'b0000000000000000)) 
               c <= {(25-0+1- 0){1'b0}};
               
           else 
               begin 
                   rsqrt_3rd__c1 = (b[14:0] * b[14:0]);
                   rsqrt_3rd__c2 = (rsqrt_3rd__c1[29:14] * m[19:4]);
                   rsqrt_3rd__c3 = (consx[31:13] - rsqrt_3rd__c2[31:13]);
                   rsqrt_3rd__c4 = (rsqrt_3rd__c3 * b[14:0]);
                   c <= rsqrt_3rd__c4[33:8];
               end
               
           
   end //always
   
   assign {zn}=n;
   
   assign {zm}=c[24:5];
    

endmodule

4jZ =1/sqrt(X)Part2
Same inverse (square root) as 3). Difference is precision.


------------------------------------------------------------------------
-- Title        Reverse Square-Root (1/sqr(X))                        --
-- File         RSQRT.vhd                                             --
-- Entity       RSQRT                                                 --
-- rev date     coded contents                                        --
-- 001 98/11/05 ueno  Make Original                                   --
-- 002 98/11/10 ueno  4th stage up                                    --
------------------------------------------------------------------------
library ieee ;
use ieee.std_logic_1164.all ;
use ieee.std_logic_unsigned.all ;
--use IEEE.std_logic_signed.all ;
use IEEE.std_logic_arith.all ;

------------------------------------------------------------------------
-- entity                                                             --
------------------------------------------------------------------------
entity RSQRT is
port(
        X       : in    std_logic_vector(19 downto 0) ; -- Input(20bit)
        ZN      : out   std_logic_vector(3 downto 0) ;  -- Exp(4bit)
        ZM      : out   std_logic_vector(19 downto 0)   -- Man(20bit)
    );
end RSQRT ;

------------------------------------------------------------------------
-- architecture                                                       --
------------------------------------------------------------------------
architecture RTL of RSQRT is
--
-- 1st stages
-- 10bit calc
-- XX.XXXXXXXX
signal  A       : std_logic_vector(9 downto 0) ;        --
constant CONSA  : std_logic_vector(9 downto 0) := "1000000111" ;    -- 2.02734375
--
-- 2nd stages
-- 16bit calc
-- XX.XXXXXXXXXXXXXXXX
signal  B       : std_logic_vector(15 downto 0) ;       -- 
--
-- 3rd stages
-- 24bit calc
-- XX.XXXXXXXXXXXXXXXXXXXXXX
signal  C       : std_logic_vector(23 downto 0) ;       -- 
--
-- 4th stages
-- 24bit calc
-- XX.XXXXXXXXXXXXXXXXXXXXXX
signal  D       : std_logic_vector(23 downto 0) ;       -- 
--
-- Constant Value
constant CONSX  : std_logic_vector(31 downto 0) := "11000000000000000000000000000000" ; -- 3.0
--
--
-- 0.XXXXXXXX
signal  M       : std_logic_vector(19 downto 0) ;       -- Mantissa
signal  N       : std_logic_vector(3 downto 0) ;        -- Expornent

begin
--------------------------------
-- Reverse Square-Root Argolizm
--
-- X = m x 4^n (m = 0.25~0.999999)
-- Z = 1/sqrt(X) = sqrt(m)/m x 2^-n
--                 ^^^^^^^^^      |
--                  ZM            ZN
-- --1st stage (3.16bit)
-- a = (2.0275551-m)            -- a = 1.78~1.02
-- --2nd stage (5.70bit) : 1000 LCs
-- b1 = (a*a)                   -- b1 = +3.17~+1.04
-- b2 = (m*b1)                  -- b2 = +0.813~+1.0208
-- b3 = (3-b2)/2                -- b3 = +0.99~+1.094
-- b4 = a*b3                    -- b4 = +1.00~+1.98
-- b  = b4
-- --3nd stage (10.82bit) : 2500 LCs
-- c1 = (b*b)                   -- c1 = +3.92~+1.00
-- c2 = (m*c1)                  -- c2 = +0.99~+1.01
-- c3 = (3-c2)/2                -- c3 = +0.99~+1.01
-- c4 = b*c3                    -- c4 = +1.00~+1.99
-- c  = c4
-- --4th stage (21.06bit) : 5000 LCs
-- d1 = (c*c)                   -- d1 = +3.98~+1.00
-- d2 = (m*d1)                  -- d2 = +0.99~+1.01
-- d3 = (3-d2)/2                -- d3 = +0.99~+1.01
-- d4 = c*d3                    -- d4 = +1.00~+1.99
-- d  = d4
--
-- ZM = g3
-- ZN = n
--------------------------------
-----------------------------------------------------------
-- Initialize                                            --
-----------------------------------------------------------
RSQRT_INIT   : process( X )
    begin
        if( X(19 downto 0) = "00000000000000000000"  ) then
            M <= (others=>'0') ;
            N <= (others=>'0') ;
        else
            -- Generate M,N
            if( X(19 downto 2)     = "000000000000000000" ) then
                M <= X(1 downto 0) & "000000000000000000" ;
                N <= "0001" ;
            elsif( X(19 downto 4)  = "0000000000000000" ) then
                M <= X(3 downto 0) & "0000000000000000" ;
                N <= "0010" ;
            elsif( X(19 downto 6)  = "00000000000000" ) then
                M <= X(5 downto 0) & "00000000000000" ;
                N <= "0011" ;
            elsif( X(19 downto 8)  = "000000000000" ) then
                M <= X(7 downto 0) & "000000000000" ;
                N <= "0100" ;
            elsif( X(19 downto 10) = "0000000000" ) then
                M <= X(9 downto 0) & "0000000000" ;
                N <= "0101" ;
            elsif( X(19 downto 12)  = "00000000" ) then
                M <= X(11 downto 0) & "00000000" ;
                N <= "0110" ;
            elsif( X(19 downto 14)  = "000000" ) then
                M <= X(13 downto 0) & "000000" ;
                N <= "0111" ;
            elsif( X(19 downto 16)  = "0000" ) then
                M <= X(15 downto 0) & "0000" ;
                N <= "1000" ;
            elsif( X(19 downto 18)  = "00" ) then
                M <= X(17 downto 0) & "00" ;
                N <= "1001" ;
            else
                M <= X ;
                N <= "1010" ;
            end if ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 1st stage                                             --
-----------------------------------------------------------
RSQRT_1ST   : process( M )
    begin
        if( M = "00000000000000000000"  ) then
            A <= (others=>'0') ;
        else
            -- A = 2.03-M
            A <= CONSA - ("00" & M(19 downto 12)) ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 2nd stage                                             --
-----------------------------------------------------------
RSQRT_1ND   : process( M, A )
        variable    B1 : std_logic_vector(17 downto 0);  -- A(9bit)*A(9bit)
        variable    B2 : std_logic_vector(16 downto 0);  -- M(8bit)*B1(9bit)
        variable    B3 : std_logic_vector(10 downto 0);  -- 3-B2(11bit)
        variable    B4 : std_logic_vector(19 downto 0);  -- A(9bit)*B3(11bit)
    begin
        if( A = "0000000000"  ) then
            B <= (others=>'0') ;
        else
            B1 := A(8 downto 0) * A(8 downto 0) ;
            B2 := B1(17 downto 9) * M(19 downto 12) ;
            B3 := CONSX(31 downto 21) - B2(16 downto 6) ;
            B4 := B3 * A(8 downto 0) ;
            B <= B4(19 downto 4) ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 3rd stage                                             --
-----------------------------------------------------------
RSQRT_3RD   : process( M, B )
        variable    C1 : std_logic_vector(29 downto 0);  -- B(15bit)*B(15bit)
        variable    C2 : std_logic_vector(31 downto 0);  -- M(16bit)*C1(16bit)
        variable    C3 : std_logic_vector(18 downto 0);  -- 3-C2(19bit)
        variable    C4 : std_logic_vector(33 downto 0);  -- B(15bit)*C3(19bit)
    begin
        if( B = "0000000000000000"  ) then
            C <= (others=>'0') ;
        else
            C1 := B(14 downto 0) * B(14 downto 0) ;
            C2 := C1(29 downto 14) * M(19 downto 4) ;
            C3 := CONSX(31 downto 13) - C2(31 downto 13) ;
            C4 := C3 * B(14 downto 0) ;
            C <= C4(33 downto 10) ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 4th stage                                             --
-----------------------------------------------------------
RSQRT_4TH   : process( M, C )
        variable    D1 : std_logic_vector(39 downto 0);  -- C(20bit)*C(20bit)
        variable    D2 : std_logic_vector(39 downto 0);  -- M(20bit)*D1(20bit)
        variable    D3 : std_logic_vector(23 downto 0);  -- 3-D2(24bit)
        variable    D4 : std_logic_vector(43 downto 0);  -- C(20bit)*D3(24bit)
    begin
        if( C = "000000000000000000000000"  ) then
            D <= (others=>'0') ;
        else
            D1 := C(22 downto 3) * C(22 downto 3) ;
            D2 := D1(39 downto 20) * M(19 downto 0) ;
            D3 := CONSX(31 downto 8) - D2(39 downto 16) ;
            D4 := D3 * C(22 downto 3) ;
            D <= D4(43 downto 20) ;
        end if ;
    end process ;
ZN <= N ;
--ZM <= A & "00000000000" ;
--ZM <= B & "0000" ;
--ZM <= C(22 downto 3) ;
ZM <= D(22 downto 3) ;

end RTL ;
------------------------------------------------------------------------
-- End of File                                                        --
------------------------------------------------------------------------

//-------------------------------------------------------------------
//
//   This file is automatically generated by VHDL to Verilog Translator.
//         Ver.1.08 Build Mar.6.2004
//               www.sugawara-systems.com   
//                    tech-support@sugawara-systems.com
//        See Original Copyright Notice for property of the file .( somewhere in this file.)
//
//--------------------------------------------------------------------


//----------------------------------------------------------------------
// Title        Reverse Square-Root (1/sqr(X))                        --
// File         RSQRT.vhd                                             --
// Entity       RSQRT                                                 --
// rev date     coded contents                                        --
// 001 98/11/05 ueno  Make Original                                   --
// 002 98/11/10 ueno  4th stage up                                    --
//----------------------------------------------------------------------

`timescale 1ns/1ns
`define ns 1
`define us (1000*`ns)
`define ms (1000*`us)
`define sec (1000*`ms)

module  rsqrt ( x, zn, zm );
    
    input [19:0]  x ;
    output [3:0]  zn ;
    output [19:0]  zm ;


    reg [17:0] rsqrt_1nd__b1;
    reg [16:0] rsqrt_1nd__b2;
    reg [10:0] rsqrt_1nd__b3;
    reg [19:0] rsqrt_1nd__b4;
    reg [29:0] rsqrt_3rd__c1;
    reg [31:0] rsqrt_3rd__c2;
    reg [18:0] rsqrt_3rd__c3;
    reg [33:0] rsqrt_3rd__c4;
    reg [39:0] rsqrt_4th__d1;
    reg [39:0] rsqrt_4th__d2;
    reg [23:0] rsqrt_4th__d3;
    reg [43:0] rsqrt_4th__d4;
    reg [9:0] a;
    parameter [9:0] consa=10'b1000000111;
    reg [15:0] b;
    reg [23:0] c;
    reg [23:0] d;
    parameter [31:0] consx=32'b11000000000000000000000000000000;
    reg [19:0] m;
    reg [3:0] n;
    wire [3:0] zn;
    wire [19:0] zm;


    
       
   always @ (x ) begin
           if ((x[19:0] === 20'b00000000000000000000)) 
               begin 
                   m <= {(19-0+1- 0){1'b0}};
                   n <= {(3-0+1- 0){1'b0}};
               end
               
           else 
               begin 
                   if ((x[19:2] === 18'b000000000000000000)) 
                       begin 
                           m <= {x[1:0],18'b000000000000000000};
                           n <= 4'b0001;
                       end
                       
                   else if ((x[19:4] === 16'b0000000000000000)) 
                       begin 
                           m <= {x[3:0],16'b0000000000000000};
                           n <= 4'b0010;
                       end
                       
                   else if ((x[19:6] === 14'b00000000000000)) 
                       begin 
                           m <= {x[5:0],14'b00000000000000};
                           n <= 4'b0011;
                       end
                       
                   else if ((x[19:8] === 12'b000000000000)) 
                       begin 
                           m <= {x[7:0],12'b000000000000};
                           n <= 4'b0100;
                       end
                       
                   else if ((x[19:10] === 10'b0000000000)) 
                       begin 
                           m <= {x[9:0],10'b0000000000};
                           n <= 4'b0101;
                       end
                       
                   else if ((x[19:12] === 8'b00000000)) 
                       begin 
                           m <= {x[11:0],8'b00000000};
                           n <= 4'b0110;
                       end
                       
                   else if ((x[19:14] === 6'b000000)) 
                       begin 
                           m <= {x[13:0],6'b000000};
                           n <= 4'b0111;
                       end
                       
                   else if ((x[19:16] === 4'b0000)) 
                       begin 
                           m <= {x[15:0],4'b0000};
                           n <= 4'b1000;
                       end
                       
                   else if ((x[19:18] === 2'b00)) 
                       begin 
                           m <= {x[17:0],2'b00};
                           n <= 4'b1001;
                       end
                       
                   else 
                       begin 
                           m <= x;
                           n <= 4'b1010;
                       end
                       
                   
                   
               end 
           
   end //always
   
       
   always @ (m ) begin
           if ((m === 20'b00000000000000000000)) 
               a <= {(9-0+1- 0){1'b0}};
               
           else 
               a <= (consa - {2'b00,m[19:12]});
               
           
   end //always
   
       
   always @ (m or a ) begin
           if ((a === 10'b0000000000)) 
               b <= {(15-0+1- 0){1'b0}};
               
           else 
               begin 
                   rsqrt_1nd__b1 = (a[8:0] * a[8:0]);
                   rsqrt_1nd__b2 = (rsqrt_1nd__b1[17:9] * m[19:12]);
                   rsqrt_1nd__b3 = (consx[31:21] - rsqrt_1nd__b2[16:6]);
                   rsqrt_1nd__b4 = (rsqrt_1nd__b3 * a[8:0]);
                   b <= rsqrt_1nd__b4[19:4];
               end
               
           
   end //always
   
       
   always @ (m or b ) begin
           if ((b === 16'b0000000000000000)) 
               c <= {(23-0+1- 0){1'b0}};
               
           else 
               begin 
                   rsqrt_3rd__c1 = (b[14:0] * b[14:0]);
                   rsqrt_3rd__c2 = (rsqrt_3rd__c1[29:14] * m[19:4]);
                   rsqrt_3rd__c3 = (consx[31:13] - rsqrt_3rd__c2[31:13]);
                   rsqrt_3rd__c4 = (rsqrt_3rd__c3 * b[14:0]);
                   c <= rsqrt_3rd__c4[33:10];
               end
               
           
   end //always
   
       
   always @ (m or c ) begin
           if ((c === 24'b000000000000000000000000)) 
               d <= {(23-0+1- 0){1'b0}};
               
           else 
               begin 
                   rsqrt_4th__d1 = (c[22:3] * c[22:3]);
                   rsqrt_4th__d2 = (rsqrt_4th__d1[39:20] * m[19:0]);
                   rsqrt_4th__d3 = (consx[31:8] - rsqrt_4th__d2[39:16]);
                   rsqrt_4th__d4 = (rsqrt_4th__d3 * c[22:3]);
                   d <= rsqrt_4th__d4[43:20];
               end
               
           
   end //always
   
   assign {zn}=n;
   
   assign {zm}=d[22:3];
    

endmodule

4)Z = 1/X Part‡T

------------------------------------------------------------------------
-- Title        Reverse X (1/X)                                       --
-- File         REVX.vhd                                              --
-- Entity       REVX                                                  --
-- rev date     coded contents                                        --
-- 001 98/11/10 ueno  Make Original                                   --
------------------------------------------------------------------------
library ieee ;
use ieee.std_logic_1164.all ;
use ieee.std_logic_unsigned.all ;
--use IEEE.std_logic_signed.all ;
use IEEE.std_logic_arith.all ;

------------------------------------------------------------------------
-- entity                                                             --
------------------------------------------------------------------------
entity REVX is
port(
        X       : in    std_logic_vector(19 downto 0) ; -- Input(20bit)
        ZN      : out   std_logic_vector(4 downto 0) ;  -- Exp(5bit)
        ZM      : out   std_logic_vector(19 downto 0)   -- Man(20bit)
    );
end REVX ;

------------------------------------------------------------------------
-- architecture                                                       --
------------------------------------------------------------------------
architecture RTL of REVX is
--
-- 1st stages
-- 10bit calc
-- XX.XXXXXXXX
signal  A       : std_logic_vector(9 downto 0) ;        --
constant CONSA  : std_logic_vector(9 downto 0) := "1100000000" ;    -- 3
--
-- 2nd stages
-- 16bit calc
-- XX.XXXXXXXXXXXXXXXX
signal  B       : std_logic_vector(15 downto 0) ;       -- 
--
-- 3rd stages
-- 24bit calc
-- XX.XXXXXXXXXXXXXXXXXXXXXX
signal  C       : std_logic_vector(23 downto 0) ;       -- 
--
-- 4th stages
-- 24bit calc
-- XX.XXXXXXXXXXXXXXXXXXXXXX
signal  D       : std_logic_vector(23 downto 0) ;       -- 
--
-- Constant Value
constant CONSX  : std_logic_vector(31 downto 0) := "10000000000000000000000000000000" ; -- 2.0
--
--
-- 0.XXXXXXXX
signal  M       : std_logic_vector(19 downto 0) ;       -- Mantissa
signal  N       : std_logic_vector(4 downto 0) ;        -- Expornent

begin
--------------------------------
-- Reverse X Argolizm (X>0)
--
-- X = m x 2^n (m = 0.5~0.999999)
-- Z = 1/X = 1/m x 2^-n
--            |      |
--           ZM     ZN
-- --1st stage (3bit)
-- a = (3-2*m)                  -- a = 1~2 (3.00bit)
-- a = (723-482*m)/256          -- a = 1~2 (4.08bit)
-- --2nd stage (6bit) : xxxx LCs
-- b1 = (m*a)                   -- b1 = 1~1.125
-- b2 = (2-b1)                  -- b2 = 0.875~1
-- b3 = a*b2                    -- b3 = 1~2
-- b  = b3
-- --3nd stage (12bit) : xxxx LCs
-- c1 = (m*b)                   -- c1 = 0.98~1
-- c2 = (2-c1)                  -- c2 = 1~1.01
-- c3 = b*c2                    -- c3 = 1~2
-- c  = c4
-- --4th stage (24bit) : ???? LCs
-- d1 = (m*c)                   -- d1 = 0.99~1
-- d2 = (3-d1)                  -- d2 = 1~1.00
-- d3 = c*d2                    -- d3 = 1~2
-- d  = d4
--
-- ZM = d
-- ZN = n
--------------------------------
-----------------------------------------------------------
-- Initialize                                            --
-----------------------------------------------------------
REVX_INIT   : process( X )
    begin
        if( X(19 downto 0) = "00000000000000000000"  ) then
            M <= (others=>'0') ;
            N <= (others=>'0') ;
        else
            -- Generate M,N
            if( X(19 downto 1)     = "0000000000000000000" ) then
                M <=          X(0) & "0000000000000000000" ;
                N <= "00001" ;
            elsif( X(19 downto 2)  = "000000000000000000" ) then
                M <= X(1 downto 0) & "000000000000000000" ;
                N <= "00010" ;
            elsif( X(19 downto 3)  = "00000000000000000" ) then
                M <= X(2 downto 0) & "00000000000000000" ;
                N <= "00011" ;
            elsif( X(19 downto 4)  = "0000000000000000" ) then
                M <= X(3 downto 0) & "0000000000000000" ;
                N <= "00100" ;
            elsif( X(19 downto 5)  = "000000000000000" ) then
                M <= X(4 downto 0) & "000000000000000" ;
                N <= "00101" ;
            elsif( X(19 downto 6)  = "00000000000000" ) then
                M <= X(5 downto 0) & "00000000000000" ;
                N <= "00110" ;
            elsif( X(19 downto 7)  = "0000000000000" ) then
                M <= X(6 downto 0) & "0000000000000" ;
                N <= "00111" ;
            elsif( X(19 downto 8)  = "000000000000" ) then
                M <= X(7 downto 0) & "000000000000" ;
                N <= "01000" ;
            elsif( X(19 downto 9)  = "00000000000" ) then
                M <= X(8 downto 0) & "00000000000" ;
                N <= "01001" ;
            elsif( X(19 downto 10) = "0000000000" ) then
                M <= X(9 downto 0) & "0000000000" ;
                N <= "01010" ;
            elsif( X(19 downto 11)  = "000000000" ) then
                M <= X(10 downto 0) & "000000000" ;
                N <= "01011" ;
            elsif( X(19 downto 12)  = "00000000" ) then
                M <= X(11 downto 0) & "00000000" ;
                N <= "01100" ;
            elsif( X(19 downto 13)  = "0000000" ) then
                M <= X(12 downto 0) & "0000000" ;
                N <= "01101" ;
            elsif( X(19 downto 14)  = "000000" ) then
                M <= X(13 downto 0) & "000000" ;
                N <= "01110" ;
            elsif( X(19 downto 15)  = "00000" ) then
                M <= X(14 downto 0) & "00000" ;
                N <= "01111" ;
            elsif( X(19 downto 16)  = "0000" ) then
                M <= X(15 downto 0) & "0000" ;
                N <= "10000" ;
            elsif( X(19 downto 17)  = "000" ) then
                M <= X(16 downto 0) & "000" ;
                N <= "10001" ;
            elsif( X(19 downto 18)  = "00" ) then
                M <= X(17 downto 0) & "00" ;
                N <= "10010" ;
            elsif(            X(19) = '0' ) then
                M <= X(18 downto 0) & '0' ;
                N <= "10011" ;
            else
                M <= X ;
                N <= "10100" ;
            end if ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 1st stage                                             --
-----------------------------------------------------------
REVX_1ST   : process( M )
    begin
        if( M = "00000000000000000000"  ) then
            A <= (others=>'0') ;
        else
            -- A = 3-2*M
            A <= CONSA - ('0' & M(19 downto 11)) ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 2nd stage                                             --
-----------------------------------------------------------
REVX_1ND   : process( M, A )
        variable    B1 : std_logic_vector(19 downto 0);  -- M(10bit)*A(10bit)   XX.XX....
        variable    B2 : std_logic_vector(11 downto 0);  -- 2-B1(12bit)          X.XX....
        variable    B3 : std_logic_vector(21 downto 0);  -- A(10bit)*B2(12bit) XXX.XX....
    begin
        if( A = "0000000000"  ) then
            B <= (others=>'0') ;
        else
            B1 := M(19 downto 10) * A ;
            B2 := CONSX(30 downto 19) - B1(18 downto 7) ;
            B3 := B2 * A ;
            B <= B3(20 downto 5) ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 3rd stage                                             --
-----------------------------------------------------------
REVX_3RD   : process( M, B )
        variable    C1 : std_logic_vector(31 downto 0);  -- M(16bit)*B(16bit)   XX.XX...
        variable    C2 : std_logic_vector(19 downto 0);  -- 2-C1(20bit)          X.XX...
        variable    C3 : std_logic_vector(35 downto 0);  -- B(16bit)*C2(20bit) XXX.XX...
    begin
        if( B = "0000000000000000"  ) then
            C <= (others=>'0') ;
        else
            C1 := B * M(19 downto 4) ;
            C2 := CONSX(30 downto 11) - C1(30 downto 11) ;
            C3 := C2 * B ;
            C <= C3(34 downto 11) ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 4th stage                                             --
-----------------------------------------------------------
REVX_4TH   : process( M, C )
        variable    D1 : std_logic_vector(39 downto 0);  -- M(20bit)*C(20bit)   XX.XX...
        variable    D2 : std_logic_vector(23 downto 0);  -- 2-D1(24bit)          X.XX...
        variable    D3 : std_logic_vector(43 downto 0);  -- C(20bit)*D2(24bit) XXX.XX...
    begin
        if( C = "000000000000000000000000"  ) then
            D <= (others=>'0') ;
        else
            D1 := C(23 downto 4) * M ;
            D2 := CONSX(30 downto 7) - D1(38 downto 15) ;
            D3 := D2 * C(23 downto 4) ;
            D <= D3(42 downto 19) ;
        end if ;
    end process ;
ZN <= N ;
--ZM <= A & "0000000000" ;
--ZM <= B & "0000" ;
ZM <= C(23 downto 4) ;
--ZM <= D(23 downto 4) ;

end RTL ;
------------------------------------------------------------------------
-- End of File                                                        --
------------------------------------------------------------------------

//-------------------------------------------------------------------
//
//   This file is automatically generated by VHDL to Verilog Translator.
//         Ver.1.08 Build Mar.6.2004
//               www.sugawara-systems.com   
//                    tech-support@sugawara-systems.com
//        See Original Copyright Notice for property of the file .( somewhere in this file.)
//
//--------------------------------------------------------------------


//----------------------------------------------------------------------
// Title        Reverse X (1/X)                                       --
// File         REVX.vhd                                              --
// Entity       REVX                                                  --
// rev date     coded contents                                        --
// 001 98/11/10 ueno  Make Original                                   --
//----------------------------------------------------------------------

`timescale 1ns/1ns
`define ns 1
`define us (1000*`ns)
`define ms (1000*`us)
`define sec (1000*`ms)

module  revx ( x, zn, zm );
    
    input [19:0]  x ;
    output [4:0]  zn ;
    output [19:0]  zm ;


    reg [19:0] revx_1nd__b1;
    reg [11:0] revx_1nd__b2;
    reg [21:0] revx_1nd__b3;
    reg [31:0] revx_3rd__c1;
    reg [19:0] revx_3rd__c2;
    reg [35:0] revx_3rd__c3;
    reg [39:0] revx_4th__d1;
    reg [23:0] revx_4th__d2;
    reg [43:0] revx_4th__d3;
    reg [9:0] a;
    parameter [9:0] consa=10'b1100000000;
    reg [15:0] b;
    reg [23:0] c;
    reg [23:0] d;
    parameter [31:0] consx=32'b10000000000000000000000000000000;
    reg [19:0] m;
    reg [4:0] n;
    wire [4:0] zn;
    wire [19:0] zm;


    
       
   always @ (x ) begin
           if ((x[19:0] === 20'b00000000000000000000)) 
               begin 
                   m <= {(19-0+1- 0){1'b0}};
                   n <= {(4-0+1- 0){1'b0}};
               end
               
           else 
               begin 
                   if ((x[19:1] === 19'b0000000000000000000)) 
                       begin 
                           m <= {x[0],19'b0000000000000000000};
                           n <= 5'b00001;
                       end
                       
                   else if ((x[19:2] === 18'b000000000000000000)) 
                       begin 
                           m <= {x[1:0],18'b000000000000000000};
                           n <= 5'b00010;
                       end
                       
                   else if ((x[19:3] === 17'b00000000000000000)) 
                       begin 
                           m <= {x[2:0],17'b00000000000000000};
                           n <= 5'b00011;
                       end
                       
                   else if ((x[19:4] === 16'b0000000000000000)) 
                       begin 
                           m <= {x[3:0],16'b0000000000000000};
                           n <= 5'b00100;
                       end
                       
                   else if ((x[19:5] === 15'b000000000000000)) 
                       begin 
                           m <= {x[4:0],15'b000000000000000};
                           n <= 5'b00101;
                       end
                       
                   else if ((x[19:6] === 14'b00000000000000)) 
                       begin 
                           m <= {x[5:0],14'b00000000000000};
                           n <= 5'b00110;
                       end
                       
                   else if ((x[19:7] === 13'b0000000000000)) 
                       begin 
                           m <= {x[6:0],13'b0000000000000};
                           n <= 5'b00111;
                       end
                       
                   else if ((x[19:8] === 12'b000000000000)) 
                       begin 
                           m <= {x[7:0],12'b000000000000};
                           n <= 5'b01000;
                       end
                       
                   else if ((x[19:9] === 11'b00000000000)) 
                       begin 
                           m <= {x[8:0],11'b00000000000};
                           n <= 5'b01001;
                       end
                       
                   else if ((x[19:10] === 10'b0000000000)) 
                       begin 
                           m <= {x[9:0],10'b0000000000};
                           n <= 5'b01010;
                       end
                       
                   else if ((x[19:11] === 9'b000000000)) 
                       begin 
                           m <= {x[10:0],9'b000000000};
                           n <= 5'b01011;
                       end
                       
                   else if ((x[19:12] === 8'b00000000)) 
                       begin 
                           m <= {x[11:0],8'b00000000};
                           n <= 5'b01100;
                       end
                       
                   else if ((x[19:13] === 7'b0000000)) 
                       begin 
                           m <= {x[12:0],7'b0000000};
                           n <= 5'b01101;
                       end
                       
                   else if ((x[19:14] === 6'b000000)) 
                       begin 
                           m <= {x[13:0],6'b000000};
                           n <= 5'b01110;
                       end
                       
                   else if ((x[19:15] === 5'b00000)) 
                       begin 
                           m <= {x[14:0],5'b00000};
                           n <= 5'b01111;
                       end
                       
                   else if ((x[19:16] === 4'b0000)) 
                       begin 
                           m <= {x[15:0],4'b0000};
                           n <= 5'b10000;
                       end
                       
                   else if ((x[19:17] === 3'b000)) 
                       begin 
                           m <= {x[16:0],3'b000};
                           n <= 5'b10001;
                       end
                       
                   else if ((x[19:18] === 2'b00)) 
                       begin 
                           m <= {x[17:0],2'b00};
                           n <= 5'b10010;
                       end
                       
                   else if ((x[19] === 1'b0)) 
                       begin 
                           m <= {x[18:0],1'b0};
                           n <= 5'b10011;
                       end
                       
                   else 
                       begin 
                           m <= x;
                           n <= 5'b10100;
                       end
                       
                   
                   
               end 
           
   end //always
   
       
   always @ (m ) begin
           if ((m === 20'b00000000000000000000)) 
               a <= {(9-0+1- 0){1'b0}};
               
           else 
               a <= (consa - {1'b0,m[19:11]});
               
           
   end //always
   
       
   always @ (m or a ) begin
           if ((a === 10'b0000000000)) 
               b <= {(15-0+1- 0){1'b0}};
               
           else 
               begin 
                   revx_1nd__b1 = (m[19:10] * a);
                   revx_1nd__b2 = (consx[30:19] - revx_1nd__b1[18:7]);
                   revx_1nd__b3 = (revx_1nd__b2 * a);
                   b <= revx_1nd__b3[20:5];
               end
               
           
   end //always
   
       
   always @ (m or b ) begin
           if ((b === 16'b0000000000000000)) 
               c <= {(23-0+1- 0){1'b0}};
               
           else 
               begin 
                   revx_3rd__c1 = (b * m[19:4]);
                   revx_3rd__c2 = (consx[30:11] - revx_3rd__c1[30:11]);
                   revx_3rd__c3 = (revx_3rd__c2 * b);
                   c <= revx_3rd__c3[34:11];
               end
               
           
   end //always
   
       
   always @ (m or c ) begin
           if ((c === 24'b000000000000000000000000)) 
               d <= {(23-0+1- 0){1'b0}};
               
           else 
               begin 
                   revx_4th__d1 = (c[23:4] * m);
                   revx_4th__d2 = (consx[30:7] - revx_4th__d1[38:15]);
                   revx_4th__d3 = (revx_4th__d2 * c[23:4]);
                   d <= revx_4th__d3[42:19];
               end
               
           
   end //always
   
   assign {zn}=n;
   
   assign {zm}=c[23:4];
    

endmodule
5)Z = 1/X Part2
Difference between Part 1 and 2 is precision.

------------------------------------------------------------------------
-- Title        Reverse X (1/X)                                       --
-- File         REVX.vhd                                              --
-- Entity       REVX                                                  --
-- rev date     coded contents                                        --
-- 001 98/11/10 ueno  Make Original                                   --
------------------------------------------------------------------------
library ieee ;
use ieee.std_logic_1164.all ;
use ieee.std_logic_unsigned.all ;
--use IEEE.std_logic_signed.all ;
use IEEE.std_logic_arith.all ;

------------------------------------------------------------------------
-- entity                                                             --
------------------------------------------------------------------------
entity REVX is
port(
        X       : in    std_logic_vector(19 downto 0) ; -- Input(20bit)
        ZN      : out   std_logic_vector(4 downto 0) ;  -- Exp(5bit)
        ZM      : out   std_logic_vector(19 downto 0)   -- Man(20bit)
    );
end REVX ;

------------------------------------------------------------------------
-- architecture                                                       --
------------------------------------------------------------------------
architecture RTL of REVX is
--
-- 1st stages
-- 10bit calc
-- XX.XXXXXXXX
signal  A       : std_logic_vector(9 downto 0) ;        --
constant CONSA  : std_logic_vector(9 downto 0) := "1100000000" ;    -- 3
--
-- 2nd stages
-- 16bit calc
-- XX.XXXXXXXXXXXXXXXX
signal  B       : std_logic_vector(15 downto 0) ;       -- 
--
-- 3rd stages
-- 24bit calc
-- XX.XXXXXXXXXXXXXXXXXXXXXX
signal  C       : std_logic_vector(23 downto 0) ;       -- 
--
-- 4th stages
-- 24bit calc
-- XX.XXXXXXXXXXXXXXXXXXXXXX
signal  D       : std_logic_vector(23 downto 0) ;       -- 
--
-- Constant Value
constant CONSX  : std_logic_vector(31 downto 0) := "10000000000000000000000000000000" ; -- 2.0
--
--
-- 0.XXXXXXXX
signal  M       : std_logic_vector(19 downto 0) ;       -- Mantissa
signal  N       : std_logic_vector(4 downto 0) ;        -- Expornent

begin
--------------------------------
-- Reverse X Argolizm (X>0)
--
-- X = m x 2^n (m = 0.5~0.999999)
-- Z = 1/X = 1/m x 2^-n
--            |      |
--           ZM     ZN
-- --1st stage (3bit)
-- a = (3-2*m)                  -- a = 1~2 (3.00bit)
-- a = (723-482*m)/256          -- a = 1~2 (4.08bit)
-- --2nd stage (6bit) : xxxx LCs
-- b1 = (m*a)                   -- b1 = 1~1.125
-- b2 = (2-b1)                  -- b2 = 0.875~1
-- b3 = a*b2                    -- b3 = 1~2
-- b  = b3
-- --3nd stage (12bit) : xxxx LCs
-- c1 = (m*b)                   -- c1 = 0.98~1
-- c2 = (2-c1)                  -- c2 = 1~1.01
-- c3 = b*c2                    -- c3 = 1~2
-- c  = c4
-- --4th stage (24bit) : ???? LCs
-- d1 = (m*c)                   -- d1 = 0.99~1
-- d2 = (3-d1)                  -- d2 = 1~1.00
-- d3 = c*d2                    -- d3 = 1~2
-- d  = d4
--
-- ZM = d
-- ZN = n
--------------------------------
-----------------------------------------------------------
-- Initialize                                            --
-----------------------------------------------------------
REVX_INIT   : process( X )
    begin
        if( X(19 downto 0) = "00000000000000000000"  ) then
            M <= (others=>'0') ;
            N <= (others=>'0') ;
        else
            -- Generate M,N
            if( X(19 downto 1)     = "0000000000000000000" ) then
                M <=          X(0) & "0000000000000000000" ;
                N <= "00001" ;
            elsif( X(19 downto 2)  = "000000000000000000" ) then
                M <= X(1 downto 0) & "000000000000000000" ;
                N <= "00010" ;
            elsif( X(19 downto 3)  = "00000000000000000" ) then
                M <= X(2 downto 0) & "00000000000000000" ;
                N <= "00011" ;
            elsif( X(19 downto 4)  = "0000000000000000" ) then
                M <= X(3 downto 0) & "0000000000000000" ;
                N <= "00100" ;
            elsif( X(19 downto 5)  = "000000000000000" ) then
                M <= X(4 downto 0) & "000000000000000" ;
                N <= "00101" ;
            elsif( X(19 downto 6)  = "00000000000000" ) then
                M <= X(5 downto 0) & "00000000000000" ;
                N <= "00110" ;
            elsif( X(19 downto 7)  = "0000000000000" ) then
                M <= X(6 downto 0) & "0000000000000" ;
                N <= "00111" ;
            elsif( X(19 downto 8)  = "000000000000" ) then
                M <= X(7 downto 0) & "000000000000" ;
                N <= "01000" ;
            elsif( X(19 downto 9)  = "00000000000" ) then
                M <= X(8 downto 0) & "00000000000" ;
                N <= "01001" ;
            elsif( X(19 downto 10) = "0000000000" ) then
                M <= X(9 downto 0) & "0000000000" ;
                N <= "01010" ;
            elsif( X(19 downto 11)  = "000000000" ) then
                M <= X(10 downto 0) & "000000000" ;
                N <= "01011" ;
            elsif( X(19 downto 12)  = "00000000" ) then
                M <= X(11 downto 0) & "00000000" ;
                N <= "01100" ;
            elsif( X(19 downto 13)  = "0000000" ) then
                M <= X(12 downto 0) & "0000000" ;
                N <= "01101" ;
            elsif( X(19 downto 14)  = "000000" ) then
                M <= X(13 downto 0) & "000000" ;
                N <= "01110" ;
            elsif( X(19 downto 15)  = "00000" ) then
                M <= X(14 downto 0) & "00000" ;
                N <= "01111" ;
            elsif( X(19 downto 16)  = "0000" ) then
                M <= X(15 downto 0) & "0000" ;
                N <= "10000" ;
            elsif( X(19 downto 17)  = "000" ) then
                M <= X(16 downto 0) & "000" ;
                N <= "10001" ;
            elsif( X(19 downto 18)  = "00" ) then
                M <= X(17 downto 0) & "00" ;
                N <= "10010" ;
            elsif(            X(19) = '0' ) then
                M <= X(18 downto 0) & '0' ;
                N <= "10011" ;
            else
                M <= X ;
                N <= "10100" ;
            end if ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 1st stage                                             --
-----------------------------------------------------------
REVX_1ST   : process( M )
    begin
        if( M = "00000000000000000000"  ) then
            A <= (others=>'0') ;
        else
            -- A = 3-2*M
            A <= CONSA - ('0' & M(19 downto 11)) ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 2nd stage                                             --
-----------------------------------------------------------
REVX_1ND   : process( M, A )
        variable    B1 : std_logic_vector(19 downto 0);  -- M(10bit)*A(10bit)   XX.XX....
        variable    B2 : std_logic_vector(11 downto 0);  -- 2-B1(12bit)          X.XX....
        variable    B3 : std_logic_vector(21 downto 0);  -- A(10bit)*B2(12bit) XXX.XX....
    begin
        if( A = "0000000000"  ) then
            B <= (others=>'0') ;
        else
            B1 := M(19 downto 10) * A ;
            B2 := CONSX(30 downto 19) - B1(18 downto 7) ;
            B3 := B2 * A ;
            B <= B3(20 downto 5) ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 3rd stage                                             --
-----------------------------------------------------------
REVX_3RD   : process( M, B )
        variable    C1 : std_logic_vector(31 downto 0);  -- M(16bit)*B(16bit)   XX.XX...
        variable    C2 : std_logic_vector(19 downto 0);  -- 2-C1(20bit)          X.XX...
        variable    C3 : std_logic_vector(35 downto 0);  -- B(16bit)*C2(20bit) XXX.XX...
    begin
        if( B = "0000000000000000"  ) then
            C <= (others=>'0') ;
        else
            C1 := B * M(19 downto 4) ;
            C2 := CONSX(30 downto 11) - C1(30 downto 11) ;
            C3 := C2 * B ;
            C <= C3(34 downto 11) ;
        end if ;
    end process ;
-----------------------------------------------------------
-- 4th stage                                             --
-----------------------------------------------------------
REVX_4TH   : process( M, C )
        variable    D1 : std_logic_vector(39 downto 0);  -- M(20bit)*C(20bit)   XX.XX...
        variable    D2 : std_logic_vector(23 downto 0);  -- 2-D1(24bit)          X.XX...
        variable    D3 : std_logic_vector(43 downto 0);  -- C(20bit)*D2(24bit) XXX.XX...
    begin
        if( C = "000000000000000000000000"  ) then
            D <= (others=>'0') ;
        else
            D1 := C(23 downto 4) * M ;
            D2 := CONSX(30 downto 7) - D1(38 downto 15) ;
            D3 := D2 * C(23 downto 4) ;
            D <= D3(42 downto 19) ;
        end if ;
    end process ;
ZN <= N ;
--ZM <= A & "0000000000" ;
--ZM <= B & "0000" ;
--ZM <= C(23 downto 4) ;
ZM <= D(23 downto 4) ;

end RTL ;
------------------------------------------------------------------------
-- End of File                                                        --
------------------------------------------------------------------------

//-------------------------------------------------------------------
//
//   This file is automatically generated by VHDL to Verilog Translator.
//         Ver.1.08 Build Mar.6.2004
//               www.sugawara-systems.com   
//                    tech-support@sugawara-systems.com
//        See Original Copyright Notice for property of the file .( somewhere in this file.)
//
//--------------------------------------------------------------------


//----------------------------------------------------------------------
// Title        Reverse X (1/X)                                       --
// File         REVX.vhd                                              --
// Entity       REVX                                                  --
// rev date     coded contents                                        --
// 001 98/11/10 ueno  Make Original                                   --
//----------------------------------------------------------------------

`timescale 1ns/1ns
`define ns 1
`define us (1000*`ns)
`define ms (1000*`us)
`define sec (1000*`ms)

module  revx ( x, zn, zm );
    
    input [19:0]  x ;
    output [4:0]  zn ;
    output [19:0]  zm ;


    reg [19:0] revx_1nd__b1;
    reg [11:0] revx_1nd__b2;
    reg [21:0] revx_1nd__b3;
    reg [31:0] revx_3rd__c1;
    reg [19:0] revx_3rd__c2;
    reg [35:0] revx_3rd__c3;
    reg [39:0] revx_4th__d1;
    reg [23:0] revx_4th__d2;
    reg [43:0] revx_4th__d3;
    reg [9:0] a;
    parameter [9:0] consa=10'b1100000000;
    reg [15:0] b;
    reg [23:0] c;
    reg [23:0] d;
    parameter [31:0] consx=32'b10000000000000000000000000000000;
    reg [19:0] m;
    reg [4:0] n;
    wire [4:0] zn;
    wire [19:0] zm;


    
       
   always @ (x ) begin
           if ((x[19:0] === 20'b00000000000000000000)) 
               begin 
                   m <= {(19-0+1- 0){1'b0}};
                   n <= {(4-0+1- 0){1'b0}};
               end
               
           else 
               begin 
                   if ((x[19:1] === 19'b0000000000000000000)) 
                       begin 
                           m <= {x[0],19'b0000000000000000000};
                           n <= 5'b00001;
                       end
                       
                   else if ((x[19:2] === 18'b000000000000000000)) 
                       begin 
                           m <= {x[1:0],18'b000000000000000000};
                           n <= 5'b00010;
                       end
                       
                   else if ((x[19:3] === 17'b00000000000000000)) 
                       begin 
                           m <= {x[2:0],17'b00000000000000000};
                           n <= 5'b00011;
                       end
                       
                   else if ((x[19:4] === 16'b0000000000000000)) 
                       begin 
                           m <= {x[3:0],16'b0000000000000000};
                           n <= 5'b00100;
                       end
                       
                   else if ((x[19:5] === 15'b000000000000000)) 
                       begin 
                           m <= {x[4:0],15'b000000000000000};
                           n <= 5'b00101;
                       end
                       
                   else if ((x[19:6] === 14'b00000000000000)) 
                       begin 
                           m <= {x[5:0],14'b00000000000000};
                           n <= 5'b00110;
                       end
                       
                   else if ((x[19:7] === 13'b0000000000000)) 
                       begin 
                           m <= {x[6:0],13'b0000000000000};
                           n <= 5'b00111;
                       end
                       
                   else if ((x[19:8] === 12'b000000000000)) 
                       begin 
                           m <= {x[7:0],12'b000000000000};
                           n <= 5'b01000;
                       end
                       
                   else if ((x[19:9] === 11'b00000000000)) 
                       begin 
                           m <= {x[8:0],11'b00000000000};
                           n <= 5'b01001;
                       end
                       
                   else if ((x[19:10] === 10'b0000000000)) 
                       begin 
                           m <= {x[9:0],10'b0000000000};
                           n <= 5'b01010;
                       end
                       
                   else if ((x[19:11] === 9'b000000000)) 
                       begin 
                           m <= {x[10:0],9'b000000000};
                           n <= 5'b01011;
                       end
                       
                   else if ((x[19:12] === 8'b00000000)) 
                       begin 
                           m <= {x[11:0],8'b00000000};
                           n <= 5'b01100;
                       end
                       
                   else if ((x[19:13] === 7'b0000000)) 
                       begin 
                           m <= {x[12:0],7'b0000000};
                           n <= 5'b01101;
                       end
                       
                   else if ((x[19:14] === 6'b000000)) 
                       begin 
                           m <= {x[13:0],6'b000000};
                           n <= 5'b01110;
                       end
                       
                   else if ((x[19:15] === 5'b00000)) 
                       begin 
                           m <= {x[14:0],5'b00000};
                           n <= 5'b01111;
                       end
                       
                   else if ((x[19:16] === 4'b0000)) 
                       begin 
                           m <= {x[15:0],4'b0000};
                           n <= 5'b10000;
                       end
                       
                   else if ((x[19:17] === 3'b000)) 
                       begin 
                           m <= {x[16:0],3'b000};
                           n <= 5'b10001;
                       end
                       
                   else if ((x[19:18] === 2'b00)) 
                       begin 
                           m <= {x[17:0],2'b00};
                           n <= 5'b10010;
                       end
                       
                   else if ((x[19] === 1'b0)) 
                       begin 
                           m <= {x[18:0],1'b0};
                           n <= 5'b10011;
                       end
                       
                   else 
                       begin 
                           m <= x;
                           n <= 5'b10100;
                       end
                       
                   
                   
               end 
           
   end //always
   
       
   always @ (m ) begin
           if ((m === 20'b00000000000000000000)) 
               a <= {(9-0+1- 0){1'b0}};
               
           else 
               a <= (consa - {1'b0,m[19:11]});
               
           
   end //always
   
       
   always @ (m or a ) begin
           if ((a === 10'b0000000000)) 
               b <= {(15-0+1- 0){1'b0}};
               
           else 
               begin 
                   revx_1nd__b1 = (m[19:10] * a);
                   revx_1nd__b2 = (consx[30:19] - revx_1nd__b1[18:7]);
                   revx_1nd__b3 = (revx_1nd__b2 * a);
                   b <= revx_1nd__b3[20:5];
               end
               
           
   end //always
   
       
   always @ (m or b ) begin
           if ((b === 16'b0000000000000000)) 
               c <= {(23-0+1- 0){1'b0}};
               
           else 
               begin 
                   revx_3rd__c1 = (b * m[19:4]);
                   revx_3rd__c2 = (consx[30:11] - revx_3rd__c1[30:11]);
                   revx_3rd__c3 = (revx_3rd__c2 * b);
                   c <= revx_3rd__c3[34:11];
               end
               
           
   end //always
   
       
   always @ (m or c ) begin
           if ((c === 24'b000000000000000000000000)) 
               d <= {(23-0+1- 0){1'b0}};
               
           else 
               begin 
                   revx_4th__d1 = (c[23:4] * m);
                   revx_4th__d2 = (consx[30:7] - revx_4th__d1[38:15]);
                   revx_4th__d3 = (revx_4th__d2 * c[23:4]);
                   d <= revx_4th__d3[42:19];
               end
               
           
   end //always
   
   assign {zn}=n;
   
   assign {zm}=d[23:4];
    

endmodule

6)Z = log(X)

------------------------------------------------------------------------
-- Title        Logalizm X (log(X))                                   --
-- File         LOG.vhd                                               --
-- Entity       LOG                                                   --
-- rev date     coded contents                                        --
-- 001 98/11/17 ueno  Make Original                                   --
------------------------------------------------------------------------
library ieee ;
use ieee.std_logic_1164.all ;
use ieee.std_logic_unsigned.all ;
--use IEEE.std_logic_signed.all ;
use IEEE.std_logic_arith.all ;

------------------------------------------------------------------------
-- entity                                                             --
------------------------------------------------------------------------
entity LOG is
port(
-- XXXXXXXXXXXXXXXXXXXX.    Integer Value
        X       : in    std_logic_vector(19 downto 0) ; -- Input(20bit)
-- XXXX.XXXXXXXXXXXXXXXX    Fixed Point Value
        Z       : out   std_logic_vector(19 downto 0)   -- Output(20bit)
    );
end LOG ;

------------------------------------------------------------------------
-- architecture                                                       --
------------------------------------------------------------------------
architecture RTL of LOG is
-- log(2)
-- .XXXXXXXXXXXXXXXX
constant LOG2V  : std_logic_vector(15 downto 0) := "1011000101110010" ;
-- 1/2 = shift1
-- 1/3
constant CONS3  : std_logic_vector(15 downto 0) := "0101010101010101" ; -- 4bit
-- 1/4 = shift2
-- 1/5
-- 1/6 = 1/3&shift
-- 1/7
constant CONS5  : std_logic_vector(15 downto 0) := "0011001100110011" ; -- 7bit
constant CONS7  : std_logic_vector(15 downto 0) := "0010010010010010" ; -- 9bit
-- 1/8 = shift3
-- 1/9
-- 1/10 = 1/5&shift
-- 1/11
-- 1/12 = 1/3&shift2
-- 1/13
-- 1/14 = 1/7&shift2
-- 1/15
constant CONS9  : std_logic_vector(15 downto 0) := "0001110001110001" ; -- 11bit
constant CONS11 : std_logic_vector(15 downto 0) := "0001011101000101" ; -- 14bit
constant CONS13 : std_logic_vector(15 downto 0) := "0001001110110001" ; -- 16bit
constant CONS15 : std_logic_vector(15 downto 0) := "0001000100010001" ; -- 18bit
--
-- .XXXXXXXXXXXXXXXX
signal  Y       : std_logic_vector(15 downto 0) ;       -- Log( M )
--
signal  F       : std_logic_vector(20 downto 0) ;       -- N*log(2)
signal  G       : std_logic_vector(20 downto 0) ;       -- temp Z
--
-- 0.XXXXXXXX
signal  M       : std_logic_vector(19 downto 0) ;       -- Mantissa
signal  N       : std_logic_vector(4 downto 0) ;        -- Expornent

begin
--------------------------------
-- Reverse X Argolizm (X>0)
--
-- X = m x 2^n (m = 0.5~0.999999)
-- m = 1-h
-- Z = log(2)*n+log(m)
--     log(2)*n-(h+h^2/2+h^3/3+h^4/4+ ....)
--
--------------------------------
-----------------------------------------------------------
-- Initialize                                            --
-----------------------------------------------------------
FLOT_INIT   : process( X )
    begin
        if( X(19 downto 0) = "00000000000000000000"  ) then
            M <= (others=>'0') ;
            N <= (others=>'0') ;
        else
            -- Generate M,N
            if( X(19 downto 1)     = "0000000000000000000" ) then
                M <=          X(0) & "0000000000000000000" ;
                N <= "00001" ;
            elsif( X(19 downto 2)  = "000000000000000000" ) then
                M <= X(1 downto 0) & "000000000000000000" ;
                N <= "00010" ;
            elsif( X(19 downto 3)  = "00000000000000000" ) then
                M <= X(2 downto 0) & "00000000000000000" ;
                N <= "00011" ;
            elsif( X(19 downto 4)  = "0000000000000000" ) then
                M <= X(3 downto 0) & "0000000000000000" ;
                N <= "00100" ;
            elsif( X(19 downto 5)  = "000000000000000" ) then
                M <= X(4 downto 0) & "000000000000000" ;
                N <= "00101" ;
            elsif( X(19 downto 6)  = "00000000000000" ) then
                M <= X(5 downto 0) & "00000000000000" ;
                N <= "00110" ;
            elsif( X(19 downto 7)  = "0000000000000" ) then
                M <= X(6 downto 0) & "0000000000000" ;
                N <= "00111" ;
            elsif( X(19 downto 8)  = "000000000000" ) then
                M <= X(7 downto 0) & "000000000000" ;
                N <= "01000" ;
            elsif( X(19 downto 9)  = "00000000000" ) then
                M <= X(8 downto 0) & "00000000000" ;
                N <= "01001" ;
            elsif( X(19 downto 10) = "0000000000" ) then
                M <= X(9 downto 0) & "0000000000" ;
                N <= "01010" ;
            elsif( X(19 downto 11)  = "000000000" ) then
                M <= X(10 downto 0) & "000000000" ;
                N <= "01011" ;
            elsif( X(19 downto 12)  = "00000000" ) then
                M <= X(11 downto 0) & "00000000" ;
                N <= "01100" ;
            elsif( X(19 downto 13)  = "0000000" ) then
                M <= X(12 downto 0) & "0000000" ;
                N <= "01101" ;
            elsif( X(19 downto 14)  = "000000" ) then
                M <= X(13 downto 0) & "000000" ;
                N <= "01110" ;
            elsif( X(19 downto 15)  = "00000" ) then
                M <= X(14 downto 0) & "00000" ;
                N <= "01111" ;
            elsif( X(19 downto 16)  = "0000" ) then
                M <= X(15 downto 0) & "0000" ;
                N <= "10000" ;
            elsif( X(19 downto 17)  = "000" ) then
                M <= X(16 downto 0) & "000" ;
                N <= "10001" ;
            elsif( X(19 downto 18)  = "00" ) then
                M <= X(17 downto 0) & "00" ;
                N <= "10010" ;
            elsif(            X(19) = '0' ) then
                M <= X(18 downto 0) & '0' ;
                N <= "10011" ;
            else
                M <= X ;
                N <= "10100" ;
            end if ;
        end if ;
    end process ;
-----------------------------------------------------------
-- logalizm calculate                                    --
-----------------------------------------------------------
LOG_CONV    : process( M )
        variable    TMP : std_logic_vector(19 downto 0);  -- 1-m
        variable    H   : std_logic_vector(15 downto 0);  -- 1-m
        variable    B1  : std_logic_vector(15 downto 0);  -- H
        variable    B2  : std_logic_vector(31 downto 0);  -- H^2
        variable    B3  : std_logic_vector(31 downto 0);  -- H^3
        variable    B4  : std_logic_vector(31 downto 0);  -- H^4
        variable    B5  : std_logic_vector(31 downto 0);  -- 
        variable    B6  : std_logic_vector(31 downto 0);  -- 
        variable    B7  : std_logic_vector(31 downto 0);  -- 
        variable    B8  : std_logic_vector(31 downto 0);  -- 
        variable    B9  : std_logic_vector(31 downto 0);  -- 
        variable    B10 : std_logic_vector(31 downto 0);  -- 
        variable    B11 : std_logic_vector(31 downto 0);  -- 
        variable    B12 : std_logic_vector(31 downto 0);  -- 
        variable    B13 : std_logic_vector(31 downto 0);  -- 
        variable    C1  : std_logic_vector(15 downto 0);  -- H
        variable    C2  : std_logic_vector(15 downto 0);  -- H^2
        variable    C3  : std_logic_vector(15 downto 0);  -- H^3
        variable    C4  : std_logic_vector(15 downto 0);  -- H^4
        variable    C5  : std_logic_vector(15 downto 0);  -- 
        variable    C6  : std_logic_vector(15 downto 0);  -- 
        variable    C7  : std_logic_vector(15 downto 0);  -- 
        variable    C8  : std_logic_vector(15 downto 0);  -- 
        variable    C9  : std_logic_vector(15 downto 0);  -- 
        variable    C10 : std_logic_vector(15 downto 0);  -- 
        variable    C11 : std_logic_vector(15 downto 0);  -- 
        variable    C12 : std_logic_vector(15 downto 0);  -- 
        variable    C13 : std_logic_vector(15 downto 0);  -- 
        variable    D   : std_logic_vector(15 downto 0);  -- 
    begin
        if( M = "00000000000000000000"  ) then
            Y <= (others=>'0') ;
        else
            -- TMP = -M
            TMP := "00000000000000000000" - M ;
            H := TMP(19 downto 4) ;
            -- BEKI
            B1  := H ;
            B2  := H*H ;
            B3  := B2(31 downto 16)*H ;
            B4  := B2(31 downto 16)*B2(31 downto 16) ;
            B5  := B4(31 downto 16)*H ;
            B6  := B4(31 downto 16)*B2(31 downto 16) ;
            B7  := B4(31 downto 16)*B3(31 downto 16) ;
            B8  := B4(31 downto 16)*B4(31 downto 16) ;
            B9  := B8(31 downto 16)*H ;
            B10 := B8(31 downto 16)*B2(31 downto 16) ;
            B11 := B8(31 downto 16)*B3(31 downto 16) ;
            B12 := B8(31 downto 16)*B4(31 downto 16) ;
            B13 := B8(31 downto 16)*B5(31 downto 16) ;
            -- KEISU
            C1  := B1 ;
            C2  := '0' & B2(31 downto 17) ;
            B3  := B3(31 downto 16)*CONS3 ;
            C3  := B3(31 downto 16) ;
            C4  := "00" & B4(31 downto 18) ;
            B5  := B5(31 downto 16)*CONS5 ;
            C5  := B5(31 downto 16) ;
            B6  := B6(31 downto 16)*CONS3 ;
            C6  := '0' & B6(31 downto 17) ;
            B7  := B7(31 downto 16)*CONS7 ;
            C7  := B7(31 downto 16) ;
            C8  := "000" & B8(31 downto 19) ;
            B9  := B9(31 downto 16)*CONS9 ;
            C9  := B9(31 downto 16) ;
            B10 := B10(31 downto 16)*CONS5 ;
            C10 := '0' & B10(31 downto 17) ;
            B11 := B11(31 downto 16)*CONS11 ;
            C11 := B11(31 downto 16) ;
            B12 := B12(31 downto 16)*CONS3 ;
            C12 := "00" & B12(31 downto 18) ;
            B13 := B13(31 downto 16)*CONS13 ;
            C13 := B13(31 downto 16) ;
            -- KASAN
            D := C1+C2+C3+C4+C5+C6+C7+C8+C9+C10+C11+C12+C13 ;
            -- KEKKA
            Y <= D ;
        end if ;
    end process ;
-----------------------------------------------------------
-- output calculate                                      --
-----------------------------------------------------------
--Feb.14.2005 TAK
OUTPUT_CALC : process( M,G) -- N, Y )
    begin
       if( M = "00000000000000000000"  ) then
           Z <= (others=>'0') ;
       else
        --   F <= N * LOG2V ;
         --  G <= F - ("00000" & Y) ;
           Z <= G(19 downto 0) ;
        end if ;
   end process ;
F <= N * LOG2V ;
G <= F - ("00000" & Y) ;

end RTL ;
------------------------------------------------------------------------
-- End of File                                                        --
------------------------------------------------------------------------
//-------------------------------------------------------------------
//
//   This file is automatically generated by VHDL to Verilog Translator.
//         Ver.1.08 Build Mar.6.2004
//               www.sugawara-systems.com   
//                    tech-support@sugawara-systems.com
//        See Original Copyright Notice for property of the file .( somewhere in this file.)
//
//--------------------------------------------------------------------


//----------------------------------------------------------------------
// Title        Logalizm X (log(X))                                   --
// File         LOG.vhd                                               --
// Entity       LOG                                                   --
// rev date     coded contents                                        --
// 001 98/11/17 ueno  Make Original                                   --
//----------------------------------------------------------------------

`timescale 1ns/1ns
`define ns 1
`define us (1000*`ns)
`define ms (1000*`us)
`define sec (1000*`ms)

module  log ( x, z );
    
    input [19:0]  x ;
    output [19:0]  z ;


    reg [19:0] log_conv__tmp;
    reg [15:0] log_conv__h;
    reg [15:0] log_conv__b1;
    reg [31:0] log_conv__b2;
    reg [31:0] log_conv__b3;
    reg [31:0] log_conv__b4;
    reg [31:0] log_conv__b5;
    reg [31:0] log_conv__b6;
    reg [31:0] log_conv__b7;
    reg [31:0] log_conv__b8;
    reg [31:0] log_conv__b9;
    reg [31:0] log_conv__b10;
    reg [31:0] log_conv__b11;
    reg [31:0] log_conv__b12;
    reg [31:0] log_conv__b13;
    reg [15:0] log_conv__c1;
    reg [15:0] log_conv__c2;
    reg [15:0] log_conv__c3;
    reg [15:0] log_conv__c4;
    reg [15:0] log_conv__c5;
    reg [15:0] log_conv__c6;
    reg [15:0] log_conv__c7;
    reg [15:0] log_conv__c8;
    reg [15:0] log_conv__c9;
    reg [15:0] log_conv__c10;
    reg [15:0] log_conv__c11;
    reg [15:0] log_conv__c12;
    reg [15:0] log_conv__c13;
    reg [15:0] log_conv__d;
    parameter [15:0] log2v=16'b1011000101110010;
    parameter [15:0] cons3=16'b0101010101010101;
    parameter [15:0] cons5=16'b0011001100110011;
    parameter [15:0] cons7=16'b0010010010010010;
    parameter [15:0] cons9=16'b0001110001110001;
    parameter [15:0] cons11=16'b0001011101000101;
    parameter [15:0] cons13=16'b0001001110110001;
    parameter [15:0] cons15=16'b0001000100010001;
    reg [15:0] y;
    wire [20:0] f;
    wire [20:0] g;
    reg [19:0] m;
    reg [4:0] n;
    reg [19:0] z;


    
       
   always @ (x ) begin
           if ((x[19:0] === 20'b00000000000000000000)) 
               begin 
                   m <= {(19-0+1- 0){1'b0}};
                   n <= {(4-0+1- 0){1'b0}};
               end
               
           else 
               begin 
                   if ((x[19:1] === 19'b0000000000000000000)) 
                       begin 
                           m <= {x[0],19'b0000000000000000000};
                           n <= 5'b00001;
                       end
                       
                   else if ((x[19:2] === 18'b000000000000000000)) 
                       begin 
                           m <= {x[1:0],18'b000000000000000000};
                           n <= 5'b00010;
                       end
                       
                   else if ((x[19:3] === 17'b00000000000000000)) 
                       begin 
                           m <= {x[2:0],17'b00000000000000000};
                           n <= 5'b00011;
                       end
                       
                   else if ((x[19:4] === 16'b0000000000000000)) 
                       begin 
                           m <= {x[3:0],16'b0000000000000000};
                           n <= 5'b00100;
                       end
                       
                   else if ((x[19:5] === 15'b000000000000000)) 
                       begin 
                           m <= {x[4:0],15'b000000000000000};
                           n <= 5'b00101;
                       end
                       
                   else if ((x[19:6] === 14'b00000000000000)) 
                       begin 
                           m <= {x[5:0],14'b00000000000000};
                           n <= 5'b00110;
                       end
                       
                   else if ((x[19:7] === 13'b0000000000000)) 
                       begin 
                           m <= {x[6:0],13'b0000000000000};
                           n <= 5'b00111;
                       end
                       
                   else if ((x[19:8] === 12'b000000000000)) 
                       begin 
                           m <= {x[7:0],12'b000000000000};
                           n <= 5'b01000;
                       end
                       
                   else if ((x[19:9] === 11'b00000000000)) 
                       begin 
                           m <= {x[8:0],11'b00000000000};
                           n <= 5'b01001;
                       end
                       
                   else if ((x[19:10] === 10'b0000000000)) 
                       begin 
                           m <= {x[9:0],10'b0000000000};
                           n <= 5'b01010;
                       end
                       
                   else if ((x[19:11] === 9'b000000000)) 
                       begin 
                           m <= {x[10:0],9'b000000000};
                           n <= 5'b01011;
                       end
                       
                   else if ((x[19:12] === 8'b00000000)) 
                       begin 
                           m <= {x[11:0],8'b00000000};
                           n <= 5'b01100;
                       end
                       
                   else if ((x[19:13] === 7'b0000000)) 
                       begin 
                           m <= {x[12:0],7'b0000000};
                           n <= 5'b01101;
                       end
                       
                   else if ((x[19:14] === 6'b000000)) 
                       begin 
                           m <= {x[13:0],6'b000000};
                           n <= 5'b01110;
                       end
                       
                   else if ((x[19:15] === 5'b00000)) 
                       begin 
                           m <= {x[14:0],5'b00000};
                           n <= 5'b01111;
                       end
                       
                   else if ((x[19:16] === 4'b0000)) 
                       begin 
                           m <= {x[15:0],4'b0000};
                           n <= 5'b10000;
                       end
                       
                   else if ((x[19:17] === 3'b000)) 
                       begin 
                           m <= {x[16:0],3'b000};
                           n <= 5'b10001;
                       end
                       
                   else if ((x[19:18] === 2'b00)) 
                       begin 
                           m <= {x[17:0],2'b00};
                           n <= 5'b10010;
                       end
                       
                   else if ((x[19] === 1'b0)) 
                       begin 
                           m <= {x[18:0],1'b0};
                           n <= 5'b10011;
                       end
                       
                   else 
                       begin 
                           m <= x;
                           n <= 5'b10100;
                       end
                       
                   
                   
               end 
           
   end //always
   
       
   always @ (m ) begin
           if ((m === 20'b00000000000000000000)) 
               y <= {(15-0+1- 0){1'b0}};
               
           else 
               begin 
                   log_conv__tmp = (20'b00000000000000000000 - m);
                   log_conv__h = log_conv__tmp[19:4];
                   log_conv__b1 = log_conv__h;
                   log_conv__b2 = (log_conv__h * log_conv__h);
                   log_conv__b3 = (log_conv__b2[31:16] * log_conv__h);
                   log_conv__b4 = (log_conv__b2[31:16] * log_conv__b2[31:16]);
                   log_conv__b5 = (log_conv__b4[31:16] * log_conv__h);
                   log_conv__b6 = (log_conv__b4[31:16] * log_conv__b2[31:16]);
                   log_conv__b7 = (log_conv__b4[31:16] * log_conv__b3[31:16]);
                   log_conv__b8 = (log_conv__b4[31:16] * log_conv__b4[31:16]);
                   log_conv__b9 = (log_conv__b8[31:16] * log_conv__h);
                   log_conv__b10 = (log_conv__b8[31:16] * log_conv__b2[31:16]);
                   log_conv__b11 = (log_conv__b8[31:16] * log_conv__b3[31:16]);
                   log_conv__b12 = (log_conv__b8[31:16] * log_conv__b4[31:16]);
                   log_conv__b13 = (log_conv__b8[31:16] * log_conv__b5[31:16]);
                   log_conv__c1 = log_conv__b1;
                   log_conv__c2 = {1'b0,log_conv__b2[31:17]};
                   log_conv__b3 = (log_conv__b3[31:16] * cons3);
                   log_conv__c3 = log_conv__b3[31:16];
                   log_conv__c4 = {2'b00,log_conv__b4[31:18]};
                   log_conv__b5 = (log_conv__b5[31:16] * cons5);
                   log_conv__c5 = log_conv__b5[31:16];
                   log_conv__b6 = (log_conv__b6[31:16] * cons3);
                   log_conv__c6 = {1'b0,log_conv__b6[31:17]};
                   log_conv__b7 = (log_conv__b7[31:16] * cons7);
                   log_conv__c7 = log_conv__b7[31:16];
                   log_conv__c8 = {3'b000,log_conv__b8[31:19]};
                   log_conv__b9 = (log_conv__b9[31:16] * cons9);
                   log_conv__c9 = log_conv__b9[31:16];
                   log_conv__b10 = (log_conv__b10[31:16] * cons5);
                   log_conv__c10 = {1'b0,log_conv__b10[31:17]};
                   log_conv__b11 = (log_conv__b11[31:16] * cons11);
                   log_conv__c11 = log_conv__b11[31:16];
                   log_conv__b12 = (log_conv__b12[31:16] * cons3);
                   log_conv__c12 = {2'b00,log_conv__b12[31:18]};
                   log_conv__b13 = (log_conv__b13[31:16] * cons13);
                   log_conv__c13 = log_conv__b13[31:16];
                   log_conv__d = ((((((((((((log_conv__c1 + log_conv__c2) + log_conv__c3) + log_conv__c4) + log_conv__c5) + log_conv__c6) + log_conv__c7) + log_conv__c8) + log_conv__c9) + log_conv__c10) + log_conv__c11) + log_conv__c12) + log_conv__c13);
                   y <= log_conv__d;
               end
               
           
   end //always
   
       
   always @ (m or g ) begin
           if ((m === 20'b00000000000000000000)) 
               z <= {(19-0+1- 0){1'b0}};
               
           else 
               z <= g[19:0];
               
           
   end //always
   
   assign {f}=(n * log2v);
   
   assign {g}=(f - {5'b00000,y});
    

endmodule

7)Cordic sin,cos,atan(y/x)
 Note signed is essential..
//Feb.13.2005
//Feb.15.2005
//Tak.Sugawara
module cordic_bench_test;
    parameter cos_sin_mode=1'b0,atan_mode=1'b1;
    parameter integer bit_precision=10;//11 fails
    parameter integer atan_precision=11;//12 fails      
    parameter integer precision=bit_precision;//
    parameter real allowable_error=1.0/(2**precision);
    parameter real allowable_error_atan=1.0/(2**atan_precision);

    parameter integer scale_power=14;//bit
    parameter integer scale=2**scale_power;//16384
    parameter real max_test_angle_degree=91;//max of 100 degree 
    reg [15:0]  in_x=0 ;
    reg [15:0]  in_y=0 ;
    reg signed [15:0]  in_angle=0 ;
    reg in_start=0;
    reg in_mode=cos_sin_mode;
    reg clk=0;
    reg enable=0;
    reg xrst=0;
    wire out_finish;
    wire signed [15:0]  out_x ;
    wire signed [15:0]  out_y ;
    wire signed [15:0]  out_z ;

//
    real in_angle_r;
    real max_in_angle_r;//
    real hard_sin,hard_cos;//
    real max_angle_r;
    real h_sin_limit,l_sin_limit;
   
    real h_cos_limit,l_cos_limit;       
    integer i;
    real work,work1;
    real x_r,y_r,hard_z,angle_z;
        
        always #10 clk=~clk;

cordic dut ( in_x, in_y, in_angle, in_start, in_mode, clk, enable, xrst, out_finish, out_x, out_y, out_z );

        initial begin

//sin/cos test
//test  0->90degree
                repeat(2) @(posedge clk);
                @(negedge clk);
                 xrst=1;
                 in_start=1;
                 enable=1;
                begin :for_loop1
                  for (i=0; 1;i=i+1) begin 
                
                        in_angle=i;
                        @(negedge clk) in_start=0;
                        repeat(3) @(negedge clk);       
                        wait (out_finish);//wait hardware calculation
                        in_angle_r=$itor(in_angle)/$itor(scale);
                        hard_sin=$itor(out_y)/$itor(scale);
                        hard_cos=$itor(out_x)/$itor(scale);
                
                        work=$sin(in_angle_r);
                        work1=allowable_error;
                        h_sin_limit=$sin(in_angle_r)+allowable_error;//evaluate as output-bit-precision
                        l_sin_limit=$sin(in_angle_r)-allowable_error;
                
                        h_cos_limit=$cos(in_angle_r)+allowable_error;
                        l_cos_limit=$cos(in_angle_r)-allowable_error;
                        if (h_sin_limit  < hard_sin)begin
                                $display("sin max error detected %g %g",h_sin_limit,hard_sin);
                                $stop;
                        end             
                if (l_sin_limit > hard_sin) begin 
                                $display("sin min error detected %g %g",l_sin_limit,hard_sin);
                        end
                        if (h_cos_limit  < hard_cos)begin
                                $display("cos max error detected %g %g",h_cos_limit,hard_sin);
                                $stop;
                        end             
                if (l_cos_limit > hard_cos) begin 
                                $display("cos min error detected %g %g",l_cos_limit,hard_sin);
                        end
                        if (i%1000==0)
                        $display("i=%d in_angle_r=%g sin=%g hadware_result=%g",i,in_angle_r,$sin(in_angle_r),hard_sin);

                        max_angle_r=max_test_angle_degree/180.*$M_PI;
                        if (max_angle_r < in_angle_r) disable for_loop1;//exit test loop
                        @(negedge clk) in_start=1;
                end
             end //for loop
//test  0->-90degree
                @(negedge clk);
                  in_start=1;
                 enable=1;
                begin :for_loop2
                  for (i=0; 1;i=i+1) begin 
                
                        in_angle=-i;
                        @(negedge clk) in_start=0;
                        repeat(3) @(negedge clk);       
                        wait (out_finish);//wait hardware calculation
                        in_angle_r=$itor(in_angle)/$itor(scale);
                        hard_sin=$itor(out_y)/$itor(scale);
                        hard_cos=$itor(out_x)/$itor(scale);
                
                        work=$sin(in_angle_r);
                        work1=allowable_error;
                        h_sin_limit=$sin(in_angle_r)+allowable_error;//evaluate as output-bit-precision
                        l_sin_limit=$sin(in_angle_r)-allowable_error;
                
                        h_cos_limit=$cos(in_angle_r)+allowable_error;
                        l_cos_limit=$cos(in_angle_r)-allowable_error;
                        if (h_sin_limit  < hard_sin)begin
                                $display("sin max error detected %g %g",h_sin_limit,hard_sin);
                                $stop;
                        end             
                if (l_sin_limit > hard_sin) begin 
                                $display("sin min error detected %g %g",l_sin_limit,hard_sin);
                        end
                        if (h_cos_limit  < hard_cos)begin
                                $display("cos max error detected %g %g",h_cos_limit,hard_sin);
                                $stop;
                        end             
                if (l_cos_limit > hard_cos) begin 
                                $display("cos min error detected %g %g",l_cos_limit,hard_sin);
                        end
                        if (i%1000==0)
                        $display("i=%d in_angle_r=%g sin=%g hadware_result=%g",i,in_angle_r,$sin(in_angle_r),hard_sin);

                        max_angle_r=max_test_angle_degree/180.*$M_PI;
                        if (-max_angle_r > in_angle_r) disable for_loop2;//exit test loop
                        @(negedge clk) in_start=1;
                end
             end //for loop     

             $display("Cordic sin/cos test passed");            

//atan (y/x) 
//test scheme 
//   1>=x>0  assuming x**2+y**2=1  y=sqrt(1-xx*2);
//
                xrst=0;
                repeat(2) @(negedge clk);
                @(negedge clk);
                in_start=1;
                enable=1; 
                xrst=1; 
                in_mode=atan_mode;              
                for (i=0;i<= scale;i=i+1) begin                                 
                        in_x=i;//Start, with given in_x and in_y
                        x_r=$itor(i)/scale;
                        work=1.0-x_r**2;
                        y_r=$sqrt(work);
                        work1=y_r*scale;
                        in_y=$rtoi(work1);
                        @(negedge clk) in_start=0;//deassert _instart
                        repeat(3) @(negedge clk);       
                        wait (out_finish);//wait hardware calculation
                        @(negedge clk);
                        hard_z=$itor(out_z)/scale;//get hardware result.
                        if (i==0) angle_z=$M_PI/2.0;
                        else if (i==scale) angle_z=0.0;
                        else angle_z=$atan(y_r/x_r);
                        if (hard_z > angle_z+allowable_error_atan) begin
                                 $display("Error Detected atan max");
                                 $stop;//assert(0);
                        end
                        if (hard_z < angle_z-allowable_error_atan) begin 
                                $display("Error Detected atan min");
                                $stop;//assert(0);
                        end
                        @(negedge clk) in_start=1;
                end
                $display("atan(y/x) test passed");
                $finish;
        end
endmodule


Results are as follows.
i= 0 in_angle_r=0 sin=0 hadware_result=0.000244141
i= 1000 in_angle_r=0.0610352 sin=0.0609973 hadware_result=0.0609131
i= 2000 in_angle_r=0.12207 sin=0.121767 hadware_result=0.121948
i= 3000 in_angle_r=0.183105 sin=0.182084 hadware_result=0.18219
i= 4000 in_angle_r=0.244141 sin=0.241723 hadware_result=0.241943
i= 5000 in_angle_r=0.305176 sin=0.300461 hadware_result=0.300415
i= 6000 in_angle_r=0.366211 sin=0.35808 hadware_result=0.357971
i= 7000 in_angle_r=0.427246 sin=0.414366 hadware_result=0.414246
i= 8000 in_angle_r=0.488281 sin=0.469109 hadware_result=0.469177
i= 9000 in_angle_r=0.549316 sin=0.522104 hadware_result=0.521973
i= 10000 in_angle_r=0.610352 sin=0.573156 hadware_result=0.573181
i= 11000 in_angle_r=0.671387 sin=0.622072 hadware_result=0.622009
i= 12000 in_angle_r=0.732422 sin=0.668672 hadware_result=0.668701
i= 13000 in_angle_r=0.793457 sin=0.712782 hadware_result=0.712769
i= 14000 in_angle_r=0.854492 sin=0.754238 hadware_result=0.754395
i= 15000 in_angle_r=0.915527 sin=0.792884 hadware_result=0.79303
i= 16000 in_angle_r=0.976563 sin=0.828578 hadware_result=0.828491
i= 17000 in_angle_r=1.0376 sin=0.861186 hadware_result=0.861328
i= 18000 in_angle_r=1.09863 sin=0.890586 hadware_result=0.890686
i= 19000 in_angle_r=1.15967 sin=0.91667 hadware_result=0.91687
i= 20000 in_angle_r=1.2207 sin=0.939341 hadware_result=0.93927
i= 21000 in_angle_r=1.28174 sin=0.958513 hadware_result=0.958435
i= 22000 in_angle_r=1.34277 sin=0.974115 hadware_result=0.974121
i= 23000 in_angle_r=1.40381 sin=0.98609 hadware_result=0.986145
i= 24000 in_angle_r=1.46484 sin=0.994392 hadware_result=0.994324
i= 25000 in_angle_r=1.52588 sin=0.998991 hadware_result=0.999023
i= 26000 in_angle_r=1.58691 sin=0.99987 hadware_result=0.999573
i= 0 in_angle_r=0 sin=0 hadware_result=0.000244141
i= 1000 in_angle_r=-0.0610352 sin=-0.0609973 hadware_result=-0.0606689
i= 2000 in_angle_r=-0.12207 sin=-0.121767 hadware_result=-0.121582
i= 3000 in_angle_r=-0.183105 sin=-0.182084 hadware_result=-0.181946
i= 4000 in_angle_r=-0.244141 sin=-0.241723 hadware_result=-0.241943
i= 5000 in_angle_r=-0.305176 sin=-0.300461 hadware_result=-0.300415
i= 6000 in_angle_r=-0.366211 sin=-0.35808 hadware_result=-0.358032
i= 7000 in_angle_r=-0.427246 sin=-0.414366 hadware_result=-0.414307
i= 8000 in_angle_r=-0.488281 sin=-0.469109 hadware_result=-0.468872
i= 9000 in_angle_r=-0.549316 sin=-0.522104 hadware_result=-0.52179
i= 10000 in_angle_r=-0.610352 sin=-0.573156 hadware_result=-0.573181
i= 11000 in_angle_r=-0.671387 sin=-0.622072 hadware_result=-0.622009
i= 12000 in_angle_r=-0.732422 sin=-0.668672 hadware_result=-0.668701
i= 13000 in_angle_r=-0.793457 sin=-0.712782 hadware_result=-0.712769
i= 14000 in_angle_r=-0.854492 sin=-0.754238 hadware_result=-0.754395
i= 15000 in_angle_r=-0.915527 sin=-0.792884 hadware_result=-0.792908
i= 16000 in_angle_r=-0.976563 sin=-0.828578 hadware_result=-0.828369
i= 17000 in_angle_r=-1.0376 sin=-0.861186 hadware_result=-0.861206
i= 18000 in_angle_r=-1.09863 sin=-0.890586 hadware_result=-0.890564
i= 19000 in_angle_r=-1.15967 sin=-0.91667 hadware_result=-0.91687
i= 20000 in_angle_r=-1.2207 sin=-0.939341 hadware_result=-0.93927
i= 21000 in_angle_r=-1.28174 sin=-0.958513 hadware_result=-0.958435
i= 22000 in_angle_r=-1.34277 sin=-0.974115 hadware_result=-0.974121
i= 23000 in_angle_r=-1.40381 sin=-0.98609 hadware_result=-0.986023
i= 24000 in_angle_r=-1.46484 sin=-0.994392 hadware_result=-0.994324
i= 25000 in_angle_r=-1.52588 sin=-0.998991 hadware_result=-0.999023
i= 26000 in_angle_r=-1.58691 sin=-0.99987 hadware_result=-0.999451
Cordic sin/cos test passed
atan(y/x) test passed

Original source and translated output.
------------------------------------------------------------------------
-- Title        CORDIC calculater sin(x), cos(x), atan(y/x)           --
-- File         CORDIC.vhd                                            --
-- Entity       CORDIC                                                --
-- rev date     coded contents                                        --
-- 001 99/01/06 ueno  Make Original                                   --
------------------------------------------------------------------------
library ieee ;
use ieee.std_logic_1164.all ;
use ieee.std_logic_unsigned.all ;
--use IEEE.std_logic_signed.all ;
--use IEEE.std_logic_arith.all ;

------------------------------------------------------------------------
-- entity                                                             --
------------------------------------------------------------------------
entity CORDIC is
    port(
        -- Input/Output Data format = Fixed Point Value
        --     range -1.99994 to 1.99994 2's complement
        -- 15  14 . 13  12  11  10  09  08  07  06  05  04  03  02  01  00
        -- Sign   ^point
        --
        IN_X        : in    std_logic_vector(15 downto 0) ; -- atan(y/X)    -0.15 to 1.00
        IN_Y        : in    std_logic_vector(15 downto 0) ; -- atan(Y/x)    -1.00 to 1.00
        IN_ANGLE    : in    std_logic_vector(15 downto 0) ; -- angle(thita) -1.74 to 1.74
        IN_START    : in    std_logic ;                     -- convert start
        IN_MODE     : in    std_logic ;                     -- 1=atan/0=sin,cos
        CLK         : in    std_logic ;                     -- System Clock
        ENABLE      : in    std_logic ;                     -- Clock Enable
        XRST        : in    std_logic ;                     -- Reset
        OUT_FINISH  : out   std_logic ;                     -- Convert end
        OUT_X       : out   std_logic_vector(15 downto 0) ; -- Calculate X
        OUT_Y       : out   std_logic_vector(15 downto 0) ; -- Calculate Y
        OUT_Z       : out   std_logic_vector(15 downto 0)   -- Calculate Z
    );
end CORDIC ;

------------------------------------------------------------------------
-- architecture                                                       --
------------------------------------------------------------------------
architecture RTL of CORDIC is

--constant    ENABLE  : std_logic := '1' ;

-----------------------------------------------------------
-- Constants                                             --
-----------------------------------------------------------
constant    VAL0    : std_logic_vector(15 downto 0) := "0000000000000000" ; -- 0.000000000
constant    VALX    : std_logic_vector(15 downto 0) := "0010011011011101" ; -- 0.607252935
constant    ATAN00  : std_logic_vector(15 downto 0) := "0011001001000100" ; -- atan(1/1)
constant    ATAN01  : std_logic_vector(15 downto 0) := "0001110110101100" ; -- atan(1/2)
constant    ATAN02  : std_logic_vector(15 downto 0) := "0000111110101110" ; -- atan(1/4)
constant    ATAN03  : std_logic_vector(15 downto 0) := "0000011111110101" ; -- atan(1/8)
constant    ATAN04  : std_logic_vector(15 downto 0) := "0000001111111111" ; -- atan(1/16)
constant    ATAN05  : std_logic_vector(15 downto 0) := "0000001000000000" ; -- atan(1/32)
constant    ATAN06  : std_logic_vector(15 downto 0) := "0000000100000000" ; -- atan(1/64)
constant    ATAN07  : std_logic_vector(15 downto 0) := "0000000010000000" ; -- atan(1/128)
constant    ATAN08  : std_logic_vector(15 downto 0) := "0000000001000000" ; -- atan(1/256)
constant    ATAN09  : std_logic_vector(15 downto 0) := "0000000000100000" ; -- atan(1/512)
constant    ATAN10  : std_logic_vector(15 downto 0) := "0000000000010000" ; -- atan(1/1024)
constant    ATAN11  : std_logic_vector(15 downto 0) := "0000000000001000" ; -- atan(1/2048)
constant    ATAN12  : std_logic_vector(15 downto 0) := "0000000000000100" ; -- atan(1/4096)
constant    ATAN13  : std_logic_vector(15 downto 0) := "0000000000000010" ; -- atan(1/8192)
constant    ATAN14  : std_logic_vector(15 downto 0) := "0000000000000001" ; -- atan(1/16384)
constant    ATAN15  : std_logic_vector(15 downto 0) := "0000000000000000" ; -- atan(1/32768)

-----------------------------------------------------------
-- Signals                                               --
-----------------------------------------------------------
signal  REG_X       : std_logic_vector(15 downto 0) ;   -- Xn Register
signal  REG_Y       : std_logic_vector(15 downto 0) ;   -- Yn Register
signal  REG_Z       : std_logic_vector(15 downto 0) ;   -- Zn Register
signal  REG_J       : std_logic_vector(3 downto 0)  ;   -- 0 to 15 counter

signal  AX          : std_logic_vector(15 downto 0) ;   -- Ballel Shift X
signal  BX          : std_logic_vector(15 downto 0) ;   -- Ballel Shift X
signal  CX          : std_logic_vector(15 downto 0) ;   -- Ballel Shift X
signal  DX          : std_logic_vector(15 downto 0) ;   -- Ballel Shift X
signal  AY          : std_logic_vector(15 downto 0) ;   -- Ballel Shift Y
signal  BY          : std_logic_vector(15 downto 0) ;   -- Ballel Shift Y
signal  CY          : std_logic_vector(15 downto 0) ;   -- Ballel Shift Y
signal  DY          : std_logic_vector(15 downto 0) ;   -- Ballel Shift Y
signal  TAB_Z       : std_logic_vector(15 downto 0) ;   -- Table Select Z

signal  INIT_LOAD   : std_logic ;                       -- X,Y,Z Initialize
signal  NOW_CONVERT : std_logic ;                       -- Now Conveting for CORDIC

signal  ADD_SUB     : std_logic ;                       -- Next Calculate '1'=ADD/'0'=SUB

-----------------------------------------------------------
-- Architectures                                         --
-----------------------------------------------------------
begin

-----------------------------------------------------------
-- Flag Control                                          --
-----------------------------------------------------------
INIT_FLAG       : process( CLK, XRST )
    begin
        if( XRST='0' ) then
            INIT_LOAD <= '0' ;
        elsif( CLK'event and CLK='1' ) then
            if( ENABLE='1' ) then
                if( IN_START='1' and INIT_LOAD='0' and NOW_CONVERT='0' ) then
                    INIT_LOAD <= '1' ;
                else
                    INIT_LOAD <= '0' ;
                end if ;
            end if ;
        end if ;
    end process ;
CONVERT_FLAG    : process( CLK, XRST )
    begin
        if( XRST='0' ) then
            NOW_CONVERT <= '0' ;
        elsif( CLK'event and CLK='1' ) then
            if( ENABLE='1' ) then
                if( INIT_LOAD='1' ) then
                    NOW_CONVERT <= '1' ;
                elsif( REG_J="1111" ) then
                    NOW_CONVERT <= '0' ;
                end if ;
            end if ;
        end if ;
    end process ;

-----------------------------------------------------------
-- Sequence Counter                                      --
-----------------------------------------------------------
COUNTER_GEN     : process( CLK, XRST )
    begin
        if( XRST='0' ) then
            REG_J <= "0000" ;
        elsif( CLK'event and CLK='1' ) then
            if( ENABLE='1' ) then
                if( NOW_CONVERT='1' ) then
                    REG_J <= REG_J + 1 ;
                end if ;
            end if ;
        end if ;
    end process ;

-----------------------------------------------------------
-- ADD/SUB Flag                                          --
-----------------------------------------------------------
SELECT_ADD_SUB  : ADD_SUB <= not REG_Y(15) when IN_MODE='1' else REG_Z(15) ;

-----------------------------------------------------------
-- Ballel Shifter                                        --
-----------------------------------------------------------
BALLEL_AX       : process( REG_X, REG_J )
    begin
        if( REG_J(3)='1' ) then
            AX <= REG_X(15) & REG_X(15) & REG_X(15) & REG_X(15) & REG_X(15) & REG_X(15) & REG_X(15) & REG_X(15) & REG_X(15 downto 8);
        else
            AX <= REG_X ;
        end if ;
    end process ;
BALLEL_BX       : process( AX, REG_J )
    begin
        if( REG_J(2)='1' ) then
            BX <= AX(15) & AX(15) & AX(15) & AX(15) & AX(15 downto 4);
        else
            BX <= AX ;
        end if ;
    end process ;
BALLEL_CX       : process( BX, REG_J )
    begin
        if( REG_J(1)='1' ) then
            CX <= BX(15) & BX(15) & BX(15 downto 2);
        else
            CX <= BX ;
        end if ;
    end process ;
BALLEL_DX       : process( CX, REG_J )
    begin
        if( REG_J(0)='1' ) then
            DX <= CX(15) & CX(15 downto 1);
        else
            DX <= CX ;
        end if ;
    end process ;
BALLEL_AY       : process( REG_Y, REG_J )
    begin
        if( REG_J(3)='1' ) then
            AY <= REG_Y(15) & REG_Y(15) & REG_Y(15) & REG_Y(15) & REG_Y(15) & REG_Y(15) & REG_Y(15) & REG_Y(15) & REG_Y(15 downto 8);
        else
            AY <= REG_Y ;
        end if ;
    end process ;
BALLEL_BY       : process( AY, REG_J )
    begin
        if( REG_J(2)='1' ) then
            BY <= AY(15) & AY(15) & AY(15) & AY(15) & AY(15 downto 4);
        else
            BY <= AY ;
        end if ;
    end process ;
BALLEL_CY       : process( BY, REG_J )
    begin
        if( REG_J(1)='1' ) then
            CY <= BY(15) & BY(15) & BY(15 downto 2);
        else
            CY <= BY ;
        end if ;
    end process ;
BALLEL_DY       : process( CY, REG_J )
    begin
        if( REG_J(0)='1' ) then
            DY <= CY(15) & CY(15 downto 1);
        else
            DY <= CY ;
        end if ;
    end process ;
TABLE_Z         : process( REG_J )
    begin
        case REG_J is
            when "0000" => TAB_Z <= ATAN00 ;
            when "0001" => TAB_Z <= ATAN01 ;
            when "0010" => TAB_Z <= ATAN02 ;
            when "0011" => TAB_Z <= ATAN03 ;
            when "0100" => TAB_Z <= ATAN04 ;
            when "0101" => TAB_Z <= ATAN05 ;
            when "0110" => TAB_Z <= ATAN06 ;
            when "0111" => TAB_Z <= ATAN07 ;
            when "1000" => TAB_Z <= ATAN08 ;
            when "1001" => TAB_Z <= ATAN09 ;
            when "1010" => TAB_Z <= ATAN10 ;
            when "1011" => TAB_Z <= ATAN11 ;
            when "1100" => TAB_Z <= ATAN12 ;
            when "1101" => TAB_Z <= ATAN13 ;
            when "1110" => TAB_Z <= ATAN14 ;
            when "1111" => TAB_Z <= ATAN15 ;
            when others => TAB_Z <= VAL0 ;
        end case ;
    end process ;

-----------------------------------------------------------
-- Calculate                                             --
-----------------------------------------------------------
CALC_X          : process( CLK, XRST )
    begin
        if( XRST='0') then
            REG_X <= (others=>'0') ;
        elsif( CLK'event and CLK='1' ) then
            if( ENABLE='1' ) then
                -- Initial Value
                if( INIT_LOAD = '1' ) then
                    if( IN_MODE='1' ) then
                        -- Atan Mode
                        REG_X <= IN_X ;
                    else
                        -- Sin/Cos Mode
                        REG_X <= VALX ;
                    end if ;
                elsif( NOW_CONVERT='1' ) then
                    if( ADD_SUB='1' ) then
                        REG_X <= REG_X + DY ;
                    else
                        REG_X <= REG_X - DY ;
                    end if ;
                end if ;
            end if ;
        end if ;
    end process ;
CALC_Y          : process( CLK, XRST )
    begin
        if( XRST='0') then
            REG_Y <= (others=>'0') ;
        elsif( CLK'event and CLK='1' ) then
            if( ENABLE='1' ) then
                -- Initial Value
                if( INIT_LOAD = '1' ) then
                    if( IN_MODE='1' ) then
                        -- Atan Mode
                        REG_Y <= IN_Y ;
                    else
                        -- Sin/Cos Mode
                        REG_Y <= VAL0 ;
                    end if ;
                elsif( NOW_CONVERT='1' ) then
                    if( ADD_SUB='1' ) then
                        REG_Y <= REG_Y - DX ;
                    else
                        REG_Y <= REG_Y + DX ;
                    end if ;
                end if ;
            end if ;
        end if ;
    end process ;
CALC_Z          : process( CLK, XRST )
    begin
        if( XRST='0') then
            REG_Z <= (others=>'0') ;
        elsif( CLK'event and CLK='1' ) then
            if( ENABLE='1' ) then
                -- Initial Value
                if( INIT_LOAD = '1' ) then
                    if( IN_MODE='1' ) then
                        -- Atan Mode
                        REG_Z <= VAL0 ;
                    else
                        -- Sin/Cos Mode
                        REG_Z <= IN_ANGLE ;
                    end if ;
                elsif( NOW_CONVERT='1' ) then
                    if( ADD_SUB='1' ) then
                        REG_Z <= REG_Z + TAB_Z ;
                    else
                        REG_Z <= REG_Z - TAB_Z ;
                    end if ;
                end if ;
            end if ;
        end if ;
    end process ;

OUT_FINISH <= not NOW_CONVERT ;
OUT_X      <= REG_X ;
OUT_Y      <= REG_Y ;
OUT_Z      <= REG_Z ;

end RTL ;
------------------------------------------------------------------------
-- End of File                                                        --
------------------------------------------------------------------------

//-------------------------------------------------------------------
//
//   This file is automatically generated by VHDL to Verilog Translator.
//         Ver.1.08 Build Mar.6.2004
//               www.sugawara-systems.com   
//                    tech-support@sugawara-systems.com
//        See Original Copyright Notice for property of the file .( somewhere in this file.)
//
//--------------------------------------------------------------------


//----------------------------------------------------------------------
// Title        CORDIC calculater sin(x), cos(x), atan(y/x)           --
// File         CORDIC.vhd                                            --
// Entity       CORDIC                                                --
// rev date     coded contents                                        --
// 001 99/01/06 ueno  Make Original                                   --
//----------------------------------------------------------------------

`timescale 1ns/1ns
`define ns 1
`define us (1000*`ns)
`define ms (1000*`us)
`define sec (1000*`ms)

module  cordic ( in_x, in_y, in_angle, in_start, in_mode, clk, enable, xrst, out_finish, out_x, out_y, out_z );
    
    input [15:0]  in_x ;
    input [15:0]  in_y ;
    input [15:0]  in_angle ;
    input in_start;
    input in_mode;
    input clk;
    input enable;
    input xrst;
    output out_finish;
    output [15:0]  out_x ;
    output [15:0]  out_y ;
    output [15:0]  out_z ;


    parameter [15:0] val0=16'b0000000000000000;
    parameter [15:0] valx=16'b0010011011011101;
    parameter [15:0] atan00=16'b0011001001000100;
    parameter [15:0] atan01=16'b0001110110101100;
    parameter [15:0] atan02=16'b0000111110101110;
    parameter [15:0] atan03=16'b0000011111110101;
    parameter [15:0] atan04=16'b0000001111111111;
    parameter [15:0] atan05=16'b0000001000000000;
    parameter [15:0] atan06=16'b0000000100000000;
    parameter [15:0] atan07=16'b0000000010000000;
    parameter [15:0] atan08=16'b0000000001000000;
    parameter [15:0] atan09=16'b0000000000100000;
    parameter [15:0] atan10=16'b0000000000010000;
    parameter [15:0] atan11=16'b0000000000001000;
    parameter [15:0] atan12=16'b0000000000000100;
    parameter [15:0] atan13=16'b0000000000000010;
    parameter [15:0] atan14=16'b0000000000000001;
    parameter [15:0] atan15=16'b0000000000000000;
    reg [15:0] reg_x;
    reg [15:0] reg_y;
    reg [15:0] reg_z;
    reg [3:0] reg_j;
    reg [15:0] ax;
    reg [15:0] bx;
    reg [15:0] cx;
    reg [15:0] dx;
    reg [15:0] ay;
    reg [15:0] by;
    reg [15:0] cy;
    reg [15:0] dy;
    reg [15:0] tab_z;
    reg init_load;
    reg now_convert;
    wire add_sub;
    wire out_finish;
    wire [15:0] out_x;
    wire [15:0] out_y;
    wire [15:0] out_z;


    
       
   always @ (posedge clk or negedge xrst ) begin
           if ((xrst === 1'b0)) 
               init_load <= 1'b0;
               
           else 
               begin 
                   if ((enable === 1'b1)) 
                       begin 
                               if ((((in_start === 1'b1) & (init_load === 1'b0)) & (now_convert === 1'b0))) 
                                       init_load <= 1'b1;
                               else 
                                       init_load <= 1'b0;

                               
                       end 
                   
                   
               end 
           
   end //always
   
       
   always @ (posedge clk or negedge xrst ) begin
           if ((xrst === 1'b0)) 
               now_convert <= 1'b0;
               
           else 
               begin 
                   if ((enable === 1'b1)) 
                       begin 
                               if ((init_load === 1'b1)) 
                                       now_convert <= 1'b1;
                               else if ((reg_j === 4'b1111)) 
                                       now_convert <= 1'b0;

                               
                       end 
                   
                   
               end 
           
   end //always
   
       
   always @ (posedge clk or negedge xrst ) begin
           if ((xrst === 1'b0)) 
               reg_j <= 4'b0000;
               
           else 
               begin 
                   if ((enable === 1'b1)) 
                       begin 
                               if ((now_convert === 1'b1)) 
                                       reg_j <= (reg_j + 1);

                               
                       end 
                   
                   
               end 
           
   end //always
   
   assign {add_sub}=(in_mode === 1'b1) ? 
                        ~ (reg_y[15])
                     :  reg_z[15];
   
       
   always @ (reg_x or reg_j ) begin
           if ((reg_j[3] === 1'b1)) 
               ax <= {{{{{{{{reg_x[15],reg_x[15]},reg_x[15]},reg_x[15]},reg_x[15]},reg_x[15]},reg_x[15]},reg_x[15]},reg_x[15:8]};
               
           else 
               ax <= reg_x;
               
           
   end //always
   
       
   always @ (ax or reg_j ) begin
           if ((reg_j[2] === 1'b1)) 
               bx <= {{{{ax[15],ax[15]},ax[15]},ax[15]},ax[15:4]};
               
           else 
               bx <= ax;
               
           
   end //always
   
       
   always @ (bx or reg_j ) begin
           if ((reg_j[1] === 1'b1)) 
               cx <= {{bx[15],bx[15]},bx[15:2]};
               
           else 
               cx <= bx;
               
           
   end //always
   
       
   always @ (cx or reg_j ) begin
           if ((reg_j[0] === 1'b1)) 
               dx <= {cx[15],cx[15:1]};
               
           else 
               dx <= cx;
               
           
   end //always
   
       
   always @ (reg_y or reg_j ) begin
           if ((reg_j[3] === 1'b1)) 
               ay <= {{{{{{{{reg_y[15],reg_y[15]},reg_y[15]},reg_y[15]},reg_y[15]},reg_y[15]},reg_y[15]},reg_y[15]},reg_y[15:8]};
               
           else 
               ay <= reg_y;
               
           
   end //always
   
       
   always @ (ay or reg_j ) begin
           if ((reg_j[2] === 1'b1)) 
               by <= {{{{ay[15],ay[15]},ay[15]},ay[15]},ay[15:4]};
               
           else 
               by <= ay;
               
           
   end //always
   
       
   always @ (by or reg_j ) begin
           if ((reg_j[1] === 1'b1)) 
               cy <= {{by[15],by[15]},by[15:2]};
               
           else 
               cy <= by;
               
           
   end //always
   
       
   always @ (cy or reg_j ) begin
           if ((reg_j[0] === 1'b1)) 
               dy <= {cy[15],cy[15:1]};
               
           else 
               dy <= cy;
               
           
   end //always
   
       
   always @ (reg_j ) begin
           case (reg_j)
               4'b0000 : 
                       tab_z <= 16'b0011001001000100;
               4'b0001 : 
                       tab_z <= 16'b0001110110101100;
               4'b0010 : 
                       tab_z <= 16'b0000111110101110;
               4'b0011 : 
                       tab_z <= 16'b0000011111110101;
               4'b0100 : 
                       tab_z <= 16'b0000001111111111;
               4'b0101 : 
                       tab_z <= 16'b0000001000000000;
               4'b0110 : 
                       tab_z <= 16'b0000000100000000;
               4'b0111 : 
                       tab_z <= 16'b0000000010000000;
               4'b1000 : 
                       tab_z <= 16'b0000000001000000;
               4'b1001 : 
                       tab_z <= 16'b0000000000100000;
               4'b1010 : 
                       tab_z <= 16'b0000000000010000;
               4'b1011 : 
                       tab_z <= 16'b0000000000001000;
               4'b1100 : 
                       tab_z <= 16'b0000000000000100;
               4'b1101 : 
                       tab_z <= 16'b0000000000000010;
               4'b1110 : 
                       tab_z <= 16'b0000000000000001;
               4'b1111 : 
                       tab_z <= 16'b0000000000000000;
               default : 
                       tab_z <= 16'b0000000000000000;
           endcase
   end //always
   
       
   always @ (posedge clk or negedge xrst ) begin
           if ((xrst === 1'b0)) 
               reg_x <= {(15-0+1- 0){1'b0}};
               
           else 
               begin 
                   if ((enable === 1'b1)) 
                       begin 
                               if ((init_load === 1'b1)) 
                                   begin 
                                           if ((in_mode === 1'b1)) 
                                                   reg_x <= in_x;
                                           else 
                                                   reg_x <= 16'b0010011011011101;

                                           
                                   end 
                               else if ((now_convert === 1'b1)) 
                                   begin 
                                           if ((add_sub === 1'b1)) 
                                                   reg_x <= (reg_x + dy);
                                           else 
                                                   reg_x <= (reg_x - dy);

                                           
                                   end 

                               
                       end 
                   
                   
               end 
           
   end //always
   
       
   always @ (posedge clk or negedge xrst ) begin
           if ((xrst === 1'b0)) 
               reg_y <= {(15-0+1- 0){1'b0}};
               
           else 
               begin 
                   if ((enable === 1'b1)) 
                       begin 
                               if ((init_load === 1'b1)) 
                                   begin 
                                           if ((in_mode === 1'b1)) 
                                                   reg_y <= in_y;
                                           else 
                                                   reg_y <= 16'b0000000000000000;

                                           
                                   end 
                               else if ((now_convert === 1'b1)) 
                                   begin 
                                           if ((add_sub === 1'b1)) 
                                                   reg_y <= (reg_y - dx);
                                           else 
                                                   reg_y <= (reg_y + dx);

                                           
                                   end 

                               
                       end 
                   
                   
               end 
           
   end //always
   
       
   always @ (posedge clk or negedge xrst ) begin
           if ((xrst === 1'b0)) 
               reg_z <= {(15-0+1- 0){1'b0}};
               
           else 
               begin 
                   if ((enable === 1'b1)) 
                       begin 
                               if ((init_load === 1'b1)) 
                                   begin 
                                           if ((in_mode === 1'b1)) 
                                                   reg_z <= 16'b0000000000000000;
                                           else 
                                                   reg_z <= in_angle;

                                           
                                   end 
                               else if ((now_convert === 1'b1)) 
                                   begin 
                                           if ((add_sub === 1'b1)) 
                                                   reg_z <= (reg_z + tab_z);
                                           else 
                                                   reg_z <= (reg_z - tab_z);

                                           
                                   end 

                               
                       end 
                   
                   
               end 
           
   end //always
   
   assign {out_finish}=~ (now_convert);
   
   assign {out_x}=reg_x;
   
   assign {out_y}=reg_y;
   
   assign {out_z}=reg_z;
    

endmodule
Top
Snapshot
Tutorial
Open Sources
F.A.Q.s
Purchase
Support
Download



1.Plasma (most MIPS I (TM))

Overview
The Plasma CPU core supports all MIPS I(TM) user mode instructions with only two exceptions, written in VHDL by Steve Rhoads-san. The source code can be seen in opencores project..
Since source is written in VHDL, I translated it to Verilog using Veritak Translator almost automatically.
Only two changes were necessary to run in Veritak Verilog Simulator.
However it is not sufficient to synthesize Xilinx/Altera. I needed following works

Memory Initialization Tool
For Steve Rhoads-san's tool, I added functions to generate Intel Hex file for Altera and ".coe file "for Xilinx.
To address Synthesizer complaint
Synthesizer complains many for synthesis. For Example Veritak Translator uses "Verilog-2001 generate", which are not fully supported in FPGA Vendors. So change is necessary for each vendor.

Post Layout Simulation
 It is best to use actual FPGA to ensure proper logic synthesis. However , it is rather bigger for Xilinx starter kit which is only FPGA board I have.( I made 32KB SRAM implementation in Plasma.!) So I did post layout gate simulation for Xilinx and Altera. The same simulation result as RTL simulation was obtained by Post Layout Gate simulation for both.



2. YACC (Yet Another CPU CPU - Yet Another most MIPS I (TM))

Overview

YACC (Yet Another CPU CPU) is MIPS I (TM) subset cpu written in native Verilog-2001  HDL. YACC has 5 pipeline and shows 110DMIPS in stratix2 with synthesized allowable maximum clock of 165MHz. It is independent design of plasma ,although YACC uses gcc-elf-mips tools provided by Steve Rhords, author of plasma (Most mips written in VHDL).

The core was developed by using Veritak Simulator, with post layout gate simulation, and tested by actual FPGAs, using Xilinx spartan3 starter kit and Cyclone by Altera,running 800 digits of pi calculation ,(255,223) Reed Solomon Error Correction ,and Interactive calculator written by C language.

Aug.27.2005
Release Note
Added an example to implement new hardware block to YACC with test bench
Complete Xilinx Starter Kit's project : Calculator by using hyperterminal
Download Build Aug.27.2005 (20MB)

Aug.2.2005
Release Note
Added an example to implement new hardware block to YACC. (See F.A.Q.8)

Dec.5.2005 Added newlib compilation example /cygwin binary compiler/some c sources examples using soft-floating library This environment is not compatible with previous release.Because using floating library requires rather larger memory area (32KB) , while previous space was 16KB. This means we can not use spartan3 starter kit in this time. We have to wait release of spartan 3E kit for 32KB memory.Also it is noted c compiler now becomes gcc-3.44.
 Download Build Dec.5.2005 (40MB)

3.Analysis of CRC Generator (Generator of synthesizable CRC functions)

Overview
http://www.easics.be/webtools/crctool tool generates RTL code of CRC functions.The tool is very useful.
This section describes answer to the question how the generate RTL comes from.
The program source of mathematica and some source code of CRC test bench written in Verilog-2001 are provided.

4.Evaluation of OPENRISC CPU
 OpenRISC 1200 from Opencores was evaluated using Veritak Simulator with  Dhrystones and Reed Solomon C code compiled in or32-uclinux-gcc.
 
5.Analog PLL Design and Simulation by Verilog HDL
 A design example is shown using built in analog simulator in veritak

6.Opencores Veritak Project Files

Veritak Project Files are prepared for the sake of convenience. You can start simulation of a very complexed project such as PCI, Ethernet ,and othres less than 2min. after installing Veritak into your PC.

<Procedure>

It is difficult to understand how the RTL source works ,especially when the source code is not design of yours. Veritak is not only a simulator but also a source code analyzer, which will be great help when you read other person's RTL source code.

Veritak Project Name Description Remarks
*_no_save.prj Project without waveform save Save WaveformView is disabled due to too big history for entire simulation. as save all..
*_trace_mode.prj Project with trace mode. You can use "Jump to Driver" function in WaveformView.
*_trace_mode2.prj Project with trace mode2. Generates tage file.




IP CORES Veritak Project File Position No of source lines Simulation seconds/minutes/hours/
-Athlon64 3000+1GB Memory on W2K)
Download(ZIP) Remarks
AC97 /ac97_ctrl/bench/verilog 11K 49min54sec AC97(0.3MB) ac97_no_save.prj
CAN /can 12K 0min CAN(0.2MB) can.prj
ATA /ata 4K 13min38sec ATA(1MB) Nov.22.2004 no_save_ata.prj
PCI /pci/bench/verilog 89K 1.5h PCI(14MB) pci_no_save.prj
USB1.1 /usb11 11K 2min37sec USB1.1(0.3MB) Added `include to source code. usb11_no_save.prj
I2C /i2c 2K 2sec I2C(0.7MB) i2c.prj
ETHERNET /ethernet/ethernet 45K 4h ETHERNET(2.6MB) tb_ethernet_no_save.prj
AES /aes_core 2K 13sec AES(0.2MB) aes.prj
DES /des 2K 1sec DES(0.5MB) des_trace_mode.prj
GENERIC FIFO /generic_fifos/generic_fifos/bench/verilog 2K 2h GENERICFIFO(0.1MB) fifo_no_save.prj
GPIO /gpio/gpio 4K 41sec GPIO(0.6MB) gpio.prj
WB_DMA /wb_dma 15K 46h WB_DMA(1.5MB)
WB_CONBUS /wb_conbus 4K 6sec WB_CONBUS(0.4MB) conbus.prj
WB_CONMAX /wb_conmax 11K
10min6sec WB_CONMAX(0.2MB)