Eu quero entender como diferentes construções no código VHDL são sintetizadas em RTL.
- Alguém pode me dizer a diferença entre a construção If-Else e a instrução Case de um processo em VHDL em termos de como o código é inferido no circuito RTL pela ferramenta de síntese?
- Considere o caso de vários if-else aninhados e misture instruções de caso com a construção if-else dentro de um processo.
- Também quando usar qual construção?
PS: Eu vi uma pergunta relacionada "Múltiplas declarações if em andamento no vhdl", mas isso não responde à minha pergunta de qualquer maneira.
vhdl
code-design
rtl
nurabha
fonte
fonte
dec
/jz
instruções, o que é muito mais eficiente. Talvez uma otimização semelhante seja aplicada aqui.Respostas:
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
A
case
construção, por outro lado, infere um grande ol 'mux:Isso corresponde a
Obviamente, esses são designs muito simplificados, com apenas uma expressão de valor, resultando em uma saída.
De acordo com o acima, você pode ver como eles aninham / misturam.
Como
if-else
deduz a prioridade, ele deve ser usado quando mais de uma condição de entrada puder ocorrer. O usocase
, por outro lado, é apropriado quando as entradas são mutuamente exclusivas.fonte
if-else
construção, no entanto, é onde essa cadeia surge. A primeira condição deve falhar para que a segunda condição seja testada. Esse não é o caso, er, dacase
construção, e é por isso que umaif-else
instrução não pode ser sintetizada como um único grande mux.case
declaração também pode gerar lógica sequencial. Encontrei "Real World VHDL" , uma série de slides de palestras da Universidade de Glasgow, que podem ser úteis para você.Em este velho post , o autor escreveu e sintetizadas duas versões funcionalmente equivalentes de código VHDL. Um usando if-else, o outro usando case. O resultado:
E sua conclusão:
Existem também dezenas de posts sobre esse assunto no Stack Overflow para todos os idiomas imagináveis. A conclusão é geralmente a mesma, que não há diferença em termos de desempenho. Ocasionalmente, se houver um grande número de casos, um compilador pode ser inteligente o suficiente para criar uma tabela de pesquisa que produziria um desempenho um pouco melhor.
Um sintetizador VHDL pode ser capaz de fazer algo semelhante. Mas você ainda precisaria de um grande número de casos. Nesse caso (trocadilhos), você provavelmente desejaria usar uma declaração de caso de qualquer maneira, pois ela fornece melhor legibilidade quando há um grande número de opções.
fonte