Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> VHDL

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:

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

Ir al siguiente tutorial »

VHDL

  1. Sistema de Navegación por Satélite BeiDou explicado: cómo se diferencia del GPS
  2. Computación en la nube vs. Computación tradicional: Comparación práctica
  3. Dominando tipos Signed vs Unsigned en VHDL: Perspectivas prácticas
  4. Variables VHDL explicadas: Ejemplos prácticos y reglas para diseño fiable
  5. Creación de listas de cadenas en VHDL: Buenas prácticas y ejemplo
  6. Finalizar elegantemente una simulación de testbench VHDL
  7. Implementación de un controlador PWM en VHDL: Diseño, simulación y demo en FPGA
  8. Generación de números aleatorios en VHDL: De uniforme a OSVVM
  9. Aprovechando procedimientos en-proceso para diseños FSM más limpios en VHDL
  10. Uso de funciones impuras en VHDL: Mejorando legibilidad y mantenibilidad de FSM
  11. Dominando funciones VHDL: Guía práctica para diseño eficiente