4

次のように、修正された分数で整数に乗算したいと思います

(負の項を持つべき級数和による乗算)

分数をCSD形式に変換する方法を見つけるために何をしましたか。しかし、整数に乗算する方法を知りたいです。

たとえば、これを手に入れました

0.46194 = 2^-1 - 2^-5 - 2^-7 + 2^-10.

次に、Verilog rtl 式として次のように取得できます。

y= (x>>1) - (x>>5) - (x>>7) + (x>>10);

しかし、問題は、入力値が 3 の場合、上記のコードをどのように計算できるかということです。

y= (3>>1) - (3>>5) - (3>>7) + (3>>10);

しかし、私が知っているように、計算は不可能です。3>>1 は 1、(3>>5) は 0、(3>>7) は 0、(3>>10) は 0 なので、

そのため、通常の結果を得ることができません。また、変更された分数式を見つける理由もなくなりました。次に、この投稿の質問ポイントは、「変更された分数を整数に適用するにはどうすればよいですか」です。

更新:これは次のようになります。y= ((3<<1024)>>1) - ((3<<1024)>>5) - ((3<<1024)>>7) + ((3<<1024)>>10);

4

1 に答える 1

5

ある場合は、reg [3:0]0 ~ 15 の整数値を保持できると見なすことができます。

ここで、小数の情報が必要です。小数のビットを知覚的に追加する必要がありますが、検証するには、数値は依然として整数です。

まだ 4 ビットありますが、バイナリの重み付けを ではなく に変更8 4 2 12 1 0.5 0.25ます。しかし、verilog はこれを認識していません。ビット パターンをどのように解釈するかがすべてです。

質問では、右側の>>just は小数ビットを表します。TCSD用語で-1を表すためにも使用

        2^-1 - 2^-5    - 2^-7      + 2^-10.
Decimal 0.5  - 0.03125 - 0.0078125 + 0.0009765625
Binary  0.1000T0T001

ご指摘のとおり、数値をシフトすると整数に切り捨てられます。秘訣は、これを行う前に数値に小数ビットを追加することです。

たとえば、小数部の 10 ビットを入力整数に追加するには、次のようにします。

input [9:0] a,

wire [19:0] a_frac = { a, 10'b0};

Verilog はこれを整数と見なしますが、数値を別の方法で解釈する必要があることに注意してください。

wire [19:0] y = (a_frac>>1) - (a_frac>>5) - (a_frac>>7) + (a_frac>>10);

yこれらのシフトされた値のための余地を残したので、何かが含まれているはずです。出力には、10 個の整数ビットと 10 個の小数ビットが含まれます。

実数をスケーリングできる数値を表示するには、次のようにします。

$display("%d * 0.46194 = %f", a, y * 2.0**-10);

注意: Verilog では特別な意味xを持つため、Verilog の変数として使用することは避けxます。気にしないか、ワイヤ上の未知の値のいずれかです。

EDA Playground の簡単な例

于 2015-02-07T15:14:53.700 に答える