我希望乘以具有修改分数的整数,如下所示
(Multiplication by power series summation with negative terms)
我已经做了什么来找到分数转换为CSD形式的方法。 但我想知道如何应用乘以整数。
例如, 我得到了这个
然后我可以像verilog rtl表达式那样:
但问题是,如果输入值为3,那么如何计算上面的代码呢?
但据我所知,它无法计算。因为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);
答案 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中具有特殊含义,或者在线上不关心或者未知值。