Cómo usar sentencias condicionales en VHDL:If-Then-Elsif-Else
En el tutorial anterior, usamos una expresión condicional con la instrucción Esperar hasta. La expresión aseguró que el proceso solo se desencadenara cuando las dos señales de contador fueran iguales. Pero, ¿y si quisiéramos que el programa en un proceso tomara diferentes acciones en función de diferentes entradas?
Las declaraciones If-Then-Elsif-Else se pueden usar para crear ramas en nuestro programa. Según el valor de una variable o el resultado de una expresión, el programa puede tomar diferentes caminos.
Esta publicación de blog es parte de la serie Tutoriales básicos de VHDL.
La sintaxis básica es:
if <condition> then
elsif <condition> then
else
end if;
El elsif y else son opcionales, y elsif se puede usar varias veces. Los <condition> puede ser un true booleano o false , o puede ser una expresión que evalúe a true o false .
Expresión de ejemplo que es true si MyCounter es menor que 10:
MyCounter < 10 Operadores relacionales:
| = | igual |
| /= | no igual |
| < | menor que |
| <= | menor que o igual |
| mayor que | |
| >= | mayor que o igual |
Operadores lógicos:
| no un | verdadero si a es falso |
| a y b | verdadero si a y b son ciertas |
| a o b | verdadero si a o b son ciertas |
| a y b | verdadero si a o b es falso |
| a ni b | verdadero si a y b son falsos |
| a xor b | verdadero si exactamente uno de a o b son ciertas |
| a xnor b | verdadero 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 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;
La salida a la consola del simulador cuando presionamos 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 el wait on CountUp, CountDown; línea. El programa siempre estará esperando allí porque If-Then-Elsif-Else y las declaraciones de informe consumen cero tiempo de simulación.
La declaració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 dejado caer el sencillo else y usó elsif CountUp = CountDown then que habría tenido el mismo resultado. Pero es una buena práctica de diseño cubrir todas las ramas, y el else cláusula 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.
Para llevar
- If-Then se puede usar solo o en combinación con Elsif y Else.
- Las expresiones pueden contener comparaciones relacionales y lógicas y cálculos matemáticos
Ir al siguiente tutorial »
VHDL
- ¿Cómo utilizamos el molibdeno?
- Cómo crear una lista de cadenas en VHDL
- Cómo detener la simulación en un banco de pruebas VHDL
- Cómo crear un controlador PWM en VHDL
- Cómo generar números aleatorios en VHDL
- Cómo usar un procedimiento en un proceso en VHDL
- Cómo usar una función impura en VHDL
- Cómo usar una función en VHDL
- Cómo crear una máquina de estados finitos en VHDL
- Cómo usar un procedimiento en VHDL
- Cómo usar una amoladora cortadora