Fixed Point Division im Verilog für Spartan 6

Ich entwickle einen Kern auf Spartan 6, der Divisionen wie 1/6, 2/4 usw. ausführen muss. Die Werte liegen also immer zwischen 0 und 1. Da ich die Genauigkeit von Gleitkommazahlen nicht benötige, möchte ich a verwenden Festkommateiler, da Teilung kostspielig ist. Ich habe einige Teiler auf opencores.org gefunden, aber alle können normale Teilungsprobleme wie 4/2,8/4 usw. berechnen, aber keine 1/6-Operationen. Kann jemand auf einen geeigneten Teiler für meine Anwendung hinweisen

Danke

Sind die Teiler konstant oder variieren sie?
Welche Art von Bandbreite (Ergebnisse pro Sekunde) und Latenz benötigt Ihre Anwendung? Ich habe einen Pipeline-Teiler entwickelt, der ein Ergebnis pro Takt bei 150 MHz liefern kann, aber das liegt daran, dass ich während des vertikalen Austastintervalls eines HD-Videostreams 1024 Skalierungsfaktoren berechnen musste. Wenn Sie diese Art von Bandbreite nicht benötigen, gibt es andere Ansätze, die weniger ressourcenintensiv sind. Mein Teiler ist in VHDL; es könnte nach Verilog übersetzt werden (aber nicht kostenlos).
@JoeHass: Wenn die Teiler Konstanten sind, brauchen Sie überhaupt keinen Teiler; du multiplizierst stattdessen einfach mit 1/x.
@DaveTweed: Ja, genau deswegen habe ich gefragt. Ich habe gelernt, bei Stackexchange nichts als selbstverständlich zu betrachten.
Selbst wenn die Teiler variieren, ist die Berechnung von 1/x ein sehr praktikabler Ansatz, wenn Sie kein Ergebnis pro Takt benötigen. Die Newton-Rhapson-Methode benötigt nur einen Multiplikator, um 1/x in wenigen Takten zu berechnen, und dann erhält man durch eine weitere Multiplikation den Quotienten. Es gibt im Laufe der Geschichte viele kommerzielle Computer, die genau diese Methode verwendet haben.
@Joe Hess Sowohl Teiler als auch Dividende variieren
@DaveTweed Mir geht es sowohl mit Verilog als auch mit VHDL gut. Können Sie mich auf gelesene Module verweisen, damit ich sie in meinen Code einfügen kann
Wie kann ich einen Code für die Festkommateilung in der Verilog-Programmierung generieren?
@ChandrashekharGutte willkommen bei electronic.stackexchange! Wie Sie vielleicht bemerkt haben, ist dies kein Forum, sondern eine Q&A-Site, daher ist der Bereich für Antworten nicht für Diskussionen gedacht. Es steht Ihnen frei, eine neue Frage zu stellen, wenn Sie etwas zu fragen haben, oder Kommentare zu verwenden, um (tatsächlich) bestehende Fragen und Antworten zu kommentieren.

Antworten (1)

Sie sagen, dass Sie Teiler gefunden haben, die eine "normale" Teilung durchführen. Die Festkommadivision ist eine normale Division, außer dass der Dividenden hochskaliert (nach links verschoben) werden muss. Verschiebe den Dividenden um 8 Stellen nach links (multipliziere mit 256) und führe dann eine normale Division durch. Das Ergebnis des Festkommabruchs ist gleich dem ganzzahligen Ergebnis der Division, dividiert durch 256. Wenn Sie also 1/6 berechnen möchten, teilen Sie tatsächlich (1*256)/6, was 42 ergibt. Das echte Ergebnis ist daher 42/256 = 0,1640625, was ziemlich nahe am wahren Wert von 0,1666 liegt... Wir würden normalerweise sagen, dass dieses Ergebnis eine Festkommazahl mit 8 Bits rechts vom Dezimalkomma ist. Wenn Sie eine höhere Genauigkeit wünschen, verwenden Sie einen größeren Skalierungsfaktor.

Mein Problem ist, wenn ich mit diesem Teiler 1/4 mache, bekomme ich Null als Antwort. Nach Ihrer Methode, wenn ich 256/4 mache, bekomme ich 64. Wenn ich 64/256 mache, würde ich wieder Null bekommen, weil jede Division mit Zähler kleiner als Nenner zu Null führt. Was zu tun ist ? :(
Sie müssen die Dividende erhöhen. Wenn Sie ganzzahlig dividieren möchten und das Ergebnis einen Bruch darstellen soll, müssen Sie den Dividenden vorher mit einer Potenz von 2 multiplizieren.
Ein bisschen Beispielcode würde mir sehr helfen. Ich habe versucht und versucht, aber hatte überhaupt keinen Erfolg. Bitte hilf mir
Wenn Sie ganzzahlige Divisionen durchführen, ist es unmöglich, ein Ergebnis zu erhalten, das keine ganze Zahl ist. Das Schlüsselkonzept ist, wie Sie diese Ganzzahl interpretieren. In Ihrem obigen Beispiel würden Sie nicht versuchen, 64/256 zu dividieren, Sie würden nur erkennen, dass das Ergebnis ein Bruch multipliziert mit der Ganzzahl 256 ist.