Dominando lógica condicional en VHDL: If-Then-Elsif-Else explicado
En el tutorial previo usamos una expresión condicional con la sentencia Wait Until para disparar un proceso solo cuando dos señales de contador coincidían. ¿Qué pasa si necesitamos que el programa tome acciones diferentes basadas en entradas variables?
El constructo If-Then-Elsif-Else nos permite ramificar nuestra lógica. Dependiendo del valor de una variable o resultado de una expresión, el programa puede seguir caminos distintos.
Este artículo es parte de la serie Tutoriales Básicos VHDL.
Sintaxis básica
La forma canónica es:
if <condition> then elsif <condition> then else end if;
Las cláusulas elsif y else son opcionales, y elsif puede aparecer múltiples veces. Un <condition> puede ser un literal booleano o una expresión que evalúe a true o false.
Ejemplo: MyCounter < 10 es true cuando MyCounter es menor que diez.
Operadores relacionales
| = | igual |
| /= | no igual |
| < | menor que |
| <= | menor o igual que |
| > | mayor que |
| >= | mayor o igual que |
Operadores lógicos
| not a | true si a es false |
| a and b | true si a y b son true |
| a or b | true si a o b son true |
| a nand b | true si a o b es false |
| a nor b | true si a y b son false |
| a xor b | true si exactamente uno de a o b son true |
| a xnor b | true si a y b son iguales |
Ejercicio
Abajo hay un ejemplo VHDL completo que demuestra el constructo If-Then-Elsif-Else en acción.
Código final:
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;
Salida de consola del simulador al ejecutar el modelo 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
Inicializamos CountDown a 10 y CountUp a 0. Ambos contadores se actualizan simultáneamente cada 10 ns en el primer proceso. El segundo proceso espera en estas señales, así que dispara cada vez que cambian. El bloque If-Then-Elsif-Else entonces selecciona una de tres ramas: CountUp > CountDown, CountUp < CountDown o CountUp = CountDown. Aunque un else explícito no es obligatorio, incluirlo es una best practice, asegurando que todos los casos edge se manejen.
El trace de consola confirma que el segundo proceso evalúa la condición tras cada actualización, imprimiendo el mensaje apropiado.
Conclusión
- Use If-Then solo o combine con Elsif y Else para cubrir todos los escenarios posibles.
- Las condiciones pueden incluir expresiones relacionales, lógicas y aritméticas.
Continuar al siguiente tutorial »
VHDL
- Dominando las Técnicas de Afiladora de Herramientas: Guía Práctica
- Cómo el molibdeno moldea la industria moderna: usos, beneficios y dinámica de suministro
- Creación de listas de cadenas en VHDL: Buenas prácticas y ejemplo
- Finalizar elegantemente una simulación de testbench VHDL
- Implementación de un controlador PWM en VHDL: Diseño, simulación y demo en FPGA
- Generación de números aleatorios en VHDL: De uniforme a OSVVM
- Aprovechando procedimientos en-proceso para diseños FSM más limpios en VHDL
- Uso de funciones impuras en VHDL: Mejorando legibilidad y mantenibilidad de FSM
- Dominando funciones VHDL: Guía práctica para diseño eficiente
- Diseño de máquina de estados finitos en VHDL: Ejemplo práctico de semáforo
- Uso de procedimientos en VHDL: Simplifique su diseño con código reutilizable