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

BON*_*GKA 4 verilog vlsi

我想将修改后的分数乘以整数,如下所示

(乘以幂项乘以负项的乘法)

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

Mor*_*gan 5

如果我们有,reg [3:0]我们可以认为它可以保存0到15的整数值.

现在我们想要得到小数信息,我们必须在感知上添加小数位,但是对于verilog这个数字仍然是一个整数.

我们仍然有4位,但我们改变的,而不是二进制加权,8 4 2 12 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
Run Code Online (Sandbox Code Playgroud)

正如您所指出的,移位数字将导致截断为整数.诀窍是在执行此操作之前将小数位添加到数字中.

例如,为传入的整数添加10个小数位:

input [9:0] a,

wire [19:0] a_frac = { a, 10'b0};
Run Code Online (Sandbox Code Playgroud)

请记住,Verilog认为这是一个整数,但我们必须以不同的方式解释数字.

wire [19:0] y = (a_frac>>1) - (a_frac>>5) - (a_frac>>7) + (a_frac>>10);
Run Code Online (Sandbox Code Playgroud)

y现在应该包含一些内容,因为您为那些转移的值留下了空间.输出将有10个整数位和10个小数位.

要显示数字,您可以缩放实数:

$display("%d * 0.46194 = %f", a, y * 2.0**-10);
Run Code Online (Sandbox Code Playgroud)

注意:我会避免x作为verilog中的变量,因为x它在verilog中具有特殊含义,或者在线上不关心或者未知值.

关于EDA Playground的一个简单例子.