Diferencia entre la instrucción If-else y Case en VHDL

10

Quiero entender cómo las diferentes construcciones en el código VHDL se sintetizan en RTL.

  • ¿Puede alguien decirme la diferencia entre la construcción If-Else y Declaración de caso ¿las construcciones de un proceso en VHDL en términos de cómo el código es inferido en el circuito RTL por la herramienta de síntesis?
  • Considere el caso de múltiples anidadas if-else y mezcla declaraciones de caso con if-else construidas dentro de un proceso.
  • ¿También cuándo usar qué construcción?

PS: He visto una pregunta relacionada "Múltiples declaraciones if en proceso en vhdl", pero eso no responde mi pregunta de ninguna manera.

    
pregunta nurabha

2 respuestas

10
  

¿Puede alguien decirme la diferencia entre el constructo If-Else y los constructos de declaración de caso de un proceso en VHDL en términos de cómo el código es inferido en el circuito RTL por la herramienta de síntesis?

La construcción if-elsif-else infiere una red de enrutamiento de prioridad:

simular este circuito : esquema creado usando CircuitLab

Esto corresponde a

if bool_expr_1 then
    sig <= val_expr_1;
elsif bool_expr_2 then
    sig <= val_expr_2;
elsif bool_expr_3 then
    sig <= val_expr_3;
else
    sig <= val_expr_4;
end if;

La construcción case , por otro lado, infiere un gran ol 'mux:

Esto corresponde a

case case_expr is
  when c0 =>
    sig <= val_expr_0;
  when c1 =>
    sig <= val_expr_1;
  when c2 =>
    sig <= val_expr_2;
      ...
  when others =>
    sig <= val_expr_N;
end case;

Obviamente, estos son diseños muy simplificados con una sola expresión de valor, lo que da como resultado una salida.

  

Considere el caso de múltiples declaraciones anidadas if-else y mezcla de casos con if-else dentro de un proceso.

Por lo anterior, puedes ver cómo se anidarían / mezclarían.

  

¿También cuándo usar qué construcción?

Dado que if-else infiere prioridad, debe usarse cuando se pueda producir más de una condición de entrada. El uso de case , por otro lado, es apropiado cuando las entradas se excluyen mutuamente.

    
respondido por el Angelo Stavrow
4

En esta antigua publicación del blog , el autor escribió y sintetizó dos versiones funcionalmente equivalentes de código VHDL. Una usando if-else, la otra usando case. El resultado:

  

Sinteticé este código y obtuve los resultados exactos. Incluso la RTL   El esquema fue exactamente igual para ambos programas.

Y su conclusión:

  

Esto muestra que las declaraciones 'case' y 'if ... elsif ... else' son ambas   igualmente eficiente. Pero si desea escribir un código claro, entonces   mejor uso "caso". "caso" es muy útil cuando la salida depende de un   gran cantidad de condiciones. Pero si la cantidad de condiciones es muy   pequeño (2 o 3), entonces puede usar 'if..elseif..else'.

También hay docenas de publicaciones sobre este tema en Stack Overflow para cada posible idioma. La conclusión es generalmente la misma, que no hay diferencia en cuanto al rendimiento. Ocasionalmente, si hay una gran cantidad de casos, un compilador puede ser lo suficientemente inteligente como para crear una tabla de consulta que produzca un rendimiento ligeramente mejor.

Un sintetizador VHDL puede hacer algo similar. Pero aún necesitaría una gran cantidad de casos, en cuyo caso (es probable que haga un juego de palabras) probablemente quiera usar una declaración de caso de todos modos, ya que proporciona una mejor legibilidad donde hay una gran cantidad de opciones.

    
respondido por el embedded.kyle

Lea otras preguntas en las etiquetas

Comentarios Recientes

No hay diferencia entre las declaraciones de caso o las declaraciones If-else en VHDL. Tienes que leer entre líneas para saber qué está pasando. Hay una serie de estándares que definen lo que puede hacer en el campo de los "hilos". La diferencia entre If-If y Herencia Hasta ahora hemos mencionado que la Interfaz de método externo común (CFMUI) se usa para implementar declaraciones de casos en DllCreate, pero eso no debería eliminar las formas comunes de implementar el estado compartido en VHDL, como controlar... Lees verder