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

时间:2015-02-07 14:39:16

标签: verilog vlsi

我希望乘以具有修改分数的整数,如下所示

Multiplication by power series summation with negative terms

我已经做了什么来找到分数转换为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)>&gt; 5) - ((3 <1024)> 7)+((3&lt; 3&lt; 1&lt; 1024)&gt; ;&LT; 1024)&GT;大于10);

1 个答案:

答案 0 :(得分:5)

如果我们有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中具有特殊含义,或者在线上不关心或者未知值。

A quick example on EDA Playground