乘以带负项的幂级数求和

Multiplication by power series summation with negative terms

如何在 Verilog 中计算浮点被乘数?到目前为止,我通常使用 shift << 1024 ,然后浮点数变成整数。然后我做一些操作,然后>> 1024 再次得到一个分数。

例如 0.3545 = 2^-2 + 2^-4 + ...

我对另一种方式有疑问,比如这样。我不知道减号(-)从哪里来:

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

我刚刚从某人那里看到了这个。但是按照你的方式,它是这样表示的

0.46194 = 2^-2 + 2^-3 + 2^-4 + 2^-6 + 2^-7 + 2^-10 + ....

我不明白它是怎么知道减号用的呢?

我们怎么知道什么时候需要减号呢?还有我如何申请verilog RTL?

更新:我理解在操作中使用减号的概念。但是有没有其他的方程式或方法可以减少表达式什么乘以 2 的幂?

更新:我们如何在verilog中使用这个方法?例如,我倾斜了 0.46194 = 2^-1 - 2^-5 - 2^-7 + 2^-10。然后这段代码在verilog中是这样写的。 0.011101101 ='hED = 'd237。所以问题的重点是我们如何将它应用到verilog中的应用程序中?


更新:先生,请检查一下这个吗?结果略有不同。

0.46194 = 0.011101101。我只是这样试过

0.011101101

0.100T10T01

= 2^-1 - 2^-4 + 2^-5 - 2^-7 + 2^-9。 = 0.462890625

有些不同。我做错了什么?

变量乘以常数通常是通过将变量添加到自身的移位版本来实现的。与接受两个变量的乘法器电路相比,将其放在 FPGA 上要便宜得多。

当常量中有一个 1 位序列时,您还可以通过使用减法来进一步节省成本。 (减法电路只和加法一样昂贵。)

考虑数字 30 = 11110。它等于 16 + 8 + 4 + 2,但它也等于 32 - 2.

一般来说,一个被乘数1位的序列,或者几个连续的2的幂之和,可以通过在最高有效位之后加上2的第一个幂,然后减去最低有效位来形成。因此,使用 32x - 2x.

而不是 16x + ... + 2x

1 位序列是分数还是整数的一部分并不重要。您只是在应用身份 2^a = 1 + ∑2^0 ... 2^(a-1),换句话说 ∑2^0 ... 2^a = 2^(a+1) - 1.

在一个以 2 为基数的 4 位数字中可以有这些值:

Base 2: Unsigned 4 bit integer, 
2^3  2^2  2^1  2^0  
  8    4    2    1 

如果我们有一个 0111,它代表 7。如果我们使用移位加架构乘以这个数字,则需要 3 个时钟周期(3 个移位和加法)。

对此的优化称为 CSD (Canonical Signed Digit。它允许负一出现在 'binary numbers' 中。我们将 -1 表示为一根柱,或 T,因为它看起来像顶部有一根柱。

100T代表8 - 1,与0111相同。可以观察到,长运行s的1可以替换为0,结束运行变成1,运行的第一个1变成-1,(T) .

转换示例:

00111101111
01000T1000T

但如果分两部分通过,我们将得到:

00111101111
0011111000T
010000T000T

我们采用了一个需要 8 个时钟周期或 8 个逻辑块来计算的数字,并将其转换为 3。

Verilog 中定点值的相关问题 and

回答后续问题:

回答有关 CSD 转换问题的后续部分。我会将它们视为纯整数以简化数字,这与将值乘以 2^9(9 个小数位)相同。

256  128 64 32 16 8 4 2 1
  0    1  1  1  0 1 1 0 1

128 + 64 +32 + 8 +4 +1 => 237

现在进行 CSD 转换:

256  128 64 32 16 8 4 2 1
  1    0  0  T  1 0 T 0 1

256  -32 + 16 - 4 + 1 => 237

您可以看到您的转换是正确的。我得到 237* 2^-9 为 0.462890625,这与转换回小数时的答案匹配。您开始使用的 0.46194 一定是四舍五入的版本,或者当量化为 9 个小数位时得到 t运行。这种误差被称为量化误差。不过,这里最重要的是您正确地进行了 CSD 转换。