What is the event in VHDL?

Eventos, Transacciones y Variables vs Señales en VHDL

hace 8 años

Valoración: 4.32 (7834 votos)

En el mundo del diseño digital y la simulación, VHDL (VHSIC Hardware Description Language) se erige como un lenguaje poderoso para describir y modelar sistemas electrónicos. Comprender los conceptos fundamentales de eventos, transacciones y la distinción entre variables y señales es crucial para cualquier diseñador que busque crear modelos precisos y eficientes. Este artículo profundiza en estos temas, proporcionando una guía clara y concisa para dominar estos aspectos esenciales de VHDL.

What is event scheduling in VHDL?
VHDL uses discrete time event driven simulation, that is if a signal value changes, that change is considered an event that has to be processed to find out the effect of this change on the other signals. Events occur at discrete times and signals are updated during next discrete time intervals.
Índice de Contenido

¿Qué es un Evento en VHDL?

En VHDL, un evento se define como un cambio de valor en una señal. Cuando una señal cambia su valor, se dice que ha ocurrido un evento en esa señal. Este concepto es fundamental para la simulación basada en eventos que utiliza VHDL. Los eventos son los que impulsan la ejecución de procesos sensibles a señales específicas, permitiendo simular el comportamiento dinámico de un circuito digital a lo largo del tiempo.

Planificación de Eventos en VHDL (Event Scheduling)

La planificación de eventos, o event scheduling, es el mecanismo mediante el cual VHDL gestiona y ordena la ejecución de eventos durante la simulación. Cuando se ejecuta una sentencia de asignación de señal, no solo se calcula el nuevo valor, sino que también se programa un evento futuro para actualizar la señal con ese nuevo valor en un instante de tiempo posterior. Este instante de tiempo está determinado por el retardo especificado en la asignación de señal (cláusula after).

VHDL utiliza una cola de eventos para gestionar estos eventos programados. La simulación avanza en el tiempo procesando los eventos en orden cronológico. Cuando llega el momento de un evento programado, el valor de la señal se actualiza y se evalúan los procesos que son sensibles a esa señal, pudiendo generar a su vez nuevos eventos.

What is := in VHDL?
Variables are assigned using the := assignment symbol. Signals are assigned using the <= assignment symbol. Variables that are assigned immediately take the value of the assignment. Signals depend on if it's combinational or sequential code to know when the signal takes the value of the assignment.[/caption]

Transacciones vs. Eventos: La Diferencia Clave

Aunque a menudo se utilizan indistintamente, es importante comprender la diferencia entre una transacción y un evento en VHDL. Una transacción se define como un par valor/tiempo. Cuando se ejecuta una asignación de señal, se programa una transacción en la señal. Esto significa que se asocia un valor a la señal junto con el tiempo en el que ese valor debe ser asignado. En esencia, una transacción representa la intención de cambiar el valor de una señal en un momento futuro.

Un evento, por otro lado, ocurre solo si el nuevo valor de la transacción es diferente del valor actual de la señal. Es decir, una transacción siempre se programa, pero un evento solo se produce si la transacción resulta en un cambio de valor.

Para ilustrar mejor esta diferencia, consideremos el ejemplo proporcionado:

architecture behave of event_transaction_example is signal a,b ,c: std_logic ; begin a <= '1' after 10 ns, '0' after 12 ns; b <= a after 5 ns; c <= transport a after 5 ns; end behave; 

Analicemos el comportamiento de las señales a, b y c en este ejemplo:

  • Señal a: Se programan transacciones en la señal a en tiempo 10 ns (valor '1') y 12 ns (valor '0'). Como estos valores son diferentes del valor inicial implícito ('U' o '0' dependiendo del simulador) y entre sí, se producen eventos en la señal a en ambos instantes de tiempo.
  • Señal b: La señal b se asigna con el valor de a con un retardo inercial de 5 ns. En tiempo 5 ns, se programa una transacción para b con el valor que tenga a en ese momento (que será 'U' o '0' inicialmente). En tiempo 17 ns (12ns + 5ns), se programa otra transacción para b. Sin embargo, debido al retardo inercial de 5ns, un pulso en la señal 'a' de duración menor a 5ns no se propagará a 'b'. En este caso, el pulso de 'a' de 2ns (entre 10ns y 12ns) es más corto que el retardo inercial de 5ns de 'b'. Por lo tanto, aunque se programan transacciones en b, no se producen eventos porque el valor resultante de las transacciones podría ser el mismo que el valor actual de b (dependiendo de la implementación y del valor inicial de 'a' y 'b'). Es decir, la señal b podría no cambiar de valor debido al filtrado del pulso corto por el retardo inercial.
  • Señal c: La señal c se asigna con el valor de a con un retardo de transporte de 5 ns. A diferencia del retardo inercial, el retardo de transporte no filtra los pulsos cortos. Por lo tanto, la señal c seguirá fielmente los cambios de la señal a, pero con un retardo de 5 ns. Se programarán transacciones y se producirán eventos en c en tiempos 5 ns y 17 ns, reflejando los eventos de a desplazados en el tiempo.

En resumen, toda asignación de señal programa una transacción, pero solo si el valor de la transacción difiere del valor actual de la señal, se produce un evento en esa señal. Los eventos son cruciales para la simulación basada en eventos, ya que activan la ejecución de procesos sensibles a las señales que han experimentado un cambio de valor.

Variables vs. Señales: El Significado de `:=` en VHDL

Una fuente común de confusión en VHDL surge al distinguir entre variables y señales. Aunque ambos pueden almacenar datos, sus comportamientos y usos son fundamentalmente diferentes. Una diferencia sintáctica obvia es el uso del operador de asignación: las variables utilizan `:=`, mientras que las señales utilizan `<=`.

[caption id="attachment_9193" align="aligncenter" width="791"]What is the difference between transaction and event in VHDL? Therefore, transaction is defined as a value/time pair. When a signal value is updated, meaning that a transaction is scheduled on that signal, if the new value is different from the previous one, then an event is said to have occurred on the signal.

Sin embargo, las diferencias van mucho más allá de la sintaxis:

CaracterísticaVariablesSeñales
Ámbito (Scope)Solo dentro de procesosDentro y fuera de procesos (arquitectura)
Uso compartidoNo se pueden compartir entre procesosSe pueden usar en múltiples procesos (pero asignadas en uno solo)
DeclaraciónDentro de un proceso, después de `process` y antes de `begin`En la arquitectura, antes de `begin`
Asignación`:=``<=`
Actualización de valorInmediataDepende del contexto: inmediata en código combinacional, con retardo (un ciclo de reloj) en código secuencial

La diferencia más importante radica en el momento en que se actualiza el valor. Las variables se actualizan inmediatamente cuando se ejecuta la sentencia de asignación. Esto significa que si se asigna un valor a una variable, ese valor estará disponible para su uso en las sentencias siguientes dentro del mismo proceso, en la misma iteración de simulación.

En contraste, las señales no se actualizan inmediatamente en código secuencial (dentro de un bloque `if rising_edge(clk)` o similar). En código secuencial, las señales modelan el comportamiento de flip-flops o registros. La asignación a una señal en código secuencial programa una transacción para que la señal se actualice al final del proceso, después de que todas las sentencias del proceso se hayan ejecutado para el ciclo de simulación actual. En esencia, en código secuencial, las señales se actualizan en el siguiente ciclo de reloj.

En código combinacional (fuera de bloques secuenciales), las señales se comportan de manera más similar a las variables en términos de actualización inmediata. Sin embargo, incluso en código combinacional, las señales todavía representan interconexiones físicas en el circuito, mientras que las variables son construcciones abstractas utilizadas para cálculos intermedios dentro de un proceso.

El ejemplo proporcionado ilustra claramente esta diferencia:

library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity variable_vs_signal is port ( i_clk: in std_logic; o_var_done: out std_logic; o_sig_done: out std_logic ); end variable_vs_signal; architecture rtl of variable_vs_signal is signal r_Var_Done: std_logic := '0'; signal r_Count: natural range 0 to 6 := 0; signal r_Sig_Done: std_logic := '0'; begin VAR_VS_SIG: process (i_clk) variable v_Count: natural range 0 to 5 := 0; begin if rising_edge(i_clk) then v_Count := v_Count + 1; -- Variable r_Count <= r_Count + 1; -- Signal -- Variable Checking if v_Count = 5 then r_Var_Done <= '1'; v_Count := 0; else r_Var_Done <= '0'; end if; -- Signal Checking if r_Count = 5 then r_Sig_Done <= '1'; r_Count <= 0; else r_Sig_Done <= '0'; end if; end if; end process VAR_VS_SIG; o_var_done <= r_Var_Done; o_sig_done <= r_Sig_Done; end rtl; 

En este ejemplo, tanto `v_Count` (variable) como `r_Count` (señal) parecen contadores. Sin embargo, su comportamiento es distinto. `v_Count` se incrementa y se verifica inmediatamente dentro del mismo ciclo de reloj. Cuando `v_Count` alcanza 5, `r_Var_Done` se pone a '1' y `v_Count` se reinicia a 0, todo dentro del mismo ciclo de reloj. Por lo tanto, `o_var_done` (que refleja `r_Var_Done`) generará un pulso cada 5 ciclos de reloj.

What is the event in VHDL?
The event is an important concept in VHDL. It relates to signals and it occurs on a signal if the current value of that signal changes. In other words, an event on a signal is a change of the signal's value. It is possible to check whether an event occurred on a signal. May 16, 2019

En cambio, `r_Count` (señal) se incrementa y se verifica, pero la actualización de `r_Count` y `r_Sig_Done` no ocurre hasta el siguiente ciclo de reloj. Como resultado, `r_Count` alcanza el valor 5 en un ciclo de reloj, y en el siguiente ciclo de reloj, se detecta que `r_Count` es 5, se pone `r_Sig_Done` a '1' y `r_Count` se reinicia a 0. Esto significa que `o_sig_done` (que refleja `r_Sig_Done`) generará un pulso cada 6 ciclos de reloj.

Este ejemplo demuestra que el uso de variables y señales para almacenar datos produce comportamientos muy diferentes, especialmente en código secuencial. Para los principiantes, generalmente se recomienda evitar el uso de variables en VHDL, al menos inicialmente. Las señales son más fundamentales para modelar hardware y su comportamiento es más intuitivo en el contexto del diseño digital. Las variables pueden introducir confusión y, en ocasiones, ser difíciles de sintetizar correctamente por las herramientas de síntesis.

Conclusión

Comprender los conceptos de eventos y transacciones, así como la distinción entre variables y señales en VHDL, es esencial para escribir código VHDL efectivo y preciso. Los eventos son la base de la simulación basada en eventos y impulsan la ejecución de procesos. Las transacciones representan la intención de cambiar el valor de una señal, mientras que los eventos solo ocurren cuando se produce un cambio de valor real. Las variables y las señales, aunque superficialmente similares, tienen comportamientos fundamentalmente diferentes, especialmente en código secuencial. Dominar estas diferencias es crucial para evitar errores sutiles y diseñar correctamente sistemas digitales complejos en VHDL. Siempre es recomendable simular exhaustivamente el código VHDL para verificar que se comporta según lo esperado y comprender las interacciones entre señales y variables.

Subir