我使用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;
答案 0 :(得分:3)
有similar question讨论固定点宽度,...乘以32位乘32位,答案适合64位。 16.16
x 16.16
的正确为32.32
。
verilog转换为实数可以是自动的,如果正确完成,缩放显示的数字n * 2**-16
不起作用。 n * 2.0**-16
因为我们使用了2.0
,所以使用浮点而不是整数来完成计算。
注意:2**n
是2的幂。在某些语言中有2 ^ n,但^
在verilog中是异或。
使用real进行比较缩放的快速示例:
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
返回:
# 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的幂为单位的整数,有些位可以表示小数信息。