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

Subversion Repositories mips789

[/] [mips789/] [branches/] [avendor/] [bench/] [calc_PI_2/] [cal_pi.c] - Blame information for rev 53

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 35 mcupro
/******************************************************************
2
 *                                                                *
3
 *    Author: Liwei                                               *
4
 *                                                                *
5
 *    This file is part of the "mips789" project.                 *
6
 *    Downloaded from:                                            *
7
 *    http://www.opencores.org/pdownloads.cgi/list/mips789        *
8
 *                                                                *
9
 *    If you encountered any problem, please contact me via       *
10
 *    Email:mcupro@opencores.org  or mcupro@163.com               *
11
 *                                                                *
12
 ******************************************************************/
13
 
14 15 mcupro
/* This source code is baseed on a 16bit CPU Aquarius in opencores.org */
15
/* Thanks the author. */
16
/* modified by Liwei 2007-10-13 */
17
 
18
 
19
//#define DOS
20
#define MIPS
21
 
22
#ifdef MIPS
23
#include "..\..\clib\dvc_lib.h"
24
#endif
25
 
26
#ifdef DOS
27
#include "stdio.h"
28
#define uart0_putc putchar
29
#define uart0_putstr puts
30
#endif
31
 
32
void          longadd(unsigned short *a, unsigned short *b, unsigned short *c);
33
void          longsub(unsigned short *a, unsigned short *b, unsigned short *c);
34
int           longdiv(unsigned short *a, unsigned short b, unsigned short *c);
35
void          calc_pi(void);
36
void          disp_oct4(unsigned short x);
37
void          disp_pi(void);
38
 
39 35 mcupro
#define  MAXFIGURE ((1100*2/4)+2) /* should be (N*8)+2 to display correctly */
40 15 mcupro
 
41
unsigned short PI[MAXFIGURE];
42
unsigned short T1[MAXFIGURE];
43
unsigned short T2[MAXFIGURE];
44
unsigned short T3[MAXFIGURE];
45
 
46
/* ============= */
47
/*  Main Routine */
48
/* ============= */
49
void main_sh(void)
50
{
51
 
52 35 mcupro
    uart0_putstr("Calculating.....   ");
53 15 mcupro
    calc_pi();
54
    disp_pi();
55
}
56
 
57
/* ------------------------------------------------- */
58
/*  Calculate the Circular Constant Pi */
59
/* ------------------------------------------------- */
60
/*  (1) Matin's formula */
61
/*  PI/4 =  4*arctan(1/5) -   arctan(1/239) */
62
/*  PI   = 16*arctan(1/5) - 4*arctan(1/239) */
63
/*  Here, arctan(1/p) = 1/p - 1/(3*p^3) + 1/(5*p^5) - 1/(7*p^7) + ... */
64
/*  Then,  */
65
/*  PI =  (16*1/5     - 4*1/239) */
66
/*      - (16*1/3*5^3 - 4*1/3*239^3) */
67
/*      + (16*1/5*5^5 - 4*1/5*239^5) */
68
/*      - (16*1/7*5^7 - 4*1/7*239^7) */
69
/*      +... */
70
/*     =  (1/1)*(16*5/(5*5)^1 - 4*239/(239*239)^1) */
71
/*      - (1/3)*(16*5/(5*5)^2 - 4*239/(239*239)^2) */
72
/*      + (1/5)*(16*5/(5*5)^3 - 4*239/(239*239)^3) */
73
/*      - (1/7)*(16*5/(5*5)^4 - 4*239/(239*239)^4) */
74
/*      +... */
75
/* ------------------------------------------------- */
76
/*  (2) Define Arrays for Long Figure Number */
77
/*  Each element has Octal 4 figures.  */
78
/*      PI[] : Value to be converged to Pi */
79
/*      T1[] : (16*  5)/(  5*  5)^n (n=1...) */
80
/*      T2[] : ( 4*239)/(239*239)^n (n=1...) */
81
/*      T3[] : (-1)*(n+1)*(1/(2n-1))*(T1[]-T2[]) */
82
/* ------------------------------------------------- */
83
/*  (3) Example */
84
/*  n TI[0] TI[1] T2[0] T2[1] T3[0] T3[1] PI[0] PI[1]  */
85
/*  0 0080  0000  0956  0000  0000  0000  0000  0000 */
86
/*  1 0003  2000  0000  0167  0003  1833  0003  1833 (+) */
87
/*  2 0000  1280  0000  0000  0000  0426  0003  1407 (-) */
88
/*  3 0000  0051  0000  0000  0000  0010  0003  1417 (+) */
89
/*  4 0000  0002  0000  0000  0000  0000  0003  1417 (-) */
90
/* ------------------------------------------------- */
91
void calc_pi(void)
92
{
93
    int i;
94
    int converged;
95
    /* ----------- */
96
    /*  Initialize */
97
    /* ----------- */
98
    converged = 0;
99
    for (i=0; i<=MAXFIGURE-1; i++)
100
    {
101
        PI[i] = 0;
102
        T1[i] = 0;
103
        T2[i] = 0;
104
        T3[i] = 0;
105
    }
106
    T1[0] = 16*5;
107
    T2[0] = 4*239;
108
 
109
    /* ----------------------------- */
110
    /*  repeat until being converged */
111
    /* ----------------------------- */
112
    i = 1;
113
    while (converged == 0)
114
    {
115
        /* ------------- */
116
        /*  Make T1 & T2 */
117
        /* ------------- */
118
        longdiv(T1,  25, T1);
119
        longdiv(T2, 239, T2);
120
        longdiv(T2, 239, T2);
121
        /* -------- */
122
        /*  Make T3 */
123
        /* -------- */
124
        longsub(T1, T2, T3);
125
        converged = longdiv(T3, (unsigned short)(2*i-1), T3);
126
        /* if (converged) break; */
127
        /* ----------------- */
128
        /*  Accumulate to PI */
129
        /* ----------------- */
130
        if (i%2 != 0)
131
            longadd(PI, T3, PI);
132
        else
133
            longsub(PI, T3, PI);
134
        /* ------------ */
135
        /*  Increment i */
136
        /* ------------ */
137
        i++;
138
    }
139
}
140
 
141
/* --------- */
142
/*  Long Add */
143
/* --------- */
144
void longadd(unsigned short *a, unsigned short *b, unsigned short *c)
145
{
146
    int i;
147
    unsigned short carry;
148
 
149
    carry = 0;
150
    for (i = MAXFIGURE-1; i >= 0; i--)
151
    {
152
        *(c+i) = *(a+i) + *(b+i) + carry;
153
        if (*(c+i) < 10000)
154
            carry = 0;
155
        else
156
        {
157
            carry = 1;
158
            *(c+i) = *(c+i) - 10000;
159
        }
160
    }
161
}
162
 
163
/* --------- */
164
/*  Long Sub */
165
/* --------- */
166
void longsub(unsigned short *a, unsigned short *b, unsigned short *c)
167
{
168
    int i;
169
    unsigned short borrow;
170
    unsigned short temp;
171
 
172
    borrow = 0;
173
    for (i = MAXFIGURE-1; i >= 0; i--)
174
    {
175
        temp = *(b+i) + borrow;
176
        if (*(a+i) >= temp)
177
        {
178
            *(c+i) = *(a+i) - temp;
179
            borrow = 0;
180
        }
181
        else
182
        {
183
            *(c+i) = 10000 + *(a+i) - temp;
184
            borrow = 1;
185
        }
186
    }
187
}
188
 
189
/* --------- */
190
/*  Long Div */
191
/* --------- */
192
int longdiv(unsigned short *a, unsigned short b, unsigned short *c)
193
{
194
    int i;
195
    int conv;
196
    unsigned long al, bl, cl, dvd, rem;
197
 
198
    conv = 1;
199
    rem = 0;
200
    for (i = 0; i <= MAXFIGURE-1; i++)
201
    {
202
        al = (unsigned long) *(a+i);
203
        bl = (unsigned long) b;
204
        cl = (unsigned long) *(c+i);
205
 
206
        dvd = al + rem;
207
        cl = dvd / b;
208
        rem    = (dvd - cl * bl) * 10000;
209
        if (cl > 0) conv = 0;
210
        *(c+i) = (unsigned short) cl;
211
    }
212
    return conv;
213
}
214
 
215
/* ----------- */
216
/*  Display Pi */
217
/* ----------- */
218
void disp_pi(void)
219
{
220
    int i, j;
221 35 mcupro
    uart0_putstr("Calculating DONE  ");
222
    uart0_putstr("Pi = 3.");
223 15 mcupro
  /*  while(1)*/
224
    {
225
        for (i = 0; i < (MAXFIGURE - 2) / 8; i++)
226
        {
227
             for (j = 0; j < 8; j++)
228
            {
229
  /*               if (j == 0) lcd_pos(0);  */
230
  /*               if (j == 4) lcd_pos(16); */
231
                disp_oct4(*(PI + i*8 + j + 1));
232
             }
233
        }
234
    }
235
}
236
 
237
/* ------------------- */
238
/*  Display Oct 4 digit */
239
/* ------------------- */
240
 
241
void disp_oct4(unsigned short x)
242
{
243
 
244
    unsigned short d;
245
    d = x / 1000;
246
    x = x - d * 1000;
247
    uart0_putc((char)(d+0x30));
248
    d = x / 100;
249
    x = x - d * 100;
250
    uart0_putc((char)(d+0x30));
251
    d = x / 10;
252
    x = x - d * 10;
253
    uart0_putc((char)(d+0x30));
254
    uart0_putc((char)(x+0x30));
255
}
256
 
257
#ifdef MIPS
258
main2()
259
#endif
260
 
261
#ifdef DOS
262
main()
263
#endif
264
{
265
 
266
unsigned char i=0;
267
 
268
 
269
for(;;)
270 35 mcupro
{
271
 uart0_putstr("Hello CPU World ,this is  MIPS789...\n");
272
calc_pi();
273 15 mcupro
    disp_pi();
274
#ifdef MIPS
275
dis_byte(i++);
276
while(get_key1()==0)      ;
277
#endif
278
 
279
#ifdef DOS
280
getchar();
281
#endif
282
}
283
 
284
 
285
}

powered by: WebSVN 2.1.0

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