Implementación de gravedad en VHDL y VGA.

Estoy trabajando en un proyecto vhdl/fpga usando el módulo vga. Estoy tratando de hacer que un objeto caiga con una aceleración (gravedad). Encontré una respuesta en otro problema, y ​​sugiere implementar algo similar a estas ecuaciones:

Position_next <= Position_reg + timestep*Velocity_reg ;

Velocity_next <= Velocity_reg + timestep*Acceleration ;

Donde timesetp en mi caso es el marco de tiempo, que es 1/60 fps. La aceleración (gravedad) va a ser un número constante. El resultado de las dos ecuaciones es un punto flotante. Lo cual es un problema, ya que el paso mínimo que puede tomar mi objeto es 1 píxel por cuadro. Alguna idea de cómo resolver este problema.

Debe explicar por qué cree que puede ser un problema.
@Andyaka Dado que el paso de tiempo es 1/60 fps = 0.016. cuando multiplicamos timestep*Acceleration, el resultado es un flotante, no un decimal. Por lo tanto, Velocity_next también es un flotador. Multiplicando nuevamente por el paso de tiempo y agregándolo a Position_reg, terminaremos con una fracción de píxeles. Y sabes que el paso mínimo del objeto es 1 píxel, no puede ser 1,5 por ejemplo.
No siento tu dolor amigo. ¿Alguna vez ha oído hablar de mantener los cálculos principales en flotantes y crear un nuevo valor entero a partir de ese flotante cuando lo necesite?
No, nunca he oído hablar de eso. Puede dar un ejemplo. Gracias
Intente buscar "convertir un número de coma flotante en un número entero".

Respuestas (2)

Entre flotantes (difíciles de implementar, hambrientos de recursos) y números enteros (sin suficiente precisión), hay un intermedio: se llama matemática de punto fijo . El punto fijo no es mucho más difícil que los números enteros para trabajar. Y es suficiente en tu caso.

La idea básica es que represente cada valor por un número entero. La correspondencia entre ambos se hace simplemente multiplicando o dividiendo por un valor fijo (normalmente una potencia de dos, para que sea más fácil). Por ejemplo, si establece la proporción en 256, eso significa que el valor 1.5 estará representado por el número 16#180# . Porque 180 en hexadecimal (= 384 en diciembre) dividido por 256 da 1,5 . Otra forma de verlo es que el número almacenado representa un número entero de 1/256 unidades.

Esto significa que la implementación de la suma y la resta no cambia en comparación con la implementación habitual de números enteros. La multiplicación es muy similar a la clásica multiplicación de enteros, solo tienes que dividir por tu proporción después (o simplemente cambiar el número correcto de bits si es una potencia de dos).

Entonces, la única elección que se puede hacer es elegir la proporción adecuada para que pueda representar con precisión los valores que necesita en su caso específico.

La diferencia entre un cambio y una división después de cada multiplicación significa que casi siempre querrás elegir una potencia de 2 como tu razón (al menos si apoyas la multiplicación).

Los distribuidores de FPGA a menudo proporcionan IP Cores que pueden realizar operaciones de coma flotante. Por ejemplo, Intel/Altera proporciona un montón de núcleos IP de punto flotante:

https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/ug/ug_altfp_mfug.pdf

Puedo decir que funcionan como he hecho con una calculadora de fractales en tiempo real.

@ Eso es genial, pero olvidé mencionar que estoy usando una placa Digilent.
Entonces tu objetivo es Xilinx. Lea sobre esto en esta página: xilinx.com/products/intellectual-property/floating_pt.html