gennemførelse af software division i DSP

K

kirgizz

Guest
Hej,

kan nogen give mig et tip eller et par tilnærmelse formler for gennemførelse division i software?(-> Hjælp assembler)

Om ansøgningen:
Jeg har brug for at erhverve hyppigheden af en input TTL-signal.Jeg bruger et stopur og måler periode af indgangssignalet.Så er den målte værdi divideres med referenceværdien (DSP ur).Mit design er at bruge 32-bit fast punkt data.Målt værdi og divider er unsigned heltal.
Jeg tror, min DSP har en ROM-baseret oversigt over gensidige værdier, men det er ikke præcise nok.Jeg formoder, det kan gennemføres ved at flytte, addition og multiplikation.
Er det???

Tak på forhånd

 
Hej!

Der er en masse software division algoritmer over internettet.
For eksempel, kan du prøve følgende referencer:
http://www.bearcave.com/software/divide.htm
http://www.sccs.swarthmore.edu/users/03/jcorder/CS23/lab3/extensions.html

Eksemplerne er i C, men de vil lade dig forstå, hvordan man gennemfører det i forsamlingen, fordi de algoritmer er ganske let.

Venlig hilsen!

 
Tak Akorostel,

det var nyttigt.Jeg kender den rigtige retning nu.

 
Se denne C kode.

Word32 L_div_s (Word32 var1, Word32 var2)
(
Word32 var_out = 0;
Word32 iteration;
Word32 L_num;
Word32 L_denom;

if ((var1> var2) | | (var1 <0) | | (var2 <0))
(
printf ( "Division Fejl var1 =% d var2 =% d \ n", var1, var2);
exit (0);
)

if (var2 == 0)
(
printf ( "Division med 0, Fatal fejl \ n");
exit (0);
)

if (var1 == 0)
(
var_out = 0;
)
anden
(
if (var1 == var2)
(
var_out = MAX_32;
)
anden
(
L_num = var1;
L_denom = var2;

for (iteration = 0; iteration <31; iteration )
(
var_out <<= 1;
L_num <<= 1;

if (L_num> = L_denom)
(
L_num = L_sub (L_num, L_denom);
var_out = L_add (var_out, 1);
)
)
)
)

return (var_out);
)

Word32 L_sub (Word32 L_var1, Word32 L_var2)
(
Word32 L_var_out;

L_var_out = L_var1 - L_var2;

if (((L_var1 ^ L_var2) & MIN_32)! = 0)
(
if ((L_var_out ^ L_var1) & MIN_32)
(
L_var_out = (L_var1 <0L)?MIN_32: MAX_32;
Overflow = 1;
)
)
return (L_var_out);
)

Word32 L_add (Word32 L_var1, Word32 L_var2)
(
Word32 L_var_out;

L_var_out = L_var1 L_var2;

if (((L_var1 ^ L_var2) & MIN_32) == 0)
(
if ((L_var_out ^ L_var1) & MIN_32)
(
L_var_out = (L_var1 <0)?MIN_32: MAX_32;
Overflow = 1;
)
)
return (L_var_out);
)

 

Welcome to EDABoard.com

Sponsor

Back
Top