gpt4 book ai didi

verilog - 如何将固定分数应用于整数

转载 作者:行者123 更新时间:2023-12-02 12:29:46 26 4
gpt4 key购买 nike

我想乘以带有修改分数的整数,如下所示

( Multiplication by power series summation with negative terms )

我已经做了什么来找到分数转换为 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);

最佳答案

如果我们有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中具有特殊含义,要么不关心,要么线路上的值未知。

A quick example on EDA Playground .

关于verilog - 如何将固定分数应用于整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28383416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com