Ya ha pasado el verano y es hora de ponerse al día. Para empezar el nuevo curso comenzaremos con un tema clásico en VHDL, las asignaciones concurrentes.

Escribir código VHDL es duro, lo sabemos. Lo mas parecido que existe a escribir código hardware es escribir programas paralelos. En VHDL todo se ejecuta en paralelo; procesos, asignaciones, otros bloques que hayamos instanciado, etc. Cuando creamos esos bloques, estamos definiendo nuevos elementos que se convertirán en puertas lógicas o registros al pasar por la herramienta de síntesis.

A la hora de definir el comportamiento de una entidad podemos utilizar dos elementos principales, procesos o asignaciones concurrentes. En este punto siempre surge la duda, ¿qué debo usar?

La respuesta es sencilla. En realidad una asignación concurrente no es mas que un proceso resumido. Es totalmente equivalente a crear un proceso combinacional. Lo vais a ver claro con un par de ejemplos.

process(a,b)
begin
  c <= a and b;
end process

En este primer ejemplo tenemos un proceso que cada vez que a o b cambian (lista de sensibilidad) se ejecuta lo que hay dentro y se asigna la operación a and b a la señal c. Acordaros de que cuando se asigna el valor a c este no toma inmediatamente el valor nuevo, sino que se adelanta un nuevo ciclo delta y se revalúan todos los bloques que dependan de c, así hasta que todos los valores se han estabilizado y entonces se puede avanzar un paso de tiempo. En ese momento, si que se actualizan todos los valores de las señales.

Una asignación concurrente seria simplemente:

 c <= a and b;

Su comportamiento es totalmente equivalente al del proceso anterior. No existe ninguna diferencia.

Cuando usar una asignación concurrente

No hay una respuesta única a esta pregunta, depende del estilo de escribir código de cada uno y de las guías de estilo a seguir en cada empresa. No obstante te indicaremos unas serie de pautas.

  1. Escribir muchas asignaciones concurrentes suele hacer el código menos entendible y se usa en descripciones de muy bajo nivel, donde describimos el circuito casi a nivel de puerta lógica. Lo bueno de los lenguajes como VHDL es poder dejar atrás estas descripciones y subir un poco el nivel de abstracción del diseño.
  2. Si tienes señales de enable que activan una salida a partir de una entrada, puedes poner una asignación concurrente como:
s_o <= s_i and enable_i;
  1. Cuando uses bufferes triestado hay que usar siempre una asignación concurrente para que la herramienta de síntesis sea capaz de entenderla. En estos casos la asignación debe tener el siguiente formato. Cualquier otro formato el sintetizador no lo va a entender. Un buffer triestado es un elemento que deja pasar la señal solo cuando esta activo, en caso contrario, coloca una impedancia muy alta que a efectos prácticos es como tener la salida fisicamente desconectada. Es muy utilizado para compartir buses de datos entre varios elementos.
Buffer triestado
Z <= A when Enable = '1' else 'Z'; 

Esperamos que este articulo os haya ayudado a entender mejor las asignaciones concurrentes en VHDL. Recordad que tenéis mas información en nuestro canal de Youtube y nuestro curso de Udemy.