Requisitos: Programación, Lógica Combinacional.
VHDL es uno de los lenguajes de descripción de hardware más utilizados para la creación de circuitos digitales. En este artículo explicaré de una manera muy precisa la diferencia entre variables y señales. Una de las principales diferencias que posee VHDL en comparación con algunos lenguajes de programación, por ejemplo: C es que permite la ejecución paralela o bien concurrente.
Esto nos brinda una gran ventaja debido a que en un sistema de hardware generalmente está compuesto por una gran cantidad de unidades de procesamiento que pueden trabajar de forma paralela. Lenguajes como C, sus ejecuciones son en serie ya que las sentencias son ejecutadas una a una por el microprocesador. VHDL, tiene la posibilidad de trabajar con sentencias en serie pero es un caso particular, por ejemplo cuando utilizamos un proceso.
Tenemos tres tipos de elementos en VHDL: las constantes, variables y señales. Aquí nos vamos a centrar únicamente en las señales y variables. Definimos entonces:
Variable: Es un elemento que nos permite introducir algún valor, donde éste puede ser alterado en cualquier momento.
Señales: Es como la representación de un alambre en un circuito. Éste puede ser de varios tipos: bus, register o normal, puede tomar algún valor inicial y sólo se actualizan al terminar el proceso en el cual están siendo utilizadas, a diferencia de las variables que éstas se actualizan instantáneamente, o sea que su valor cambia en el momento de la asignación. Las señales presentan la propiedad de almacenar el valor actual y de guardar un valor futuro. ¿Cómo funciona? Imaginemos que la señal es una caja que contiene dos apartados, el primer apartado es donde se encuentra el valor actual y el segundo apartado mejor conocido como driver, es el que contiene el valor futuro. Cuando se lee una señal, estamos haciendo uso de la sección que contiene el valor actual, mientras que cuando asignamos algo a una señal, estamos escribiendo en la sección driver.
Para entender un poco más, es necesario saber que las variables sólo se declaran en procesos o subprogramas donde las sentencias son ejecutadas en serie, mientras que las señales se declaran en los paquetes (packages), procesos concurrentes (blocks) o en las arquitecturas (architecture).
Para llegar a donde queremos hay que tener en cuenta que un bloque process equivale a una instrucción concurrente en donde todas las ejecuciones dentro de este process se hacen en serie. Es decir, para una simulación todas la instrucciones internas ocurren en un solo paso, y no se sigue hasta el próximo paso sino hasta cuando se completado lo que hay en process. Podríamos resumir que en un bloque process las señales mantienen su valor y no se alteran hasta que el bloque termine de ejecutarse.
Veamos entonces un ejemplo para comprender la diferencia “En acción” de estos dos conceptos.
1 |
-- Equivocada utilización de senal<br /> ARCHITECTURE circuito OF clase911 IS<br /> SIGNAL a,b,c,x,y: integer;<br /> BEGIN<br /> PROCESS (a,b,c)<br /> BEGIN<br /> c <= a; -- Está por el gusto<br /> x <= c+911;<br /> c <= b; -- Ésta es la que tiene válidez<br /> y <= c+911;<br /> END PROCESS;<br /> END circuito; |
Explicación:
Tenemos una señal llamada c en la cual se escribe en la sección driver, es decir que tomará el valor de a en el próximo paso de simulación pero no en la primera ejecución del process. Se hace lo mismo con la señal x, solo que en este caso tomará el valor de c que presenta antes de empezar el process. Tenemos después que el valor futuro de la seña c se reemplaza por el valor que tiene b antes del process. Es decir, que el valor futuro de c se ha sobre escrito y ya no será a sino b. Luego tenemos una señal y en donde éste toma el valor de c que está antes de empezar el proceso y luego se le suma 911.
Haciendo una prueba de escritorio, si tuviéramos a = 2, b = 1, c = 3.Tendríamos que: x = 914, y = 912, b = 1, c = 1, a = 2.Como c ha cambiado y está en la lista sensible del process, éste se volverá a ejecutar repitiéndose las operaciones. Si ustedes hacen el ciclo, verán que x = 912, y = 912, b = 1, c = 1, a = 2. En este caso, como ni una señal ha cambiado en este proceso, la ejecución se detiene. En conclusión podemos observar que en realidad nunca se asigna el valor futuro a la señal c de a porque más adelante se dice que el driver de c debe tomar es el valor de b.
1 |
-- Acertada utilización de senal<br /> ARCHITECTURE circuito OF clase911 IS<br /> SIGNAL a,b,x,y: integer;<br /> BEGIN<br /> PROCESS (a,b)<br />VARIABLE C: integer;<br /> BEGIN<br /> c := a; -- Se ejecuta instantáneamente<br /> x <= c+911;<br /> c := b; -- Se ejecuta instantáneamente<br /> y <= c+911;<br /> END PROCESS;<br /> END circuito;<br /> |
Explicación:
En este pedazo de código vemos entonces que es CASI lo mismo que en código anterior sólo que aquí usamos variables en vez de señales. Observamos que c desaparece de la lista sensible ya que es una variable interna y no puede formar parte de la lista sensible del bloque process. La primera instrucción asigna el valor de a a la variable c instantáneamente, es decir, que c toma el valor de a después de iniciar el bloque process. Nótese el uso de las variables para ejecuciones en serie. Después se guarda en el driver de x el valor que tiene c actual más 911, y luego el valor de c se sobre escribe de una vez por el valor de b para luego ser asignado al valor de la señal y.
Veamos la prueba de escritorio, si tuviéramos: a = 2, b = 1.
La variable c toma el valor de a de manera inmediata, luego x = 2+911 = 913 para luego cambiar el valor de c que ahora valdrá 1, es decir: c = 1, y luego se tendrá que y = 1+911 = 912. Vemos que a = 2, y b = 1. Como ni una señal ha cambiado su valor después de la ejecución de y, entonces el bloque no se vuelve a ejecutar y termina el programa.
Se deduce entonces que las señales y variables son dos tipos de elementos diferentes que su uso dependerá de los parámetros de diseño del circuito digital que necesitemos crear.
Si usted tiene alguna pregunta sobre este artículo, o deseas simplemente hacer un comentario, siéntase en libertad de hacerlo.