Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> VHDL

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


Ir para o próximo tutorial »

VHDL

  1. Como usamos o molibdênio?
  2. Como criar uma lista de strings em VHDL
  3. Como parar a simulação em um testbench VHDL
  4. Como criar um controlador PWM em VHDL
  5. Como gerar números aleatórios em VHDL
  6. Como usar um procedimento em um processo em VHDL
  7. Como usar uma função impura em VHDL
  8. Como usar uma função em VHDL
  9. Como criar uma máquina de estado finito em VHDL
  10. Como usar um moedor de corte