VHDL: optimizar comparaciones de señales para síntesis

2

Como prefacio, hay ciertos estilos de codificación utilizados en VHDL / Verilog que ayudan a las herramientas de síntesis a inferir hardware diferente (algunos mejor en rendimiento que el otro). Por ejemplo, usar una escalera if-else-if inferiría una serie de mux'es, mientras que una declaración de caso inferiría un multiplexor ancho único. Estos estilos de codificación no son significativos cuando se realiza solo la simulación funcional, pero son sustanciales cuando se dirige a la RTL para la implementación ASIC o FPGA. En el caso de los FPGA, la arquitectura CLB (bloque lógico configurable) define las capacidades logradas utilizando RTL (como el ancho de entrada de la LUT).

Llegando a la pregunta, he visto muchos casos en los que dos señales de ancho de n bits deberían compararse en VHDL. Y necesito un consejo sobre la inferencia de hardware. Usaré el siguiente fragmento de código para limitar aún más la pregunta.

signal counter_a: unsigned(31 downto 0);
signal counter_b: unsigned(31 downto 0);
signal clk, trigger_en, count_b_en : std_logic;

counter_a_gen: process (clk) begin
    if(rising_edge(clk)) then
        counter_a <= counter_a + 1; -- free running counter
    end if;
end process;

counter_b_gen: process (clk) begin
    if(rising_edge(clk)) then
        if(count_b_en = '1') then
            counter_b <= counter_b + 1;
        else 
            counter_b <= (others => '0');
        end if;
    end if;
end process;

-- compare the counters to generate some logic
trigger_gen: process (clk) begin
    if(rising_edge(clk)) then
        if(counter_a = counter_b) then
            trigger_en <= '1';
        else 
            trigger_en <= '0';
        end if;
    end if;
end process;

El fragmento de código anterior tiene dos contadores de 32 bits counter_a y counter_b, que deben compararse en un bloque secuencial. Si considero una LUT de 4 entradas en un FPGA, la comparación necesitaría múltiples niveles de lógica. Un camino de este tipo dificultaría el cumplimiento del tiempo debido a los enormes retrasos combinatorios. Entonces mi pregunta es ¿cómo lo hacemos optimizado? ¿En este caso para aumentar el rendimiento?

    
pregunta electro_sm11

1 respuesta

2
  • Si su circuito puede soportar retrasos en la señal de trigger_en, puede dividir la comparación (por ejemplo, comparadores de 4 8 bits) y canalizar el resultado en varios ciclos.

  • Puede usar varios comparadores en paralelo con valores futuros, manteniendo counter_a + 1, counter_b + 1, counter a + 2, counter a + 3 ... pipeline el resultado de cada comparador (como se muestra arriba), luego decida qué comparación es válida a partir del valor de count_b_en durante los últimos 2 o 3 ciclos. Un montón de hardware!

"Gran retraso combinatorio": realmente depende de su frecuencia objetivo. Los FPGA tienen una propagación de acarreo rápida y rutas directas entre LUT adyacentes, por lo que los retrasos no son muy grandes para los comparadores de 32 bits. (128 bits es un comparador grande, 32 bits es bastante estrecho)

La sugerencia anterior con mucho hardware puede ser teóricamente más rápida pero prácticamente más lenta a veces porque el hardware adicional agrega retrasos de propagación, carga de señal ...

    
respondido por el TEMLIB

Lea otras preguntas en las etiquetas