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.
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 »