Como usar instruções condicionais em VHDL:If-Then-Elsif-Else
No tutorial anterior, usamos uma expressão condicional com a instrução Wait Until. A expressão garantiu que o processo só fosse acionado quando os dois sinais do contador fossem iguais. Mas e se quiséssemos que o programa em um processo tomasse ações diferentes com base em entradas diferentes?
As instruções If-Then-Elsif-Else podem ser usadas para criar ramificações em nosso programa. Dependendo do valor de uma variável ou do resultado de uma expressão, o programa pode seguir caminhos diferentes.
Esta postagem do blog faz parte da série de tutoriais básicos de VHDL.
A sintaxe básica é:
if <condition> then
elsif <condition> then
else
end if;
O
elsif
e else
são opcionais e elsif
pode ser usado várias vezes. O <condition>
pode ser um booleano true
ou false
, ou pode ser uma expressão que resulta em true
ou false
. Expressão de exemplo que é
true
se MyCounter
é menor que 10:MyCounter < 10
Operadores relacionais:
= | igual |
/= | diferente |
menor que | |
<= | menor ou igual |
> | maior que |
>= | maior ou igual |
Operadores lógicos:
não um | true se um é falso |
a e b | true se um e b são verdadeiras |
a ou b | true se um ou b são verdadeiras |
a ne b | true se um ou b é falso |
a nem b | true se um e b são falsos |
a xor b | true se exatamente um de a ou b são verdadeiras |
a xnor b | true se um e b são iguais |
Exercício
Neste tutorial em vídeo, aprenderemos como usar instruções If-Then-Elsif-Else em VHDL:
O código final que criamos neste tutorial:
entity T08_IfTb is end entity; architecture sim of T08_IfTb is signal CountUp : integer := 0; signal CountDown : integer := 10; begin process is begin CountUp <= CountUp + 1; CountDown <= CountDown - 1; wait for 10 ns; end process; process is begin if CountUp > CountDown then report "CountUp is larger"; elsif CountUp < CountDown then report "CountDown is larger"; else report "They are equal"; end if; wait on CountUp, CountDown; end process; end architecture;
A saída para o console do simulador quando pressionamos o botão de execução no ModelSim:
VSIM 2> run # ** Note: CountDown is larger # Time: 0 ns Iteration: 0 Instance: /t08_iftb # ** Note: CountDown is larger # Time: 0 ns Iteration: 1 Instance: /t08_iftb # ** Note: CountDown is larger # Time: 10 ns Iteration: 1 Instance: /t08_iftb # ** Note: CountDown is larger # Time: 20 ns Iteration: 1 Instance: /t08_iftb # ** Note: CountDown is larger # Time: 30 ns Iteration: 1 Instance: /t08_iftb # ** Note: They are equal # Time: 40 ns Iteration: 1 Instance: /t08_iftb # ** Note: Countup is larger # Time: 50 ns Iteration: 1 Instance: /t08_iftb # ** Note: Countup is larger # Time: 60 ns Iteration: 1 Instance: /t08_iftb ...
Análise
Demos
CountDown
um valor inicial de 10 e CountUp
um valor de 0. O primeiro processo altera os dois valores do contador exatamente ao mesmo tempo, a cada 10 ns. Quando isso acontece, o segundo processo é acionado porque o programa estará sempre esperando no wait on CountUp, CountDown;
linha. O programa estará sempre esperando lá porque as instruções If-Then-Elsif-Else e report consomem zero tempo de simulação. A instrução If-Then-Elsif-Else fará com que o programa pegue uma das três ramificações que criamos. As duas primeiras ramificações cobrem os casos em que os dois contadores têm valores diferentes. Poderíamos ter descartado o único
else
, e usou elsif CountUp = CountDown then
que teria o mesmo resultado. Mas é uma boa prática de design cobrir todas as ramificações, e o else
cláusula cobre todos os casos intencionais e imprevistos. Como podemos ver na impressão, o segundo processo leva uma das três ramificações toda vez que os contadores mudam.

Retirada
- If-Then pode ser usado sozinho ou em combinação com Elsif e Else.
- As expressões podem conter comparações relacionais e lógicas e cálculos matemáticos
Ir para o próximo tutorial »
VHDL
- Como usamos o molibdênio?
- Como criar uma lista de strings em VHDL
- Como parar a simulação em um testbench VHDL
- Como criar um controlador PWM em VHDL
- Como gerar números aleatórios em VHDL
- Como usar um procedimento em um processo em VHDL
- Como usar uma função impura em VHDL
- Como usar uma função em VHDL
- Como criar uma máquina de estado finito em VHDL
- Como usar um moedor de corte