Schwerkraft in VHDL und VGA implementieren.

Ich arbeite an einem VHDL/FPGA-Projekt mit dem VGA-Modul. Ich versuche, ein Objekt mit einer Beschleunigung (Schwerkraft) fallen zu lassen. Ich habe eine Antwort auf ein anderes Problem gefunden, und es wird vorgeschlagen, etwas Ähnliches wie diese Gleichungen zu implementieren:

Position_nächster <= Position_reg + Zeitschritt*Geschwindigkeit_reg ;

Velocity_next <= Velocity_reg + timestep*Acceleration ;

Wobei timesetp in meinem Fall die Bildzeit ist, die 1/60fps beträgt. Die Beschleunigung (Schwerkraft) wird eine konstante Zahl sein. Das Ergebnis der beiden Gleichungen ist ein Fließkommawert. Das ist ein Problem, da der minimale Schritt, den mein Objekt machen kann, 1 Pixel pro Frame beträgt. Irgendeine Idee, wie man dieses Problem lösen kann.

Sie müssen erklären, warum Sie denken, dass dies ein Problem sein könnte.
@Andyaka Da der Zeitschritt 1/60 fps = 0,016 ist. Wenn wir timestep*Acceleration multiplizieren, ist das Ergebnis eine Gleitkommazahl, keine Dezimalzahl. Daher ist Velocity_next auch ein Float. Wenn wir erneut mit timestep multiplizieren und es zu Position_reg addieren, erhalten wir am Ende einen Bruchteil von Pixeln. Und Sie wissen, dass der minimale Objektschritt 1 Pixel beträgt, er kann beispielsweise nicht 1,5 sein.
Ich fühle deinen Schmerz nicht, Alter. Haben Sie schon einmal davon gehört, die Hauptberechnungen in Floats zu halten und aus diesem Float einen neuen ganzzahligen Wert zu erstellen, wenn Sie ihn brauchen?
Nein noch nie davon gehört. Kannst du ein Beispiel geben. Danke
Versuchen Sie, nach "Konvertieren einer Gleitkommazahl in eine ganze Zahl" zu suchen.

Antworten (2)

Zwischen Gleitkommazahlen (schwierig zu implementieren, ressourcenintensiv) und Ganzzahlen (nicht genügend Genauigkeit) gibt es eine Zwischenstufe: Sie heißt Festkomma- Mathematik. Der Umgang mit Festkommazahlen ist nicht viel schwieriger als mit ganzen Zahlen. Und das reicht in deinem Fall.

Die Grundidee ist, dass Sie jeden Wert durch eine ganze Zahl darstellen. Die Entsprechung zwischen beiden erfolgt einfach durch Multiplikation oder Division durch einen festen Wert (normalerweise eine Zweierpotenz, um es einfacher zu machen). Wenn Sie beispielsweise das Verhältnis auf 256 einstellen, bedeutet dies, dass der Wert 1,5 durch die Zahl 16#180# dargestellt wird . Denn 180 in hex (= 384 in dec) dividiert durch 256 macht 1,5 . Eine andere Möglichkeit, es zu sehen, ist, dass die gespeicherte Zahl eine ganze Zahl von 1/256-tel-Einheiten darstellt.

Das bedeutet, dass sich die Implementierung von Addition und Subtraktion gegenüber der üblichen Integer-Implementierung nicht ändert. Die Multiplikation ist der klassischen ganzzahligen Multiplikation sehr ähnlich, Sie müssen nur danach durch Ihr Verhältnis dividieren (oder einfach die richtige Anzahl von Bits verschieben, wenn es sich um eine Zweierpotenz handelt).

Die einzige Entscheidung, die Sie treffen müssen, besteht darin, das Verhältnis angemessen zu wählen, damit Sie die Werte, die Sie in Ihrem speziellen Fall benötigen, genau darstellen können.

Der Unterschied zwischen einer Verschiebung und einer Division nach jeder Multiplikation bedeutet, dass Sie fast immer eine Potenz von 2 als Verhältnis wählen möchten (zumindest wenn Sie die Multiplikation unterstützen).

FPGA-Distributoren bieten häufig IP-Cores an, die Gleitkommaoperationen ausführen können. Beispielsweise bietet Intel/Altera eine Reihe von Gleitkomma-IP-Kernen:

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

Ich kann sagen, dass sie funktionieren, da ich damit einen Echtzeit-Fraktalrechner erstellt habe.

@Das ist großartig, aber ich habe vergessen zu erwähnen, dass ich ein Digilent-Board verwende.
Ihr Ziel ist also Xilinx. Lesen Sie darüber auf dieser Seite: xilinx.com/products/intellectual-property/floating_pt.html