Topic Infineon XC886/888CLM Cordic & MDU Module XC886/888CLM May 2006 Page 1 May 2006 Department Agenda XC888/886CLM – Cordic Coprocessor XC886/888CLM – MDU Coprocessor XC886/888CLM May 2006 Page 2 XC886/888CLM – New Peripherals T21 UART1 MultiCan Cordic MDU XC886/888CLM May 2006 Page 3 XC886/888CLM – Cordic Basics Cordic (COordinate Rotation DIgital Computer) – Mathematical co-processor for 16bit trigonometric, hyperbolic and linear functions (e.g. to solve SIN, COS, LOG, EXP, SQRT...) – Hardcoded - Look Up Table based on iterative approximation algorithm (16 iterations, max 41 cycles) 8 SFRs in the mapped area one interrupt vector on a shared node @0x0043 XC886/888CLM May 2006 Page 4 XC886/888CLM – Cordic History CORDIC algorithms belong to the class of shift-add algorithms. (introduced by Jack E. Volder in 1951 for trigonometric functions, generalized and extended with linear and hyperbolic functions by J.S. Walther 1971 ) The idea behind the CORDIC is, to have all mathematic functions in a microcontroller available with most less costs, since shift and add hardware can be easy implemented. Mainly the CORDIC is used to perform a rotation in a plane using a series of specific incremental rotation angles selected so that each is performed by a shift and add operation. There is also a mechanism for computing the magnitude and phase angle of an input vector. One CORDIC iteration involves 2 shifts, 1 table lookup, 3 additions XC886/888CLM May 2006 Page 5 XC886/888CLM – Some Math Basics Some basic functions – Taylor series expansion sine (x), cosine (x) x3 x5 x7 sin x = x − + − ± ...; 3! 5! 7! – arctan (x) x3 x5 x7 arctan x = x − + − ± ... 3 5 7 Factorial – e.g. 5! = 5*4*3*2*1 = 120 XC886/888CLM May 2006 Page 6 XC886/888CLM – Some Math Basics cont. The Unite Circle Radian – deg to rad XC886/888CLM May 2006 Page 7 angle [rad ] = angle [deg ] • e.g. 45 (deg) Æ 45/180*PI = 0.7854 (rad) e.g. 1 (rad) = PI Æ 180 (deg) π 180 XC886/888CLM – Cordic Coordinate Systems CORDIC equations x(i+1) = x(i) – m di y(i) 2–i y(i+1) = y(i) + di x(i) 2–i z(i+1) = z(i) – di e(i) XC886/888CLM May 2006 Page 8 m Coordinate System Domain of Convergence 1 circular 1.74 radian 0 linear 2 -1 hyperbolic 1.11 radian XC886/888CLM – Cordic Iterations Starting with a phase of 45 degrees, the phase of each successive R multiplier is a little over half of the phase of the previous “Binary search" on phase by adding or subtracting successively smaller phases to reach the "target" phase –––––––––––––––––––––––––––––––– i e(i) in degrees e(i) in radians ––––––––––––––––––––––––––––––– 0 1 2 3 4 5 6 7 8 9 45.0 26.6 14.0 7.1 3.6 1.8 0.9 0.4 0.2 0.1 0.785 398 163 0.463 647 609 0.244 978 663 0.124 354 994 0.062 418 810 0.031 239 833 0.015 623 728 0.007 812 341 0.003 906 230 0.001 953 123 –––––––––––––––––––––––––––––––– XC886/888CLM May 2006 Page 9 Example: 30° angle 30.0 ≅ 45.0 – 26.6 + 14.0 – 7.1 + 3.6 + 1.8 – 0.9 + = 30.1 0.4 – 0.2 + 0.1 XC886/888CLM – Cordic Math Functions CORDIC Rotation Vectoring IN xn,zn,yn xn,yn,zn OUT yn+1 = xn * zn + yn zn+1 = yn / xn + zn Circular IN zn=angle, xn=K,yn=0 xn,yn, zn=0 SINE/COSINE angle/ magnitude OUT xn+1 = cos(angle) zn+1 = arctan(yn/xn ) Linear MUL/DIV/MAC K=1 yn+1 = sin(angle) xn+1 = 1/K*(xn2 + yn2)1/2 K = 1.64676 IN z1=angle, x1=K´,y1=0 y1 < x1, z1=0 OUT xn+1 = cosh(angle) zn+1 = arctanh(y1/x1) Hyperbolic K = 0.828 XC886/888CLM May 2006 Page 10 yn+1 = sinh(angle) xn+1 = 1/K´*(x12 - y12)1/2 XC886/888CLM – Cordic Data Format S15 – S15 or e.g. S5.10 or S10.5. – signed integer one sign bit | 15 number bits – rational number (fractional) one sign | n . (15-n) bit fractional decimal point can be freely chosen fraction means S | 21 + 20. 2-1 + 2-2 + 2-3 +.... Example S15 25 x -25 = -625 0x0019 x 0xFFE7 = 0xFD8F 2.5 x -2.5 = -6.25 0x0028 x 0xFFD8 = 0xF9C0 0.25 x -0.25= 0.0625 – negative numbers in Twos Complement e.g. -25dec = 1|111 1111 1110 0110 +1 = 1|111 1111 1110 0111 4Q16 (S4.11) – decimal point is fixed XC886/888CLM May 2006 Page 11 Example S4.11 S| 4.11 2.5 = 0|001‘0.100‘0000‘0000 = 0x1400 (-5.625 = 0|010‘1.101‘0000‘0000 = 0x2D00 twos compl)= 1|101‘0.010‘1111‘1111 + 1 = 0xD300 XC886/888CLM – Cordic Data Format cont. Input: – X, Y can be integer (S15) or rational number (fraction) in all operating modes. They must have the same form and in case of fraction the same number of bits for the decimal place. Results: – X, Y can be integer (S15) or rational number (fraction) in all operating modes. Must be same format as input format. – X in circular vectoring mode can be interpreted as twos complement or as 16-bit unsigned depending on bit X_USIGN X, Y Result Data = CD_Result / MPS MPS = magnitude prescaler (1, 2, 4) XC886/888CLM May 2006 Page 12 – Z for linear functions it is always in signed 4Q16 (S4.11) – Z for linear functions is signed 4Q16 format ( S4.11 ) – Z for circular and hyperbolic functions it is always handled as scaled normalized integer. – Z for circular and hyperbolic functions is a scaled normalized integer input Z = real Z (in rad) * 32768/PI real result Z (in rad) = Z* PI/32768 XC886/888CLM – Cordic Accuracy & Deviation Input inaccuracy: representation of a value is limited by the number of bits The CORDICs accuracy is also limited by the number of iterations. Therefore an absolute deviation can be calculated. This is the difference between the expected and the real value. The normalized deviation refers to the magnitude of the result, i.e. the absolute error for small numbers is big, but if this is put into relationship to the magnitude it is still small. Properly scaled values will produce small errors. The max. error can be calculated and is depending on the chosen mode. Some examples for Linear and Circular mode XC886/888CLM May 2006 Page 13 XC886/888CLM – Cordic Accuracy & Deviation cont Some example calculation in LINEAR mode – y=z*x |z| ≤ 2 Æ z in S1.11 with x = 3000, 6000, ....30000 in S15 and z = 1, 0.1, 0.01, 0.001 in S4.11 // result magnitude in S15 = 32768 // calculate 0*0.01, 3000*0.01, 6000*0.01 ... 30000*0.01 for (x=0;x<32000;x+=3000){ //(x, z=0.01 S4Q16) product = CD_multiply (x, 0x0014); } – here: the deviation depends on how accurate the value z can be coded in S4.11 (Input inaccuracy) Æ max. error: 2-11 = 0,000488281 Z XC886/888CLM May 2006 Page 14 Zcoded 1 0.1 0.01 0.001 hex 0x0800 0x00CD 0x0014 0x0002 dec 1.000000 0.100098 0.009766 0.000977 XC886/888CLM – Cordic Accuracy & Deviation cont X 3000 6000 9000 12000 15000 18000 21000 24000 27000 30000 3000 6000 9000 12000 15000 18000 21000 24000 27000 30000 300 600 901 1201 1501 1802 2102 2403 2701 3003 29 58 88 117 146 176 205 235 264 293 3 6 9 12 15 18 21 24 27 30 Z 1 0x0800 0.1 0x00CD 0.01 0x0014 0.001 0x0002 – Input format of X: integer (S15) or fraction – It is necessary to reserve as many bits as possible after the decimal point to minimize the output truncation error of the result. XC886/888CLM May 2006 Page 15 i.e. 18.5 Æ possible: 0|000 0001 0010.1000 better: 0|001 0010.1000 0000 = 0x0128 = 0x1280 XC886/888CLM – Cordic Scaling the Amplitude Example for circular rotation mode – sine calculation – YFINAL = K*X*sin(Z) K = 1,64676 – For scaling the amplitude A = K*X, set X = A/K note: choose the amplitude as high as possible to increase the resolution of the range of sin(Z) and to decrease the result error note: Amax = 32768 X A YFINAL 1 1.64676 {-1.64676…+1.64676} 100 164.676 {-164.676…+164.676} 12145 19999.9 {-19999.9…+19999.9} 19898 32767.3 {-32767.3…+32676.3} – Angle Z in normalized scaled integer XC886/888CLM May 2006 Page 16 Min. adjusting angle: 180 ° = 0.00549 ° 32768 XC886/888CLM – Cordic Example SINE() How to calculate sine(z) ~1µs XC886/888CLM May 2006 Page 17 z0=angle, x0=K,y0=0 yn+1 = sine(angle) SYSCON0 |= 0x01; // switch into mapped area CD_STATC = 0x00; // clear keep bits - disable CORDIC IRQ CD_CON = 0x0A; // circular rotation mode - auto start CD_CORDYL= 0x00; CD_CORDYH= 0x00; // y0=0 CD_CORDXH= 0x17; // x0hi=K CD_CORDZL= z; CD_CORDZH= (z>>8); // input angle z in integer CD_CORDXL= 0xB9; // x0lo=K and start Cordic while(!(CD_STATC & 0x04)); // wait on CORDIC ready printf ("SIN CORDIC = %d%d\n",CD_CORDYH,CD_CORDYL ); // print result SYSCON0 &= 0xFE; // switch to non-mapped area XC886/888CLM – Cordic Example ARCTAN() How to calculate an angle xn, yn, zn=0 zn+1 = arctan(yn/xn ) CD_S15 CORDIC_CalculateAtan (CD_S15 Xval ,CD_S15 Yval) { if(Xval == 0x0000) { g_CORDIC_atan.WORD = 0; // Avoid error at 'divide by 0' } else { ´ SYSCON0 |= 1; CD_STATC = 0; CD_CON =(MPS_1+TWOS_COMPLEMENT+START_AUTO+MODE_VECTORING+FUNC_CIRCULAR); CD_CORDZH = CD_CORDZL = 0; CD_CORDYH = (unsigned char) Yval; CD_CORDYL = (unsigned char) (Yval>>8); CD_CORDXH = (unsigned char) Xval; CD_CORDXL = (unsigned char) (Xval>>8); while(!(CD_STATC & 0x04)); // wait on CORDIC ready g_CORDIC_atan.BYTE.H = CD_CORDZH; g_CORDIC_atan.BYTE.L = CD_CORDZL; SYSCON0 &= 0xFE; } ~1µs XC886/888CLM May 2006 Page 18 } XC886/888CLM – Cordic Example Multiply & Accumulate How to do a MAC in S4Q16 (S4.11) ~1µs ~1µs XC886/888CLM May 2006 Page 19 xn, zn, yn yn+1 = xn * zn + yn // mac (multiply & accumulate) -- input format x, y in S15, z in S4.11 // x=4096 = 0x1000, y=4096 =0x1000, z=2 =0x1000 >> yn+1 = 12288 = 0x3000 SYSCON0 |= 0x01; // set RMAP CD_CON =(MPS_1+TWOS_COMPLEMENT+START_WITH_ST_SET+MODE_ROTATION+FUNC_LINEAR); CORDIC_LOAD_XYZ_REGISTERS(0x1000,0x1000,0x1000); // (x, y, z) CORDIC_START(); // set start bit while(!(CD_STATC & 0x04)); // Polling until CORDIC is ready – EOCflag g_CORDIC_mac.BYTE.H = CD_CORDYH; g_CORDIC_mac.BYTE.L = CD_CORDYL; // result yn+1 = 12288 = 0x3000 // additional accumulate CD_CON &= 0xEF; CD_STATC |= 0x40; CD_CORDZH = 0x08; CD_CORDZL = 0x00; CD_CORDXH = 0x10; CD_CORDXL = 0x00; while(!(CD_STATC & 0x04)); g_CORDIC_mac.BYTE.H = CD_CORDYH; g_CORDIC_mac.BYTE.L = CD_CORDYL; SYSCON0 &= 0xFE; // Set AutoStart // KEEP Y // z=1 = 0x0800 // x=4096 = 0x1000 //CORDIC starts here automatically // Polling until CORDIC is ready - EOC // result yn+1 = 16384 = 0x4000 // clr RMAP Agenda XC888/886CLM – Cordic Coprocessor XC886/888CLM – MDU Coprocessor XC886/888CLM May 2006 Page 20 XC886/888CLM – MDU Mathematical co-processor for Multiply and Divide – Fast signed/unsigned 16x16bit multiplication – Fast signed/unsigned 32/16bit or 16/16bit division – 32bit unsigned normalization – 32bit arithmetic/logical shift operations CPU has to MOVE the operands and result (including waitstate for code fetching from Flash) = 8clk / 8bit – e.g. signed multiplication 16bit x 16bit: 32 (load operands) + 16 (multiplication) + 32 (fetch result) = 80clk = 3.3µs @ 24MHz For continues MDU operation, next operands can be loaded in parallel to current calculation – e.g. continues (interleaved) signed multiplication 16bit x 16bit: 16 (multiplication) || 32 (load operands for next multiplication) + 32 (fetch result) = 64clk = 2.7µs @ 24MHz XC886/888CLM May 2006 Page 21 XC886/888CLM – MDU Performance XC886/888CLM May 2006 Page 22 XC886/888CLM – MDU ROM-Library MDU is very useful for some mathmetical functions such as – UIDIV, LMUL, ULDIV, LShift ROM contains most valuable MDU-routines which can be called by user – this saves codespace and runtime (no waitstate for ROM access) easy integration with KEIL compiler MDU Library support in ROM only available for devices marked with “M” ROM Library support from AB-step onwards Routine Name XC886/888CLM May 2006 Page 23 Num of Bytes Num of Clock Cycle ROM Software MDU Software MDU ?C?IMUL 18 20 57 53 MDU Library ?C?UIDIV 85 24 267 61 MDU Library ?C?LMUL 139 61 213 123 / 105 MDU Library ?C?ULDIV 146 197 1148 / 886 101 / 249 MDU Library ?C?LNEG 14 X 31 X -- ?C?ULSHR 19 28 10 + (30 * n) 50 + n MDU Library ?C?SLSHR 20 28 10 + (30 * n) 50 + n MDU Library ?C?LSHL 20 28 10 + (30 * n) 50 + n MDU Library XC886/888CLM – Floating Point ROM-Library ROM contains most valuable floating point routines which can be called by user – this saves codespace and runtime (no waitstate for ROM access) easy integration with KEIL compiler Float Library support in ROM available for all devices Fload Library support from AB-step onwards Routine Name Num of Bytes Num of Clock Cycle Software Software ?C?FPADD from 309 to 488 Float Library ?C?FSUB ~408 Float Library ?C?FPMUL ~385 Float Library ?C?FPDIV ~1757 Float Library ~87 Float Library ?C?FPCASTC from 197 to 231 Float Library ?C?FPCASTI from 271 to 305 Float Library ?C?FPCASTL from 699 to 733 Float Library ?C?FPCASTF from 630 to 980 Float Library ?C?FPCMP3 XC886/888CLM May 2006 Page 24 ROM ~1kbyte XC886/888CLM May 2006 Page 25 Example PI-Control without Cordic in ASM ;******* PI-Regler 16********* pi16_3_B: ; Eingang_sollwert (16 Bits) = sollwert16 ; Ausgang ( 8 Bits) = sollwert pi16_8_B: cjne a,ymax16,pi16_4_B ; Ausgang und Integrierer Begrenzung _pi_regler16_B: ; Eingang_istwert (16 Bits) = Drehzahl pi16_4_B: mov ; sollwert,a ret pi16_neg_B: ; negative Regelabw e_L Begrenzung clr c jc pi16_5_B cjne a,#0FFh,pi16_9_B mov a,sollwert16+1 ; e = Regelabweichung = Sollwert - Iswert mov a,ymax16 mov a,r2 subb a,Drehzahl+1 mov yint16,a jz pi16_9_B mov r2,a mov sollwert,a cpl a ret inc a ; R2 = e_L mov a,sollwert16 subb a,Drehzahl ; A = e_H jc pi16_neg_B ; Überlauftest cjne a,#0,pi16_1_B ; High-teil von Regelabweichung e_H test pi16_5_B: sjmp pi16_10_B mov yint16,a pi16_51_B: pi16_9_B: ; positive Regelabweichung e_L mov a,r2 jmp pi16_2_B ; Proportional Anteil mov b,kp16 pi16_1_B: mov a,#0FFh ; positive Regelabweichung e_L Begrenzung mul ab mov r2,a ; positive Regelabweichung e_L jnb b.7,pi16_52_B ; Überlauftest vor der Multiplication pi16_2_B: mov a,r2 ; positive Regelabweichung e_L mov b,ki16 ; Integrierer yint16 = yint16 + ki*e_L mul ab ; ki * e_L add a,yint16+2 ; A = yint16_L + L mov yint16+2,a ; yint16_L = yint16_L + L mov a,b ;A=H addc a,yint16+1 ; A = yint16_M + H + C mov yint16+1,a ; yint16_M = yint16_M + H + C clr a ;A=0 addc a,yint16 ; A = yint16_H + C jnc pi16_3_B ; Überlauftest mov a,ymax16 ; Ausgang und Integrierer Begrenzung XC886/888CLM mov yint16,a May 2006 mov sollwert,a Page 26 ret ; kp * e_L mov b,#07FH pi16_52_B: ; Multiplication mal 2 add a,ACC ;A=L*2 xch a,b ;A=H /B=L*2 addc a,ACC ;A=H*2 xch a,b ;A=L*2 /B=H*2 add a,yint16+1 addc a,yint16 pi16_7_B ; Überlauftest cjne a,ymax16,pi16_6_B pi16_6_B: jc pi16_8_B pi16_7_B: mov mov a,#0FFh ; negative Regelabweichung e_L pi16_10_B: mov r2,a ; R2 = maximale Regelabweichung e_L mov b,ki16 ; Integrierer , yint = yint - ki*e mul ab ; ki * e_L mov r3,a mov a,yint16+2 ; yint16_L = yint16_L - L clr c subb a,r3 ;C=0 ; A = yint16_L - L mov yint16+2,a ; yint16_L = yint16_L - L mov a,yint16+1 ; A = yint16_M subb a,b ; A = yint16_M - H - C mov yint16+1,a ; yint16_M = yint16_M - H - C mov a,b jc ; negative Regelabweichung e_L a,ymax16 ; Ausgang Begrenzung mov a,yint16 ; A = yint16_H subb a,#0 ; A = yint16_H - C jnc pi16_11_B ; Überlauftest clr a pi16_11_B: mov yint16,a pi16_101_B: mov a,r2 ; negative Regelabweichung e_L ; Proportional Anteil Example PI-Control with Cordic int pi_control(int IST, int SOLL) { // y = Kp * e + Ki * integral(e*dt) error = SOLL-IST; // calculation of the error SYSCON0 |= 0x01; // switch into mapped area CD_STATC = 0x00; // clr keep bit - int dis CD_CON = 0x08; // LinRot - auto start MPS=1 CORDY = 0x0000; // Y = 0 CORDZ = 0x08CD; // Kp = 1.1 CORDX = error; // CORDIC start auto NOP // wait on ready – 25nops if(ERROR) result = result_max; CD_STATC = 0x40; //set keep bit for CORDY CORDZ = 0x0733; // Ki = 0.9 CORDX = error_int;//CORDIC start auto NOP // wait on ready – 25nops error_int += error;// calc error integral if(ERROR) result = result_max; printf ("PI = %04d dec \n",(int)result); SYSCON0 &= 0xFE; return (int)result; } XC886/888CLM May 2006 Page 27