¿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:
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:
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.