VHDL - rango de dirección de longitud variable genérico

2

Me gustaría tener algo genérico de longitud variable en mi entidad, sin embargo, parece que la dirección del rango predeterminado es to lo que colisiona con los rangos de señales internas que se declaran con downto .

entity my_entity is
    generic (
        GEN: std_ulogic_vector := b"100_0000_0000_0000_0000_1000" &
                                  b"0000_0000_0000_0000_0000_0000" &
                                  b"0000_0000_0001"
    );
    port (
        clk: in std_ulogic;
        reset: in std_ulogic;
        a: in std_ulogic_vector(63 downto 0);
        b: out std_ulogic_vector(63 downto 0)
    );
end;

¿Existe algún mecanismo específico de idioma para informar a las herramientas de VHDL que la dirección del rango de GEN es downto no to ? En este momento, la única solución que se me ocurre es usar una constante adicional en la parte declarativa de la arquitectura con el mismo valor pero con una dirección de rango diferente.

    
pregunta Al Bundy

2 respuestas

2

Porque casi siempre hay más de una manera:

library ieee;
use ieee.std_logic_1164.all;
entity my_entity is
    generic (
        UNBOUND_GEN: std_ulogic_vector := b"100_0000_0000_0000_0000_1000" &
                                  b"0000_0000_0000_0000_0000_0000" &
                                  b"0000_0000_0001"
    );
    port (
        clk: in std_ulogic;
        reset: in std_ulogic;
        a: in std_ulogic_vector(63 downto 0);
        b: out std_ulogic_vector(63 downto 0)
    );
    alias  GEN: std_ulogic_vector (UNBOUND_GEN'length - 1 downto 0) 
              is UNBOUND_GEN;
end entity;

El alias también se puede declarar como un elemento declarativo de la arquitectura o en la región declarativa de encierro inmediato de donde se utiliza en una arquitectura.

En una implementación de herramienta VHDL compatible con -2008, se puede prescindir del alias y se puede usar una segunda declaración genérica que depende de la primera:

library ieee;
use ieee.std_logic_1164.all;
entity my_entity1 is
    generic (
        UNBOUND_GEN: std_ulogic_vector := b"100_0000_0000_0000_0000_1000" &
                                  b"0000_0000_0000_0000_0000_0000" &
                                  b"0000_0000_0001";
        GEN: std_ulogic_vector (UNBOUND_GEN'length - 1 downto 0) := UNBOUND_GEN

    );
    port (
        clk: in std_ulogic;
        reset: in std_ulogic;
        a: in std_ulogic_vector(63 downto 0);
        b: out std_ulogic_vector(63 downto 0)
    );
    -- alias  GEN: std_ulogic_vector (UNBOUND_GEN'length - 1 downto 0)
    --           is UNBOUND_GEN;
end entity;
    
respondido por el user8352
1

Por lo que sé, no hay una manera de informar a las herramientas de una dirección sin especificar también el rango.

Normalmente, si necesitara un genérico de longitud variable, usaría un segundo genérico para definir su longitud. Usando tu ejemplo se vería así:

entity my_entity is
    generic (
        GEN_LEN: positive := 59; -- positive forces len >= 1
        GEN: std_ulogic_vector(GEN_LEN-1 downto 0) := 
                                  b"100_0000_0000_0000_0000_1000" &
                                  b"0000_0000_0000_0000_0000_0000" &
                                  b"0000_0000_0001"
    );
    port (
        clk: in std_ulogic;
        reset: in std_ulogic;
        a: in std_ulogic_vector(63 downto 0);
        b: out std_ulogic_vector(63 downto 0)
    );
end;

Entiendo que esto probablemente no sea tan bonito como lo que esperabas. Aunque maneja tu caso de uso.

    
respondido por el Lincoln

Lea otras preguntas en las etiquetas