¿Cómo se escalan las declaraciones de casos VHDL cuando se agregan expresiones adicionales?

0

Estoy usando una declaración de caso en VHDL donde la expresión es una dirección de bus de 12 bits y la salida es un bus de datos de 32 bits.

Aquí está mi código:

process (iAPB_BUS_IN.pclk)  
begin
  if rising_edge(iAPB_BUS_IN.pclk) then
    if (write_pulse = '1') then
      case bus_addr is
      when TX_CTRL    =>        
          rd_data(31)             <= tx_enable;
          rd_data(30)             <= arb_suppress_mgmt;           
          rd_data(29)             <= arb_suppress_2022;           
          rd_data(28 downto 0)    <= (others => '0');

        when TX_STATUS    =>
          rd_data(31 downto QUEUE_NUMBER)   <= (others => '0'); 
          rd_data(QUEUE_NUMBER -1 downto 0) <= tx_que_avalb;

        when RX_CTRL    =>
          rd_data(31)                       <= rx_enable;
          rd_data(30)                       <= rx_allow_tcp;
          rd_data(29 downto 0)              <= (others => '0');
        --------------------------------------------------
        -- What happens if I add another expression below?
        --------------------------------------------------
        when RX_CTRL2    =>
          rd_data(31)                       <= rx_que;
          rd_data(30)                       <= rx_allow_udp;
          rd_data(29 downto 0)              <= (others => '0');
      end case;
    end if;
end process;

Aquí hay algunas respuestas que dan un ejemplo de síntesis de declaraciones de casos (como esta ) , pero no dan ningún detalle sobre cuántas LUT se utilizan.

Me gustaría saber cómo juzgar cuántas LUT adicionales se agregarán si agrego otra cuando declaración.

    
pregunta Klik

1 respuesta

1

La única forma es probarlo y ver, en la tecnología FPGA que necesita.

Una respuesta general sería "unas pocas LUT y FF adicionales" (tal vez decenas) para cada cláusula adicional, pero ocasionalmente te topas con un comportamiento de la herramienta de síntesis menos que óptimo que agrega muchas más.

No hay magia involucrada, una buena herramienta de síntesis agregará tantas puertas como lo harías expandiendo expresiones booleanas, simplificando los mapas de Karnaugh y dibujando la lógica a mano. Solo, en segundos en lugar de horas ...

Dado que es probable que bus_addr sea escaso (aquí, 4092 direcciones no utilizadas) recomiendo encarecidamente una cláusula "cuando otros" para definir el comportamiento de direcciones desconocidas. Puede ser tan simple como

when others     => 
                   rd_data <= (others => '-');

es decir, No importa, dando permiso de síntesis para hacer lo que quiera, para optimizar el tamaño de la lógica. Pruebe (others => '0') para un comportamiento más limpio y compare el tamaño resultante.

También puede simplificar estos brazos de caso, por ejemplo a

when RX_CTRL    => 
                   rd_data <= (31 =>rx_enable, 30=> rx_allow_tcp, others => '0');

No debería afectar la lógica generada en absoluto.

    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas