рдбрд┐рдЬрд┐рдЯрд▓ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд▓реЙрдЧрд░рд┐рдердо рдПрдХ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рд╣реИред рдЕрдзрд┐рдХ рдмрд╛рд░, рд╢рд╛рдпрдж, рдХреЗрд╡рд▓ рджреГрдврд╝ рд╕рдВрдХрд▓реНрдк (рд╕рдВрдЪрдп рдХреЗ рд╕рд╛рде рдЧреБрдгрд╛) рдФрд░ рдЪрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдореНрдкрд▓реАрдЯреНрдпреВрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ FPGA рдкрд░ рд▓рдШреБрдЧрдгрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
CORDIC рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рд╛рдЗрдкрд░рдмреЛрд▓рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдФрд░ рд╕рд░рд▓ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдбрд╝реА рд╣реИ, рдХреНрд░рд┐рд╕реНрдЯрд▓ рдЫреЛрдЯрд╛ рд╣реИ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рдиреГрддреНрдп рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдерд╛ рдХрд┐ рдореБрдЭреЗ рдПрдХ рджрд┐рди рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рд░реИрдо рдмреНрд▓реЙрдХ (рд╕рд╛рдЗрдХреНрд▓реЛрди IV) рдХреЗ рджреЛрдиреЛрдВ рдкреЛрд░реНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╕рдХрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдереЗ, рдЬрд┐рд╕рд╕реЗ рдХреЛрдИ рдореБрдлреНрдд рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдВ рдирд╣реАрдВ рд░рд╣ рдЧрдИ рдереАрдВред рдореИрдВ рд╣рд╛рдЗрдкрд░рдмреЛрд▓рд┐рдХ рдХреЙрд░реНрдбрд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдПрдХ рдЧреБрдгрдХ рдерд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рдордп рдЖрд░реЗрдЦ рдореЗрдВ рдПрдХ рд╕рднреНрдп рдореБрдХреНрдд рдЦрд┐рдбрд╝рдХреА рдкреНрд░рд╛рдкреНрдд рдХреА рдЧрдИ рдереАред рдПрдХ рджрд┐рди рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рд░рдЪрдирд╛ рдХреА, рдЬрд┐рд╕рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреБрдгрд╛, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд╕реНрдХреНрд╡реИрд░рд┐рдВрдЧ рд╣реИред рдФрд░ рдЪреВрдВрдХрд┐ рд╕рд░реНрдХрд┐рдЯ рд╕реНрдХреНрд╡реЗрд░рд┐рдВрдЧ рдЧреБрдгрди рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░рд▓ рд╣реИ, рд╢рд╛рдпрдж рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╡рд┐рд╢реЗрд╖ рдЪрд┐рдкреНрд╕ рдХреЗ рд▓рд┐рдП рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдлрдкреАрдЬреАрдП рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реАред
рдпрд╣ рдмрддрд╛рддреЗ рд╣реБрдП рдХрд┐ рдХреНрдпрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╕рд╛рди рд╣реИред рдЪрд▓реЛ рдЙрдирдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдмрд╛рдж рдореЗрдВ рдкреВрд░реНрдгрд╛рдВрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
рдПрдХ рд╕рдВрдЦреНрдпрд╛
X рд╣реЛрдиреЗ рджреЗрдВред рд╕рдВрдЦреНрдпрд╛
Y рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдРрд╕рд╛
X=2Y ред
рд╣рдо рдпрд╣ рднреА рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐
рдПрдХреНрд╕ 1 рд╕реЗ 2 рддрдХ рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╣реИред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпрддрд╛ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐
рдПрдХреНрд╕ рдХреЛ рд╣рдореЗрд╢рд╛ рджреЛ рдХреА рд╢рдХреНрддрд┐ рд╕реЗ рдЧреБрдгрд╛ рдпрд╛ рд╡рд┐рднрд╛рдЬрди рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдпрд╛ рдШрдЯрд╛рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдЖрд╕рд╛рди рд╣реИред рддреЛ
X 1 рд╕реЗ 2 рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдлрд┐рд░
Y , 0 рд╕реЗ 1. рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдЭреВрда рд╣реЛрдЧрд╛ред рд╣рдо
Y рдХреЛ рдПрдХ рдЕрдирдВрдд рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЕрдВрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
Y=b020+b12тИТ1+...+bn2тИТn+...
рдЧреБрдгрд╛рдВрдХ
bi рдЗрд╕ рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ
Y рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рдЗрдирд░реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рдмрд┐рдЯреНрд╕ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ
ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐
Y 1 рд╕реЗ рдХрдо рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐
b0 = 0ред
рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рд╕рдореАрдХрд░рдг рдХреЛ рд╡рд░реНрдЧ:
X2=22Y рдФрд░ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд╣рдо
2Y рдХрд╛ рдмрд╛рдЗрдирд░реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд╣реИ
2Y=b120+b22тИТ1+...+bn2тИТ(nтИТ1)+...
рдпрд╛рдиреА рдмрд┐рдЯреНрд╕
bi рд╡рд╣реА рд░рд╣рд╛, рдмрд╕ рджреЛ рдХреА рд╢рдХреНрддрд┐рдпрд╛рдВ рдЪрд▓реА рдЧрдИрдВред рдмрд▓реНрд▓рд╛
b0 рджреГрд╢реНрдп рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред
рджреЛ рдорд╛рдорд▓реЗ рд╕рдВрднрд╡ рд╣реИрдВ:
1)
X2>2 , 2Y> 1,
b1=12)
X2<2 , 2Y <1,
b1=0рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо
рдПрдХреНрд╕ рдХреЗ рдирдП рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ
X2/2 рджреВрд╕рд░реЗ рдореЗрдВ -
X2 ред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХрд╛рд░реНрдп рдкреВрд░реНрд╡ рдореЗрдВ рдХрдо рд╣реЛ рдЧрдпрд╛ рдерд╛ред рдирдпрд╛
X рдлрд┐рд░ рд╕реЗ 1 рд╕реЗ 2 рдХреА рд╕реАрдорд╛ рдореЗрдВ рд╣реИ, рдирдпрд╛
Y 0 рд╕реЗ 1 рддрдХ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдПрдХ рд╕рд╛ рд╕реАрдЦрд╛ред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдорд╛рди рдХрджрдо рдЙрдард╛рддреЗ рд╣реБрдП, рд╣рдо
рд╡рд╛рдИ рдХреЗ рдХрдИ рдмрд┐рдЯреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ C рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
#include <stdio.h> #include <math.h> int main() { double w=1.4; double s=0.0; double a=0.5; double u=w; for(int i=0; i<16; i++) { u=u*u; if(u>2) { u=u/2; s+=a; } a*=0.5; } w=log2(w); double err=100*abs(2*(sw)/(s+w)); printf("res=%f, log=%f, err=%f%c\n",s,w,err,'%'); return 0; }
рд╣рдордиреЗ 16 рдмрд┐рдЯреНрд╕ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рд▓рдШреБрдЧрдгрдХ рдХреА рдЧрдгрдирд╛ рдХреА рдФрд░ рдЧрдгрд┐рддреАрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рджреНрд╡рд╛рд░рд╛ рджреА рдЧрдИ рддреБрд▓рдирд╛ рдореЗрдВред рд▓рд╛рдпрд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо:
рд░реЗрд╕ = 0.485413, рд▓реЙрдЧ = 0.485427, рдЧрд▓рдд = 0.002931%
рдкрд░рд┐рдгрд╛рдо рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде 0.003% рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рджрдХреНрд╖рддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
рдЖрдЗрдП рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред
рдмрддрд╛ рджреЗрдВ рдХрд┐ рдПрди-рдмрд┐рдЯ рдмрд╛рдЗрдирд░реА рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╕рдВрдЦреНрдпрд╛рдПрдВ рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИрдВ [0, 1]ред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрдХрд╛рдИ рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ
2рдПрди рд▓реЗрдХрд┐рди рдирд╣реАрдВ
2рдПрдитИТ1 , рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдПрдХ рдбреНрдпреВрд╕ рд╕рдВрдЦреНрдпрд╛
2N+1 ред рд╣рдо рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рдЫрд╡рд┐ рдФрд░ рд╕рдорд╛рдирддрд╛ рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
#include <stdio.h> #include <math.h> #define DIG 18 // #define N_BITS 16 // unsigned ONE=1<<(DIG-1); // unsigned TWO=ONE<<1; // unsigned SCALE=1<<(N_BITS+1); // unsigned myLog(unsigned w) { unsigned s=0; unsigned long long u=w; for(int i=0; i<N_BITS+1; i++) { s<<=1; u=(u*u)>>(DIG-1); // ! if(u&TWO) // { u>>=1; s+=1; } printf("%X\n", (int)u); } return s; } int main() { double w=1.2345678; unsigned iw=(unsigned)(ONE*w); double dlog=log2(w); unsigned ilog=myLog(iw); unsigned test=(unsigned)(SCALE*dlog); int err=abs((int)(ilog-test)); printf("val=0x%X, res=0x%X, log=0x%X, err=%d\n",iw,ilog,test,err); return 0; }
рд╡рд┐рднрд┐рдиреНрди рдмрд┐рдЯ рдбреЗрдкреНрде (DIG), рдЧрдгрдирд╛ рд╕рдЯреАрдХрддрд╛ (N_BITS), рдФрд░ рд▓рдШреБрдЧрдгрдХ рддрд░реНрдХ (w) рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЦреЗрд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЧрдгрдирд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕ рд╕реНрд░реЛрдд рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЙрддреНрдкрд╛рджрди рд╣реЛрддрд╛ рд╣реИ:
рд╡реИрд▓ = 0x27819, рд░реЗрд╕ = 0x9BA5, рд▓реЙрдЧ = 0x9BA6, рдЗрд░реЗрдЯ = 1
рдЕрдм рд╕рдм рдХреБрдЫ рдмрд░рд╛рдорджреЗ рдкрд░ рд▓реЛрд╣реЗ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рд╕реА рдореЗрдВ
myLog рдлрд╝рдВрдХреНрд╢рди рдХреЗ
рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЪрд░ рдФрд░
u рдХреЛ рд▓реВрдк рдореЗрдВ рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рддреБрд▓рдирд╛
рд╡реЗрд░рд┐рд▓реЙрдЧ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЛрд╣реЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЗрди рдЪрд░реЛрдВ рдХрд╛ рдкрддреНрд░рд╛рдЪрд╛рд░ рдмрд╣реБрдд рдкрд╛рд░рджрд░реНрд╢реА рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИред
рдпреВ рдПрдХ рдХрд╛рдордХрд╛рдЬреА рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИ рдЬреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рджреМрд░рд╛рди
рдПрдХреНрд╕ рдХреЗ рдирдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИред
s рдПрдХ рд╢рд┐рдлреНрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдЬрдорд╛ рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
module logarithm( input clk, // input wr, // input[17:0] din, // output[nbits-1:0] dout, // output rdy // ); parameter nbits=16; //
рдЗрдирдкреБрдЯ рдмрд╕ рдХреНрд░рдорд╢рдГ рдЪрдХреНрд░рд╡рд╛рдд IV рдореЗрдВ рдЧреБрдгрдХ рдХреА рдЪреМрдбрд╝рд╛рдИ 18-рдмрд┐рдЯ рдХреЛ рдЕрдкрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдкрд░ рд╕рдВрдЦреНрдпрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╛рдиреА рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рдЙрдЪреНрдЪ рдмрд┐рдЯ рдХреЗ рд╕рд╛рдеред рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рднреА рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЧрдгрдирд╛рдУрдВ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЛ рдиреЛрдбреНрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 16 рдХреЗ рдмрд░рд╛рдмрд░ред рдореЙрдбреНрдпреВрд▓ рдкреНрд░рддрд┐ рдЪрдХреНрд░ рдПрдХ рдмрд┐рдЯ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ 16 рдЪрдХреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ 16 рдмрд┐рдЯреНрд╕ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рд▓рдШреБрдЧрдгрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рд╣реА рд╕рдЯреАрдХрддрд╛ рдпрд╛ рдПрдХ рд╣реА рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рддреЗрдЬреА рд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрдИ рдЙрдкрдХрд░рдгреЛрдВ рдФрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдХрдард┐рдирд╛рдИ рдирд╣реАрдВ рд╣реЛрдЧреАред
рдпрд╣рд╛рдБ рдкреВрд░рд╛ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рд╣реИ //--------------------- logarithm.v ------------------------------// module logarithm( input clk, // input wr, // input[17:0] din, // output[nbits-1:0] dout, // output rdy // ); parameter nbits=16; // reg[4:0] cnt; // reg[17:0] acc; // - reg[nbits-1:0] res; // always @(posedge clk) if(wr) cnt<=nbits+1; else if(cnt != 0) cnt<=cnt-1; wire[35:0] square=acc*acc; // wire bit=square[35]; // wire[17:0] next = bit ? square[35:18] : square[34:17]; // always @(posedge clk) if(wr) acc<=din; else if(cnt != 0) begin acc<=next; #10 $display("%X", acc); end always @(posedge clk) if(wr) res<=0; else if(cnt != 0) begin res[nbits-1:1]<=res[nbits-2:0]; res[0]<=bit; end assign dout=res; assign rdy=(cnt==0); endmodule //======================== testbench.v =====================// module testbench(); reg clk; // always #100 clk=~clk; reg wr; // reg[17:0] din; // wire rdy; // wire[15:0] dout; // logarithm log2( .clk (clk), .wr (wr), .din (din), .dout (dout), .rdy (rdy) ); // n task skipClk(integer n); integer i; begin for(i=0; i<n; i=i+1) @(posedge clk); #10 ; end endtask initial begin // $dumpfile("testbench.vcd"); $dumpvars(0, testbench); clk=0; wr=0; din=18'h27819; skipClk(3); wr=1; skipClk(1); wr=0; @(rdy); skipClk(3); $display("value=%X, result=%X", din, dout); $display("Done !"); $finish; end endmodule
рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдБ:
рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдкрд░, рд╣рдо рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдХрд╛ рдЕрдВрддрд┐рдо рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЦрддреЗ рд╣реИрдВ - рдореВрд▓реНрдп = 27819, рдкрд░рд┐рдгрд╛рдо = 9ba5ред рд╡реЗрд░рд┐рд▓реЛрдЧ рдиреЗ рд╕реАред рдЬреИрд╕реА рд╣реА рдЪреАрдЬрд╝ рджреАред рдпрд╣рд╛рдБ рдХрд╛ рдЯрд╛рдЗрдорд┐рдВрдЧ рдЖрд░реЗрдЦ рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реБрдЪрд┐ рдХрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдирд╣реАрдВ рд▓рд╛рддрд╛ рд╣реВрдВред
рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ (рдПрд╕реАрд╕реА) рдФрд░ рд╕реА (рдПрд╕) рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдордзреНрдпрд╡рд░реНрддреА рдЖрдЙрдЯрдкреБрдЯ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:Verilog C
30c5d 30C5D
252b1 252B1
2b2bc 2B2BC
3a3dc 3A3DC
35002 35002
2be43 2BE43
3c339 3C339
38a0d 38A0D
321b0 321B0
273a3 273A3
30163 30163
24214 24214
28caf 28CAF
34005 34005
2a408 2A408
37c9d 37C9D
30a15 30A15
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡реЗ рдмрд┐рдЯ рд╕реЗ рдереЛрдбрд╝рд╛ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдПрдХ рд╡реЗрд░рд┐рд▓реЛ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реА рдореЙрдбрд▓ рдХреЛ рдереЛрдбрд╝рд╛ рдКрдкрд░ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдЬреЛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╢рд╛рдпрдж рдпрд╣реА рд╕рдм рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдЙрдкрдпреЛрдЧреА рд▓рдЧреЗрдЧрд╛ред