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

Subversion Repositories pipelined_fixed_point_elementary_functions

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /pipelined_fixed_point_elementary_functions
    from Rev 5 to Rev 6
    Reverse comparison

Rev 5 → Rev 6

/trunk/math_pipelined/atan2_pipelined.sv
0,0 → 1,207
 
 
 
`define PI_x64 (68'sd57952155664616982739/4)
 
module atan2_pipelined(
input clk,
input signed [UP:0] y,
input signed [UP:0] x,
output signed [UP:0] oangle,
output signed [UP:0] odebug
);
 
parameter BITS_HIGH= 16;
parameter BITS_LOW= 16;
parameter BITS_GUARD= 0;
 
parameter IS_IBNIZ= 0;// пїЅпїЅпїЅпїЅ 0, пїЅпїЅ f=atan2 пїЅпїЅпїЅпїЅ 1, пїЅпїЅ f=atan2/2PI
// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ.
 
// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
parameter UP= BITS_HIGH +BITS_LOW -1;
 
// пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ- пїЅпїЅпїЅ пїЅпїЅпїЅпїЅ(пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ)
parameter UPL= BITS_LOW -1;
 
// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ "пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ" пїЅпїЅпїЅ "пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ" пїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
parameter UPG= UP +BITS_GUARD;
parameter UPLG= UPL +BITS_GUARD;
`define BOUT (UPL) // пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ
 
reg signed [UPG:0] cx [`BOUT:0];
reg signed [UPG:0] csin [`BOUT:0];
reg signed [UPG:0] ccos [`BOUT:0];
 
//wire signed [UPG:0] x0= (x[UP] ? -x : x)<<<BITS_GUARD;
 
assign oangle= cx[`BOUT]>>>(BITS_GUARD);
assign odebug= csin[`BOUT]>>>BITS_GUARD;
 
// пїЅпїЅпїЅпїЅ, пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ 1.00...001
wire signed [63:0] C_ANGLE [63:0];
 
//
wire signed [UPG:0] cx2 [`BOUT:0];
wire signed [UPG:0] csin2 [`BOUT:0];
wire signed [UPG:0] ccos2 [`BOUT:0];
 
 
always @*
begin
integer ind;
for (ind=0; ind< `BOUT; ind=ind+1)
begin
if ( csin[ind] >0 )
begin
cx2[ind]<= cx[ind]+ (C_ANGLE[ind] >>> (62-UPLG));
csin2[ ind ]<= csin[ ind ] - (ccos[ ind ] >>>(ind) );
ccos2[ ind ]<= ccos[ ind ] + (csin[ ind ] >>>(ind) );
end
else
begin
cx2[ind]<= cx[ind]- (C_ANGLE[ind] >>> (62-UPLG));
csin2[ ind ]<= csin[ ind ] + (ccos[ ind ] >>>(ind) );
ccos2[ ind ]<= ccos[ ind ] - (csin[ ind ] >>>(ind) );
end
end
end
 
always @( posedge clk )
begin
integer ind;
 
csin[0]= {y, {BITS_GUARD{1'h0}}};
ccos[0]= {x, {BITS_GUARD{1'h0}}};
cx[0]=0;
// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, CORDIC
for (ind=0; ind< `BOUT; ind=ind+1)
begin
if ( csin2[ind] >0 )
begin
cx[ind+1]<= cx2[ind]+ (C_ANGLE[ind] >>> (62-UPLG));
csin[ ind +1 ]<= csin2[ ind ] - (ccos2[ ind ] >>>(ind) );
ccos[ ind +1 ]<= ccos2[ ind ] + (csin2[ ind ] >>>(ind) );
end
else
begin
cx[ind+1]<= cx2[ind]- (C_ANGLE[ind] >>> (62-UPLG));
csin[ ind +1 ]<= csin2[ ind ] + (ccos2[ ind ] >>>(ind) );
ccos[ ind +1 ]<= ccos2[ ind ] - (csin2[ ind ] >>>(ind) );
end
end
// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ
// begin
// ind= UP-2;
// if ( cx[ind] >0 )
// begin
// cx[ind+1]<= cx[ind]- (C_ANGLE[ind-BITS_HIGH+1] >>> (63-UPLG));
// csin[ ind +1 ]<= s_sign[ind] ?-(csin[ ind ] + (ccos[ ind ] >>>(ind-(BITS_HIGH-1) +1) )) :
// csin[ ind ] - (ccos[ ind ] >>>(ind-(BITS_HIGH-1) +1) );
// ccos[ ind +1 ]<= c_sign[ind] ? -(ccos[ ind ] - (csin[ ind ] >>>(ind-(BITS_HIGH-1) +1) )) :
// ccos[ ind ] + (csin[ ind ] >>>(ind-(BITS_HIGH-1) +1) );
// end
// else
// begin
// cx[ind+1]<= cx[ind]+ (C_ANGLE[ind-BITS_HIGH+1] >>> (63-UPLG));
// csin[ ind +1 ]<= s_sign[ind] ?-(csin[ ind ] + (ccos[ ind ] >>>(ind-(BITS_HIGH-1) +1) )) :
// csin[ ind ] + (ccos[ ind ] >>>(ind-(BITS_HIGH-1) +1) );
//
// ccos[ ind +1 ]<= c_sign[ind] ? -(ccos[ ind ] - (csin[ ind ] >>>(ind-(BITS_HIGH-1) +1) )) :
// ccos[ ind ] - (csin[ ind ] >>>(ind-(BITS_HIGH-1) +1) );
// end
// s_sign[ind+1]<= s_sign[ind];
// c_sign[ind+1]<= c_sign[ind];
// end
// if ( x[UP] )
// begin
// end
// else
// begin
// cx[0]= x;
// end
end
 
//for ( i=0; i<64; i++){
// double dval= atan(1./pow(2.,i)) * pow(2.,63.); //((long long)1 << i);
// unsigned long long val= dval;
// unsigned long long val_ibn= dval/6.283185307179586476925286766559;
// cout << "assign C_ANGLE[" << dec << i << "]= IS_IBNIZ?"
// " 64'h" << hex << val_ibn << ":"
// " 64'h" << hex << val << ";" << endl;
//}
 
assign C_ANGLE[0]= IS_IBNIZ? 64'h1000000000000000: 64'h6487ed5110b46000;
assign C_ANGLE[1]= IS_IBNIZ? 64'h0972028ecef98400: 64'h3b58ce0ac3769e00;
assign C_ANGLE[2]= IS_IBNIZ? 64'h4fd9c2daf71cf40: 64'h1f5b75f92c80dd00;
assign C_ANGLE[3]= IS_IBNIZ? 64'h28888ea0eeecd20: 64'h0feadd4d5617b700;
assign C_ANGLE[4]= IS_IBNIZ? 64'h14586a1872c4d80: 64'h7fd56edcb3f7a80;
assign C_ANGLE[5]= IS_IBNIZ? 64'h0a2ebf0ac823140: 64'h3ffaab7752ec4a0;
assign C_ANGLE[6]= IS_IBNIZ? 64'h517b0f2e141318: 64'h1fff555bbb729b0;
assign C_ANGLE[7]= IS_IBNIZ? 64'h28be2a88ea2158: 64'h0fffeaaadddd4b8;
assign C_ANGLE[8]= IS_IBNIZ? 64'h145f29a368619c: 64'h7fffd5556eeedc;
assign C_ANGLE[9]= IS_IBNIZ? 64'h0a2f975d98559c: 64'h3ffffaaaab7778;
assign C_ANGLE[10]= IS_IBNIZ? 64'h517cc0048dd3d: 64'h1fffff55555bbc;
assign C_ANGLE[11]= IS_IBNIZ? 64'h28be60a54065b: 64'h0fffffeaaaaade;
assign C_ANGLE[12]= IS_IBNIZ? 64'h145f3066ff630: 64'h7fffffd555557;
assign C_ANGLE[13]= IS_IBNIZ? 64'h0a2f98360b979: 64'h3ffffffaaaaaa;
assign C_ANGLE[14]= IS_IBNIZ? 64'h517cc1b57488: 64'h1fffffff55555;
assign C_ANGLE[15]= IS_IBNIZ? 64'h28be60db5d3d: 64'h0fffffffeaaaa;
assign C_ANGLE[16]= IS_IBNIZ? 64'h145f306dc2fe: 64'h7fffffffd555;
assign C_ANGLE[17]= IS_IBNIZ? 64'h0a2f9836e40a: 64'h3ffffffffaaa;
assign C_ANGLE[18]= IS_IBNIZ? 64'h517cc1b7256: 64'h1fffffffff55;
assign C_ANGLE[19]= IS_IBNIZ? 64'h28be60db935: 64'h0fffffffffea;
assign C_ANGLE[20]= IS_IBNIZ? 64'h145f306dc9c: 64'h7fffffffffd;
assign C_ANGLE[21]= IS_IBNIZ? 64'h0a2f9836e4e: 64'h3ffffffffff;
assign C_ANGLE[22]= IS_IBNIZ? 64'h517cc1b727: 64'h1ffffffffff;
assign C_ANGLE[23]= IS_IBNIZ? 64'h28be60db93: 64'h0ffffffffff;
assign C_ANGLE[24]= IS_IBNIZ? 64'h145f306dc9: 64'h7fffffffff;
assign C_ANGLE[25]= IS_IBNIZ? 64'h0a2f9836e4: 64'h3fffffffff;
assign C_ANGLE[26]= IS_IBNIZ? 64'h517cc1b72: 64'h1fffffffff;
assign C_ANGLE[27]= IS_IBNIZ? 64'h28be60db9: 64'h1000000000;
assign C_ANGLE[28]= IS_IBNIZ? 64'h145f306dc: 64'h0800000000;
assign C_ANGLE[29]= IS_IBNIZ? 64'h0a2f9836e: 64'h400000000;
assign C_ANGLE[30]= IS_IBNIZ? 64'h517cc1b7: 64'h200000000;
assign C_ANGLE[31]= IS_IBNIZ? 64'h28be60db: 64'h100000000;
assign C_ANGLE[32]= IS_IBNIZ? 64'h145f306d: 64'h080000000;
assign C_ANGLE[33]= IS_IBNIZ? 64'h0a2f9836: 64'h40000000;
assign C_ANGLE[34]= IS_IBNIZ? 64'h517cc1b: 64'h20000000;
assign C_ANGLE[35]= IS_IBNIZ? 64'h28be60d: 64'h10000000;
assign C_ANGLE[36]= IS_IBNIZ? 64'h145f306: 64'h08000000;
assign C_ANGLE[37]= IS_IBNIZ? 64'h0a2f983: 64'h4000000;
assign C_ANGLE[38]= IS_IBNIZ? 64'h517cc1: 64'h2000000;
assign C_ANGLE[39]= IS_IBNIZ? 64'h28be60: 64'h1000000;
assign C_ANGLE[40]= IS_IBNIZ? 64'h145f30: 64'h0800000;
assign C_ANGLE[41]= IS_IBNIZ? 64'h0a2f98: 64'h400000;
assign C_ANGLE[42]= IS_IBNIZ? 64'h517cc: 64'h200000;
assign C_ANGLE[43]= IS_IBNIZ? 64'h28be6: 64'h100000;
assign C_ANGLE[44]= IS_IBNIZ? 64'h145f3: 64'h080000;
assign C_ANGLE[45]= IS_IBNIZ? 64'h0a2f9: 64'h40000;
assign C_ANGLE[46]= IS_IBNIZ? 64'h517c: 64'h20000;
assign C_ANGLE[47]= IS_IBNIZ? 64'h28be: 64'h10000;
assign C_ANGLE[48]= IS_IBNIZ? 64'h145f: 64'h08000;
assign C_ANGLE[49]= IS_IBNIZ? 64'h0a2f: 64'h4000;
assign C_ANGLE[50]= IS_IBNIZ? 64'h517: 64'h2000;
assign C_ANGLE[51]= IS_IBNIZ? 64'h28b: 64'h1000;
assign C_ANGLE[52]= IS_IBNIZ? 64'h145: 64'h0800;
assign C_ANGLE[53]= IS_IBNIZ? 64'h0a2: 64'h400;
assign C_ANGLE[54]= IS_IBNIZ? 64'h51: 64'h200;
assign C_ANGLE[55]= IS_IBNIZ? 64'h28: 64'h100;
assign C_ANGLE[56]= IS_IBNIZ? 64'h14: 64'h080;
assign C_ANGLE[57]= IS_IBNIZ? 64'h0a: 64'h40;
assign C_ANGLE[58]= IS_IBNIZ? 64'h5: 64'h20;
assign C_ANGLE[59]= IS_IBNIZ? 64'h2: 64'h10;
assign C_ANGLE[60]= IS_IBNIZ? 64'h1: 64'h08;
assign C_ANGLE[61]= IS_IBNIZ? 64'h0: 64'h4;
assign C_ANGLE[62]= IS_IBNIZ? 64'h0: 64'h2;
assign C_ANGLE[63]= IS_IBNIZ? 64'h0: 64'h1;
endmodule
 
/trunk/math_pipelined/math_pipelined.sv
0,0 → 1,192
 
module mull_pipelined(
input clk,
input [7:0] x,
input [7:0] y,
output [15:0] z
);
reg [7:0] cx [7:0];
reg [7:0] cy [7:0];
reg [15:0] cz [15:0];
assign z= cz[7];
 
always @( posedge clk )
begin : multblk
integer ind;
cx[0]<= x;
cy[0]<= y;
cz[0]<= y[0]? x : 0;
for (ind=0; ind<6; ind=ind+1)
begin
cy[ind+1]<= cy[ind];
cx[ind+1]<= cx[ind];
cz[ind+1]<= cz[ind] + (cy[ind][ind+1]? (cx[ind]<<(ind+1)) : 0);
end
cz[7]<= cz[6] + (cy[6][7]? cx[6] : 0);
end
endmodule
//module div_pipelined(
// input clk,
// input [15:0] x,
// input [7:0] y,
// output [7:0] z
// );
//
//parameter BITS= 8;
//
//reg [15:0] cx [15:0];
//reg [7:0] cy [7:0];
//reg [7:0] cz [7:0];
//assign z= cz[7];
//
//wire [15:0] candidate [7:0];
//
//assign candidate[0]= x- (y<<7);
//
//`define MY_EXPR(ind) assign candidate[(ind+1)]= cx[(ind)]- (cy[(ind)]<<(6-ind))
//
//`MY_EXPR( 0 );
//`MY_EXPR( 1 );
//`MY_EXPR( 2 );
//`MY_EXPR( 3 );
//`MY_EXPR( 4 );
//`MY_EXPR( 5 );
//`MY_EXPR( 6 );
//
//always @( posedge clk )
//begin : multblk
// integer ind;
// integer j;
// cx[0]<= candidate[0][15] ? x : candidate[0];
// cy[0]<= y;
// cz[0][7]<= candidate[0][15] ? 0 : 1;
// for (ind=0; ind<6; ind=ind+1)
// begin
// cy[ind+1]<= cy[ind];
// cx[ind+1]<= candidate[ind+1][15] ? cx[ind] : candidate[ind+1];
// cz[ind+1][6-ind]<= candidate[ind+1][15] ? 0 : 1;
// for (j=7; j>6-ind; j=j-1)
// begin
// cz[ind+1][j]<= cz[ind][j];
// end
// end
// cz[7][0]<= candidate[7][15] ? 0 : 1;
// cz[7][7:1]<=cz[6][7:1];
//end
//endmodule
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
module div_pipelined(
input clk,
input [D_UP:0] x,
input [UP:0] y,
output [UP:0] z
);
 
parameter BITS= 48;
// ���������� ���������, �� ��������������.
parameter UP= BITS-1;
parameter D_UP= 2*BITS-1;
reg [D_UP:0] cx [UP:0];
reg [UP:0] cy [UP:0];
reg [UP:0] cz [UP:0];
reg csign [UP:0];
 
assign z= (csign[UP] ? -cz[UP]:cz[UP]);
 
wire [D_UP:0] candidate [UP:0];
 
wire [D_UP:0] ux= ( (x[D_UP]) ? (-x):x );
wire [UP:0] uy= ( (y[UP]) ? (-y):y );
wire [D_UP:0] _uy= uy;
 
wire [D_UP:0] _cy [UP:0];
 
always @*
begin
integer ind;
candidate[0]<= ux- (_uy<<UP);
for (ind=0; ind< BITS-2 ; ind=ind+1)
begin
_cy <= cy;
candidate[ind+1]<= cx[ind]- (_cy[ind]<<(BITS-2-ind));
end
end
 
 
always @( posedge clk )
begin : multblk
integer ind;
integer j;
csign[0]= x[D_UP]^y[UP];
cx[0]<= candidate[0][D_UP] ? ux : candidate[0];
cy[0]<= uy;
cz[0][UP]<= ~candidate[0][D_UP]; // !!! sign bit?
for (ind=0; ind< BITS-1 ; ind=ind+1)
begin
cy[ind+1]<= cy[ind];
cx[ind+1]<= candidate[ind+1][D_UP] ? cx[ind] : candidate[ind+1];
cz[ind+1][ BITS-2 -ind]<= ~candidate[ind+1][D_UP];
csign[ind+1]<= csign[ind];
for (j=UP; j> BITS-2 -ind; j=j-1)
begin
cz[ind+1][j]<= cz[ind][j];
end
end
// cz[UP][0]<= ~candidate[UP][D_UP];
// cz[UP][UP:1]<=cz[ BITS-2 ][UP:1];
// csign[UP]<= csign[UP-1];
end
endmodule
 
 
module id_pipelined(
input clk,
input [UP:0] i,
output [UP:0] o
);
 
parameter BITS= 32;
parameter DELAY= 32;
// ���������� ���������, �� ��������������.
parameter UP= BITS-1;
reg [UP:0] cx [DELAY];
 
assign o= cx[DELAY-1];
 
always @( posedge clk )
begin : blk
integer ind;
cx[0]<= i;
for (ind=0; ind< DELAY-1 ; ind=ind+1)
begin
cx[ind+1]<= cx[ind];
end
end
endmodule
 
/trunk/math_pipelined/sin_pipelined.sv
0,0 → 1,280
 
 
 
`define PI_x64 (68'sd57952155664616982739/4)
`define K_DEFORM (64'h26dd3b6a10d7969a)
 
module sin_pipelined(
input clk,
input signed [UP:0] x,
output signed [UP:0] osin, //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
output signed [UP:0] ocos,
output signed [UP:0] odebug
);
 
parameter BITS_HIGH= 16;
parameter BITS_LOW= 16;
parameter BITS_GUARD= 2;
 
 
 
parameter UP= BITS_HIGH +BITS_LOW -1;
 
 
parameter UPL= BITS_LOW -1;
 
 
parameter UPG= UP +BITS_GUARD;
parameter UPLG= UPL +BITS_GUARD;
 
reg signed [UPG:0] cx [`BOUT:0];
 
reg signed [UPLG+1:0] csin [`BOUT:BITS_HIGH-1];//!!!+2!!!!
reg signed [UPLG+1:0] ccos [`BOUT:BITS_HIGH-1];
 
wire signed [UPG:0] x0= (x[UP] ? -x : x)<<<BITS_GUARD;
 
//wire [UP:0] p_osin= s_sign[BITS_HIGH-1]? (-cx[BITS_HIGH-1]>>BITS_GUARD): cx[BITS_HIGH-1]>>BITS_GUARD; // !!!!!!!!!!!!!!!!!!!!!
//wire [UP:0] p_osin= s_sign[BITS_HIGH+1]? (-csin[BITS_HIGH+1][UPLG:BITS_GUARD]>>BITS_GUARD): csin[BITS_HIGH+1][UPLG:BITS_GUARD]>>BITS_GUARD; // !!!!!!!!!!!!!!!!!!!!!
//wire [UPL:0] p_osin= csin[BITS_HIGH][UPLG:BITS_GUARD];
//wire [UPL:0] p_osin= csin[UPL][UPLG:BITS_GUARD] +csin[UPL][BITS_GUARD-1];
 
assign osin= csin[`BOUT]>>>BITS_GUARD; // !!!!!!!!!!!!!!!!!!!!!
assign ocos= ccos[`BOUT]>>>BITS_GUARD; // !!!!!!!!!!!!!!!!!!!!!
assign odebug= cx[`BOUT]>>>BITS_GUARD; // !!!!!!!!!!!!!!!!!!!!!
 
//assign osin= s_sign[`BOUT]? (-cx[`BOUT]>>BITS_GUARD): cx[`BOUT]>>>BITS_GUARD; // !!!!!!!!!!!!!!!!!!!!!
//assign ocos= ccos[UPL][UPLG:BITS_GUARD] +ccos[UPL][BITS_GUARD-1];
 
 
wire signed [63:0] C_ANGLE [63:0];
 
reg s_sign [UP:0];
reg c_sign [UP:BITS_HIGH-2];
reg xy_swap [UP:BITS_HIGH-1];
 
always @( posedge clk )
begin
integer ind;
 
 
for (ind=0; ind< BITS_HIGH-4; ind=ind+1)
begin
end
 
// x <- x-Pi*n
// s_sign[BITS_HIGH-2]<= ( cx[BITS_HIGH-3]- (`PI_x64>>(67-(UPG-(BITS_HIGH-3)) )) >0
// ? s_sign[BITS_HIGH-3] : ~s_sign[BITS_HIGH-3] );
//
// c_sign[BITS_HIGH-2]<= ( cx[BITS_HIGH-3]- (`PI_x64>>(67-(UPG-(BITS_HIGH-3)) )) >0
// ? s_sign[BITS_HIGH-3] : ~s_sign[BITS_HIGH-3] );
// x <- x-Pi*n/2
// s_sign[BITS_HIGH-1]<= s_sign[BITS_HIGH-2];
 
 
s_sign[0]<= x[UP];
cx[0]<= ( x0- (`PI_x64>>>(65-(UPG) )) >0 ? x0- (`PI_x64>>>(65-(UPG) )) : x0 );
 
for (ind=0; ind< BITS_HIGH-4; ind=ind+1)
begin
cx[ind+1]<= ( cx[ind]- (`PI_x64>>>(66-(UPG-ind) )) >0 ? cx[ind]- (`PI_x64>>>(66-(UPG-ind) )) : cx[ind] );
s_sign[ind+1]<= s_sign[ind];
end
// for (ind=BITS_HIGH-4; ind< BITS_HIGH-1; ind=ind+1)
begin
 
ind= BITS_HIGH-4;
if ( cx[ind]- (`PI_x64>>>(66-(UPG-ind) )) >0 )
begin
cx[ind+1]<= (`PI_x64>>>(65-(UPG-ind) ))-cx[ind];
s_sign[ind+1]<= ~s_sign[ind];
end
else
begin
cx[ind+1]<= cx[ind];
s_sign[ind+1]<= s_sign[ind];
end
end
begin
ind= BITS_HIGH-3;
if ( cx[ind]- (`PI_x64>>>(66-(UPG-ind) )) >0 )
begin
cx[ind+1]<= (`PI_x64>>>(65-(UPG-ind) ))-cx[ind];
s_sign[ind+1]<= s_sign[ind];
c_sign[ind+1]<= 1'h1;
end
else
begin
cx[ind+1]<= cx[ind];
s_sign[ind+1]<= s_sign[ind];
c_sign[ind+1]<= 1'h0;
end
end
begin
ind= BITS_HIGH-2;
if ( cx[ind] > (`PI_x64>>(66-(UPG-ind) )) )
begin
cx[ind+1]<= (s_sign[ind]^c_sign[ind]) ? ((`PI_x64>>>(65-(UPG-ind) ))-cx[ind]) : -((`PI_x64>>>(65-(UPG-ind) ))-cx[ind]);
csin[ind+1]<= 0;
ccos[ind+1]<= -(`K_DEFORM>>(64-UPLG-3))
+(1<<BITS_GUARD); // to avoid results >=|1.0|, if you prefer more precision, you need to
// csin[ind+1]<= s_sign[ind] ? -(64'sh9B74) : 64'sh9B74;
// ccos[ind+1]<= 0;
end
else
begin
cx[ind+1]<= (s_sign[ind]^c_sign[ind]) ? -(cx[ind]) : (cx[ind]);
csin[ind+1]<= 0;
ccos[ind+1]<= (`K_DEFORM>>(64-UPLG-3))
-(1<<BITS_GUARD); // to avoid results >=|1.0|
// csin[ind+1]<= 0;
// ccos[ind+1]<= c_sign[ind] ? -(64'sh9B74) : 64'sh9B74;
end
s_sign[ind+1]<= 0;
c_sign[ind+1]<= 0;
end
 
`define BHm1 (BITS_HIGH-1)
 
// cx[16]<= cx[15]- 32'sh00003000;//(C_ANGLE[ind-`BHm1] >> (64-UPLG));
 
 
for (ind=`BHm1; ind< `BOUT; ind=ind+1)
 
 
 
 
begin
if ( cx[ind] >0 )
begin
 
 
 
cx[ind+1]<= cx[ind]- (C_ANGLE[ind-`BHm1] >>> (64-UPLG));
csin[ ind +1 ]<= csin[ ind ] + (ccos[ ind ] >>>(ind-`BHm1 ) );
ccos[ ind +1 ]<= ccos[ ind ] - (csin[ ind ] >>>(ind-`BHm1 ) );
end
else
begin
 
cx[ind+1]<= cx[ind]+ (C_ANGLE[ind-`BHm1] >>> (64-UPLG));
csin[ ind +1 ]<= csin[ ind ] - (ccos[ ind ] >>>(ind-`BHm1 ) );
ccos[ ind +1 ]<= ccos[ ind ] + (csin[ ind ] >>>(ind-`BHm1 ) );
end
end
 
// begin
// ind= UP-2;
// if ( cx[ind] >0 )
// begin
// cx[ind+1]<= cx[ind]- (C_ANGLE[ind-BITS_HIGH+1] >>> (63-UPLG));
// csin[ ind +1 ]<= s_sign[ind] ?-(csin[ ind ] + (ccos[ ind ] >>>(ind-(BITS_HIGH-1) +1) )) :
// csin[ ind ] - (ccos[ ind ] >>>(ind-(BITS_HIGH-1) +1) );
// ccos[ ind +1 ]<= c_sign[ind] ? -(ccos[ ind ] - (csin[ ind ] >>>(ind-(BITS_HIGH-1) +1) )) :
// ccos[ ind ] + (csin[ ind ] >>>(ind-(BITS_HIGH-1) +1) );
// end
// else
// begin
// cx[ind+1]<= cx[ind]+ (C_ANGLE[ind-BITS_HIGH+1] >>> (63-UPLG));
// csin[ ind +1 ]<= s_sign[ind] ?-(csin[ ind ] + (ccos[ ind ] >>>(ind-(BITS_HIGH-1) +1) )) :
// csin[ ind ] + (ccos[ ind ] >>>(ind-(BITS_HIGH-1) +1) );
//
// ccos[ ind +1 ]<= c_sign[ind] ? -(ccos[ ind ] - (csin[ ind ] >>>(ind-(BITS_HIGH-1) +1) )) :
// ccos[ ind ] - (csin[ ind ] >>>(ind-(BITS_HIGH-1) +1) );
// end
// s_sign[ind+1]<= s_sign[ind];
// c_sign[ind+1]<= c_sign[ind];
// end
// if ( x[UP] )
// begin
// end
// else
// begin
// cx[0]= x;
// end
end
 
// for ( i=0; i<64; i++){
// double dval= atan(1./pow(2.,i)) * pow(2.,63.); //((long long)1 << i);
// unsigned long long val= dval;
// cout << "assign C_ANGLE[" << dec << i << "]= 64'h" << hex << val << ";" << endl;
// }
 
assign C_ANGLE[0] = 64'sh6487ed5110b46000;
assign C_ANGLE[1] = 64'sh3b58ce0ac3769e00;
assign C_ANGLE[2] = 64'sh1f5b75f92c80dd00;
assign C_ANGLE[3] = 64'shfeadd4d5617b700;
assign C_ANGLE[4] = 64'sh7fd56edcb3f7a80;
assign C_ANGLE[5] = 64'sh3ffaab7752ec4a0;
assign C_ANGLE[6] = 64'sh1fff555bbb729b0;
assign C_ANGLE[7] = 64'shfffeaaadddd4b8;
assign C_ANGLE[8] = 64'sh7fffd5556eeedc;
assign C_ANGLE[9] = 64'sh3ffffaaaab7778;
assign C_ANGLE[10]= 64'sh1fffff55555bbc;
assign C_ANGLE[11]= 64'shfffffeaaaaade;
assign C_ANGLE[12]= 64'sh7fffffd555557;
assign C_ANGLE[13]= 64'sh3ffffffaaaaaa;
assign C_ANGLE[14]= 64'sh1fffffff55555;
assign C_ANGLE[15]= 64'shfffffffeaaaa;
assign C_ANGLE[16]= 64'sh7fffffffd555;
assign C_ANGLE[17]= 64'sh3ffffffffaaa;
assign C_ANGLE[18]= 64'sh1fffffffff55;
assign C_ANGLE[19]= 64'shfffffffffea;
assign C_ANGLE[20]= 64'sh7fffffffffd;
assign C_ANGLE[21]= 64'sh3ffffffffff;
assign C_ANGLE[22]= 64'sh1ffffffffff;
assign C_ANGLE[23]= 64'shffffffffff;
assign C_ANGLE[24]= 64'sh7fffffffff;
assign C_ANGLE[25]= 64'sh3fffffffff;
assign C_ANGLE[26]= 64'sh1fffffffff;
assign C_ANGLE[27]= 64'sh1000000000;
assign C_ANGLE[28]= 64'sh800000000;
assign C_ANGLE[29]= 64'sh400000000;
assign C_ANGLE[30]= 64'sh200000000;
assign C_ANGLE[31]= 64'sh100000000;
assign C_ANGLE[32]= 64'sh80000000;
assign C_ANGLE[33]= 64'sh40000000;
assign C_ANGLE[34]= 64'sh20000000;
assign C_ANGLE[35]= 64'sh10000000;
assign C_ANGLE[36]= 64'sh8000000;
assign C_ANGLE[37]= 64'sh4000000;
assign C_ANGLE[38]= 64'sh2000000;
assign C_ANGLE[39]= 64'sh1000000;
assign C_ANGLE[40]= 64'sh800000;
assign C_ANGLE[41]= 64'sh400000;
assign C_ANGLE[42]= 64'sh200000;
assign C_ANGLE[43]= 64'sh100000;
assign C_ANGLE[44]= 64'sh80000;
assign C_ANGLE[45]= 64'sh40000;
assign C_ANGLE[46]= 64'sh20000;
assign C_ANGLE[47]= 64'sh10000;
assign C_ANGLE[48]= 64'sh8000;
assign C_ANGLE[49]= 64'sh4000;
assign C_ANGLE[50]= 64'sh2000;
assign C_ANGLE[51]= 64'sh1000;
assign C_ANGLE[52]= 64'sh800;
assign C_ANGLE[53]= 64'sh400;
assign C_ANGLE[54]= 64'sh200;
assign C_ANGLE[55]= 64'sh100;
assign C_ANGLE[56]= 64'sh80;
assign C_ANGLE[57]= 64'sh40;
assign C_ANGLE[58]= 64'sh20;
assign C_ANGLE[59]= 64'sh10;
assign C_ANGLE[60]= 64'sh8;
assign C_ANGLE[61]= 64'sh4;
assign C_ANGLE[62]= 64'h2;
assign C_ANGLE[63]= 64'h1;
endmodule
 
/trunk/math_pipelined/sqrt_pipelined.sv
0,0 → 1,66
 
 
 
module sqrt_pipelined(
input clk,
input [UP:0] x,
output [UP:0] osqrt,
output [UP:0] odebug
);
 
parameter BITS= 32;
 
 
 
parameter UP= BITS-1;
 
reg [UP:0] cr [UP:0];
reg [UP:0] crr [UP:0];
reg [UP:0] _crr [UP:0];
 
reg [UP:0] cx [UP:0];
 
 
 
assign osqrt= cr[`BOUT];
assign odebug= crr[`BOUT];
 
always @( posedge clk )
begin
integer ind;
 
 
 
cx[0]<= x;
// cr[0]<= 32'h00800000;
// crr[0]<= 32'h40000000;
`define MEDI (64'h0000000000000001<<(BITS-1) )
`define MEDI2 (64'h0000000000000001<<(BITS-1))
cr[0]<= `MEDI;
crr[0]<= `MEDI2;
 
for (ind=0; ind< UP; ind=ind+1)
begin
if ( cx[ind]>crr[ind] )
begin
cr [ind+1]<= cr [ind] + (`MEDI>>(ind+1));
// _crr [ind+1]<= (cr [ind] + (`MEDI>>(ind+1)) )*(cr [ind] + (`MEDI>>(ind+1)) );
crr[ind+1]<= crr [ind] + (`MEDI2>>(2*(ind+1))) + ( (cr[ind])>>(ind) );
end
else
begin
cr [ind+1]<= cr [ind] - (`MEDI>>(ind+1));
// _crr [ind+1]<= (cr [ind] - (`MEDI>>(ind+1)) )*(cr [ind] - (`MEDI>>(ind+1)) );
crr[ind+1]<= crr [ind] + (`MEDI2>>(2*(ind+1))) - ( (cr[ind])>>(ind) );
end
cx [ind+1]<= cx [ind];
end
end
 
endmodule
 
/trunk/math_pipelined/exp_pipelined.sv
0,0 → 1,139
 
module exp_pipelined(
input clk,
input signed [ARG_HIGH+ ARG_LOW-1:0] ix,
output [RES_HIGH+ RES_LOW-1:0] oexp
);
 
parameter ARG_HIGH= 4;
parameter ARG_LOW= 16;
parameter ARG_GUARD= 0;
 
parameter RES_HIGH= 16;
parameter RES_LOW= 16;
parameter RES_GUARD= 0;
 
 
parameter A_BITS= ARG_HIGH+ ARG_LOW+ ARG_GUARD;
parameter A_UP= A_BITS-1;
 
parameter R_BITS= RES_HIGH+ RES_LOW+ RES_GUARD;
parameter STEPS= RES_HIGH+ RES_LOW;
parameter R_UP= R_BITS-1;
 
bit [A_UP:0] x [STEPS:0];
bit [R_UP:0] bexp [STEPS:0];
 
assign oexp= bexp[STEPS]>>RES_GUARD;
 
`define LN2x64 (64'hB17217F7D1CF79AB)
wire signed [63:0] C_LN_10001 [63:0]; // Ln(1+1/2^x)
 
always @( posedge clk )
begin
integer ind;
 
x[0]<= ix<<<ARG_GUARD;
bexp[0]<= 64'h1<<(RES_LOW+RES_GUARD);
for (ind=0; ind<ARG_HIGH; ind++ )
begin
if ( x[ind]>(`LN2x64>>( 64-A_BITS+ind )) )
begin
x [ind+1]<= x[ind] - (`LN2x64>>( 64-A_BITS+ind ));
bexp[ind+1]<= bexp[ind]<<(64'h1<<(ARG_HIGH-ind-1));
end
else
begin
x [ind+1]<= x [ind];
bexp[ind+1]<= bexp[ind];
end
end
for (ind=ARG_HIGH; ind<STEPS; ind++ )
begin
if ( x[ind]>(C_LN_10001[ind-ARG_HIGH]>>( 67-A_BITS )) )
begin
x [ind+1]<= x[ind] - (C_LN_10001[ind-ARG_HIGH]>>( 67-A_BITS ));
bexp[ind+1]<= bexp[ind] + (bexp[ind]>>(ind-ARG_HIGH+1));
end
else
begin
x [ind+1]<= x [ind];
bexp[ind+1]<= bexp[ind];
end
end
end
 
// for ( i=0; i<64; i++){
// double dval= log(1+1./pow(2.,1+i)) * pow(2.,64.); //((long long)1 << i);
// unsigned long long val= i>30 ? 1ull<<(63-i) :dval;
// cout << "assign C_LN_10001[" << dec << i << "]= 64'h" << hex << val << ";" << endl;
// }
 
 
assign C_LN_10001[1]= 64'h391fef8f35344400;
assign C_LN_10001[2]= 64'h1e27076e2af2e600;
assign C_LN_10001[3]= 64'hf85186008b15300;
assign C_LN_10001[4]= 64'h7e0a6c39e0cc000;
assign C_LN_10001[5]= 64'h3f815161f807c80;
assign C_LN_10001[6]= 64'h1fe02a6b1067890;
assign C_LN_10001[7]= 64'hff805515885e00;
assign C_LN_10001[8]= 64'h7fe00aa6ac4398;
assign C_LN_10001[9]= 64'h3ff80155156220;
assign C_LN_10001[10]= 64'h1ffe002aa6ab11;
assign C_LN_10001[11]= 64'hfff8005551558;
assign C_LN_10001[12]= 64'h7ffe000aaa6aa;
assign C_LN_10001[13]= 64'h3fff800155515;
assign C_LN_10001[14]= 64'h1fffe0002aaa6;
assign C_LN_10001[15]= 64'hffff80005555;
assign C_LN_10001[16]= 64'h7fffe0000aaa;
assign C_LN_10001[17]= 64'h3ffff8000155;
assign C_LN_10001[18]= 64'h1ffffe00002a;
assign C_LN_10001[19]= 64'hfffff800005;
assign C_LN_10001[20]= 64'h7ffffe00000;
assign C_LN_10001[21]= 64'h3fffff80000;
assign C_LN_10001[22]= 64'h1fffffe0000;
assign C_LN_10001[23]= 64'hffffff8000;
assign C_LN_10001[24]= 64'h7fffffe000;
assign C_LN_10001[25]= 64'h3ffffff800;
assign C_LN_10001[26]= 64'h1ffffffe00;
assign C_LN_10001[27]= 64'hfffffff80;
assign C_LN_10001[28]= 64'h7ffffffe0;
assign C_LN_10001[29]= 64'h3fffffff8;
assign C_LN_10001[30]= 64'h1fffffffe;
assign C_LN_10001[31]= 64'h100000000;
assign C_LN_10001[32]= 64'h80000000;
assign C_LN_10001[33]= 64'h40000000;
assign C_LN_10001[34]= 64'h20000000;
assign C_LN_10001[35]= 64'h10000000;
assign C_LN_10001[36]= 64'h8000000;
assign C_LN_10001[37]= 64'h4000000;
assign C_LN_10001[38]= 64'h2000000;
assign C_LN_10001[39]= 64'h1000000;
assign C_LN_10001[40]= 64'h800000;
assign C_LN_10001[41]= 64'h400000;
assign C_LN_10001[42]= 64'h200000;
assign C_LN_10001[43]= 64'h100000;
assign C_LN_10001[44]= 64'h80000;
assign C_LN_10001[45]= 64'h40000;
assign C_LN_10001[46]= 64'h20000;
assign C_LN_10001[47]= 64'h10000;
assign C_LN_10001[48]= 64'h8000;
assign C_LN_10001[49]= 64'h4000;
assign C_LN_10001[50]= 64'h2000;
assign C_LN_10001[51]= 64'h1000;
assign C_LN_10001[52]= 64'h800;
assign C_LN_10001[53]= 64'h400;
assign C_LN_10001[54]= 64'h200;
assign C_LN_10001[55]= 64'h100;
assign C_LN_10001[56]= 64'h80;
assign C_LN_10001[57]= 64'h40;
assign C_LN_10001[58]= 64'h20;
assign C_LN_10001[59]= 64'h10;
assign C_LN_10001[60]= 64'h8;
assign C_LN_10001[61]= 64'h4;
assign C_LN_10001[62]= 64'h2;
assign C_LN_10001[63]= 64'h1;
 
endmodule
 
 

powered by: WebSVN 2.1.0

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