幂函数乘积与负项相乘

时间:2015-02-06 16:28:54

标签: vhdl verilog fpga vlsi

如何在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

有些不同。我错了什么?

2 个答案:

答案 0 :(得分:3)

变量乘以常量通常是通过将变量添加到自身的移位版本来实现的。这比使用两个变量的乘法器电路便宜得多。

通过使用减法,当常量中有1位序列时,可以进一步节省成本。 (减法电路仅与加法相同。)

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

通常,可以通过在最高有效位之后加上2的第一个幂并且减去最低有效位来形成一系列被乘数1比特,或者几个连续2的幂的和。因此,请使用16x + ... + 2x

,而不是32x - 2x

1位序列是分数还是整数的一部分并不重要。您只是在其他情况2^a = 1 + ∑2^0 ... 2^(a-1)中应用了身份∑2^0 ... 2^a = 2^(a+1) - 1

答案 1 :(得分:2)

在4位基数2中,数字可以包含以下值:

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。它允许减去一个出现在'二进制数'中。我们将-1表示为一个条形,或 T ,因为它看起来像一个顶部有条形的那个。

100T代表8 - 1,与0111相同。可以观察到1的长运行可以用0结束,结束运行变为1,运行的前1运动变为-1,(T)。

转换的一个例子:

00111101111
01000T1000T

但如果通过两节,我们会得到:

00111101111
0011111000T
010000T000T

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

与Verilog x precision binary fixed point representation?verilog-floating-points-multiplication中的定点值相关的问题。

要涵盖后续问题:

要回答有关您的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个小数位时会被截断。此错误称为量化错误。这里最重要的是你的CSD转换是正确的。