Cómo usar instrucciones condicionales en VHDL: If-Then-Elsif-Else

En el tutorial anterior usamos una expresión condicional con la instrucción Wait Until. La expresión garantizaba que el proceso solo se activara cuando las dos señales de contador fueran iguales. Pero, ¿qué pasa si queremos que el programa en un proceso tome diferentes acciones basadas en diferentes entradas?

Las sentencias If-Then-Elsif-Else se pueden usar para crear ramas en nuestro programa. Dependiendo del valor de una variable o del resultado de una expresión, el programa puede tomar diferentes caminos.

Esta entrada de blog es parte de la serie de tutoriales básicos de VHDL.

La sintaxis básica es:

if <condition> then
elsif <condition> then
else
end if;

Los elsif y else son opcionales, y elsif se pueden usar varias veces. <condition> puede ser un booleano true o false, o puede ser una expresión que evalúa true o false.

Expresión de ejemplo que es true si MyCounter es menor que 10:

MyCounter < 10

Operadores relacionales:

= igual
/= no es igual
< menos de
<= menos de o igual
> mayor que
>= mayor o igual

operadores Lógicos:

no es un true si a es falso
a y b true si a y b son verdaderas
a o b true si a o b son verdaderas
una nand b true si a o b es falsa
un ni b true si a y b son falsas
a xor b true si exactamente uno de a o b son verdaderas
un xnor b true si a y b son iguales

Ejercicio

En este video tutorial aprenderemos a usar sentencias If-Then-Elsif-Else en VHDL:

El código final que creamos en 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;

La salida a la consola del simulador cuando pulsamos el botón ejecutar en 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álisis

Dimos CountDown un valor inicial de 10, y CountUp un valor de 0. El primer proceso cambia ambos valores de contador al mismo tiempo, cada 10 ns. Cuando esto sucede, se activa el segundo proceso porque el programa siempre estará esperando en la línea wait on CountUp, CountDown;. El programa siempre estará esperando allí porque las sentencias If-Then-Elsif-Else y report consumen cero tiempo de simulación.

La instrucción If-Then-Elsif-Else hará que el programa tome una de las tres ramas que creamos. Las dos primeras ramas cubren los casos en los que los dos contadores tienen valores diferentes. Podríamos haber eliminado el sencillo else, y usado elsif CountUp = CountDown then, lo que habría tenido el mismo resultado. Pero es una buena práctica de diseño cubrir todas las ramas, y la cláusula else cubre todos los casos intencionales e imprevistos.

Como podemos ver en la impresión, el segundo proceso toma una de las tres ramas cada vez que cambian los contadores.

 ¡Obtén acceso exclusivo a ejercicios y respuestas!

Comida para llevar

  • If-Then se puede usar solo o en combinación con Elsif y Otros.
  • Las expresiones pueden contener comparaciones relacionales y lógicas y cálculos matemáticos

Ir al siguiente tutorial »