VHDL - VHDL

VHDL
Paradigma concurrente , reactivo , flujo de datos
Apareció por primera vez Decenio de 1980
Lanzamiento estable
IEEE 1076-2019 / 23 de diciembre de 2019 ; Hace 20 meses ( 2019-12-23 )
Disciplina de mecanografía fuerte
Extensiones de nombre de archivo .vhd
Sitio web IEEE VASG
Dialectos
VHDL-AMS
Influenciado por
Ada , Pascal
Fuente VHDL para un sumador firmado

El lenguaje de descripción de hardware VHSIC ( VHDL ) es un lenguaje de descripción de hardware (HDL) que puede modelar el comportamiento y la estructura de los sistemas digitales en múltiples niveles de abstracción , desde el nivel del sistema hasta el de las puertas lógicas , para la entrada de diseño, documentación, y fines de verificación. Desde 1987, VHDL ha sido estandarizado por el Instituto de Ingenieros Eléctricos y Electrónicos (IEEE) como IEEE Std 1076 ; la última versión (en abril de 2020) de la cual es IEEE Std 1076-2019 . Para modelar sistemas analógicos y de señal mixta , se ha desarrollado una HDL estandarizada por IEEE basada en VHDL llamada VHDL-AMS (oficialmente IEEE 1076.1).

VHDL lleva el nombre del programa del Departamento de Defensa de los Estados Unidos que lo creó, el Programa de circuitos integrados de muy alta velocidad (VHSIC). A principios de la década de 1980, el programa VHSIC buscó un nuevo HDL para usar en el diseño de los circuitos integrados que pretendía desarrollar. El producto de este esfuerzo fue VHDL Versión 7.2, lanzado en 1985. El esfuerzo por estandarizarlo como estándar IEEE comenzó el año siguiente.

Historia

En 1983, VHDL se desarrolló originalmente a instancias del Departamento de Defensa de EE. UU. Para documentar el comportamiento de los ASIC que las empresas proveedoras incluían en los equipos. El estándar MIL-STD-454N en el Requisito 64 en la sección 4.5.1 "Documentación de ASIC en VHDL" requiere explícitamente la documentación de "Dispositivos microelectrónicos" en VHDL.

La idea de poder simular los ASIC a partir de la información de esta documentación era tan obviamente atractiva que se desarrollaron simuladores lógicos que podían leer los archivos VHDL. El siguiente paso fue el desarrollo de herramientas de síntesis lógica que leen el VHDL y dan como resultado una definición de la implementación física del circuito.

Debido a que el Departamento de Defensa requiere que la mayor parte de la sintaxis posible se base en Ada, para evitar reinventar conceptos que ya habían sido probados a fondo en el desarrollo de Ada, VHDL toma prestado en gran medida del lenguaje de programación Ada en ambos concepto y sintaxis .

La versión inicial de VHDL, diseñado para IEEE estándar IEEE 1076-1987, incluida una amplia gama de tipos de datos, incluyendo numérica ( número entero y de bienes ), lógica ( bit y boolean ), carácter y tiempo , además de arrays de bitllamada bit_vectory de characterllamada string .

Sin embargo, un problema que no se resolvió en esta edición fue la "lógica multivalor", en la que también se consideran la fuerza de excitación de una señal (ninguna, débil o fuerte) y los valores desconocidos. Esto requería el estándar IEEE 1164 , que definía los tipos lógicos de 9 valores: escalar std_logicy su versión vectorial std_logic_vector. Al ser un subtipo resuelto de su std_Ulogictipo principal, std_logiclas señales de tipo -permiten la conducción múltiple para modelar estructuras de bus, por lo que la función de resolución conectada maneja las asignaciones en conflicto de manera adecuada.

El IEEE 1076 actualizado , en 1993, hizo que la sintaxis fuera más consistente, permitió más flexibilidad en la nomenclatura, extendió el charactertipo para permitir caracteres imprimibles ISO-8859-1 , agregó el xnoroperador, etc.

Los cambios menores en el estándar (2000 y 2002) agregaron la idea de tipos protegidos (similar al concepto de clase en C ++ ) y eliminaron algunas restricciones de las reglas de mapeo de puertos.

Además del estándar IEEE 1164, se introdujeron varios estándares secundarios para ampliar la funcionalidad del lenguaje. El estándar IEEE 1076.2 agregó un mejor manejo de tipos de datos reales y complejos. El estándar IEEE 1076.3 introdujo tipos firmados y sin firmar para facilitar las operaciones aritméticas en vectores. El estándar IEEE 1076.1 (conocido como VHDL-AMS ) proporcionó extensiones de diseño de circuitos de señal mixta y analógica.

Algunos otros estándares admiten un uso más amplio de VHDL, especialmente VITAL (Iniciativa VHDL hacia las bibliotecas ASIC) y extensiones de diseño de circuitos de microondas .

En junio de 2006, el Comité Técnico VHDL de Accellera (delegado por IEEE para trabajar en la próxima actualización de la norma) aprobó el llamado Draft 3.0 de VHDL-2006. Si bien mantiene una compatibilidad total con versiones anteriores, este estándar propuesto proporciona numerosas extensiones que facilitan la escritura y la administración del código VHDL. Los cambios clave incluyen la incorporación de estándares secundarios (1164, 1076.2, 1076.3) en el estándar principal 1076, un conjunto extendido de operadores, una sintaxis más flexible de casos y declaraciones de generación , incorporación de VHPI (VHDL Procedural Interface) (interfaz para lenguajes C / C ++ ) y un subconjunto de PSL ( lenguaje de especificación de propiedades ). Estos cambios deberían mejorar la calidad del código VHDL sintetizable, hacer que los bancos de pruebas sean más flexibles y permitir un uso más amplio de VHDL para descripciones a nivel de sistema.

En febrero de 2008, Accellera aprobó VHDL 4.0, también conocido informalmente como VHDL 2008, que abordó más de 90 problemas descubiertos durante el período de prueba para la versión 3.0 e incluye tipos genéricos mejorados. En 2008, Accellera lanzó VHDL 4.0 al IEEE para votación para su inclusión en IEEE 1076-2008. El estándar VHDL IEEE 1076-2008 se publicó en enero de 2009.

Estandarización

El estándar IEEE 1076 define el lenguaje de descripción de hardware VHSIC o VHDL. Fue desarrollado originalmente bajo el contrato F33615-83-C-1003 de la Fuerza Aérea de los Estados Unidos otorgado en 1983 a un equipo de Intermetrics, Inc. como expertos en idiomas y contratista principal, Texas Instruments como expertos en diseño de chips e IBM como diseño de sistemas informáticos. expertos. El lenguaje ha sido objeto de numerosas revisiones y tiene una variedad de subestándares asociados que lo amplían o amplían de manera importante.

1076 fue y sigue siendo un hito en el diseño de sistemas electrónicos.

Revisiones

  • IEEE 1076-1987 Primera revisión estandarizada de la versión 7.2 del lenguaje de la Fuerza Aérea de los Estados Unidos.
  • IEEE 1076-1993 (también publicado con ISBN  1-55937-376-8 ). Mejoras significativas como resultado de varios años de comentarios. Probablemente la versión más utilizada con el mayor soporte de herramientas de proveedores.
  • IEEE 1076-2000. Revisión menor. Introduce el uso de tipos protegidos .
  • IEEE 1076-2002. Revisión menor de 1076-2000. Las reglas con respecto a los puertos de búfer se relajan.
    • IEC 61691-1-1: 2004. Adopción por IEC de IEEE 1076-2002.
  • IEEE 1076c-2007. Se presentó VHPI, la interfaz de procedimiento VHDL, que proporciona al software los medios para acceder al modelo VHDL. El lenguaje VHDL requirió modificaciones menores para adaptarse al VHPI.
  • IEEE 1076-2008 (anteriormente denominado 1076-200x). Revisión importante publicada el 26-01-2009. Entre otros cambios, este estándar incorpora un subconjunto básico de PSL, permite genéricos en paquetes y subprogramas e introduce el uso de nombres externos .
    • IEC 61691-1-1: 2011. Adopción por IEC de IEEE 1076-2008.
  • IEEE 1076-2019. Revisión mayor.

Estándares relacionados

  • IEEE 1076.1 VHDL analógico y de señal mixta ( VHDL-AMS )
  • Paquetes estándar IEEE 1076.1.1 VHDL-AMS (stdpkgs)
  • Paquete matemático IEEE 1076.2 VHDL
  • Paquete de síntesis IEEE 1076.3 VHDL (vhdlsynth) (estándar numérico )
  • Paquete de síntesis IEEE 1076.3 VHDL: coma flotante (fphdl)
  • IEEE 1076.4 Timing (iniciativa VHDL hacia las bibliotecas ASIC: vital)
  • Interoperabilidad de síntesis IEEE 1076.6 VHDL (retirada en 2010)
  • Paquetes de lógica multivalor IEEE 1164 VHDL (std_logic_1164)

Diseño

VHDL se usa generalmente para escribir modelos de texto que describen un circuito lógico. Tal modelo es procesado por un programa de síntesis, solo si es parte del diseño lógico. Se utiliza un programa de simulación para probar el diseño lógico utilizando modelos de simulación para representar los circuitos lógicos que interactúan con el diseño. Esta colección de modelos de simulación se denomina comúnmente banco de pruebas .

Un simulador VHDL suele ser un simulador impulsado por eventos . Esto significa que cada transacción se agrega a una cola de eventos durante un tiempo programado específico. Por ejemplo, si una asignación de señal debe ocurrir después de 1 nanosegundo, el evento se agrega a la cola durante el tiempo + 1ns. También se permite el retardo cero, pero aún debe programarse: para estos casos , se utiliza el retardo delta , que representa un paso de tiempo infinitamente pequeño. La simulación cambia entre dos modos: ejecución de sentencias, donde se evalúan las sentencias desencadenadas, y procesamiento de eventos, donde se procesan los eventos en la cola.

VHDL tiene construcciones para manejar el paralelismo inherente en los diseños de hardware, pero estas construcciones ( procesos ) difieren en sintaxis de las construcciones paralelas en Ada ( tareas ). Como Ada, VHDL está fuertemente tipado y no distingue entre mayúsculas y minúsculas . Para representar directamente operaciones que son comunes en hardware, hay muchas características de VHDL que no se encuentran en Ada, como un conjunto extendido de operadores booleanos que incluyen nand y nor .

VHDL tiene capacidades de entrada y salida de archivos, y se puede usar como un lenguaje de propósito general para el procesamiento de texto, pero los archivos se usan más comúnmente en un banco de pruebas de simulación para estímulos o datos de verificación. Hay algunos compiladores de VHDL que crean binarios ejecutables. En este caso, podría ser posible usar VHDL para escribir un banco de pruebas para verificar la funcionalidad del diseño usando archivos en la computadora host para definir estímulos, interactuar con el usuario y comparar los resultados con los esperados. Sin embargo, la mayoría de los diseñadores dejan este trabajo en manos del simulador.

Es relativamente fácil para un desarrollador sin experiencia producir código que simule con éxito pero que no se pueda sintetizar en un dispositivo real, o sea demasiado grande para ser práctico. Un error particular es la producción accidental de pestillos transparentes en lugar de chanclas tipo D como elementos de almacenamiento.

Se puede diseñar hardware en un VHDL IDE (para implementación de FPGA como Xilinx ISE, Altera Quartus, Synopsys Synplify o Mentor Graphics HDL Designer) para producir el esquema RTL del circuito deseado. Después de eso, el esquema generado se puede verificar usando un software de simulación que muestra las formas de onda de las entradas y salidas del circuito después de generar el banco de pruebas apropiado. Para generar un banco de pruebas apropiado para un circuito en particular o un código VHDL, las entradas deben definirse correctamente. Por ejemplo, para la entrada de reloj, se requiere un proceso de bucle o una declaración iterativa.

Un último punto es que cuando un modelo VHDL se traduce en las "puertas y cables" que se asignan a un dispositivo lógico programable, como un CPLD o FPGA , entonces se configura el hardware real, en lugar de "ejecutar el código VHDL "como si estuviera en algún tipo de chip de procesador.

Ventajas

La ventaja clave de VHDL, cuando se utiliza para el diseño de sistemas, es que permite describir (modelar) y verificar (simular) el comportamiento del sistema requerido antes de que las herramientas de síntesis traduzcan el diseño en hardware real (puertas y cables).

Otro beneficio es que VHDL permite la descripción de un sistema concurrente . VHDL es un lenguaje de flujo de datos en el que se considera que cada declaración se ejecuta simultáneamente, a diferencia de los lenguajes de computación de procedimientos como BASIC, C y código ensamblador, donde una secuencia de declaraciones se ejecuta secuencialmente una instrucción a la vez.

Un proyecto VHDL es polivalente. Al crearse una vez, un bloque de cálculo se puede utilizar en muchos otros proyectos. Sin embargo, se pueden ajustar muchos parámetros de bloques formativos y funcionales (parámetros de capacidad, tamaño de memoria, base de elementos, composición de bloques y estructura de interconexión).

Un proyecto VHDL es portátil. Al crearse para una base de elementos, un proyecto de dispositivo informático se puede portar en otra base de elementos, por ejemplo, VLSI con varias tecnologías.

Una gran ventaja de VHDL en comparación con Verilog original es que VHDL tiene un sistema de tipo completo . Los diseñadores pueden usar el sistema de tipos para escribir un código mucho más estructurado (especialmente declarando tipos de registros ).

Ejemplos de diseño

En VHDL, un diseño consta como mínimo de una entidad que describe la interfaz y una arquitectura que contiene la implementación real. Además, la mayoría de los diseños importan módulos de biblioteca. Algunos diseños también contienen múltiples arquitecturas y configuraciones .

Una puerta AND simple en VHDL se vería como

-- (this is a VHDL comment)
/*
    this is a block comment (VHDL-2008)
*/
-- import std_logic from the IEEE library
library IEEE;
use IEEE.std_logic_1164.all;

-- this is the entity
entity ANDGATE is
  port ( 
    I1 : in std_logic;
    I2 : in std_logic;
    O  : out std_logic);
end entity ANDGATE;

-- this is the architecture
architecture RTL of ANDGATE is
begin
  O <= I1 and I2;
end architecture RTL;

(Tenga en cuenta que RTLsignifica diseño de nivel de transferencia de registro ). Si bien el ejemplo anterior puede parecer detallado para los principiantes de HDL, muchas partes son opcionales o deben escribirse solo una vez. Generalmente, las funciones simples como esta son parte de un módulo de comportamiento más grande, en lugar de tener un módulo separado para algo tan simple. Además, el uso de elementos como el std_logictipo puede parecer al principio una exageración. Se podría usar fácilmente el tipo integrado bity evitar la importación de la biblioteca al principio. Sin embargo, utilizando una forma de lógica multivaluada , específicamente lógica 9 valorado- ( U, X, 0, 1, Z, W, H, L, -), en lugar de bits simples (0,1) ofrece una muy poderosa de simulación y herramienta de depuración para el diseñador que hace actualmente no existen en ningún otro HDL.

En los ejemplos que siguen, verá que el código VHDL se puede escribir en una forma muy compacta. Sin embargo, los diseñadores más experimentados generalmente evitan estas formas compactas y usan un estilo de codificación más detallado en aras de la legibilidad y el mantenimiento.

Construcciones sintetizables y plantillas VHDL

VHDL se utiliza con frecuencia para dos objetivos diferentes: simulación de diseños electrónicos y síntesis de dichos diseños. La síntesis es un proceso en el que un VHDL se compila y se asigna a una tecnología de implementación como un FPGA o un ASIC.

No todas las construcciones en VHDL son adecuadas para síntesis. Por ejemplo, la mayoría de las construcciones que se ocupan explícitamente de la sincronización, como wait for 10 ns;no son sintetizables, a pesar de ser válidas para la simulación. Si bien las diferentes herramientas de síntesis tienen diferentes capacidades, existe un subconjunto sintetizable común de VHDL que define qué construcciones de lenguaje y qué modismos se asignan en hardware común para muchas herramientas de síntesis. IEEE 1076.6 define un subconjunto del lenguaje que se considera el subconjunto de síntesis oficial. En general, se considera una "mejor práctica" escribir código muy idiomático para la síntesis, ya que los resultados pueden ser incorrectos o subóptimos para construcciones no estándar.

Plantilla MUX

El multiplexor , o 'MUX' como se le suele llamar, es una construcción simple muy común en el diseño de hardware. El siguiente ejemplo muestra un MUX simple de dos a uno, con entradas Ay B, selector Sy salida X. Tenga en cuenta que hay muchas otras formas de expresar el mismo MUX en VHDL.

X <= A when S = '1' else B;

Plantilla de pestillo

Un pestillo transparente es básicamente un bit de memoria que se actualiza cuando se genera una señal de habilitación. Nuevamente, hay muchas otras formas en que esto se puede expresar en VHDL.

-- latch template 1:
Q <= D when Enable = '1' else Q;

-- latch template 2:
process(all)
begin
    Q <= D when(Enable);
end process;

Chanclas tipo D

El flip-flop tipo D muestrea una señal entrante en el borde ascendente (o descendente) de un reloj. Este ejemplo tiene un restablecimiento asíncrono, activo-alto y muestras en el borde del reloj ascendente.

DFF : process(all) is
begin
  if RST then
    Q <= '0';
  elsif rising_edge(CLK) then
    Q <= D;
  end if;
end process DFF;

Otra forma común de escribir el comportamiento disparado por el borde en VHDL es con el atributo de señal 'evento'. Debe escribirse un solo apóstrofo entre el nombre de la señal y el nombre del atributo.

DFF : process(RST, CLK) is
begin
  if RST then
    Q <= '0';
  elsif CLK'event and CLK = '1' then
    Q <= D;
  end if;
end process DFF;

VHDL también se presta a "frases ingeniosas" como

DFF : Q <= '0' when RST = '1' else D when rising_edge(clk);

o

DFF : process(all) is 
begin
  if rising_edge(CLK) then
    Q  <= D;
    Q2 <= Q1;
  end if;
  if RST then
    Q <= '0';
  end if;
end process DFF;

Lo cual puede ser útil si no se deben restablecer todas las señales (registros) impulsadas por este proceso.

Ejemplo: un contador

El siguiente ejemplo es un contador progresivo con reset asíncrono, carga paralela y ancho configurable. Demuestra el uso del tipo 'unsigned', conversiones de tipos entre 'unsigned' y 'std_logic_vector' y genéricos VHDL . Los genéricos están muy cerca de los argumentos o plantillas en otros lenguajes de programación tradicionales como C ++.

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;    -- for the unsigned type

entity COUNTER is
  generic (
    WIDTH : in natural := 32);
  port (
    RST   : in std_logic;
    CLK   : in std_logic;
    LOAD  : in std_logic;
    DATA  : in std_logic_vector(WIDTH-1 downto 0);
    Q     : out std_logic_vector(WIDTH-1 downto 0));
end entity COUNTER;

architecture RTL of COUNTER is

begin
  process(all) is
  begin
    if RST then
      Q <= (others => '0');
    elsif rising_edge(CLK) then
      if LOAD then
        Q <= DATA;
      else
        Q <= std_logic_vector(unsigned(Q) + 1); --Addition is unsigned, converted back to std_logic_vector
      end if;
    end if;
  end process;

end architecture RTL;

Los contadores más complejos pueden agregar declaraciones if / then / else dentro del rising_edge(CLK) elsifpara agregar otras funciones, como habilitaciones de conteo, detener o pasar a algún valor de conteo, generar señales de salida como señales de conteo de terminales, etc. Se debe tener cuidado con el pedido y anidamiento de dichos controles si se usan juntos, con el fin de producir las prioridades deseadas y minimizar el número de niveles lógicos necesarios.

Construcciones de solo simulación

Un gran subconjunto de VHDL no se puede convertir en hardware. Este subconjunto se conoce como el subconjunto no sintetizable o de solo simulación de VHDL y solo se puede utilizar para la creación de prototipos, la simulación y la depuración. Por ejemplo, el siguiente código generará un reloj con una frecuencia de 50 MHz. Puede, por ejemplo, usarse para impulsar una entrada de reloj en un diseño durante la simulación. Sin embargo, es una construcción de solo simulación y no se puede implementar en hardware. En el hardware real, el reloj se genera externamente; se puede reducir internamente mediante la lógica del usuario o hardware dedicado.

process
begin
  CLK <= '1'; wait for 10 NS;
  CLK <= '0'; wait for 10 NS;
end process;

Las construcciones de solo simulación se pueden utilizar para crear formas de onda complejas en muy poco tiempo. Dicha forma de onda se puede utilizar, por ejemplo, como vectores de prueba para un diseño complejo o como un prototipo de alguna lógica de sintetizador que se implementará en el futuro.

process
begin
  wait until START = '1'; -- wait until START is high
  
  for i in 1 to 10 loop -- then wait for a few clock periods...
    wait until rising_edge(CLK);
  end loop;

  for i in 1 to 10 loop 	-- write numbers 1 to 10 to DATA, 1 every cycle
    DATA <= to_unsigned(i, 8);
    wait until rising_edge(CLK);
  end loop;

  -- wait until the output changes
  wait on RESULT;
  
  -- now raise ACK for clock period
  ACK <= '1';
  wait until rising_edge(CLK);
  ACK <= '0';

  -- and so on...
end process;

Simuladores VHDL

Comercial:

Otro:

  • EDA Playground : IDE VHDL gratuito basado en navegador web (utiliza Synopsys VCS, Cadence Incisive, Aldec Riviera-PRO y GHDL para la simulación de VHDL)
  • GHDL es un compilador VHDL de código abierto que puede ejecutar programas VHDL. GHDL en GitHub
  • boot by freerangefactory.org es un compilador y simulador de VHDL basado en GHDL y GTKWave
  • VHDL Simili de Symphony EDA es un simulador de VHDL comercial gratuito.
  • nvc de Nick Gasson es un compilador VHDL de código abierto
  • freehdl de Edwin Naroska era un simulador de VHDL de código abierto, abandonado desde 2001.

Ver también

Referencias

Notas

Otras lecturas

  • Peter J. Ashenden, "La guía del diseñador para VHDL, tercera edición (Sistemas sobre silicio)", 2008, ISBN  0-1208-8785-1 . (El libro de referencia de VHDL escrito por uno de los desarrolladores principales del lenguaje)
  • Bryan Mealy, Fabrizio Tappero (febrero de 2012). [1] . La guía sencilla para escribir código VHDL potente para sus implementaciones digitales. Archivado desde el Free Range VHDL original el 13 de febrero de 2015.
  • Johan Sandstrom (octubre de 1995). "Comparando Verilog con VHDL sintácticamente y semánticamente" . Diseño de sistemas integrados . EE Times.- Sandstrom presenta una tabla que relaciona las construcciones VHDL con las construcciones Verilog .
  • Qualis Design Corporation (20 de julio de 2000). "Tarjeta de referencia rápida VHDL" (PDF) . 1.1. Qualis Design Corporation. Archivado desde el original (PDF) el 2003-12-10. Cite journal requiere |journal=( ayuda )
  • Qualis Design Corporation (20 de julio de 2000). "Tarjeta de referencia rápida de 1164 paquetes" (PDF) . 1.0. Qualis Design Corporation. Archivado desde el original (PDF) el 14 de marzo de 2016. Cite journal requiere |journal=( ayuda )
  • Janick Bergeron, "Escritura de bancos de pruebas: verificación funcional de modelos HDL", 2000, ISBN  0-7923-7766-4 . (La Biblia del banco de pruebas HDL)

enlaces externos