VHDL Puerto sin restricciones en una entidad

3

Tengo un problema con la definición de una entidad. Estoy escribiendo una envoltura que acepta varios genéricos. Entre estos genéricos hay algunos valores booleanos que tienen la función de habilitar o deshabilitar la transmisión de alguna señal de entrada a la salida de la entidad. Me gustaría tener el ancho de la señal de salida relacionada con los valores booleanos. Esto es lo que quiero hacer:

entity of DUT is 
   generic( 
     DATA_1_WIDTH : natural := 16;
     DATA_2_WIDTH : natural := 16;
     SWITCH_1 : boolean := FALSE;
     SWITCH_2 : boolean := FALSE;
     ....
     );
   port (
     clk : in std_logic;
     rst : in std_logic;
     DATA_1 : in std_logic_vector(DATA_1_WIDTH - 1 downto 0);
     DATA_2 : in std_logic_vector(DATA_2_WIDTH - 1 downto 0);
     ....
     DATA_OUT : out std_logic_vector);

Cuando el ancho de "DATA_OUT" cambie con los valores de los interruptores:

  • Cuando SWITCH_1 = TRUE y SWITCH_2 = TRUE = > ancho de DATA_OUT = DATA_1_WIDTH + DATA_2_WIDTH + constante;
  • Cuando SWITCH_1 = TRUE y SWITCH_2 = FALSE = > ancho de DATA_OUT = DATA_1_WIDTH + constante;

Y así sucesivamente.

¿Puede alguien decirme una manera de hacer esto?

    
pregunta haster8558

1 respuesta

6

Dependiendo de cómo funcione el resto de su entidad, es posible que pueda dejar DATA_OUT como una matriz sin restricciones. Esto significa que no le da un ancho en el mapa de puertos, y que toma el ancho de la señal que se conecta a él en la entidad de creación de instancias. Básicamente, esto hace que el problema suba un nivel en la jerarquía.

También puedes lograr esto usando una función. Cree un paquete para su diseño, y dentro de esto cree una función, algo como esto:

function GetDataOutWidth(Switch1, Switch2 : boolean; Data1Width, Data2Width : integer) return integer is
  constant WidthConstant : integer := 2; -- Or whatever
begin
  if (Switch2) then
    return Data1Width + Data2Width + WidthConstant;
  else
    return Data1Width + WidthConstant;
  end if;
end function;

Tu código puede usar esta función en el mapa del puerto, algo como esto:

DATA_OUT : out std_logic_vector(GetDataOutWidth(SWITCH_1, SWITCH_2, DATA_1_WIDTH, DATA_2_WIDTH)-1 downto 0)
    
respondido por el scary_jeff

Lea otras preguntas en las etiquetas