如何将固定分数应用于整数

how can I apply fixed fraction to the integer

我想乘以修正分数的整数如下

()

我找到了将分数转换为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);

如果我们有 reg [3:0] 我们可以认为它可以容纳 0 到 15 的整数值。

现在我们想要小数信息,我们必须在感知上添加小数位,但是要verilog这个数字仍然是一个整数。

我们仍然有 4 位,但是我们改变了二进制加权,而不是 8 4 2 12 1 0.5 0.25。但是 verilog 不知道这是关于我们如何解释位模式的全部内容。

题中>>的右边就是小数位。还使用 T 表示 CSD 项中的 -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);

注意:我会避免将 x 作为 verilog 中的变量,因为 x 在 verilog 中具有特殊含义,要么不关心,要么是线路上的未知值。

A quick example on EDA Playground.