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