division des logiciels DSP

K

kirgizz

Guest
Salut,

quelqu'un pourrait me donner un pourboire ou d'une paire de formules d'approximation pour la mise en œuvre de division dans le logiciel?(-> Utilisation de l'assembleur)

A propos de la demande:
J'ai besoin d'acquérir la fréquence d'un signal TTL.I Utilisez une minuterie et période de mesure du signal d'entrée.Alors la valeur mesurée est divisée par la valeur de référence (horloge DSP).Mon dessein n'est point l'aide de données 32 bits fixe.Valeur mesurée et le diviseur sont des entiers non signés.
Je pense, mon DSP a une ROM basé sur la table des valeurs de réciprocité, mais ce n'est pas assez précise.Je suppose, il peut être mis en œuvre en déplaçant, l'addition et de multiplication.
Est-ce que c'est???

Merci d'avance

 
Salut!

Il ya beaucoup d'algorithmes logiciels de division sur l'internet.
Par exemple, essayez de références suivantes:
http://www.bearcave.com/software/divide.htm
http://www.sccs.swarthmore.edu/users/03/jcorder/CS23/lab3/extensions.html

Les exemples sont en C, mais ils vous permettent de comprendre comment l'implémenter dans le montage, car les algorithmes sont très facile.

Cordialement!

 
Je vous remercie Akorostel,

Il a été utile.Je sais que le bon sens maintenant.

 
Voir ce code C.

Word32 L_div_s (Word32 var1, Word32 var2)
(
Word32 var_out = 0;
Word32 itération;
Word32 L_num;
Word32 L_denom;

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

if (var2 == 0)
(
printf ( "Division par 0, Fatal error \ n");
exit (0);
)

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

for (iteration = 0; iteration <31; itération )
(
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