如何在Verilog中计算浮点被乘数?到目前为止,我通常使用shift<< 1024,然后浮点数变为整数。然后我做一些操作,然后>> 1024再次获得分数。
例如0.3545 = 2 ^ -2 + 2 ^ -4 + ......
我对另一种方式有疑问,就像这样。我不知道减号( - )来自哪里:
我刚从别人那看。但是按照你的方式,就像这样表示
我不明白它是如何知道使用减号的?
我们如何知道何时需要它?另外我如何申请verilog RTL?
更新:我理解使用减号操作的概念。但有没有其他方法可以使等式或方法减少表达式乘以2的幂?
更新:我们如何在verilog中使用此方法?例如,我倾斜0.46194 = 2 ^ -1 - 2 ^ -5 - 2 ^ -7 + 2 ^ -10。然后这段代码就像在verilog中这样写了。 0.011101101 =' hED =' d237。所以问题的关键是我们如何将它应用于verilog中的应用程序?
更新:先生,您能检查一下吗?结果有点不同。
有些不同。我错了什么?
答案 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转换是正确的。