Introducción al VHDL
Ing. Arturo Miguel de Priego
[email protected] Parte de este material está basado en presentaciones de Altera, de cursos que preparé en la PUCP, y de fuentes en Internet.
¿Qué significa VHDL? VHDL = VHSIC + HDL. VHSIC = Very High Speed Integrated Circuit Circuitos Integrados de Muy Alta Velocidad HDL = Hardware Description Language Lenguaje de Descripción de Hardware
VHDL es un lenguaje textual de alto nivel que se utiliza para la descripción del hardware de los sistemas digitales. Las herramientas CAD toman descripciones VHDL para simular, sintetizar y verificar circuitos digitales.
¿Qué es VHDL? • VHDL es un lenguaje estándar que se emplea para la documentación, simulación, síntesis y verificación de sistemas digitales. • Los lenguajes de descripción de hardware, como el VHDL, facilitan la descripción de circuitos integrados digitales complejos.
¿Por qué VHDL? • Lenguaje estándar. • Soporte de las principales compañías proveedoras de herramientas CAD y EDA. • Flexibilidad de implementación en circuitos integrados: código VHDL es portable entre herramientas, aunque normalmente es necesario hacer ajustes según el dispositivo o la tecnología. • Es un lenguaje popular cuyo número de usuarios sigue aumentando. • Ventajas – Proceso de desarrollo más confiable y automatizado – Reducción de costo y tiempo de salida al mercado
VHDL: Orígenes y evolución • Desarrollado en los comienzos de los 80’s como un método para la descripción de sistemas electrónicos para el Departamento de Defensa de EE.UU. Su sintáxis es similar al lenguaje de programación Ada. • Fue estandarizado en 1987, bajo la norma IEEE 1076. En 1993 salió una revisión con algunas nuevas capacidades, manteniendo la compatibilidad con la norma original. • Es utilizado ampliamente en la industria y academia, sin embargo, otros lenguajes como SystemC y SystemVerilog están ganando mayor atención y popularidad.
¿Para qué sirve VHDL? • Comienzos de los 90’s : diseño de ASICs complejos, empleando herramientas de síntesis. • Mediados de los 90’s: diseño con lógica programable. • Se utiliza en la documentación así como en la simulación del sistema, y además se emplea para sintetizar la parte hardware del sistema digital. • Actualmente se emplea en el modelamiento de todo el sistema digital (hardware y software.) • Las herramientas de síntesis permiten implementar los circuitos sobre ASICs y FPLDs.
Limitaciones de VHDL • No permite describir sistemas analógicos. Sin embargo, ya se están desarrollando versiones análogas y mixtas. • No existe un estilo de descripción normalizado. Para síntesis se requiere ajustar los estilos disponibles a la capacidad de las herramientas CAD. • Es posible sintetizar lógica solo de un subconjunto del lenguaje. Las herramientas de síntesis no soportan los mismos subconjuntos, y existen a veces diferencias al mudar de herramientas.
Conceptos Fundamentales • CONCURRENCIA => Actividades concurrentes son sucesos que ocurren en paralelo. En el hardware los eventos suelen disparar varios procesos al mismo tiempo. Modela la activación de los bloques de un sistema digital, donde las señales se presentan sobre las entradas de los bloques y producen resultados en las salidas • ESTRUCTURA=> Ordenamiento de bloques en una jerarquía. Cada bloque se puede describir en estilo RTL, comportamental o mixto. • SECUENCIA => Las sentencias secuenciales se ejecutan una después de otra, como en lenguajes de software con un solo microprocesador. • TIEMPO => VHDL permite modelar el concepto de tiempo. Simulación dirigida por eventos. Un evento es producido por un cambio en una señal en un determinado tiempo de simulación. La respuesta de un modelo a un evento puede provocar nuevos eventos.
Niveles de Abstracción • La abstracción define cuanto detalle debe ser descrito acerca del diseño. • Existen cuatro niveles principales de abstracción: – Layout (Trazado): descripción en el nivel geométrico o físico. Especifica la disposición física de los dispositivos en el chip. Puede incluir información sobre temporización y efectos analógicos. – Lógico: Especifica la conexión de puertas lógicas y registros. Informa detalladamente la función, arquitectura, tecnología y temporización. – Transferencia de Registros (RTL): Define cada registro en el diseño y la lógica entre ellos. Contiene información de la arquitectura pero no detalla la tecnología. No especifica los retardos de tiempo absolutos. – Comportamental: Describe la función de un diseño sin especificar la arquitectura de registros. Puede requerir información de tiempos de retardos.
• En VHDL se utilizan los estilos RTL y Comportamental
Carta Y de Gajski & Kahn Estructural
RTL:ALU, regisro Procesador
Microcomputador
Puerta lógica, flipflop Transistor Especificaciones Algoritmo
Geométrico Trazado de figuras
Lenguaje RTL Ecuación Booleana Ecuación Diferencial
Celdas estándares Macroceldas
Funcional
Plano de bloques Chip, PCP, MCM
Mayor abstracción
Menor abstracción
Estilos RTL y Comportamental • La mayoría de las herramientas de síntesis requieren que el código se exprese en el nivel RTL. En este nivel el diseñador debe especificar la arquitectura de los registros y puertas en el diseño. – Camino de datos (datapath) modelado estructuralmente.
• Las herramientas de síntesis comportamental generan automáticamente el circuito en el nivel de puertas y flipflops a partir de la codificación de un algoritmo. – Sección de control (i.e. máquinas de estados) descrito funcionalmente.
• La descripción comportamental se emplea también para modelar estímulos y respuestas (testbenchs), documentar partes y detallar las especificaciones del hardware. • NOTA: – Algunos CADs permiten mezclar descripciones HDL con descripciones esquemáticas.
Unidades de Diseño en VHDL
Entidad
Paquete
Arquitectura Cuerpo de Paquete Configuración
Paquetes • En un paquete se colocan definiciones comunes para varias entidades de diseño. Ello facilita el trabajo de equipos. • Puede contener declaraciones de: – Valores constantes – Tipos definidos por el usuario – Componentes
• Un Cuerpo de Paquete es otra unidad de diseño, que incluye subprogramas • En el curso vamos a emplear esta característica del lenguaje para compartir información y archivos de diseño.
VHDL Metodología de Diseño Requerimientos
Especificaciones
Arquitectura Modelamiento RTL, Funcional Verificación
Síntesis Modelo de Puertas
Banco de Pruebas Simulación Rediseño Simulación
Ubicación y Conexión FPLD, ASIC
Modelo de Retardos
Simulación
Sintaxis VHDL Entidad y Arquitectura – Tipos de datos Señales y variables – Asignaciones – Procesos Sentencia IF ELSE – Sentencia CASE
Entidades y Arquitecturas • Entidad => Indica QUE es el diseño. – Define la interfaz de un bloque, sin definir su comportamiento. Equivale a un símbolo en un diagrama esquemático.
• Arquitectura => Indica COMO trabaja el diseño. – Modela el comportamiento o estructura del circuito. Puede contener elementos RTL o comportamentales. – Una entidad puede contener varias arquitecturas.
• Entidad + Arquitecturas = opciones de diseño, diferentes soluciones para un mismo problema.
Entidad • Define la interfaz con el mundo exterior (i.e., pines de entrada y salida) • Funciona como un símbolo esquemático, con la diferencia que se usa texto en vez de símbolos gráficos Entradas Puerto
ENTITY ejemplo IS PORT ( a, b : in BIT; c, d : out BIT); END ejemplo;
Tipo de dato
Salidas
IN: entrada OUT: salida INOUT: bidireccional
Nombre de la Entidad
Arquitectura • Define la implementación del diseño. • La arquitectura puede definirse mediante asignaciones de expresiones lógicas, interconexiones de componentes y sentencias de alto nivel. • Funciona como un circuito esquemático. ARCHITECTURE pld OF ejemplo IS BEGIN c <= a AND b; d <= a OR b; END pld; Todas las sentencias se
colocan entre BEGIN y END.
Ejemplo de un diseño completo
ENTITY example IS PORT ( END example;
a : in BIT; b : out BIT);
ARCHITECTURE pld OF example IS BEGIN b <= a; END pld;
ENTITY define los puertos (interfaz) del diseño. ENTITY y ARCHITECTURE conforman un par enlazado mediante un nombre.
ARCHITECTURE define la implementación.
VHDL no es sensitivo al tipo de carácter
Puertos, Señales y Variables • Los puertos se especifican en la entidad: IN OUT INOUT
Puerto de entrada Puerto de salida Puerto bidireccional
• Las señales y variables se usan en la arquitectura SIGNAL Se declara antes del BEGIN de la arquitectura y se puede usar en cualquier lugar de ella. Si va en un proceso su valor se actualiza al salir de él. La asignación usa el símbolo <= VARIABLE Se declara y utiliza en un proceso y actualiza inmediatamente su valor asignado. La asignación usa el símbolo :=
Tipos de Datos • Cada señal debe tener un tipo de dato asociado que se indica cuando la señal es declarada. Tipos diferentes de datos no pueden asignarse unos a otros. Todos los puertos, señales y variables deben ser de algún tipo de dato. Existen tipos ya construidos pero también pueden crearse nuevos. • TIME => 10 ns 2.5 ps • BIT => ‘0’ ‘1’ • BIT_VECTOR => grupo de bits “00101101” “0101” • STD_LOGIC = {‘0’, ‘1’, ‘X’, ‘Z’} más 5 otros tipos no usados para síntesis. – ‘X’ (no ´x´) es valor de no importa. – ‘Z’ (mayúscula) es valor de tres-estados.
• • • •
STD_LOGIC_VECTOR => p.e. “0Z1X011” Carácter => ‘A’ ‘x’ ‘7’ Cadenas => “VHDL” Real => 1.23 -9.8
Tipo de Dato INTEGER • Se comporta como un entero en álgebra • El rango es especificado por el usuario o por defecto por el compilador. – El usuario puede especificar cualquier subrango: pablo :INTEGER range 0 TO 255; vilma :INTEGER range 200 DOWNTO 54; – Si el rango no es especificado será el rango por defecto determinado por el compilador. doctorRajuela
:INTEGER;
Buses • VHDL ofrece tipos vectores para crear buses • Tipos de vectores comunes: – BIT_VECTOR, STD_LOGIC_VECTOR
• Ejemplos – SIGNAL pablo :bit_vector(7 downto 0); – SIGNAL betty :std_logic_vector(3 downto 0); – SIGNAL bambam :std_logic_vector(1 to 3); El MSB queda indicado por el índice de la izquierda: pablo(7), betty(3) bambam(1) El LSB queda indicado por el índice de la derecha: pablo(0), betty(0) bambam(3)
Asignación de Buses • Bus completo – pebbles <= “11111111”;
• Un bit de un bus – dino (3) <= ‘1’;
La dirección del subrango debe ser igual como en la declaración del vector
• Una parte del bus – SIGNAL picapiedras :bit_vector(7 downto 0); – picapiedras (3 downto 2) <= “11”;
• Encadenación – SIGNAL mas :bit_vector (8 downto 0); – mas <= a(1) & b(3 downto 0) & ‘0’ & “010”;
• Agregado – mas(3 downto 0) <= ( a(1), b(3), ‘0’, ‘1’); – maz <= ( 3=> ‘1’, 1 downto 0 => ‘1’, 2 => L ); – max <= ( 3=> ‘1’, OTHERS => N );
Tipos Enumerados • Los tipos enumerados son tipos creados por el usuario. • Se emplean principalmente para las máquinas de estado. • Los tipos se enumeran en una secuencia binaria, comenzando desde cero e incrementándose de uno en uno. • Ejemplos – TYPE pais IS (Alemania, Italia, Japon); – TYPE luces IS (rojo, verde, ambar, negro);
Asignaciones de Señales Concurrentes • Simple a <= r or t; b <= ((r or t) and not(g xor h));
• Condicional Estas asignaciones no se emplean dentro de los procesos
• Selectiva
q <= ‘0’ WHEN clr = ‘0’ ELSE ‘1’ WHEN set = ‘1’ ELSE ‘X’ ; WITH sel SELECT q <= a WHEN ‘0’, b WHEN ‘1’;
Especifican los valores de las señales para cualquier combinación de las entradas. La síntesis crea puertas y conexiones lógicas. No se crean latches ni flipflops.
Asignación múltiple • Cuando más una señal recibe dos asignaciones de señales separadas, se dice que es manejada por múltiples fuentes. • En esos casos, se necesita una Función de Resolución. Si no existe una función de resolución la asignación múltiple resulta ilegal. • El tipo std_ulogic no soporta asignación múltiple, pero si el tipo std_logic. • VHDL para síntesis de MAX+plus II no permite asignaciones múltiples en asignaciones concurrentes.
Asignación simple • Es una asignación directa, como en una función booleana o matemática: c <= a AND b; d <= e; x <= y + z;
-- crea una puerta AND -- conecta dos nodos -- suma y con z, luego asigna el -- resultado a x ENTITY EjmAsgSimple IS PORT ( a, b, e : IN BIT; c, d : OUT BIT END EjmAsgSimple; ARCHITECTURE maxpld OF EjmAsgSimple IS BEGIN c <= a AND b; d <= e; END maxpld;
);
Asignación Condicional • Lista una serie de expresiones que son asignadas a una señal luego de una evaluación positiva de una o más expresiones booleanas. Cada expresión booleana se valida en el orden escrito. -- Multiplexor 2 a 1: f <= a si s = ‘0’, b si s = ‘1’ ARCHITECTURE mux OF Mux2a1 IS BEGIN f <= a WHEN s = ' 0'ELSE b; END Mux2a1;
Ejemplo: Codificador con prioridad ENTITY condsigm IS PORT( high, mid, low : IN BIT; q : OUT INTEGER RANGE 0 TO 3 ); END condsigm; ARCHITECTURE maxpld OF condsigm IS BEGIN q <= 3 WHEN high = ' 1'ELSE -- prioridad más alta 2 WHEN mid = ' 1'ELSE -- media prioridad 1 WHEN low = ' 1'ELSE -- prioridad más baja 0; -- no hay señal activa END maxpld;
Asignación Selectiva Lista alternativas disponibles para cada valor de una expresión.
ENTITY selsig IS PORT( d0, d1, d2, d3: IN BIT; s : IN INTEGER RANGE 0 TO 3; q : OUT BIT); END selsig; ARCHITECTURE maxpld OF selsig IS BEGIN WITH s SELECT output <= d0 WHEN 0, d1 WHEN 1, d2 WHEN 2, d3 WHEN 3; END maxpld;
Multiplexor 4 a 1
Procesos • Un proceso define sentencias que se ejecutan en la secuencia descrita. • Una sentencia Wait o una Lista de Sensibilidad describe las condiciones para ejecutar la sentencia Process (Proceso). • Dentro del proceso, las sentencias se ejecutan secuencialmente. • Los procesos se comunican entre sí concurrentemente mediante señales. • En un proceso pueden existir asignación de variables, de señales, llamadas a procedimientos, sentencias IF, sentencias CASE, y sentencias iterativas. • Una arquitectura puede contener más de un proceso.
La Sentencia Process • Usando lista de sensibilidad (Sensitivity List): PROCESS (a, b, c, d) BEGIN -- sentencia secuencial #1 -- ... -- sentencia secuencial #N END PROCESS;
• Este proceso se ejecuta luego de un cambio en cualquier señal de la lista de sensibilidad.
La Sentencia Process • Usando la sentencia Wait: PROCESS BEGIN WAIT condición -- sentencia secuencial #1 -- ... -- sentencia secuencial #N END PROCESS;
• Este proceso se ejecuta cuando la condición WAIT es verdadera
La Sentencia Process • Utilice etiquetas para la organización de varios procesos:
abcd: PROCESS (a, b, c, d) BEGIN -- sentencia secuencial #1 -- ... -- sentencia secuencial #N END PROCESS abcd;
• La etiqueta (label) identifica procesos específicos en una arquitectura de múltiples procesos
Ejemplo: Función OR
entity PuertaOR is port (A,B : in bit; Z : out bit); end PuertaOR;
architecture comb of PuertaOR is begin OR_FUNC: process (A,B) begin if (A=' 1'or B=' 1' ) then Z <= ' 1' ; else Z <= ' 0' ; end if; end process OR_FUNC; end comb;
Sentencia if • Elige una acción basada en una condición. Permite las palabras ELSIF, ELSE. Debe estar dentro de una sentencia Process IF expresion THEN IF expresion THEN
sentencia;
sentencia;
IF expresion THEN
sentencia;
sentencia;
END IF;
sentencia; ELSIF expresion THEN
IF expresion THEN
sentencia;
sentencia;
sentencia;
sentencia; ELSE sentencia; sentencia; END IF;
ELSIF expresion THEN sentencia; sentencia; END IF;
sentencia; ELSIF expresion THEN sentencia; sentencia; ELSIF expresion THEN sentencia; sentencia; ELSE sentencia; sentencia; END IF;
Sentencia if : Ejemplo ENTITY if_ex IS PORT (sel, a, b y END if_ex;
: IN BIT; : OUT BIT);
ARCHITECTURE if_ex OF if_ex IS BEGIN PROCESS (sel, a, b) BEGIN IF sel = '1' THEN y <= a; ELSE y <= b; Esta descripción resulta en END IF; un multiplexor dos a uno. END PROCESS; END if_ex;
Sentencias Case • Ejecuta sentencias de acuerdo al valor de una expresión. • When Others sirve para indicar que sentencias deben ejecutarse si el valor de la expresión no coincide con los casos anteriores. CASE expresion IS
WHEN valor_constante =>
CASE val IS WHEN “00” => q <= i0; WHEN “01” => q <= i1; WHEN OTHERS => q <= ‘X’; END CASE;
sentencia; sentencia; WHEN valor_constante => sentencia; sentencia; WHEN OTHERS => sentencia; sentencia; END CASE;
Construcciones VHDL para una AND proceso con case
asignación directa
proceso con if - else
asignación condicional asignación selectiva