¿Es posible aplicar la restricción de rango STD_LOGIC_VECTOR de abajo hacia arriba?

5

Sé que las entidades pueden usar tipos de arreglos no restringidos (como STD_LOGIC_VECTOR ) en su lista de puertos, que se dimensionarán automáticamente para coincidir con la señal conectada en el mapa de puertos cuando se ejemplifiquen (y posiblemente tamaños diferentes para cada instanciación). Dentro de los atributos de la entidad, como 'LENGTH y 'HIGH , se pueden usar para descubrir el rango real instanciado.

Tengo un objeto de este tipo, que es un paralelo - > convertidor en serie (acepte entradas de cualquier tamaño, las entradas más anchas requieren más ciclos de reloj para escupir).

¿Es posible hacer que la inferencia de rango funcione en sentido inverso, es decir, tener el rango especificado en un subcomponente, aplicado a una señal sin restricciones en el componente principal y propagado desde allí a otros componentes?

Más detalles:

Mi aplicación tiene una serie de subcomponentes de fuente de datos que producen flujos de datos de diversos anchos, lógica de arbitraje para muestrear y serializar estas fuentes round-robin, y convertidores en serie > paralelos que realizan la serialización real y el protocolo de enlace con la lógica de arbitraje de bus.

En este momento tengo los anchos de señal especificados como constantes en un paquete, pero esto significa que siempre que cambie el formato de los datos de flujo, tengo que cambiar tanto el subcomponente de origen como el paquete. Realmente me gustaría que el ancho se especifique solo en el componente de origen, ya que los componentes posteriores se adaptan a cualquier ancho.

    
pregunta Ben Voigt

1 respuesta

6

Lo mejor es usar genéricos. Aquí hay un ejemplo de declaración de entidad para un registro de desplazamiento:

entity shift_register is
  generic (n_bits :integer := 8);
  port (clk  :std_logic;
        din  :std_logic_vector (n_bits-1 downto 0);
        dout :std_logic);
end entity shift_register;

Cuando creas una instancia de este registro de turnos, lo harías así:

signal data :std_logic_vector (15 downto 0);
...
U0:  shift_register 
  generic map (n_bits => data'length)
  port map (clk, din, out);

En la entidad, definí el valor predeterminado de n_bits a 8. Cuando lo instalé podría haber omitido el mapa genérico y luego se usaría el valor predeterminado de n_bits.

EDITAR: Para responder mejor a tu pregunta. Ir en "reversa" realmente no funciona tan bien, y lo evitaría si fuera posible. Pero si debe hacerlo, entonces siempre puede declarar algunas constantes en su paquete y usarlas más arriba. No está muy limpio, pero funciona.

    
respondido por el user3624

Lea otras preguntas en las etiquetas