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

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:

Dominando sentencias concurrentes en VHDL: Guía práctica

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.

Dominando sentencias concurrentes en VHDL: Guía práctica

Conclusión

Proceda al siguiente tutorial »

VHDL

  1. Ejemplo de procedimiento VHDL: Incrementando un vector Standard Logic
  2. Creación de listas de cadenas en VHDL: Buenas prácticas y ejemplo
  3. Creación de un testbench dirigido por Tcl para un módulo VHDL de cerradura por código
  4. Finalizar elegantemente una simulación de testbench VHDL
  5. Implementación de un controlador PWM en VHDL: Diseño, simulación y demo en FPGA
  6. Diseño de un búfer circular FIFO robusto en VHDL usando RAM de bloques
  7. Cómo construir un testbench de auto-comprobación en VHDL: Guía práctica
  8. Implementación de lista enlazada dinámica en VHDL con tipos protegidos y punteros de acceso
  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