Alguém pode me dizer a diferença entre a construção If-Else e a construção Case de um processo em VHDL em termos de como o código é inferido no circuito RTL pela ferramenta de síntese?
A if-elsif-else
construção infere uma rede de roteamento prioritário:
simular este circuito - esquemático criado usando o CircuitLab
Isso 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;
A case
construção, por outro lado, infere um grande ol 'mux:
Isso 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, esses são designs muito simplificados, com apenas uma expressão de valor, resultando em uma saída.
Considere o caso de vários if-else aninhados e a mistura de instruções de caso com a construção if-else dentro de um processo.
De acordo com o acima, você pode ver como eles aninham / misturam.
Também quando usar qual construção?
Como if-else
deduz a prioridade, ele deve ser usado quando mais de uma condição de entrada puder ocorrer. O uso case
, por outro lado, é apropriado quando as entradas são mutuamente exclusivas.
dec
/jz
instruções, o que é muito mais eficiente. Talvez uma otimização semelhante seja aplicada aqui.