2

私は現在、CをVHDLに変換するフレームワークに取り組んでおり、長い筆算の実装に行き詰まっています。実際、私のフレームワークは32ビット変数でしか機能しないため、Cのlong long変数を解析すると、2つのVHDL変数が生成されます。1つは最上位部分を含み、もう1つは最下位部分を含みます。要約すると、これから:

long long a = 1LL;

生成されるVHDLは次のようになります。

var30 <= 00000000000000000000000000000000;
var31 <= 00000000000000000000000000000001;

今私の問題は:2つの長い長いパラメータ(VHDLで)を2つの変数に分割するので、どうすれば分割できますか?最も(または最も少ない)重要な部分を独立して(伝播するためのキャリーだけで)作業できるので、加算/減算に問題はありませんでしたが、これを使用すると、除算を実行する方法がわかりません。ある種の操作、最も重要でない部分と最も重要な部分は実際に結びついています...誰かがアイデアを持っているなら、それは大いにありがたいです

PS:掛け算についても同じ問題があります

編集:私は両方とも符号付き/符号なし変数で作業し、結果は64ビット変数になるはずです

4

1 に答える 1

0

乗算と除算の問題の両方について、問題を次のように分解できます。各 64 ビット値、x は次のように表現できると考えてk*x.hi+x.loください。x.hi は上位 32 ビット、x.lo は下位 32 ビット、k = 2^32。したがって、乗算の場合:

a*b = (a.hi*k+a.lo)*(b.hi*k+b.lo)
    = a.hi*b.hi*k*k + (a.hi*b.lo + a.lo*b.hi)*k + a.lo*b.lo

64 ビットの結果だけが必要な場合は、最初の項が消えて次のようになります。

a*b = (a.hi*b.lo + a.lo*b.hi)*k + a.lo*b.lo

一般に、乗算ではビット数が 2 倍になるため、上記の式で 32 ビット x 32 ビットを乗算すると、64 ビットの項が生成されることに注意してください。場合によっては、下位 32 ビット (上記の式の最初の 2 つの項) のみが必要ですが、最後の項では下位 32 ビットと上位 32 ビットの両方が必要です。

于 2012-08-28T10:25:03.617 に答える