Conceptos Fundamentales de VHDL para Diseño Digital

Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 9,27 KB

Generalidades del Diseño Digital con VHDL

El flujo de trabajo en el diseño digital con VHDL se puede resumir en los siguientes pasos clave:

  • Diseño CAD (Diseño Asistido por Computadora): Creación y escritura del código VHDL que describe el circuito.
  • Simulación: Proceso de probar y verificar el comportamiento funcional del diseño para asegurar que cumple con las especificaciones antes de la implementación física.
  • EDA (Electronic Design Automation): Conjunto de herramientas de software que automatizan el proceso de diseño electrónico, incluyendo la síntesis, el enrutado y la implementación del diseño en un dispositivo físico como una FPGA o CPLD.

Unidades de Diseño Básico en VHDL

Los componentes fundamentales para construir un diseño en VHDL son:

  • Entidad (Entity)
  • Arquitectura (Architecture)
  • Paquetes (Packages)
  • Señales (Signals) y Variables (Variables)
  • Procesos (Process)
  • Sentencias de control (IF, ELSE, CASE)

Entidad (Entity)

La entidad define la interfaz de un bloque de diseño, es decir, sus puertos de entrada y salida, sin describir su comportamiento interno. Indica "qué es" el diseño, actuando como una caja negra.

Declaración de una Entidad

La sintaxis general es:

ENTITY nombre_entidad IS
    PORT (
        -- Lista de puertos: Entradas, Salidas, I/O, Buffers
    );
END ENTITY nombre_entidad;

Ejemplos:

-- Ejemplo 1: Compuerta AND simple
ENTITY ejem1 IS
    PORT (
        a, b : IN  BIT;
        s    : OUT BIT
    );
END ENTITY ejem1;

-- Ejemplo 2: Multiplexor 4 a 1
ENTITY mux1 IS
    PORT (
        Dato   : IN  BIT_VECTOR(3 DOWNTO 0);
        Select : IN  BIT_VECTOR(1 DOWNTO 0);
        Enable : IN  BIT;
        Sal    : OUT BIT
    );
END ENTITY mux1;

Arquitectura (Architecture)

La arquitectura indica "cómo trabaja" el diseño. Modela el comportamiento o la estructura interna del circuito definido en la entidad. Una misma entidad puede tener varias arquitecturas asociadas, permitiendo modelar el mismo componente de diferentes maneras (por ejemplo, a nivel de comportamiento o estructural).

ARCHITECTURE nombre_arquitectura OF nombre_entidad IS
    -- Declaración de señales, componentes y otros elementos internos
BEGIN
    -- Núcleo del programa: descripción del comportamiento o estructura
END ARCHITECTURE nombre_arquitectura;

-- Ejemplo de arquitectura para la entidad ejem1
ARCHITECTURE archejem1 OF ejem1 IS
BEGIN
    s <= a AND b;
END ARCHITECTURE archejem1;

Señales (Signal) y Variables (Variable)

Tanto las señales como las variables se utilizan para almacenar valores, pero tienen diferencias fundamentales:

  • Señal (SIGNAL): Representa un "cable" físico en el hardware. La asignación se realiza con el operador <= y es concurrente (no se actualiza inmediatamente, sino al final de un ciclo o proceso).
  • Variable (VARIABLE): Se utiliza dentro de procesos, funciones o procedimientos para cálculos intermedios. La asignación se realiza con := y su valor se actualiza de forma inmediata y secuencial.

Modos y Tipos de Datos

Modos de Puerto

Los puertos de una entidad pueden tener los siguientes modos:

  • IN: Puerto de entrada. Solo se puede leer.
  • OUT: Puerto de salida. Solo se puede escribir.
  • INOUT: Puerto bidireccional. Se puede leer y escribir.
  • BUFFER: Similar a OUT, pero su valor también puede ser leído internamente en la arquitectura.

Tipos de Datos

  • INTEGER: Números enteros. El rango puede ser especificado por el usuario o tomar el valor por defecto del compilador.
    VARIABLE Pablo: INTEGER RANGE 0 TO 255;
    VARIABLE Juan: INTEGER RANGE 200 DOWNTO 54;
    VARIABLE Pedro: INTEGER; -- Rango por defecto
  • BIT: Representa un solo bit con valores '0' o '1'.
  • BIT_VECTOR: Un vector o conjunto de bits. Se define con un rango. Ejemplo: "0101".
    SIGNAL mi_vector: BIT_VECTOR(7 DOWNTO 0);
    SIGNAL otro_vector: BIT_VECTOR(0 TO 3);
  • STD_LOGIC: Tipo estándar (de la librería IEEE 1164) que puede tener 9 valores, incluyendo '0', '1', 'X' (desconocido), 'Z' (alta impedancia), etc.
  • STD_LOGIC_VECTOR: Vector de tipo STD_LOGIC. Ejemplo: "0Z1X011".
  • TIME: Para especificar unidades de tiempo en simulaciones. Ejemplo: 20 ns, 2.5 ps.

Asignación de Señales y Buses

Asignación de Buses

  • Bus completo: Se asigna un valor a todos los bits del vector.
    -- Suponiendo que 'jose' es un BIT_VECTOR(7 DOWNTO 0)
    jose <= "11111111";
  • Un bit de un bus: Se asigna un valor a un bit específico.
    dino(3) <= '1';
    jose(5) <= '1';
  • Una parte del bus (slice): Se asigna un valor a un subconjunto de bits.
    SIGNAL pablo: BIT_VECTOR(7 DOWNTO 0);
    pablo(3 DOWNTO 2) <= "11";
  • Concatenación: Se unen bits o vectores usando el operador &.
    SIGNAL vilma: BIT_VECTOR(8 DOWNTO 0);
    -- Suponiendo que 'a' y 'b' son vectores de bits
    vilma <= a(1) & b(3 DOWNTO 0) & '0' & "010";

Asignación de Señales

Existen diferentes formas de asignar valores a las señales:

Asignación Simple (Concurrente)

Se ejecuta cada vez que una de las señales a la derecha del operador cambia de valor.

a <= r OR t;
b <= ((r OR t) AND NOT (g XOR h));
c <= a AND b;  -- Crea una compuerta AND
x <= y + z;    -- Suma y con z, luego asigna el resultado a x

Ejemplo completo:

ENTITY Ejm2 IS
    PORT (
        a, b : IN  BIT;
        c    : OUT BIT
    );
END ENTITY Ejm2;

ARCHITECTURE maxpld OF Ejm2 IS
BEGIN
    c <= a AND b;
END ARCHITECTURE maxpld;

Asignación Condicional

Utiliza la estructura WHEN ... ELSE para asignar un valor basado en la evaluación de una o más expresiones booleanas. Las condiciones se evalúan en el orden en que están escritas.

q <= '0' WHEN clr = '0' ELSE
     '1' WHEN set = '1' ELSE
     'X';

-- Ejemplo de un multiplexor 2 a 1
ARCHITECTURE mux OF Mux2 IS
BEGIN
    f <= a WHEN s = '0' ELSE b;
END ARCHITECTURE mux;

Asignación Selectiva

Utiliza la estructura WITH ... SELECT para asignar un valor a una señal eligiendo entre varias opciones, basándose en el valor de una expresión de selección.

WITH Sel SELECT
    q <= a WHEN "00",
         b WHEN "01",
         c WHEN "10",
         d WHEN OTHERS;

Estilos de Descripción de una Arquitectura

Comportamental (Behavioral)

Se caracteriza por incluir sentencias y órdenes típicas de un lenguaje de programación (IF, CASE, LOOP, etc.) dentro de un bloque PROCESS. Describe el comportamiento del circuito de forma secuencial, sin importar cómo quedará la distribución de las compuertas lógicas en el dispositivo final (CPLD o FPGA).

Flujo de Datos (Dataflow)

Describe cómo la información es transferida de señal a señal y de la entrada a la salida mediante asignaciones de señales concurrentes (simples, condicionales o selectivas). En este estilo no se utilizan bloques PROCESS.

Estructural (Structural)

En este estilo se describe una "netlist" o lista de interconexiones. Se instancian componentes previamente definidos (otras entidades) y se conectan entre sí mediante señales. Es análogo a construir un circuito conectando chips en una protoboard. A menudo requiere el uso de señales auxiliares y la declaración de componentes en paquetes o librerías.

Paquetes (Packages)

Los paquetes permiten agrupar un conjunto de declaraciones (tipos de datos, funciones, procedimientos, componentes) para que puedan ser reutilizadas en diferentes diseños sin necesidad de repetirlas.

PACKAGE nombre_del_paquete IS
    -- Declaración de procedimientos
    -- Declaración de funciones
    -- Declaración de componentes
END PACKAGE nombre_del_paquete;

Mixto

Es el estilo más común y consiste en combinar los tres estilos anteriores (comportamental, flujo de datos y estructural) dentro de una misma arquitectura para aprovechar las ventajas de cada uno.


Definiciones de Acrónimos

  • CPLD: Complex Programmable Logic Device (Dispositivo Lógico Programable Complejo).
  • FPGA: Field-Programmable Gate Array (Matriz de Puertas Programable en Campo).

Entradas relacionadas: