VHDL si se genera en el preámbulo, ¿es posible?

1

¿Es posible generar un conjunto diferente de constantes en un preámbulo vhdl usando una especie de "si genera una declaración"?

Por ejemplo, estaba intentando:

biblioteca ieee; use ieee.std_logic_1164.all;

entity my_entity is
   generic(flag : integer);
   port(x : in std_logic_vector(31 downto 0);
        y : out std_logic_vector(31 downto 0));
end entity my_entity;

architecture arch of my_entity is

   flag_true : if flag /= 0 generate
      constant K1 : integer := 32;
   end generate flag_true;

   flag_false : if flag = 0 generate
      constant K2 : integer 32;
   end generate flag_false;

begin

   flag_true_conc : if flag /= 0 generate
      y(K1 - 1 downto 0) <= not x(K1 - 1 downto 0);
   end generate flag_true_conc;

   flag_false_conc : if flag = 0 generate
      y(K2 - 1 downto 0) <= x(K2 - 2 downto 0) & x(K2 - 1);
   end generate flag_false_conc;

end architecture arch; 

Pero cuando ejecuto ncvhdl para la comprobación de sintaxis, me devuelve muchos errores:

ncvhdl: 14.20-s029: (c) Copyright 1995-2016 Cadence Design Systems, Inc.
architecture arch of my_entity is
                                  |
ncvhdl_p: *E,EXPBEG (entity_test.vhd,10|34): expecting the reserved word 'BEGIN' [1.2].
      constant K1 : integer := 32;
                                   |
ncvhdl_p: *E,EXPBEG (entity_test.vhd,13|35): expecting the reserved word 'BEGIN' [9.7].
      constant K2 : integer 32;
                            |
ncvhdl_p: *E,EXPSMI (entity_test.vhd,17|28): expecting a semicolon (';') [4.3.1.1].
      constant K2 : integer 32;
                                |
ncvhdl_p: *E,EXPBEG (entity_test.vhd,17|32): expecting the reserved word 'BEGIN' [9.7].
   end generate flag_false;
                            |
ncvhdl_p: *E,EXPEND (entity_test.vhd,18|28): expecting the reserved word 'END' [1.2].

No creo que, a excepción del if generado en el preámbulo, he hecho algo extraño.

Suponiendo que te hice entender lo que estoy tratando de lograr, ¿es posible hacerlo?

(Tienes que imaginar la situación en la que en el preámbulo quiero generar un conjunto diferente de constantes en función de algún tipo de indicador o condición).

    
pregunta user8469759

2 respuestas

4

No puede incluir declaraciones (formalmente no hay "preámbulo") en la región declarativa.

Sin embargo, puede ajustar las declaraciones y sus declaraciones asociadas en una instrucción de bloque. Esto mantiene las declaraciones y sus declaraciones muy cerca del alcance, evitando errores en los que las declaraciones están asociadas con las declaraciones erróneas (lo que sería posible en su ejemplo).

Haz eso:

architecture arch of my_entity is
-- declarative region

begin
-- concurrent statement region

   flag_true : if flag /= 0 generate
      -- a block statement
      true_block : block
         constant K1 : integer := 32;
      begin
         y(K1 - 1 downto 0) <= not x(K1 - 1 downto 0);
      end;
   end generate flag_true;

end architecture arch; 

Y una observación:

si /=0 significa true , probablemente haya algo muy malo en el diseño: tiene verdaderos booleanos en VHDL, no tiene que ocultar el significado para poder hacer todo con un entero. Entonces puedes escribir

if flag generate ...
    
respondido por el Brian Drummond
0

Habría agregado esto como un comentario a la respuesta de Brian, pero quería incluir el código y hacerlo legible.

Con las declaraciones generate , no necesita una instrucción de bloqueo. A partir de VHDL-1993, las declaraciones generate pueden tener regiones declarativas. Por ejemplo:

architecture arch of my_entity is
-- declarative region

begin
-- concurrent statement region

   flag_true : if flag /= 0 generate
      -- declarative region (scope limited to generate)
      constant K1 : integer := 32;
   begin
      y(K1 - 1 downto 0) <= not x(K1 - 1 downto 0);
   end generate flag_true;

end architecture arch;

De hecho, el ejemplo de Brian requiere VHDL '93 o posterior con el uso de end architecture ... . De la Guía del diseñador para VHDL :

  

En VHDL-87, la entidad de palabras clave puede no estar incluida al final de una declaración de entidad, y la arquitectura de palabras clave puede no estar incluida al final de un cuerpo de arquitectura.

Y según el OP, el hecho de que estén usando end entity ... y end architecure ... , pueden usar la región declarativa generate .

    
respondido por el PlayDough

Lea otras preguntas en las etiquetas