Maths. Matemáticas con Icestudio

354 views
Skip to first unread message

Jose Pico

unread,
May 20, 2017, 3:32:28 PM5/20/17
to FPGAwars: explorando el lado libre
Hola:

He estado probando y me he quedado gratamente sorprendido al ver que se puede sintetizar operaciones de multiplicación únicamente usando el operador de multiplicación *.
Esto nos abre un abanico increíble de oportunidades que estoy seguro de que poco a poco irán apareciendo por estos foros.

El multiplicador nos permite generar muchas funciones matemáticas, sucesiones... donde por poner un ejemplo que se me ocurre de forma fácil seria intentar crear un generador
de funciones como  por ejemplo una señal triangular donde extrayendo el resultado de la función a un conversor A/D nos permitiría crear una función real.
Supongo que también filtros digitales...

Os adjunto un pequeño ejemplo de un módulo factorial ( máximo 8! ya que uso 16 bits y 9! me desbordaría .... ) 


Por cierto, si alguien me puede ayudar a realizar el test bech sería de agradecer ( el tema test bench lo tengo aún verde verde )
Yo lo he simulado con salidas digitales por los puertos, pero 16 bits no es fácil para probarlo rápido.
Adjunto ficheros.

Me planteo así mismo una pregunta, ¿como cualquier mierdecilla de calculadora es capaz de realizar operaciones elevadas del número factorial?
en un ICE40 se podría implementar una calculadora decente?
hasta cuantos bits podría ampliar el módulo del factorial realizado?

Saludos y Gracias










factorial.ice
factorial_Module.ice
Ex_Facorial_01.ice

Jose Pico

unread,
May 20, 2017, 4:14:55 PM5/20/17
to FPGAwars: explorando el lado libre
Hola:

Añado un pequeño ejemplo de una sucesión matemática ( 2n+3(n+1) ) realizada con  Icestudio.



Saludos y a disfrutar
Succession 2n+3(n+1).ice

Juan José Luna Espinosa

unread,
May 20, 2017, 4:53:56 PM5/20/17
to fpga-wars-explora...@googlegroups.com
> ¿como cualquier mierdecilla de calculadora es capaz de realizar operaciones elevadas del número factorial?

Porque lo hace secuencialmente en muchos ciclos de reloj, aunque tu lo veas aparecer instantaneamente.

--
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-lado-libre+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/e1c6acfa-c05d-4991-a099-0b2369b482e1%40googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

1138-4EB

unread,
May 20, 2017, 7:29:15 PM5/20/17
to FPGAwars: explorando el lado libre
Hola José,

Habiendo "visto" las posibilidades que se te abren, lo que puedes buscar es:
  • Digital Signal Processing (DSP), o cómo computar infinidad de algoritmos con una serie de Multiply Accumulation -MACC- (multiplicador + sumador). En este ámbito entran los generadores de funciones que comentas, pero también DFT, fitros IIR, FIR... Si echas un ojo a los últimos mensajes del hilo sobre PID, apreciarás que se puede expresar como un filtro, al igual que otros controladores clásicos.
  • COordinate Rotation DIgital Computer (CORDIC) es un circuito interesantísimo basado en técnicas matemáticas del siglo XVII, que se publicó en su versión "moderna" en 1959 y se generalizó en los 70. Sirve para computar operaciones trigonométricas e hiperbólicas. Lo brillante es que se hace sólo con sumas/restas, shifts y lookups. No hay ninguna multiplicación, ni division, ni raíz cuadrada.
La calculadoras científicas basadas en HP-35, muy extendida en los años 70 y 80 (y que se relanzó en 2007), funcionan sólo con CORDIC y DSP. Por ello, en principio en la ICE40 se puede implementar una calculadora científica completa, no sólo "una mierdecilla".

CORDIC requiere aproximadamente una docena de iteraciones para resolver cada operación. Como comenta Juan José, lo habitual en las calculadoras basadas en CPU es que se realicen de forma secuencial, por lo que se obtiene un resultado cada 10-15 ciclos de reloj. La ventaja en el caso de las FPGAs es que se pueden implementar una docena de etapas como "pipeline" (se denomina "unrolled" CORDIC). En ese caso, el primer resultado tarda 10-15 ciclos en estar disponible, pero a partir de ahí se obtiene un nuevo resultado cada ciclo de reloj.

Subiendo ligeramente el nivel de abstracción, con CORDIC se pueden computar rotaciones de Givens (https://en.wikipedia.org/wiki/Givens_rotation), que es una operación básica para rotaciones espaciales en álgebra lineal (Jacobi, Householder, Davenport, Golub...).

Con respecto al testbench, es este caso, no tiene mayor misterio que introducir una serie de entradas y observar las salidas. Para ello, haces un módulo "top" en el que añades todo tu diseño y otro módulo llamado "test". El módulo test tendrá las mismas entradas/salidas que el módulo a probar, pero en sentido contrario. El módulo "top" no tiene ninguna entrada ni salida, ya que es sólo la "protoboard" donde hacemos las conexiones. A partir de aquí, depende de cuánto quieras complicarte:
  • "test" puede ser un contador en el caso del módulo factorial. En el de la sucesión matemática pueden ser dos contadores. En cualquier caso, tú debes indicar el rango de cada uno. Alternativamente, puedes usar alguna librería para generación aleatoria de entradas, dentro de los rango que tú indiques.
  • Puedes "comprobar" el resultado simulando y observando en gtkwave el resultado. Para no tener que hacer los cálculos a mano, puedes hacer que "test" lo calcule (utilizando un estilo parecido a C, ignorando las limitaciones de sintesis). Así, en el mismo módulo "test" puedes comparar el valor obtenido con el esperado, y generar un error si no coinciden. Puedes echar un vistazo a uno de los hilos sobre conversores binario-7segmentos, donde se comparan varias descripciones del mismo circuito.
  • Si no te encuentras cómodo escribiendo algorítmicamente en verilog, puedes generar una tabla en cualquier otro lenguaje (Python, Matlab, R, JavaScript, Golang...) y guardarla en un fichero de texto. La tabla contendrá en cada fila un conjunto de entradas y las salidas esperadas. Así, "test" sólo tendrá que leer el fichero de texto. Hay algún ejemplo de esto también en el hilo de conversores 7seg.
Saludos


El sábado, 20 de mayo de 2017, 21:32:28 (UTC+2), Jose Pico escribió:

Democrito

unread,
May 20, 2017, 8:57:35 PM5/20/17
to FPGAwars: explorando el lado libre
No tengo idea y lo que voy a comentar -es lo que me ha parecido entender- cada vez que lo he mirado (y sigo con la duda).

Me parece que las calculadoras de bolsillo utilizan algo parecido a los logaritmos (no algoritmos, que sí, eso también lo usan). Se trata de un grupos de n bits, de los cuales los separas en "mantisa" (parte decimal) y exponente. De esa manera se puede trabajar con número muy grandes y muy pequeños, con la limitación de los n bits que se estén utilizando.

Si estoy metiendo la pata, por favor, corregirme!

Unai Martinez

unread,
May 20, 2017, 10:57:46 PM5/20/17
to FPGA-WARS: explorando el lado libre
Hola Democrito,

Más o menos es correcto, pero estás mezclando dos conceptos:
  • Representación en coma fija VS coma flotante. La coma fija es lo más natural, donde 8 bits permiten representar los siguientes rangos [0,255] (1), [-128,127] (1), [-255,0] (1), [0,127.5] (0.5), [0,63.75] (0.25)... Lo que he expresado entre paréntesis es la precisión asociada al bit menos significativo. En coma flotante, como tú indicas, se utiliza mantisa y exponente, como en la notación científica. Supongamos que de los 8 bits se utilizan 2 para el exponente y 6 para la mantisa. El resultado es que se pueden representar rangos mayores, porque el exponente permite "elevar" el resultado. Sin embargo, al disponer de "sólo" 6 bits para la mantisa, la precisión es "peor" que en coma fija. Como conclusión, la elección de un formato de representación depende de la aplicación en concreto, de la precisión necesaria y de los rangos esperados.
  • En una representación logarítmica (https://en.wikipedia.org/wiki/Logarithmic_number_system), las multiplicaciones son sumas y las divisiones son restas. Por ello, en aplicaciones con muchas sumas, divisiones, raíces cuadradas, etc. puede ser más "rápido" convertir las entradas a base logarítmica, hacer las operaciones, y convertir el resultado de nuevo a una representación lineal.

Naturalmente en FPGAs se pueden "mezclar" múltiples representaciones, utilizando en cada parte del circuito la más adecuada para las señales a gestionar.

Saludos


--
Has recibido este mensaje porque estás suscrito a un tema del grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/fpga-wars-explorando-el-lado-libre/y72M6QNkrcc/unsubscribe.
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a fpga-wars-explorando-el-lado-libre+unsubscribe@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.

Democrito

unread,
May 21, 2017, 5:03:45 AM5/21/17
to FPGAwars: explorando el lado libre
Ahora queda todo más claro!

Gracias por la explicación, Unai.

Jose Pico

unread,
May 21, 2017, 7:43:40 AM5/21/17
to FPGAwars: explorando el lado libre
Hola Unai:

De nuevo una lección maestra.

Saludos y Mil Gracias por tus realimentaciones.

Jose Pico

unread,
May 22, 2017, 3:50:49 PM5/22/17
to FPGAwars: explorando el lado libre
Hola a todos:

Ya he podido crear mi testbesh comprobando con este por ejemplo que el factorial de 5 es 120.

El tema es que me he liado un poco a la hora de entender la exportación que realiza Icestudio.

Al exportar desde Icestudio  y crear el fichero verilog, este crea una serie de modulos y submódulos anidados hasta llegar a mi módulo a testear que me han liado 
(aún no lo tengo muy claro del todo como lo exporta ) a la hora de crear mi testbench.

Igualmente la exportación del testBench me crea un medio fichero de testbench que también me ha costado un poco entender pero que finalmente he podido hacerme con él.

La idea era usar los ficheros que se exportan para poder simular usando estos y tener que crear yo lo mínimo ( el problema es entender un poco la exportación como genera las cosas ).

Este es un esquemático de mi testbench:


Este es el resultado en gtkwave:


Añado imágenes y ficheros *.v  test_bench. v , etc  con notaciones y aclaraciones por si alguien lo quiere tomar como ejemplo para cuando use la exportación desde Icestudio.

Saludos y Gracias
.sconsign.dblite
Ex_Facorial_02.pcf
Ex_Facorial_02.v
Ex_Facorial_02_tb.gtkw
Ex_Facorial_02_tb.out
Ex_Facorial_02_tb.v
Ex_Facorial_02_tb.vcd

Juanma Rico

unread,
May 23, 2017, 1:58:20 AM5/23/17
to FPGAwars: explorando el lado libre
¡¡Genial José!!... ya estoy viendo una calculadora HP48GX en mi iceZUM Alhambra... jejejejeje

¡¡Gracias por compartir!!

Jesús Arroyo

unread,
May 23, 2017, 4:11:26 AM5/23/17
to FPGAwars: explorando el lado libre
Muy buena Jose:

Lo he probado y funciona perfecto.

Actualmente el proceso de simulación en Icestudio es manual como has averiguado.

Por resumir básicamente hay que exportar el verilog, testbench y gtkw.

El único fichero que hay que editar es el testbench, añadiendo el comportamiento de tus variables de entrada en la sección TODO, y si quieres también el tiempo y la escala, al principio del testbench. Lo que hace este testbench es instanciar el topmodule main en verilog y simular las condiciones de entrada. Si tu diseño tiene una señal llamada clk, como es tu caso, se genera una señal de reloj para la simulación automáticamente.

Ahora el proceso sería, cada vez que modifiques el diseño debes exportar de nuevo el verilog, pero sin modificarlo, y luego ejecutar apio sim.

PD: los ficheros que adjuntas .sconsign.dblite, *.out y *.vcd son ficheros de salida del proceso de simulación y por lo tanto no son necesarios para ejecutar la misma.

Buen trabajo, es muy interesante esa línea!

Un saludo.

Jose Pico

unread,
Jul 18, 2017, 2:53:24 AM7/18/17
to FPGAwars: explorando el lado libre
Hola:

Adjunto un módulo de cálculo del factorial.

Saludos
Factorial v2.ice
Ex_Factorial v2.ice

Jesús Arroyo

unread,
Jul 18, 2017, 4:38:35 AM7/18/17
to FPGAwars: explorando el lado libre
Buenas Jose,

He añadido un módulo RX para probar n = 6,7,... Con 6 genera b4, exp 2 = 720, pero con 7 genera 9d, exp 3. Al dividir por 2 se pierde la parte decimal del resultado y parece que falta una potencia de dos.



Quizá sería más cómodo codificar el valor del resultado en un bus de 16 bit y luego enviar en paquetes de 8 bit.


Un saludo!
Auto Generated Inline Image 1

Jose Pico

unread,
Jul 18, 2017, 8:52:29 AM7/18/17
to fpga-wars-explora...@googlegroups.com
  Gracias  Jesús por tus pruebas!
  Lo revisaré!
  Tengo otro con 16 bits pero solo vale hasta 8!
  Aunque normalmente  con 8!  o menos ya se pueden hacer muchas operaciones matemáticas como aprox de funciones...
  
   Saludos y  Gracias
 
  Mola como poco a poco se van consiguiendo modulos y se van reutilizando.😂 


--


Has recibido este mensaje porque estás suscrito a un tema del grupo "FPGAwars: explorando el lado libre" de Grupos de Google.


Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/fpga-wars-explorando-el-lado-libre/y72M6QNkrcc/unsubscribe.


Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a fpga-wars-explorando-el...@googlegroups.com.


Para publicar en este grupo, envía un correo electrónico a fpga-wars-explora...@googlegroups.com.

Jose Pico

unread,
Aug 20, 2017, 6:52:05 AM8/20/17
to FPGAwars: explorando el lado libre
 Hola:

Adjunto un pequeño módulo de Ca2 de un número de 8 bits y unos pequeños ejemplos de uso.
Adjunto también otros pequeños ejemplos para ver como  un número entero o una constante trata un número en Ca2 o no.


Saludos
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a fpga-wars-explorando-el-lado-libre+unsubscribe@googlegroups.com.


Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Ca2_8bits.ice
Ex_Ca2 Bloque Cte.ice
Ex_Ca2 Integer.ice
Ex_Ca2.ice

Jose Pico

unread,
Aug 20, 2017, 7:37:53 AM8/20/17
to FPGAwars: explorando el lado libre
Hola:

Adjunto un pequeño módulo  restador y u ejemplo de su uso.
Se puede ver el uso de números con signo gracias a que trabajan en complemento a 2.

Saludos
Resta.ice
Resta_signed.ice

Jose Pico

unread,
Aug 20, 2017, 7:40:52 AM8/20/17
to FPGAwars: explorando el lado libre
Hola de nuevo, jejejejej:

Adjunto módulo multiplicador 8x8 bits (Salida 16 bits ) y ejemplo de su uso.

Saludos 
Muliplier8x8.ice
Ex01 Mult8x8.ice

Jose Pico

unread,
Aug 20, 2017, 8:01:46 AM8/20/17
to FPGAwars: explorando el lado libre
Hola:

adjunto un módulo que podría valer para modelar   un módulo de la transformada z  equivalente a   z^-1  ( Retardo )
no he realizado ningún ejemplo con él pero  con un restador,sumador,multiplicador, z^-1 podemos empezar a crear módulos P, I ,D o PID completo.
En tener algo más lo muestro ( Ahí dejo  la idea por si alguien tiene tiempo y le pica el gusanillo ).
Unai dejó su proyecto final en otro hilo donde podemos ver el PID que desarrolló y se puede apreciar que solo se necesitan sumadores,registros,restadores... La pena es que esté en Euskera y 
pierdo muchos detalles ( de Euskera ni papa jejejej ).

Saludos

Jose Pico

unread,
Aug 20, 2017, 8:06:45 AM8/20/17
to FPGAwars: explorando el lado libre
Se me olvidó adjuntar el módulo.

y el enlace a la memoria de Unai.

Saludos
Z^-1.ice

Obijuan

unread,
Aug 22, 2017, 7:05:25 AM8/22/17
to FPGAwars: explorando el lado libre
Hola Jose!

Me encantan tus avances con las matemáticas por hardware!  ¡Gracias!  :-)

Saludos, Obijuan



El sábado, 20 de mayo de 2017, 21:32:28 (UTC+2), Jose Pico escribió:

Jose Pico

unread,
Sep 3, 2017, 5:56:58 PM9/3/17
to FPGAwars: explorando el lado libre
Duda sobre notación en punto fijo:

 porqué si sumo 1.25 + (-1.25 ) no me da cero? he usado  notación de punto fijo 3.5 (3 para la parte entera y 5 para la parte decimal)  

num   1.25 8'b001.01000
     +  -1.25 8'b111.01000
      0    9'b(1)00010000 

Adjunto el ejemplo en icestudio.
PuntoFijo.ice

Democrito

unread,
Sep 3, 2017, 7:49:33 PM9/3/17
to FPGAwars: explorando el lado libre
Hola José,

Desconozco la razón, pero he descargado tu circuito y le he echado un ojo. Me acordé que usas un puerto serie aparte y como no hace mucho que he reinstalado todo, me puse a mirar el tema de configurar para que poder usar el TX de la FPGA.

He pasado de Windows 8 a 10. Espero que no haya problemas, los pasos son súper sencillos.

  1. Abres el Administrador de dispositivos.
  2. En "Controladoras de bus serie Universal" haces clic con el botón de derecho a "USB Serial Converter B".
  3. Propiedades.
  4. Pestaña: "Avanzados"
  5. Habilitas la casilla "Cargar VCP".
  6. Aceptar.
  7. Enchufas y desenchufas.
  8. Te ha de aparecer el puerto COM nuevo más abajo. En "Puertos (COM y LPT)"
Si no te sale, enchufa y vuelve a enchufa, alguna vez me ha sucedido, el tener que repetir.
Tomas el programa más sencillo que tengas, por ejemplo enviar la letra 'k', y lo subes a tu FPGA. Y a ver qué tal.

Si te funciona abrimos un hilo especificando la solución.

Saludos.





Juan José Luna Espinosa

unread,
Sep 3, 2017, 10:19:15 PM9/3/17
to fpga-wars-explora...@googlegroups.com


Hola,

Para números en coma fija a mí me va mejor verlos siempre como números enteros.


Notación 3.5 (entera.decimal)

1.25 = 001.01000

00101000 = 40 en decimal

-1.25 = complementoA2( 00101000 ) = 11010111 + 1 = 11011000


Ahora,

1.25 + (- 1.25 ) = 00101000 + 11011000

00101000
11011000
--------
00000000


Saludos


--
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-lado-libre+unsubscribe@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.

1138-4EB

unread,
Sep 4, 2017, 12:32:44 AM9/4/17
to FPGAwars: explorando el lado libre
Si estás usando complemento a 2, debes convertir tanto la parte entera como la fraccional. '111.01000' no es -1.25, sino 000.10111+1 -> 000.11000 = (-)0.75. Por eso, el resultado de la suma es 0.5.

Como comenta Juan José, puede ser más sencillo de visualizar multiplicando por 2^(bits_fraccionales) antes de operar, y dividir el resultado entre la misma constante: 0 = [ a*(2^f) + b*(2^f) ] / (2^f) = [ 40 + (-40) ] / 32, siendo a=1.25, b=-1.25 y f=5.

Jose Pico

unread,
Sep 4, 2017, 2:05:44 AM9/4/17
to FPGAwars: explorando el lado libre
Muchas gracias!
Cometí el error de convertir solo la parte decimalna Ca2, sabía que estaba mal pero no lo veía.
Muchas gracias

Jose Pico

unread,
Sep 4, 2017, 2:10:54 AM9/4/17
to FPGAwars: explorando el lado libre
Gracias Demócrito!
Lo probaré
Ahora uso un hc06 conectado a la FPGA y me conecto por bluetooth a este desde un pincho bluetooth desde mi pc.
Así también me mola.
De hecho hice un pequeño robot q lo controlaba con las teclas del pc y por bluetooth.

Saludos

Jose Pico

unread,
Sep 4, 2017, 6:11:20 PM9/4/17
to FPGAwars: explorando el lado libre
Hola Demócrito!

He probado lo que me has comentado y me ha funcionad perfectamente a la primera.
Marcando la casilla  "Cargar VCP"  me ha funcionado OK.

Mil Gracias.

Democrito

unread,
Sep 4, 2017, 6:32:12 PM9/4/17
to FPGAwars: explorando el lado libre
Genial! Asunto resuelto!

jordon...@gmail.com

unread,
May 13, 2018, 6:10:59 PM5/13/18
to FPGAwars: explorando el lado libre


Buenas noches¡¡ 

Vuelvo a abrir este hilo en relación a nuestra pequeña bilbioteca de bloques Maths. Mi duda es;

Con el objetivo de obtener los valores pitch, yaw y roll de mi FPGA venidos de un IMU necesito, por un lado obtener el valor del ángulo gracias al giroscopio, nada difícil teniendo en cuando el trato de la coma que tan bien habéis explicado en este hilo.

Como ya sabéis, debido al error que va acumulando el giroscopio (deriva) en tiempos largos es necesario el uso del acelerómetro, y ahí viene el tema, necesito las operaciones raíz cuadrada y tangente. En un principio, pensé que no era problema, pues contamos con $sqrt y $atan. El problema viene aquí, según he probado hasta ahora, esta función de SystemVerilog me devuelve un numero entero, y obviamente puedo perder mucha precisión.

Alguna idea o recomendación?

Os dejo el modelo del Self-Balancing robot¡¡




1138-4EB

unread,
May 13, 2018, 7:18:43 PM5/13/18
to FPGAwars: explorando el lado libre
Hola!

El conjunto de algoritmos CORDIC que se mencionan más arriba en este mismo hilo te sirven para computar arcotangentes y raíces cuadradas.

https://es.wikipedia.org/wiki/CORDIC

Un saludo
Reply all
Reply to author
Forward
0 new messages