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.