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

Subversion Repositories pipelined_fixed_point_elementary_functions

[/] [pipelined_fixed_point_elementary_functions/] [trunk/] [math_pipelined/] [atan2_pipelined.sv] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 leshabiruk
 
2
 
3
 
4
`define PI_x64 (68'sd57952155664616982739/4)
5
 
6
module atan2_pipelined(
7
        input clk,
8
        input signed [UP:0] y,
9
        input signed [UP:0] x,
10
        output signed [UP:0] oangle,
11
        output signed [UP:0] odebug
12
        );
13
 
14
parameter BITS_HIGH= 16;
15
parameter BITS_LOW= 16;
16
parameter BITS_GUARD= 0;
17
 
18
parameter IS_IBNIZ= 0;//        пїЅпїЅпїЅпїЅ 0, пїЅпїЅ f=atan2        пїЅпїЅпїЅпїЅ 1, пїЅпїЅ f=atan2/2PI
19
//      пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ.
20
 
21
//      пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
22
parameter UP= BITS_HIGH +BITS_LOW -1;
23
 
24
// пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ- пїЅпїЅпїЅ пїЅпїЅпїЅпїЅ(пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ)
25
parameter UPL=                   BITS_LOW -1;
26
 
27
//      пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ "пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ" пїЅпїЅпїЅ "пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ" пїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
28
parameter UPG= UP   +BITS_GUARD;
29
parameter UPLG= UPL +BITS_GUARD;
30
 
31
`define BOUT (UPL)      //      пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ
32
 
33
reg signed [UPG:0] cx [`BOUT:0];
34
reg signed [UPG:0] csin [`BOUT:0];
35
reg signed [UPG:0] ccos [`BOUT:0];
36
 
37
//wire signed [UPG:0] x0= (x[UP] ? -x : x)<<
38
 
39
assign oangle= cx[`BOUT]>>>(BITS_GUARD);
40
assign odebug= csin[`BOUT]>>>BITS_GUARD;
41
 
42
//      пїЅпїЅпїЅпїЅ, пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ 1.00...001
43
wire signed [63:0] C_ANGLE [63:0];
44
 
45
//
46
wire signed [UPG:0] cx2 [`BOUT:0];
47
wire signed [UPG:0] csin2 [`BOUT:0];
48
wire signed [UPG:0] ccos2 [`BOUT:0];
49
 
50
 
51
always @*
52
begin
53
        integer ind;
54
        for (ind=0; ind< `BOUT; ind=ind+1)
55
        begin
56
                if ( csin[ind] >0 )
57
                begin
58
                        cx2[ind]<= cx[ind]+ (C_ANGLE[ind] >>> (62-UPLG));
59
                        csin2[ ind ]<= csin[ ind ] - (ccos[ ind ] >>>(ind) );
60
                        ccos2[ ind ]<= ccos[ ind ] + (csin[ ind ] >>>(ind) );
61
                end
62
                else
63
                begin
64
                        cx2[ind]<= cx[ind]- (C_ANGLE[ind] >>> (62-UPLG));
65
                        csin2[ ind ]<= csin[ ind ] + (ccos[ ind ] >>>(ind) );
66
                        ccos2[ ind ]<= ccos[ ind ] - (csin[ ind ] >>>(ind) );
67
                end
68
        end
69
 
70
end
71
 
72
always @( posedge clk )
73
begin
74
        integer ind;
75
 
76
        csin[0]= {y, {BITS_GUARD{1'h0}}};
77
        ccos[0]= {x, {BITS_GUARD{1'h0}}};
78
        cx[0]=0;
79
        //      пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ, CORDIC
80
 
81
        for (ind=0; ind< `BOUT; ind=ind+1)
82
        begin
83
                if ( csin2[ind] >0 )
84
                begin
85
                        cx[ind+1]<= cx2[ind]+ (C_ANGLE[ind] >>> (62-UPLG));
86
                        csin[ ind +1 ]<= csin2[ ind ] - (ccos2[ ind ] >>>(ind) );
87
                        ccos[ ind +1 ]<= ccos2[ ind ] + (csin2[ ind ] >>>(ind) );
88
                end
89
                else
90
                begin
91
                        cx[ind+1]<= cx2[ind]- (C_ANGLE[ind] >>> (62-UPLG));
92
                        csin[ ind +1 ]<= csin2[ ind ] + (ccos2[ ind ] >>>(ind) );
93
                        ccos[ ind +1 ]<= ccos2[ ind ] - (csin2[ ind ] >>>(ind) );
94
                end
95
        end
96
        //      пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ
97
//      begin
98
//              ind= UP-2;
99
//              if ( cx[ind] >0 )
100
//              begin
101
//                      cx[ind+1]<= cx[ind]- (C_ANGLE[ind-BITS_HIGH+1] >>> (63-UPLG));
102
//                      csin[ ind +1 ]<= s_sign[ind] ?-(csin[ ind ] + (ccos[ ind ] >>>(ind-(BITS_HIGH-1) +1) )) :
103
//                                                                                                        csin[ ind ] - (ccos[ ind ] >>>(ind-(BITS_HIGH-1) +1) );
104
//                      ccos[ ind +1 ]<= c_sign[ind] ? -(ccos[ ind ] - (csin[ ind ] >>>(ind-(BITS_HIGH-1) +1) )) :
105
//                                                                                                              ccos[ ind ] + (csin[ ind ] >>>(ind-(BITS_HIGH-1) +1) );
106
//              end
107
//              else
108
//              begin
109
//                      cx[ind+1]<= cx[ind]+ (C_ANGLE[ind-BITS_HIGH+1] >>> (63-UPLG));
110
//                      csin[ ind +1 ]<= s_sign[ind] ?-(csin[ ind ] + (ccos[ ind ] >>>(ind-(BITS_HIGH-1) +1) )) :
111
//                                                                                                        csin[ ind ] + (ccos[ ind ] >>>(ind-(BITS_HIGH-1) +1) );
112
//
113
//                      ccos[ ind +1 ]<= c_sign[ind] ? -(ccos[ ind ] - (csin[ ind ] >>>(ind-(BITS_HIGH-1) +1) )) :
114
//                                                                                                              ccos[ ind ] - (csin[ ind ] >>>(ind-(BITS_HIGH-1) +1) );
115
//              end
116
//              s_sign[ind+1]<= s_sign[ind];
117
//              c_sign[ind+1]<= c_sign[ind];
118
//      end
119
 
120
 
121
//      if ( x[UP] )
122
//      begin
123
//      end
124
//      else
125
//      begin
126
//              cx[0]= x;
127
//      end
128
end
129
 
130
        //for ( i=0; i<64; i++){
131
        //      double dval= atan(1./pow(2.,i)) * pow(2.,63.); //((long long)1 << i);
132
        //      unsigned long long val= dval;
133
        //      unsigned long long val_ibn= dval/6.283185307179586476925286766559;
134
        //      cout << "assign C_ANGLE[" << dec << i << "]= IS_IBNIZ?"
135
        //              " 64'h" << hex << val_ibn << ":"
136
        //              " 64'h" << hex << val << ";" << endl;
137
        //}
138
 
139
assign C_ANGLE[0]= IS_IBNIZ? 64'h1000000000000000: 64'h6487ed5110b46000;
140
assign C_ANGLE[1]= IS_IBNIZ? 64'h0972028ecef98400: 64'h3b58ce0ac3769e00;
141
assign C_ANGLE[2]= IS_IBNIZ? 64'h4fd9c2daf71cf40: 64'h1f5b75f92c80dd00;
142
assign C_ANGLE[3]= IS_IBNIZ? 64'h28888ea0eeecd20: 64'h0feadd4d5617b700;
143
assign C_ANGLE[4]= IS_IBNIZ? 64'h14586a1872c4d80: 64'h7fd56edcb3f7a80;
144
assign C_ANGLE[5]= IS_IBNIZ? 64'h0a2ebf0ac823140: 64'h3ffaab7752ec4a0;
145
assign C_ANGLE[6]= IS_IBNIZ? 64'h517b0f2e141318: 64'h1fff555bbb729b0;
146
assign C_ANGLE[7]= IS_IBNIZ? 64'h28be2a88ea2158: 64'h0fffeaaadddd4b8;
147
assign C_ANGLE[8]= IS_IBNIZ? 64'h145f29a368619c: 64'h7fffd5556eeedc;
148
assign C_ANGLE[9]= IS_IBNIZ? 64'h0a2f975d98559c: 64'h3ffffaaaab7778;
149
assign C_ANGLE[10]= IS_IBNIZ? 64'h517cc0048dd3d: 64'h1fffff55555bbc;
150
assign C_ANGLE[11]= IS_IBNIZ? 64'h28be60a54065b: 64'h0fffffeaaaaade;
151
assign C_ANGLE[12]= IS_IBNIZ? 64'h145f3066ff630: 64'h7fffffd555557;
152
assign C_ANGLE[13]= IS_IBNIZ? 64'h0a2f98360b979: 64'h3ffffffaaaaaa;
153
assign C_ANGLE[14]= IS_IBNIZ? 64'h517cc1b57488: 64'h1fffffff55555;
154
assign C_ANGLE[15]= IS_IBNIZ? 64'h28be60db5d3d: 64'h0fffffffeaaaa;
155
assign C_ANGLE[16]= IS_IBNIZ? 64'h145f306dc2fe: 64'h7fffffffd555;
156
assign C_ANGLE[17]= IS_IBNIZ? 64'h0a2f9836e40a: 64'h3ffffffffaaa;
157
assign C_ANGLE[18]= IS_IBNIZ? 64'h517cc1b7256: 64'h1fffffffff55;
158
assign C_ANGLE[19]= IS_IBNIZ? 64'h28be60db935: 64'h0fffffffffea;
159
assign C_ANGLE[20]= IS_IBNIZ? 64'h145f306dc9c: 64'h7fffffffffd;
160
assign C_ANGLE[21]= IS_IBNIZ? 64'h0a2f9836e4e: 64'h3ffffffffff;
161
assign C_ANGLE[22]= IS_IBNIZ? 64'h517cc1b727: 64'h1ffffffffff;
162
assign C_ANGLE[23]= IS_IBNIZ? 64'h28be60db93: 64'h0ffffffffff;
163
assign C_ANGLE[24]= IS_IBNIZ? 64'h145f306dc9: 64'h7fffffffff;
164
assign C_ANGLE[25]= IS_IBNIZ? 64'h0a2f9836e4: 64'h3fffffffff;
165
assign C_ANGLE[26]= IS_IBNIZ? 64'h517cc1b72: 64'h1fffffffff;
166
assign C_ANGLE[27]= IS_IBNIZ? 64'h28be60db9: 64'h1000000000;
167
assign C_ANGLE[28]= IS_IBNIZ? 64'h145f306dc: 64'h0800000000;
168
assign C_ANGLE[29]= IS_IBNIZ? 64'h0a2f9836e: 64'h400000000;
169
assign C_ANGLE[30]= IS_IBNIZ? 64'h517cc1b7: 64'h200000000;
170
assign C_ANGLE[31]= IS_IBNIZ? 64'h28be60db: 64'h100000000;
171
assign C_ANGLE[32]= IS_IBNIZ? 64'h145f306d: 64'h080000000;
172
assign C_ANGLE[33]= IS_IBNIZ? 64'h0a2f9836: 64'h40000000;
173
assign C_ANGLE[34]= IS_IBNIZ? 64'h517cc1b: 64'h20000000;
174
assign C_ANGLE[35]= IS_IBNIZ? 64'h28be60d: 64'h10000000;
175
assign C_ANGLE[36]= IS_IBNIZ? 64'h145f306: 64'h08000000;
176
assign C_ANGLE[37]= IS_IBNIZ? 64'h0a2f983: 64'h4000000;
177
assign C_ANGLE[38]= IS_IBNIZ? 64'h517cc1: 64'h2000000;
178
assign C_ANGLE[39]= IS_IBNIZ? 64'h28be60: 64'h1000000;
179
assign C_ANGLE[40]= IS_IBNIZ? 64'h145f30: 64'h0800000;
180
assign C_ANGLE[41]= IS_IBNIZ? 64'h0a2f98: 64'h400000;
181
assign C_ANGLE[42]= IS_IBNIZ? 64'h517cc: 64'h200000;
182
assign C_ANGLE[43]= IS_IBNIZ? 64'h28be6: 64'h100000;
183
assign C_ANGLE[44]= IS_IBNIZ? 64'h145f3: 64'h080000;
184
assign C_ANGLE[45]= IS_IBNIZ? 64'h0a2f9: 64'h40000;
185
assign C_ANGLE[46]= IS_IBNIZ? 64'h517c: 64'h20000;
186
assign C_ANGLE[47]= IS_IBNIZ? 64'h28be: 64'h10000;
187
assign C_ANGLE[48]= IS_IBNIZ? 64'h145f: 64'h08000;
188
assign C_ANGLE[49]= IS_IBNIZ? 64'h0a2f: 64'h4000;
189
assign C_ANGLE[50]= IS_IBNIZ? 64'h517: 64'h2000;
190
assign C_ANGLE[51]= IS_IBNIZ? 64'h28b: 64'h1000;
191
assign C_ANGLE[52]= IS_IBNIZ? 64'h145: 64'h0800;
192
assign C_ANGLE[53]= IS_IBNIZ? 64'h0a2: 64'h400;
193
assign C_ANGLE[54]= IS_IBNIZ? 64'h51: 64'h200;
194
assign C_ANGLE[55]= IS_IBNIZ? 64'h28: 64'h100;
195
assign C_ANGLE[56]= IS_IBNIZ? 64'h14: 64'h080;
196
assign C_ANGLE[57]= IS_IBNIZ? 64'h0a: 64'h40;
197
assign C_ANGLE[58]= IS_IBNIZ? 64'h5: 64'h20;
198
assign C_ANGLE[59]= IS_IBNIZ? 64'h2: 64'h10;
199
assign C_ANGLE[60]= IS_IBNIZ? 64'h1: 64'h08;
200
assign C_ANGLE[61]= IS_IBNIZ? 64'h0: 64'h4;
201
assign C_ANGLE[62]= IS_IBNIZ? 64'h0: 64'h2;
202
assign C_ANGLE[63]= IS_IBNIZ? 64'h0: 64'h1;
203
endmodule
204
 
205
 
206
 
207
 

powered by: WebSVN 2.1.0

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