Logaritmos

163 views
Skip to first unread message

Democrito

unread,
Aug 9, 2022, 1:17:09 AM8/9/22
to FPGAwars: explorando el lado libre
Hola,

Acabo de terminar un circuito que hace el logaritmo en base 2 de cualquier número entero de 16 bits. Da como resultado una parte entera a la que se le suele llamar "característica" (de 4 bits) y una parte fraccionaria llamada "mantisa" (de 16 bits, en punto fijo) con una resolución de 4 decimales.

El ICE que adjunto de ejemplo se ve así:

esquema.PNG
Este ejemplo funciona a través del puerto serie. Dejo una imagen de muestra de datos de entrada y los resultados:

test.PNG

El logaritmo en base 2 no es muy común y para hacer las comprobaciones se puede hacer de dos maneras como mínimo:

1) Con la calculadora, por ejemplo, sería así, sin importar la base que use la calculadora:
log(1234)/log(2) donde "1234" es el número que queremos saber su logaritmo en base 2.

2) Más fácil es escribir en el navegador como si fuese una palabra: log2(1234) y te dará el resultado.

Una vez que se obtiene el logaritmo en base 2, convertirlo en logaritmo natural (neperiano), o en base 10, es muy sencillo, porque sólo hay que multiplicar por una constante. Creo que en dos días ya habré sacado módulos que lo pueda hacer.

Adjunto un ejemplo hecho en plan rápido, cuando lo pase a limpio lo subiré a mi GitHub y lo documentaré. Con este ejercicio he aprendido un montón de cosas y descubrí una web muy interesante, en los próximos días os hablaré de ella.

Saludos.
Serial_example_log2.ice

Jo mo

unread,
Aug 9, 2022, 3:52:13 PM8/9/22
to fpga-wars-explora...@googlegroups.com
Hola democrito,

Thanks a lot for these log blocks! 
I will test them when i will be back at home!

Have a good night!

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/a4ba32f4-b79c-4929-94ef-f094122b9fben%40googlegroups.com.

charli va

unread,
Aug 9, 2022, 5:21:29 PM8/9/22
to fpga-wars-explora...@googlegroups.com
Muuuchas gracias Demócrito! ando jugando con temas gráficos así que me van a venir estupendo tus bloques para probar algunas cosas.

Gracias! vaya currada!

ANDRES AMAUTA GONZALESZAPATA

unread,
Aug 9, 2022, 10:17:02 PM8/9/22
to fpga-wars-explora...@googlegroups.com
felicidades Demócrito por tu trabajo, gracias por compartir!
Saludos


Advertencia legal: 
Este mensaje y, en su caso, los archivos anexos son confidenciales, especialmente en lo que respecta a los datos personales, y se dirigen exclusivamente al destinatario referenciado. Si usted no lo es y lo ha recibido por error o tiene conocimiento del mismo por cualquier motivo, le rogamos que nos lo comunique por este medio y proceda a destruirlo o borrarlo, y que en todo caso se abstenga de utilizar, reproducir, alterar, archivar o comunicar a terceros el presente mensaje y ficheros anexos, todo ello bajo pena de incurrir en responsabilidades legales. Las opiniones contenidas en este mensaje y en los archivos adjuntos, pertenecen exclusivamente a su remitente y no representan la opinión de la Universidad de Cuenca salvo que se diga expresamente y el remitente esté autorizado para ello. El emisor no garantiza la integridad, rapidez o seguridad del presente correo, ni se responsabiliza de posibles perjuicios derivados de la captura, incorporaciones de virus o cualesquiera otras manipulaciones efectuadas por terceros.

Democrito

unread,
Aug 14, 2022, 6:00:59 PM8/14/22
to FPGAwars: explorando el lado libre
Buenas de nuevo,  gracias por vuestros comentarios Joaquim, Charli y Zupay!

Como dije en el post anterior, si tenemos resuelto el log2, conseguir los demás tipo de logaritmo (en base 10 y natural) es muy sencillo, sólo hay que multiplicar por una constante.

Para log10 sería así:         log10 = log2 x 0.30102999566
y
para ln sería así:                       ln = log2 x 0.69314718056

Dentro del circuito está todo explicado y comento de dónde viene cada cosa. Para mí la parte más compleja a sido traducir esa multiplicación a formato punto fijo porque hasta el momento no tenía experiencia de este tipo.

La parte entera del logaritmo (natural y en base 10) las he resuelto en todo los casos con un encoder especial para cada tipo de logaritmo, en el que según la entrada, da un entero muy concreto.
La parte fraccionaria es donde tuve que experimentar de muchas formas hasta dar con la solución, pese a que de antemano ya tenía unas pistas. Para el formato punto fijo, esas constantes (las que comenté arriba) se han de multiplicar por 65536 (porque es formato Qn.16) y como es una multiplicación que da un resultado en 32 bits, para la mantisa hay que tomar sólo los 16 bits más altos y el resto descartarlo.

Los circuitos consumen bastantes recursos, con cada multiplicación de 32 bits aumenta notablemente. Intentando optimizar lo máximo posible usé un truco que aprendí de Joaquim. Se trata de tomar la constante que quieres multiplicar y verla en binario, entonces usas las potencias de cada "1" que encontramos. De esta manera se multiplica siempre con bases de 2. Con este procedimiento conseguí ahorrar unos 100 "LC".

En Ln y log10, al resultado de la multiplicación de 32 bits le sumo una constante. Esto me ayudó a ajustar la exactitud en 4 decimales, con un error máximo de -1 para el dígito decimal menos significativo. La mayoría de las veces el resultado, o bien es exacto, o bien redondea al alza el dígito menos significativo. Este pequeño ajuste es debido a que en las conversiones se pierden decimales pero si se le suma una constante resuelve de forma sobresaliente esas pérdidas.

Para terminar comentar que nada de esto hubiera sido posible si no hubiera encontrado una web alucinante (en realidad, sólo para quien sepa apreciar el valor que tiene) donde explica varios algoritmos transcendentes, entre ellos el logaritmo en base 2 y conversiones de éste. Mis más sincero agradecimiento para Tracy Allen. Utiliza un lenguaje de programación (muy muy antiguo) llamado "PBasic" que se usan o usaban en las "Basic Stamp". Yo no tengo idea de ese lenguaje (sí con lo común a cualquier otro lenguaje de programación), pero buscando en los manuales de instrucciones (PDF) pude entender ciertas instrucciones, aparte de que en la propia página también las explica, pero necesitaba ver ejemplos de usos.


Adjunto ejemplos de log10 y Ln. Actualizaciones aquí: https://github.com/Democrito/repositorios/tree/master/Maths/logarithms

Saludos.
Serial_example_Ln.ice
Serial_example_Log10.ice

Democrito

unread,
Aug 14, 2022, 6:02:02 PM8/14/22
to FPGAwars: explorando el lado libre
Por cierto, corregí dos pequeños errores que tenía en el circuito de mi primer post.

Democrito

unread,
Aug 15, 2022, 6:00:18 PM8/15/22
to FPGAwars: explorando el lado libre
Esta mañana aprendí a multiplicar dos números en punto fijo y lo he aplicado a los módulos que resuelven logaritmos (Log10 y Ln). Adjunto estos módulos modificados, por otra parte también se encuentran actualizados en mi GitHub.

En los anteriores módulos (posts de arriba) utilizaba la multiplicación sólo con la parte fraccionaria (mantisa), no sabía cómo multiplicar la parte entera y era por eso que lo resolvía a través de una especie de encoder particular para cada caso. Esto no afecta al módulo que resuelve el logaritmo en base 2 (lleva un encoder por necesidad), sólo afecta a los módulos que resuelven el Ln(x) y Log10(x) porque ambos han de multiplicar por una constante fraccionaria.

La teoría de multiplicar dos números en punto fijo, con lápiz y papel la conocía perfectamente, pero aplicarlo a FPGA es otra historia. Dentro de los circuitos Ln y log10 está todo explicado.

Saludos.
Logarithms.zip

charli va

unread,
Aug 15, 2022, 6:28:16 PM8/15/22
to fpga-wars-explora...@googlegroups.com
Muchas gracias nuevamente Demócrito! hoy no podré, pero mañana lo pruebo sin falta.

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.

Democrito

unread,
Aug 15, 2022, 8:17:56 PM8/15/22
to FPGAwars: explorando el lado libre
Tranquilo Carlos, todo esto es para "el futuro" de quien lo pueda necesitar. Por mi parte estoy muy contento de la cantidad de cosas que he ido aprendiendo.

Aprovecho para comentar que el módulo "log2" es el menos pesado y aún así pesa unos 700 LC. Si alguien necesita sólo la parte entera de un Log2, sólo ha de utilizar un encoder (en la Colección Jedi se encuentra como "codificadores", sección "Combinacional" ).

Si alguien se da cuenta de cómo optimizar alguna parte del circuito, por favor, que lo comente.

Un abrazo!

Jo mo

unread,
Aug 16, 2022, 2:27:28 AM8/16/22
to fpga-wars-explora...@googlegroups.com
Hola guys, 
I'm still on hollidays  i see that as usual Democrito is doing a crasy work! Congratulation man! 
I will test all this when i will be back at the end of this week! 

For the ressources, as you wrote, long time ago, one day, we have to explore de feasabilyty of a "utility processor" or "specialysed math coprocessor" with the objective of making it very small (around 300 Luts), and with a simple to use set of instructions!

Big hug to you all !

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.

Devta Singh Khalsa

unread,
Aug 16, 2022, 4:57:25 AM8/16/22
to fpga-wars-explora...@googlegroups.com
Demócrito, es impresionante la labor, la cantidad de trabajo, la generosidad al compartirla y el tiempo de documentación que desarrollas. Solo quiero agradecerte tu existencia y tu trabajo y actitud, porque esa es la armagasa que crea la cultura, el compartir sin mirar a quien, ni quien puede usarlo, el hacer algo para que pueda ser útil a unos o a otros en otros tiempos.

Este grupo es increíble y aunque estoy apenas empezando en electrónica, y eso es mucho para mi, sois todos muy generosos con vuestras aportaciones y la tarea de coumentación, comentar, animar, etc.
Os agradezco que con la que está cayendo sigais pedaleando a ese ritmo.

Este grupo muy útil por eso, muchas gracias a todos.
----
Y aquí en no cristiano: (by Google)

Democrito, the work, the amount of work, the generosity in sharing it and the documentation time that you develop is impressive. I just want to thank you for your existence and your work and attitude, because that is the weapon that culture creates, sharing without looking at who, or who can use it, doing something so that it can be useful to some or others at other times.

This group is incredible and although I'm just starting out in electronics, and that's a lot for me, you are all very generous with your contributions and the task of commenting, commenting, animating, etc.

I appreciate that with the one that is falling you keep pedaling at that rate.

This group very helpful for that, thank you all very much.

Devta Singh Khalsa
http://devta.wordpress.com/ 
http://circulodesanacion.com
http://medicosdelcielo.org

Cantarranas,2
19413 Villaviciosa de Tajuña
Guadalajara / Spain


Democrito

unread,
Aug 16, 2022, 4:53:07 PM8/16/22
to FPGAwars: explorando el lado libre
Gracias Devta & Joaquim, A big hug to both!
Reply all
Reply to author
Forward
0 new messages