es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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:

    señal s_out: std_logic_vector(31 downto 0);
    
    WHATEVER: entity work.example_entity
      port map(
        o_port => s_out
      );
    
    signal s_a: std_logic_vector(11 downto 0);
    s_a <= s_out(15 downto 4);
    

    Aquí, se asigna el puerto de salida completo o_port a s_out, y luego se asigna a s_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:

    signal s_out: std_logic_vector(31 downto 0);
    
    WHATEVER: entity work.example_entity
      port map(
        o_port => s_out
      );
    
    signal s_a: std_logic_vector(11 downto 0);
    s_a <= (s_out and x"F00") >> 4;
    

    Aquí, s_out se enmascara primero con el valor hexadecimal F00 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 en s_a.

Comments are closed.