将定点二进制数与整数进行比较
compare fixed point binary number with an integer
我计算一个 16.16 定点二进制数,然后将结果与一个整数进行比较。 16.16 数平方后变成 64 位二进制数。
我不确切知道我的代码是否正确以及 16.16 定点数的每个正方形是否在范围内。
我也无法设置正确的语句来表示 32.32 定点结果。
伪代码
reg [31:0] n; //the 32 Bit number we want to square
reg [63:0] res; //out result register after squaring n
integer i;
...
res = n * n; // squaring n
i = 1;
/* compare with some integer - bigger than i */
if( res[63:32] >= i && res[31:0] > 0)
begin ...do something ... end
/* compare with some integer - less/equal than i */
if( (res[63:32] < i && res[31:0] >= 0) || (res[63:32] <= i && res[31:0] == 0))
begin ...do something... end
...
在测试台中,我试图将结果表示为 32.32 定点二进制数 - 但这种表示在显示时不会给我正确的浮点值:
res[63:32] + $bitstoreal({1'b0,15'b011111111111111,{fer3[31:0],{81{1'b0}} }) -1;
有一个 讨论定点宽度,...将 32 位乘以 32 位,答案将适合 64 位。 16.16
x 16.16
的正确答案是 32.32
.
verilog 到实数的转换可以自动进行,如果正确完成,缩放数字以显示 n * 2**-16
不起作用。 n * 2.0**-16
因为我们使用 2.0
计算是使用浮点而不是整数完成的。
注意:2**n
是 2 的 n 次方。 2^n 在某些语言中,但 ^
在 verilog 中是 XOR。
使用真实进行比较缩放的快速示例:
reg [31:0] n; //16.16
reg [63:0] n_sq; //32.32
real n_sq_real; // Floating Point
always @* begin
n_sq = n * n;
end
initial begin
#1ps;
n = { 16'd2, 16'b1000_0000_0000_0000}; //2.5
#1ns;
$display("n %f, n squared %f", (n * 2.0**-16), n_sq * 2.0**-32);
n_sq_real = n_sq * 2.0**-32 ;
$display("n_sq_real %f", n_sq_real);
end
Returns:
# n 2.500000, n squared 6.250000
# n_sq_real 6.250000
如果只是为了与整数进行比较,您可以通过移出小数位来截断数字,即 n_sq * 2.0**-32
变为 n_sq >> 32
或者您可以按小数位数缩放整数。
n_sq >= i<<32 ;
归根结底,verilog 中的定点数只是按 2 的幂缩放的整数,因此一些位可以表示小数信息。
我计算一个 16.16 定点二进制数,然后将结果与一个整数进行比较。 16.16 数平方后变成 64 位二进制数。 我不确切知道我的代码是否正确以及 16.16 定点数的每个正方形是否在范围内。 我也无法设置正确的语句来表示 32.32 定点结果。
伪代码
reg [31:0] n; //the 32 Bit number we want to square
reg [63:0] res; //out result register after squaring n
integer i;
...
res = n * n; // squaring n
i = 1;
/* compare with some integer - bigger than i */
if( res[63:32] >= i && res[31:0] > 0)
begin ...do something ... end
/* compare with some integer - less/equal than i */
if( (res[63:32] < i && res[31:0] >= 0) || (res[63:32] <= i && res[31:0] == 0))
begin ...do something... end
...
在测试台中,我试图将结果表示为 32.32 定点二进制数 - 但这种表示在显示时不会给我正确的浮点值:
res[63:32] + $bitstoreal({1'b0,15'b011111111111111,{fer3[31:0],{81{1'b0}} }) -1;
有一个 16.16
x 16.16
的正确答案是 32.32
.
verilog 到实数的转换可以自动进行,如果正确完成,缩放数字以显示 n * 2**-16
不起作用。 n * 2.0**-16
因为我们使用 2.0
计算是使用浮点而不是整数完成的。
注意:2**n
是 2 的 n 次方。 2^n 在某些语言中,但 ^
在 verilog 中是 XOR。
使用真实进行比较缩放的快速示例:
reg [31:0] n; //16.16
reg [63:0] n_sq; //32.32
real n_sq_real; // Floating Point
always @* begin
n_sq = n * n;
end
initial begin
#1ps;
n = { 16'd2, 16'b1000_0000_0000_0000}; //2.5
#1ns;
$display("n %f, n squared %f", (n * 2.0**-16), n_sq * 2.0**-32);
n_sq_real = n_sq * 2.0**-32 ;
$display("n_sq_real %f", n_sq_real);
end
Returns:
# n 2.500000, n squared 6.250000
# n_sq_real 6.250000
如果只是为了与整数进行比较,您可以通过移出小数位来截断数字,即 n_sq * 2.0**-32
变为 n_sq >> 32
或者您可以按小数位数缩放整数。
n_sq >= i<<32 ;
归根结底,verilog 中的定点数只是按 2 的幂缩放的整数,因此一些位可以表示小数信息。