如何将固定分数应用于整数
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 1
到 2 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 中具有特殊含义,要么不关心,要么是线路上的未知值。
我想乘以修正分数的整数如下
(
我找到了将分数转换为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 1
到 2 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 中具有特殊含义,要么不关心,要么是线路上的未知值。