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 ”