VHDL: Demultiplexar una señal a una de las muchas salidas mientras se conducen las salidas no utilizadas a '0'

2

Estoy intentando crear VHDL sintetizable que demultiplexará un flujo de señal continuo de un bit en una de las muchas salidas. Las salidas que no se están enviando esta secuencia deben establecerse en '0'. Vea la imagen a continuación para obtener una idea de lo que estoy tratando de lograr.

El código que he escrito para crear esta funcionalidad es:

send_s         <= (line_select_s => prbs_i(0), others => '0');

donde 'prbs_i (0)' es el flujo de señal.

Desafortunadamente, esto no se puede sintetizar en Vivado, dando el error:

[Synth 8-211] could not evaluate expression: aggregate choice expression

¿Hay una manera adecuada de hacer esto? El VHDL simula bien pero no sintetiza.

    
pregunta BenAdamson

2 respuestas

3

El problema con su código es que una asignación del formulario:

a <= (3 => '0', others => '1');

debe usar constantes para las compensaciones que se asignan (en este caso, 3).

Si necesita que el desplazamiento se configure para variar, debe dividirlo en dos asignaciones. Tenga en cuenta que esto solo funcionará dentro de un proceso; con un par de asignaciones concurrentes, se encontraría con un problema de varios controladores.

process (line_select_s, prbs_i)
begin
  send_s <= (others => '0');
  send_s(line_select_s) <= prbs_i(0);
end process;

Esto funciona porque aunque comenzamos asignando '0' a todo el vector, la última asignación a una señal en particular en un proceso tendrá prioridad.

Una alternativa es usar un bucle:

process (line_select_s, prbs_i)
begin
  send_s <= (others => '0');
  for i in send_s'range loop
    if (i = line_select_s) then
      send_s(i) <= prbs_i(0);
    end if;
  end loop;
end process;

Esto tiene la ventaja de que si su señal de selección puede representar un desplazamiento mayor que el ancho de su vector objetivo, no se producirá ningún error en la simulación. Un escenario de ejemplo sería una señal de selección de 3 bits, pero un vector objetivo con solo 5 elementos; el primer método produciría un error si la señal de selección representara 6, 7 u 8, pero el segundo no.

Como nota al margen, es posible que desee hacer que un proceso como este sea sincrónico si desea obtener el mejor rendimiento (en términos de frecuencia de operación máxima) de su diseño.

    
respondido por el scary_jeff
1

Muchas formas están ahí. Una forma sencilla de hacerlo es, mediante el modelo de flujo de datos:

with line_select_s select
send_s <= (send_s & "0000") when "000",
        ('0' & send_s & "000") when "001",
        ("00" & send_s & "00") when "010",
        ("000" & send_s & '0') when "011";
        ("0000" & send_s) when "100";
         "00000" when others;
    
respondido por el MITU RAJ

Lea otras preguntas en las etiquetas