Entendiendo la diferencia entre señales y variables en VHDL
En nuestro tutorial previo exploramos cómo declarar una variable dentro de un proceso. Las variables son ideales para trabajo algorítmico local, pero no pueden verse fuera de ese proceso. Cuando necesitas un valor compartido con otras partes del diseño, usas una señal.
Las señales se declaran en la región declarativa de una arquitectura —es decir, entre la línea architecture <architecture_name> of <entity_name> is y la palabra clave begin.
Este post es parte de la serie Tutoriales Básicos VHDL.
La sintaxis para declarar una señal es:signal <name> : <type>;
Una señal puede declararse opcionalmente con valor inicial:signal <name> : <type> := <initial_value>;
Ejercicio
En este tutorial de video aprendemos a declarar una señal y descubrimos la diferencia central entre variable y señal.
El código final que creamos en este tutorial:
entity T06_SignalTb is end entity; architecture sim of T06_SignalTb is signal MySignal : integer := 0; begin process is variable MyVariable : integer := 0; begin report "*** Process begin ***"; MyVariable := MyVariable + 1; MySignal <= MySignal + 1; report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal); MyVariable := MyVariable + 1; MySignal <= MySignal + 1; report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal); wait for 10 ns; report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal); end process; end architecture;
La salida a la consola del simulador al presionar run en ModelSim:
VSIM 2> run # ** Note: *** Process begin *** # Time: 0 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=1, MySignal=0 # Time: 0 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=2, MySignal=0 # Time: 0 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=2, MySignal=1 # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: *** Process begin *** # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=3, MySignal=1 # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=4, MySignal=1 # Time: 10 ns Iteration: 0 Instance: /t06_signaltb # ** Note: MyVariable=4, MySignal=2 # Time: 20 ns Iteration: 0 Instance: /t06_signaltb ...
Análisis
Creamos una señal y una variable con mismo valor inicial de 0. Aunque las tratamos idénticamente en el proceso, la salida de consola revela comportamientos distintos. Las diferencias clave son:
- Las variables usan operador
:=y se actualizan inmediatamente dentro del proceso. - Las señales usan operador
<=; el nuevo valor se agenda y solo toma efecto cuando el proceso se suspende (ej., en una sentenciawait). - Cuando una señal se asigna múltiples veces antes de que el proceso reanude, solo la última asignación "gana" porque valores agendados previos se sobrescriben.
En nuestro ejemplo, los dos primeros incrementos de MySignal se perdieron porque fueron sobrescritos antes de la sentencia wait for 10 ns; causara la suspensión del proceso y la actualización de la señal. El incremento subsecuente aparece tras la suspensión, coincidiendo con el comportamiento esperado.
Conclusión
- Use variables para valores temporales que necesitan actualizaciones inmediatas y locales.
- Use señales cuando necesite comunicar cambios a otros procesos o componentes.
- Recuerde que las asignaciones de señal se agendan y solo se confirman cuando el proceso pausa; asignaciones múltiples sin pausa resultan en solo el último valor sobreviviendo.
Ir al siguiente tutorial »
VHDL
- Sistema de Navegación por Satélite BeiDou explicado: cómo se diferencia del GPS
- Computación en la nube vs. Computación tradicional: Comparación práctica
- Dominando tipos Signed vs Unsigned en VHDL: Perspectivas prácticas
- Variables VHDL explicadas: Ejemplos prácticos y reglas para diseño fiable
- 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