Estoy escribiendo un código VHDL para un entero a flotador convertidor usando variables. Lo he simulado y los resultados coinciden con las expectativas. Sin embargo, cuando busco compilar y sintetizar utilizando Precision RTL de Mentor Graphics, encuentro el siguiente error:
El ancho del sector en la expresión de selección de la parte variable no es estático. Si este es un caso genuino, use expresiones más simples en su lugar.
Este error se refiere a la siguiente línea de código:
sig_float_out(WIDTH*2-5 downto 0) <= int_input(first_one_at downto 0) & int_input(WIDTH-1 downto first_one_at+1);
Me parece que mi expresión es localmente estática y no debería tener problemas para sintetizar, ya que solo estoy buscando intercambiar contenido alrededor de una variable predeterminada.
Si este no es el caso, se agradecerán algunas aclaraciones y opciones de modificación.
El código completo para referencia:
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity lab4 is
port(
int_input : in std_logic_vector(3 downto 0);
float_output : out std_logic_vector(7 downto 0);
underflow : out std_logic
);
end lab4;
architecture int_to_float of lab4 is
constant WIDTH : integer := 4;
signal sig_float_out : std_logic_vector(WIDTH*2 - 1 downto 0);
signal check : integer;
begin
process(int_input)
variable first_one_at : integer;
variable bool_flag : boolean;
variable input_2comp : std_logic_vector(WIDTH - 1 downto 0);
begin
first_one_at := 0;
bool_flag := false;
underflow <= '1';
if (int_input = "0000") then
sig_float_out <= (others => '0');
underflow <= '0';
elsif (int_input(WIDTH - 1) = '0') then
for i in WIDTH - 1 downto 0 loop
if (int_input(i) = '1') then
if (bool_flag = false) then
first_one_at := i;
bool_flag := true;
end if;
end if;
end loop;
sig_float_out(WIDTH*2-1) <= int_input(WIDTH -1);
sig_float_out(WIDTH*2-2 downto WIDTH*2-4) <= std_logic_vector(to_unsigned(first_one_at + 1 + 3, 3));
sig_float_out(WIDTH*2-5 downto 0) <= int_input(first_one_at downto 0) & int_input(WIDTH-1 downto first_one_at+1);
else
input_2comp := std_logic_vector(unsigned(not(int_input))+1);
for i in WIDTH - 1 downto 0 loop
if (input_2comp(i) = '1') then
if (bool_flag = false) then
first_one_at := i;
bool_flag := true;
end if;
end if;
end loop;
sig_float_out(WIDTH*2-1) <= int_input(WIDTH -1);
sig_float_out(WIDTH*2-2 downto WIDTH*2-4) <= std_logic_vector(to_unsigned(first_one_at + 1 + 3, 3));
sig_float_out(WIDTH*2-5 downto 0) <= input_2comp(first_one_at downto 0) & input_2comp(WIDTH-1 downto first_one_at+1);
end if;
check<=first_one_at;
end process;
float_output <= sig_float_out;
end int_to_float;