Dominando sentencias concurrentes en VHDL: Guía práctica
Una sentencia concurrente en VHDL es una asignación de señal que se sitúa directamente en una arquitectura, fuera de cualquier bloque process. También se le conoce como asignación concurrente o proceso concurrente.
Cuando escribe una sentencia concurrente, está creando efectivamente un proceso que es automáticamente sensible a cada señal que aparece en el lado derecho de la asignación. En otras palabras, una asignación concurrente es azúcar sintáctico para un proceso con una lista de sensibilidad completa.
Esta abreviatura es especialmente útil cuando quiere implementar lógica combinacional simple que conduce una sola señal. En lugar de escribir un constructo process completo con una lista de sensibilidad, puede asignar directamente a la señal objetivo en el cuerpo de la arquitectura.
Este tutorial es parte de la serie Tutoriales Básicos de VHDL.
Cuando se usa correctamente, la intención del código permanece cristalina —no hay necesidad de ensuciar el diseño con un proceso para cada bit que quiera conmutar.
Ejercicio
En este video aprendemos cómo crear una sentencia concurrente:
El código final que creamos en este tutorial:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity T13_ConcurrentProcsTb is
end entity;
architecture sim of T13_ConcurrentProcsTb is
signal Uns : unsigned(5 downto 0) := (others => '0');
signal Mul1 : unsigned(7 downto 0);
signal Mul2 : unsigned(7 downto 0);
signal Mul3 : unsigned(7 downto 0);
begin
process is
begin
Uns <= Uns + 1;
wait for 10 ns;
end process;
-- Proceso multiplicando Uns por 4
process is
begin
Mul1 <= Uns & "00";
wait on Uns;
end process;
-- Proceso equivalente usando lista de sensibilidad
process(Uns) is
begin
Mul2 <= Uns & "00";
end process;
-- Proceso equivalente usando sentencia concurrente
Mul3 <= Uns & "00";
end architecture;
La ventana de forma de onda en ModelSim después de presionar run, y hacer zoom en la línea de tiempo:
Podemos ver en la forma de onda que Mul1, Mul2 y Mul3 se comportan exactamente igual. Esto confirma que una sentencia concurrente y los dos procesos que escribimos son totalmente equivalentes.
Una sentencia concurrente opera igual que un proceso: todas las señales que aparecen en el lado derecho del <= se añaden implícitamente a su lista de sensibilidad. Consecuentemente, la señal en el lado izquierdo se actualiza cada vez que cualquiera de esas señales evaluadas cambia.
En este ejemplo multiplicamos la señal Uns por 4 usando un desplazamiento de bits a la izquierda. Todas nuestras señales son del tipo unsigned, así que el compilador las trata como valores numéricos. Anexar dos bits cero a la derecha de un número binario es equivalente a multiplicarlo por 4.
Conclusión
- Una sentencia concurrente es una asignación de señal colocada directamente en la arquitectura.
- Es funcionalmente idéntica a un proceso con todas las señales del lado derecho en su lista de sensibilidad.
Proceda al siguiente tutorial »
VHDL
- Ejemplo de procedimiento VHDL: Incrementando un vector Standard Logic
- Creación de listas de cadenas en VHDL: Buenas prácticas y ejemplo
- Creación de un testbench dirigido por Tcl para un módulo VHDL de cerradura por código
- Finalizar elegantemente una simulación de testbench VHDL
- Implementación de un controlador PWM en VHDL: Diseño, simulación y demo en FPGA
- Diseño de un búfer circular FIFO robusto en VHDL usando RAM de bloques
- Cómo construir un testbench de auto-comprobación en VHDL: Guía práctica
- Implementación de lista enlazada dinámica en VHDL con tipos protegidos y punteros de acceso
- 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