11 votos

Diferencia entre la sentencia If-else y Case en VHDL

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

  • ¿Puede alguien decirme la diferencia entre If-Else construir y Declaración del caso construcciones de un proceso en VHDL en términos de cómo el código se infiere en el circuito RTL por la herramienta de síntesis?
  • Considere el caso de múltiples if-else anidados y mezclando declaraciones case con if-else dentro de un proceso.
  • También, ¿cuándo utilizar qué construcción?

PD: He visto una pregunta relacionada "Múltiples sentencias if en proceso en vhdl" pero eso no responde a mi pregunta de ninguna manera.

13voto

quackingduck Puntos 1091

¿Puede alguien decirme la diferencia entre las construcciones If-Else y Case 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?

El if-elsif-else infiere una red de enrutamiento prioritario:

schematic

simular este circuito - Esquema creado con 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;

El case construir, por otro lado, infiere un gran mux:

enter image description here

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;

Evidentemente, se trata de diseños muy simplificados con una sola expresión de valor, que da lugar a una sola salida.

Considere el caso de múltiples if-else anidados y la mezcla de declaraciones case con construcciones if-else dentro de un proceso.

Según lo anterior, se puede ver cómo anidarían/se mezclarían.

También, ¿cuándo utilizar qué construcción?

Desde if-else infiere la prioridad, debe utilizarse cuando puede darse más de una condición de entrada. Utilizando case por otro lado, es apropiado cuando las entradas son mutuamente excluyentes.

4voto

Morris Maynard Puntos 49

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

Sinteticé este código y obtuve los mismos resultados, incluso el esquema RTL Incluso el esquema RTL era exactamente el mismo para ambos programas.

Y su conclusión:

Esto demuestra que las sentencias 'case' y 'if...elsif...else' son igualmente eficientes. Pero si quieres escribir un código claro, entonces es mejor que uses 'case'. Pero si quieres escribir un código claro, entonces es mejor que utilices 'case'. Pero si el número de condiciones es muy pequeño, la salida se puede Pero si el número de condiciones es muy pequeño (2 o 3) entonces puedes usar 'if..elseif..else'.

También hay docenas de puestos sobre este tema en Stack Overflow para todos los lenguajes imaginables. La conclusión es generalmente la misma, que no hay ninguna diferencia en cuanto al rendimiento. Ocasionalmente, si hay un gran número de casos, un compilador puede ser lo suficientemente inteligente como para crear una tabla de búsqueda que produzca un rendimiento ligeramente mejor.

Un sintetizador VHDL puede ser capaz de hacer algo similar. Pero todavía necesitaría un gran número de casos en cuyo caso (juego de palabras) probablemente querría utilizar una declaración de caso de todos modos, ya que proporciona una mejor legibilidad cuando hay un gran número de opciones.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X