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 1不是2 1 0.5 0.25。但是verilog不知道这一切都是关于我们如何解释位模式。

在问题中,just 的右侧>>代表小数位。也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 中作为变量,因为在 verilog 中x具有特殊含义,要么不关心,要么在线路上的未知值。

EDA Playground 上的一个简单示例

于 2015-02-07T15:14:53.700 回答