Std_logic_vector a un problema de conversión sin firmar

1
architecture behavioral of test is
signal lfsr_state : std_logic_vector (31 downto 0); 
begin        
LFSR_32_1 : entity work.setState port map(clk, lfsr_state);
process (clk)
begin
if (rising_edge(clk)) then    
    if((unsigned(lfsr_state)) <= 2147483648) then
            Bit_out <= '1';
        else
            Bit_out <= '0';
        end if;
    end if;
end process;
end architecture;      

Hola, Tengo un problema relacionado con la conversión de un lógico_vector de 32 bits a una señal sin firmar. La función anterior siempre devuelve '0', aunque espero que '0' y '1' se devuelvan con igual probabilidad, ya que los números pseudoaleatorios de 32 bits lfsr se distribuyen por igual en el intervalo [0, (2 ^ 32) -1].
¿Podría ser posible que el rango de ((sin signo (estado lfsr)) no esté en el intervalo [0, (2 ^ 32) -1]? Muchas gracias.

    
pregunta hans

1 respuesta

1

El problema es casi seguro que 2147483648 no se puede representar como Integer en la herramienta de simulación que está utilizando. El peligro es que, al estar fuera del rango Integer, representa -2147483648, ¡y la comparación se está realizando contra eso!

Exprese el número como X"80000000" (un literal de vector de bits) o, si es necesario, unsigned(X"80000000") y debería funcionar. Esta forma no está limitada a 32 bits!

16 # 80000000 # es otro literal numérico, por lo que puede o no funcionar. Hay diferencias entre los simuladores en esta área, y nuevamente entre sim y synth a veces.

Estoy bastante disgustado si un simulador simplemente deja que esto ocurra sin advertencias o errores de rango; tenga en cuenta que algunos sims (Xilinx ISIM) tienen controles de rango que están desactivados por defecto. Enciéndalo y vuelva a intentarlo tal vez ...

    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas