Como usar instruções condicionais em VHDL: If-then-Elsif-Else
No tutorial anterior, usamos uma expressão condicional com o tempo de Espera Até que a instrução. A expressão garantiu que o processo só foi desencadeado quando os dois sinais de contadores são iguais. Mas e se nós quiséssemos que o programa em um processo para tomar ações diferentes baseadas em entradas diferentes?
as declarações If-Then-Elsif-Elsef podem ser usadas para criar filiais em nosso programa. Dependendo do valor de uma variável, ou do resultado de uma expressão, o programa pode tomar caminhos diferentes.
este post no blog faz parte da série básica de tutoriais 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 avalia a true
ou false
.Expressão de exemplo que é true
se MyCounter
for inferior a 10:
MyCounter < 10
operadores relacionais:
= | igual |
/= | não é igual |
< | menos de |
<= | menor ou igual |
> | maior que |
>= | maior ou igual |
operadores Lógicos:
não um | verdadeiro se a é falso |
a e b | true se a e b são verdadeiras |
a ou b | verdadeiro se a ou b forem verdadeiras |
uma nand b | verdadeiro se a ou b for falsa |
a nem b | true se a e b são falsas |
a xor b | verdadeiro se exatamente um a ou b são verdadeiros |
um xnor b | true se a e b são iguais |
Exercício
neste vídeo tutorial vamos aprender como usar o If-then-Elsif-Else em VHDL:
O código final, nós criamos este tutorial:
entity T08_IfTb isend 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 simulador console quando pressionamos o botão executar 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 muda ambos os valores do contador ao mesmo tempo, a cada 10 ns. Quando isso acontece, o segundo processo é desencadeado porque o programa estará sempre esperando na linha wait on CountUp, CountDown;
. O programa estará sempre esperando lá porque o If-Then-Elsif-elsif-Else e as declarações de relatório consomem zero tempo de simulação.
a declaração If-Then-Elsif-Elsef fará com que o programa tome um dos três ramos que criamos. Os dois primeiros ramos cobrem os casos em que os dois contadores têm valores diferentes. Poderíamos ter deixado cair o single else
, e usado elsif CountUp = CountDown then
que teria tido o mesmo resultado. Mas é uma boa prática de design para cobrir todos os ramos, e a cláusula else
abrange todos os casos intencionais e imprevistos.Como podemos ver a partir da impressão, o segundo processo leva um dos três ramos cada vez que os contadores mudam.Acesso exclusivo a exercícios e Respostas!
Takeaway
- If-Then may be used alone or in combination with Elsif and Elsef.
- expressões podem conter comparações relacionais e lógicas e cálculos matemáticos
Go to the next tutorial ”