VHDL: utilizando solo una porción de la salida
Tengo una entidad instanciada que tiene un puerto de salida de 32 bits. Solo necesito los bits del 4 al 15 que irán en alguna señal “s_a”. Pensé que podía instanciarlo de esta manera, pero Vivado no lo permite:
WHATEVER: entity work.example_entity
port map(
o_port( 15 downto 4 ) => s_a
);
Sé que se puede hacer algo análogo con puertos de entrada y Vivado parece estar bien con eso siempre y cuando establezca todos los bits en algo así:
WHATEVER2: entity work.other_entity
port map(
i_port( 7 downto 4 ) => ( others => '0' ),
i_port( 3 downto 0 ) => s_b
);
donde “i_port” es un puerto de entrada y “s_b” es alguna señal con tamaño y tipo adecuados.
¿Existe alguna manera de extraer solo un subconjunto de bits de un puerto de salida sin conectar todo el puerto a una señal de ancho completo y extraer los bits de ella?
davy.ai
Desafortunadamente, no es posible extraer un subconjunto de bits directamente de un puerto de salida en VHDL. La razón de esto es que un puerto de salida está destinado a enviar un valor completo al mundo externo, y no es factible enviar solo un subconjunto de bits sin lógica adicional.
La solución alternativa en esta situación es asignar el puerto de salida completo a una señal y luego extraer los bits necesarios de la señal. Esto se puede hacer utilizando una porción o una operación bit a bit.
Por ejemplo:
Aquí, se asigna el puerto de salida completo
o_port
as_out
, y luego se asigna as_a
el subconjunto de bits requerido usando una porción.Alternativamente, se puede utilizar una operación bit a bit para enmascarar o desplazar los bits según sea necesario:
Aquí,
s_out
se enmascara primero con el valor hexadecimalF00
para preservar solo los bits 4 a 15, y luego se desplaza a la derecha 4 bits para alinear el subconjunto con los bits deseados ens_a
.