2的指数幂

时间:2019-04-24 11:49:42

标签: vhdl

我正在尝试处理需要找到2的指数幂的VHDL代码。例如:T_1 <= 8191 + 2 ** DATA_3;其中DATA_3是变量。我包括“ use IEEE.MATH_REAL.ALL;”。在标题中。但是,这不起作用。有人可以给我一些建议吗?

2 个答案:

答案 0 :(得分:3)

如果需要计算2的幂,最好将向量左移。

在VHDL中,您所用的代码将具有以下格式:

T_1 <= 8191 + (1 sll DATA_3); 

避免使用实函数,因为它们通常不可合成(除非您的FPGA中有协处理器IP)。

答案 1 :(得分:0)

Compute exp(x) using VHDL

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;

entity exp_lut is
port(
  i_clk          : in  std_logic;
  i_rstb         : in  std_logic;
  i_x            : in  std_logic_vector( 3 downto 0);
  o_exp          : out std_logic_vector( 7 downto 0));
end exp_lut;

architecture rtl of exp_lut is
constant C_LUT_DEPTH    : integer := 4;  -- 16 word
constant C_LUT_BIT      : integer := 8;     -- 8 bit LUT

type t_lut_exp is array(0 to (2**C_LUT_DEPTH)-1) of integer range 0 to (2**C_LUT_BIT)-1;

constant C_LUT_ADDR_OFFSET         : unsigned(C_LUT_DEPTH-1 downto 0):= to_unsigned(2**(C_LUT_DEPTH-1),C_LUT_DEPTH);

signal lut_addr                    : unsigned(C_LUT_DEPTH-1 downto 0);
signal lut_value                   : std_logic_vector(C_LUT_BIT-1 downto 0);

constant C_LUT_EXP : t_lut_exp :=(
   39,
   44,
   50,
   57,
   64,
   73,
   83,
   94,
  106,
  120,
  136,
  155,
  175,
  199,
  225,
  255);

begin

p_rom : process(i_clk)
begin
  if(rising_edge(i_clk)) then
    lut_addr   <= C_LUT_ADDR_OFFSET + unsigned(i_x);
    lut_value  <= std_logic_vector(to_signed(C_LUT_EXP(to_integer(lut_addr)),C_LUT_BIT));
  end if;
end process p_rom;

p_exp : process(i_clk,i_rstb)
begin
  if(i_rstb='0') then
    o_exp     <= (others=>'0');
  elsif(rising_edge(i_clk)) then
    o_exp     <= lut_value;
  end if;
end process p_exp;

end rtl;