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