在VHDL中表示整数的位数

在VHDL中表示整数的位数,vhdl,Vhdl,我必须转换一个整数,以确定表示该整数需要多少位。 比如说,整数值是22。我知道表示这个整数需要5位。 VHDL中是否有任何属性可以执行此操作? 重要提示:结果也应该是一个整数,它应该表示位数。没有VHDL属性或函数,但您可以创建如下函数: -- Returns number of bits required to represent val in binary vector function bits_req(val : natural) return natural is variable

我必须转换一个整数,以确定表示该整数需要多少位。 比如说,整数值是22。我知道表示这个整数需要5位。 VHDL中是否有任何属性可以执行此操作?
重要提示:结果也应该是一个整数,它应该表示位数。

没有VHDL属性或函数,但您可以创建如下函数:

-- Returns number of bits required to represent val in binary vector
function bits_req(val : natural) return natural is
  variable res_v    : natural;  -- Result
  variable remain_v : natural;  -- Remainder used in iteration
begin
  res_v := 0;
  remain_v := val;
  while remain_v > 0 loop  -- Iteration for each bit required
    res_v := res_v + 1;
    remain_v := remain_v / 2;
  end loop;
  return res_v;
end function;

然而,有时
ceil_log2
函数也很有用,因为它根据内存映射中的条目给出所需的地址位数,并且
ceil_log2(val)=bits_req(val-1)

没有VHDL属性或函数,但您可以创建如下函数:

-- Returns number of bits required to represent val in binary vector
function bits_req(val : natural) return natural is
  variable res_v    : natural;  -- Result
  variable remain_v : natural;  -- Remainder used in iteration
begin
  res_v := 0;
  remain_v := val;
  while remain_v > 0 loop  -- Iteration for each bit required
    res_v := res_v + 1;
    remain_v := remain_v / 2;
  end loop;
  return res_v;
end function;

然而,有时
ceil_log2
函数也很有用,因为它根据内存映射中的条目给出所需的地址位数,并且
ceil_log2(val)=bits_req(val-1)

使用math_real库。它不用于合成,但在架构和begin语句之间非常有效

use ieee.math_real.all;


constant nbits : natural := integer(ceil(log2(real(n))));
我经常使用math_real在线生成sin/cos表。。。再一次,这是在架构和开始之间。。。再次强调,不要试图在合成中使用math_real


我已经在Quartus、ISE、Vivado和Modelsim中成功地使用了此功能;可能不是所有的东西都支持它。

使用math\u real库。它不用于合成,但在架构和begin语句之间非常有效

use ieee.math_real.all;


constant nbits : natural := integer(ceil(log2(real(n))));
我经常使用math_real在线生成sin/cos表。。。再一次,这是在架构和开始之间。。。再次强调,不要试图在合成中使用math_real


我已经在Quartus、ISE、Vivado和Modelsim中成功地使用了此功能;可能不是所有的东西都支持它。

只要在编译时对常量语句求值,它就可以用于合成。只要在编译时对常量语句求值,它就可以用于合成。