2

ハードウェア (verilog/fpga 実装) で、0 ~ 1023 の範囲の整数を 1023 で乗算し、結果を 1 ~ 1023 の範囲の数値で除算する必要があります。おそらく10ビットをシフトするだけで済むので、乗算は簡単です(必要に応じて、余分な1023を減算します)。分割はちょっと面白いけど。面積/電力は私にとってそれほど重要ではありません (私は FPGA を使用しているので、リソースは既に存在します)。デザインをパイプライン処理できる限り、(妥当な範囲内での) レイテンシは大した問題ではありません。さまざまなトレードオフを持ついくつかの選択肢があることは明らかですが、このような状況に対して「明白な」または「簡単な」アルゴリズムがあるかどうか疑問に思っています。オペランドの範囲が限られていることと、私が持っている豊富なリソース (bram など) を考えると、あるのかどうか疑問に思っています。

4

2 に答える 2

1

整数ではなく固定小数点精度で作業できる場合は、次のように変更できる場合があります。

結果を 1 ~ 1023 の範囲の数値で割ります

1 ~ 1/1023 の範囲の数値による乗算。つまり、除算を事前に計算し、それを乗算の係数として保存します。

于 2013-08-07T20:36:23.753 に答える
1

すべてを事前計算でき、予備の 20x20 乗数があり、事前計算された数値を保存する方法がある場合は、Morgan の提案に従ってください。20 ビットの被乗数 (10b の商、10b の余り) を事前に計算し、最初の 10b の数値を掛けて、40b の結果の下位 30b を取得する必要があります。

それ以外の場合、遅延は重要ではないと言うので、非常に簡単なのは復元できない部門です(Webには多くのものがありますが、そのほとんどは理解できません)。20 ビットの分子 ((1023 x ) の乗算の結果) と 10 ビットの分母があります。これにより、20b の商と 10b の剰余が得られます (つまり、答えの整数部分に 20 ビット、小数部分に 10 ビット、30b の答えが得られます)。

実際のハードウェアは非常に簡単です: 11b の加算器/減算器、31b のシフト レジスタ、および除数を格納するための 10b または 11b のレジスタです。また、それを制御するための小さな FSM も必要です (2b)。クロック サイクルごとに比較、加算または減算、およびシフトを実行する必要があり、21 サイクルで答えが得られます。おもう。:)

于 2013-08-08T08:29:34.547 に答える