Mapa de puerto VHDL: conecte solo algunos bits de un vector

2

Mi diseño tiene una entidad para la configuración que devuelve std_logic_vectors (longitud definida por genérico, normalmente 32 bits)

entity CenterConfig is
generic (
    -- Width of S_AXI data bus
    C_S_AXI_DATA_WIDTH  : integer   := 32;
    -- Width of S_AXI address bus
    C_S_AXI_ADDR_WIDTH  : integer   := 4
);
port (
    ...
    ...
    center_height: out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
    center_width: out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0)
);
end CenterConfig;

Durante la creación de instancias, solo quiero conectar los pines usados y declarar los otros como ABIERTOS.

Config: CenterConfig 
generic map(
    C_S_AXI_DATA_WIDTH => C_S_AXI_DATA_WIDTH,
    C_S_AXI_ADDR_WIDTH => C_S_AXI_ADDR_WIDTH
)
port map(
    ...
    ...
    center_height(std_center_height'range) => std_center_height,
    center_height(C_S_AXI_DATA_WIDTH-1 downto std_center_height'length) => open, 
    -- not working, not elegant

    center_width(std_center_width'range) => std_center_width
);
  

ERROR: [VRFC 10-1225] center_height parcialmente asociado no puede tener OPEN real [/home/mir3/Compute/ip_repo/Starburst/src/Starburst.vhd:306]

La longitud de std_center_height también se define mediante genéricos. ¿Cómo puedo declarar ABIERTO a los demás de una manera elegante?

¿Hay algo como (otros = > abierto)?

    
pregunta Botnic

2 respuestas

2

Creo que si fuera yo, y como los datos en este caso son solo un vector sin un significado directo (como en, no es un número signed o unsigned ), haría que std_center_height tenga un ancho de C_S_AXI_DATA_WIDTH , para que pueda conectarse a la instanciación de una manera "normal". Entonces solo usaría la constante que define el ancho de std_center_height cuando usa este vector. Algo como:

constant C_STD_CENTER_HEIGHT_WIDTH : integer := 19;
signal std_center_height : std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
signal some_other_vector : std_logic_vector(C_STD_CENTER_HEIGHT_WIDTH-1 downto 0);

...

port map (
  center_height => std_center_height
);

some_other_vector <= std_center_height(C_STD_CENTER_HEIGHT_WIDTH-1 downto 0);

Tenga en cuenta que some_other_vector no es un alias de std_center_height , sino que solo se usa como ejemplo de 'uso de std_center_height en algún otro bit de lógica'.

    
respondido por el scary_jeff
2
  

La longitud de std_center_height también se define mediante genéricos. Cómo puedo   ¿Declara a los otros ABIERTO de una manera elegante?

Hay un problema básico con tus asociaciones:

center_height(std_center_height'range) => std_center_height,
center_height(C_S_AXI_DATA_WIDTH-1 downto std_center_height'length) => open, 
-- not working, not elegant

center_width(std_center_width'range) => std_center_width

Ha especificado que std_center_height y std_center_width dependen de los genéricos, lo que significa que los segmentos especificados son nombres estáticos locales.

IEEE Std 1076-2008 6.5.7.1 La asociación enumera el párrafo 16 (en parte):

  

... Además, cada subelemento escalar del objeto de interfaz declarado explícitamente se asociará exactamente una vez con un real (o subelemento del mismo) en la misma lista de asociación, y todas esas asociaciones aparecerán en una secuencia contigua dentro de esa lista de asociación . Cada elemento de asociación que asocia una porción o un subelemento (o una porción del mismo) de un objeto de interfaz debe identificar el formal con un nombre estático localmente.

La primera de estas dos oraciones da la razón por la cual no puede determinar que cada subelemento esté conectado en el momento del análisis para un segmento que depende de un genérico.

Hay una larga cadena de referencias sobre lo que constituye un nombre estático local (8.1 para 6, nombre estático localmente, 9.4.2 para 2 rango estáticamente local, para 1 g), 16.2.3 Atributos predefinidos de arreglos ('LONGITUD es una función).

No puede tener un nombre estático local que dependa de un subtipo que no sea estático localmente. Eso significa que las tres asociaciones no funcionarán. Puede declarar constantes locales o usar un paquete cuya declaración sea visible tanto para la arquitectura que ejemplifica CenterConfig como para la declaración de entidad para CenterConfig, pero eso no ayuda con el problema ABRIR .

  

¿Hay algo como (others = > open)?

No. 6.5.7.1 Listas de asociación párrafo 18:

  

Es un error si un real de abierto se asocia con un objeto de interfaz formal que se asocia individualmente. Un real de abierto cuenta como la asociación única permitida para el objeto de interfaz formal correspondiente, pero no proporciona una constante, señal o variable (como corresponde a la clase de objeto del formal) al formal .

No puede hacer una asociación individual con algunos subelementos de asociación abiertos, es todo o nada.

Sabemos que puede usar un nombre que no sea de sector como formal, el nombre del puerto en sí mismo es un nombre estático local. Podemos usar datos reales que coincidan con la longitud de los formales, y porque usted quería elegante:

library ieee;
use ieee.std_logic_1164.all;

entity CenterConfig is
    generic (
        C_S_AXI_DATA_WIDTH  : integer   := 32;
        C_S_AXI_ADDR_WIDTH  : integer   := 4
    );
    port (
        center_height: out std_logic_vector(C_S_AXI_DATA_WIDTH - 1 downto 0);
        center_width: out std_logic_vector(C_S_AXI_DATA_WIDTH - 1 downto 0)
    );
end entity CenterConfig;

architecture foo of centerconfig is

begin
end architecture;

library ieee;
use ieee.std_logic_1164.all;

entity instance is
    generic (
           CENTERHEIGHT: integer := 16;      -- because 42 is out or range
           CENTERWIDTH:  integer := 16; 
           C_S_AXI_DATA_WIDTH: integer   := 32;
           C_S_AXI_ADDR_WIDTH: integer   := 4
    );
end entity;

architecture fum of instance is 

    component centerconfig is
        generic (
            C_S_AXI_DATA_WIDTH  : integer   := 32;
            C_S_AXI_ADDR_WIDTH  : integer   := 4
        );
        port (
            center_height: 
                out std_logic_vector(C_S_AXI_DATA_WIDTH - 1 downto 0);
            center_width: 
                out std_logic_vector(C_S_AXI_DATA_WIDTH - 1 downto 0)
        );
    end component;

    signal full_center_height: std_logic_vector 
                        (C_S_AXI_DATA_WIDTH - 1 downto 0);
    signal full_center_width:  std_logic_vector
                        (C_S_AXI_DATA_WIDTH - 1 downto 0);

    alias std_center_height: std_logic_vector(CENTERHEIGHT - 1  downto 0) is
        full_center_height (CENTERHEIGHT - 1  downto 0);
    alias std_center_width: std_logic_vector(CENTERWIDTH - 1  downto 0) is
        full_center_height (CENTERWIDTH - 1  downto 0);
begin

Config: 
    CenterConfig 
        generic map (
            C_S_AXI_DATA_WIDTH => C_S_AXI_DATA_WIDTH,
            C_S_AXI_ADDR_WIDTH => C_S_AXI_ADDR_WIDTH
        )
        port map (
            center_height => full_center_height,
            center_width => full_center_width
        );
 Monitor:
     process (std_center_height, std_center_width) 
     begin
         report "std_center_height length = " & 
                 integer'image(std_center_height'length);
         report "std_center_width length = " & 
                 integer'image(std_center_width'length);
     end process;
end architecture;

Puede utilizar alias de segmentos de la señal utilizada con el nombre deseado.

Y este ejemplo analiza, elabora y simula:

ghdl -a center_config.vhdl
ghdl -e instancia
instancia de ghdl -r
center_config.vhdl: 71: 10: @ 0ms: (nota de informe): std_center_height length = 16
center_config.vhdl: 73: 10: @ 0ms: (nota de informe): std_center_width length = 16

Y esto evita el requisito de nombres localmente estáticos usando rebanadas o tratando de especificar asociaciones abiertas basadas en genéricos.

    
respondido por el user8352

Lea otras preguntas en las etiquetas