Agregado de 2 vectores en VHDL

Estoy comprobando lo que puedo y no puedo hacer al agregar y concatenar en VHDL.

si bien puedo combinar dos vectores concatenándolos, sigo recibiendo un error si uso agregado.

Vi una respuesta aquí que muestra que es posible.

¿Alguien puede explicar por qué están dando errores, o tal vez es el idioma que no permite esto?

Agradezco cualquier sugerencia.

aquí está mi código. Marqué las líneas correctas e incorrectas. Uso ModelSim. Comento/elimino el comentario al verificar para evitar varios controladores.

architecture RTL of example_array is
--signal Z_BUS                                  : std_logic_vector(7 downto 0);
--signal R_BUS                                  : std_logic_vector(3 downto 0);
--signal A_BIT, B_BIT, C_BIT, D_BIT     : std_logic;

signal T_BUS                                    :  std_logic_vector(7 downto 0);
signal Y_BUS                                    :  std_logic_vector(7 downto 0);
signal U_BUS                                    :  std_logic_vector(3 downto 0);
signal P_BUS                                    :   std_logic_vector(3 downto 0);
signal E_BIT, F_BIT, G_BIT, H_BIT       :  std_logic;

BEGIN
Z_BUS <= A_BIT & R_BUS & B_BIT & C_BIT & D_BIT;                 -- correct
--Z_BUS <= W_BUS & R_BUS;                                       -- correct

P_BUS <= (E_BIT, F_BIT, G_BIT, H_BIT);                          -- correct
U_BUS <= (E_BIT, F_BIT, G_BIT, H_BIT);                          -- correct


(E_BIT, F_BIT, G_BIT, H_BIT)    <= std_logic_vector'("1011");       -- correct
(E_BIT, F_BIT, G_BIT, H_BIT)    <= P_BUS(3 downto 0);               -- correct
(E_BIT, F_BIT, G_BIT, H_BIT)    <= P_BUS;                           -- correct
Y_BUS <= (2 => '1', 3 => F_BIT, 1 downto 0 => '0', others => '0');  -- correct

--T_BUS(7 downto 0) <= (U_BUS(3 downto 0), P_BUS(3 downto 0));  -- WRONG!!
--T_BUS <= (U_BUS, P_BUS);                                      -- WRONG!!
--(U_BUS(3 downto 0), P_BUS(3 downto 0)) <= T_BUS(7 downto 0);  -- WRONG!!

END architecture RTL;
(U_BUS(3 downto 0), P_BUS(3 downto 0));es una agregación, no una concatenación (por ejemplo T_BUS <= U_BUS & P_BUS;, ). Para la asignación agregada, no ha especificado la versión de VHDL, anterior a o -2008 type nybble_array is array (0 to 1) of std_logic_vector(3 downto 0);y (U_BUS, P_BUS) <= nybble_array'(T_BUS (7 downto 4), T_BUS (3 downto 0));necesita un elemento a la derecha para cada elemento a la izquierda. El tipo tiene que ser discernible del contexto. El tipo de elemento tiene que ser el mismo.
Está pidiendo descomposición, no agregación ... Sé que LRM lo llama "agregado" en el BNF de destino . Esto se debe a que el LRM de alguna manera es perezoso al reutilizar las reglas BNF existentes. Pero el término técnicamente correcto es descomposición, cuando aparece un agregado en el lado izquierdo de una asignación.
@Paebbels: IEEE Std 1076-2008 describe la descomposición estructural del modelo de diseño , VHDL es un lenguaje de descripción de hardware. El término no se encuentra en el Glosario de términos de ingeniería de software (IEEE Std 610.12-1990) de la época en que se creó el estándar VHDL, mientras que 610.12-2012 lo define como 2. la partición de una función modelada en sus funciones componentes . Eso no encaja bien con la asignación como una operación básica impenetrable (5.1). El VHDL Extended BNF describe la sintaxis que para un agregado sigue siendo la misma ya sea que se use como expresión o destino de asignación.
@ user8352 Sé lo que dice el texto en VHDL LRM. Soy el vicepresidente del grupo de trabajo IEEE P1076... El término agregado significa "colección". Eso es cierto para el lado derecho de una asignación, pero no para el lado izquierdo (LHS). El LHS es la operación inversa: una operación dividida. Se llama descomposición o desempaquetado. La forma correcta en el LRM de VHDL sería tener, por ejemplo, una regla BNF de descomposición, que es un alias para la regla agregada. Otras partes del LRM hacen un uso intensivo de estos "redireccionamientos" de BNF.
El problema es el funcionamiento básico . La asignación no es una función. Eso se escribe 'vicio'. Anexo I - agregado: ( B ) Una especie de destino de una instrucción de asignación de variable o instrucción de asignación de señal que asigna un valor compuesto. Entonces se dice que el objetivo tiene la forma de un agregado. El estándar es internamente consistente.

Respuestas (1)

Use la Biblioteca VHDL-2008 en ModelSim y su error se resolverá. Los paquetes VHDL-93/2002 no admiten la agregación de vectores como la que ha expresado.

No hay un operador de coma. Un agregado es una expresión, requiere paréntesis e incluye una o más asociaciones posicionales o con nombre separadas por comas. La nueva característica de -2008 es que los elementos de asociación de agregados de matriz pueden ser del tipo del propio agregado además del tipo de elemento agregado. Las revisiones anteriores solo admiten elementos de asociación del tipo de elemento agregado. El tipo del agregado, su tipo de elemento y tipo de índice (para asociación nombrada) se derivan del contexto. Agregación no concatenación. Su solución funciona, su explicación necesita trabajo.