将定点二进制数与整数进行比较

时间:2015-01-06 16:51:25

标签: verilog

我使用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;

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

example on EDA Playground

如果只是为了与整数进行比较,你可以通过移出小数位来截断你的数字,即n_sq * 2.0**-32变为n_sq >> 32

或者你可以用整数小数位来缩放整数。

n_sq >= i<<32 ;

在一天结束时,verilog中的定点数只是以2的幂为单位的整数,有些位可以表示小数信息。