Sé que las entidades pueden usar tipos de matriz sin restricciones (como STD_LOGIC_VECTOR
) en su lista de puertos, que se dimensionarán automáticamente para que coincidan con la señal conectada en el mapa del puerto cuando se instancian (y posiblemente diferentes tamaños para cada instancia). Dentro de la entidad, los atributos como 'LENGTH
y 'HIGH
se pueden usar para descubrir el rango instanciado real.
Tengo un objeto de este tipo, que es un convertidor paralelo -> serie (acepta 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 a la inversa, 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 fuentes de datos que producen flujos de datos de varios anchos, lógica de arbitraje para muestrear y serializar estas fuentes por turnos, y convertidores paralelo->serie que realizan la serialización real y el protocolo de enlace con la lógica de arbitraje del bus.
En este momento, tengo los anchos de señal especificados como constantes en un paquete, pero esto significa que cada vez que cambia el formato de datos de transmisión, 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.
Lo mejor es usar genéricos. Aquí hay una declaración de entidad de ejemplo 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 crea una instancia de este registro de desplazamiento, lo haría 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 en 8. Cuando lo instalé, podría haber dejado 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 es posible. Pero si es necesario, siempre puede declarar algunas constantes en su paquete y usarlas más adelante. No es muy limpio, pero funciona.
ben voigt
usuario3624
ben voigt
parallel_out <= some_data & some_more_data & even_more_data;
. Eso realmente controla qué tan ancho debe ser el puerto de salida, cuando agregoyet_more_data
a la salida, el rango de la matriz tiene que aumentar. Luego necesito una constante en un archivo de paquete, para hacer que todas las señales que enrutan esos datos coincidan con el ancho, y la necesidad de mantener eso sincronizado es lo que estoy tratando de eliminar.usuario3624
ben voigt
usuario3624
ben voigt
ben voigt