declaración de puerto vhdl con diferentes tamaños

0

Estoy escribiendo un modelo vhdl y tengo un problema con la declaración del puerto. Digamos que tengo una entidad entityA que crea una instancia de N entityB . Ahora, entityB tiene un puerto, out , con bits de tamaño M, y M puede variar entre todas las entidades, por lo que out es std_logic_vector(M-1 downto 0) . Estos puertos deben propagarse en un tamaño mayor a entityB .

Si todos los componentes entityB tendrían el mismo tamaño de puerto, digamos FIX_M, la solución sería usar un std_logic_vector(N*FIX_M-1 downto 0) en entityA . Mi problema es que el tamaño M puede variar. La primera solución que me viene a la mente es usar la misma solución, utilizando en lugar de M a MAX_M, pero en ese caso, muchos pines quedarán sin usar (y para la entrada es un problema, ¿verdad?).

¿Tienes una idea mejor? Gracias de antemano.

    
pregunta Alessandro

1 respuesta

2

Utiliza una matriz de tamaños para especificar los tamaños individuales de EntityB. El puerto de EntityA tiene el tamaño calculado por sum .

Los bits coincidentes están divididos por high y low .

función global:

function sum(SIZES) is
  variable count : integer := 0;
begin
  for i in SIZES'range loop
    count := count + SIZES(i);
  end loop;
  return count;
end function;

Ejemplo :

entity EntityA is
  genierc (
    SIZES : integer_vector
  );
  port (
    data(sum(SIZES) - 1 downto 0)
  );
end entity;

architecture rtl of EntityA is
  function high(SIZES, idx) is
  begin
    for i in 0 to idx loop
      pos := pos + SIZES(i);
    end loop;
    return pos - 1;
  end function;
  function low(SIZES, idx) is
  begin
    for i in 0 to idx - 1 loop
      pos := pos + SIZES(i);
    end loop;
    return pos;
  end function;
begin
  genB : for i in SIZES'range generate
    instB : entity work.EntityB
      generic map (
        N => SIZES(i)
      )
      port map (
        data => data(high(SIZES, i) downto low(SIZES, i))
      );
end architecture;

Uso :

signal input : std_logic_vector(13 downto 0);

ex : entity work.EntityA
  generic map (
    SIZES => (2, 3, 4, 5)
  );
  port map (
    data => input
  );
    
respondido por el Paebbels

Lea otras preguntas en las etiquetas