En este primer articulo de nuestra página vamos a ver qué es VHDL y para qué se utiliza dentro del diseño electrónico y sobre todo en el mundo de las FPGA.

La Wikipedia define VHDL como:

VHDL es un lenguaje de especificación definido por el IEEE utilizado para describir circuitos digitales y para la automatización de diseño electrónico. VHDL es acrónimo proveniente de la combinación de dos acrónimos: VHSIC y HDL.

Esta definición puede ser confusa y poco clara para gente que no este familiarizada con el diseño electrónico, así que vamos a intentar explicarlo de forma sencilla. Para ello nos remontaremos al pasado, donde no existía VHDL y la vida de los diseñadores era mucho más complicada.

Antes de aparecer VHDL en 1983, diseñar un circuito electrónico requería de herramientas de captura de esquemáticos. Estas herramientas consistían en un «lienzo» donde los diseñadores pintaban bloques y establecían las conexiones entre ellos con lineas. En esos tiempos la informática no estaba tan avanzada como ahora y diseñar un circuito de esta manera requería de programas muy caros y sobre todo poco compatibles entre ellos.

Un circuito realizado con herramientas de captura de esquemáticos tenían el aspecto que se ve en la imagen. Cómo se puede ver es complicado de entender y de compartir con otros diseñadores.

captura esquematicos

Herramienta de captura de esquemáticos

En 1980 el DoD, Departamento de Defensa Americano, propuso un concurso donde se buscaba una alternativa a las herramientas de este tipo.  En 1983 de esta iniciativa surgía VHDL. A partir de ese momento VHDL y su hermano Verilog se han convertido en la herramienta standard a la hora de diseñar circuitos digitales complejos.

VHDL es un lenguaje de descripción de hardware, no es un lenguaje de programación, aunque su sintaxis y forma de uso se asemeje mucho. Con VHDL no programamos, lo que se hace es tomar un diseño electrónico y describirlo mediante el lenguaje, de forma que sirva como punto de entrada a herramientas que convertirán esa descripción en una implementación real del sistema.

De esta forma las descripciones de circuitos en VHDL son siempre compatibles independientemente de las herramientas utilizadas, ya que el lenguaje fue convertido en un standard del IEEE y el problema del intercambio de diseños desaparece, surgiendo de esta forma todo un mercado de compra y venta componentes electrónicos reusables, llamados también de IP (Intellectual Property). Incluso es posible descargarse IP de código abierto en VHDL de páginas como opencores.org.

Aparte de permitir un intercambio eficiente de componentes, el uso de VHDL ofrece muchas de ventajas. La mas significativa es que utilizando el lenguaje es posible tanto describir como simular el sistema. El propio lenguaje ofrece las herramientas para escribir módulos que apliquen entradas al sistema y mediante una herramienta llamada simulador poder ver las salidas y verificar si son correctas. Esto permite crear entornos complejos de verificación para comprobar la corrección del sistema, algo fundamental en diseños que van a ser enviados a dispositivos físicos y donde un error en el diseño puede acarrear unos costes catastróficos para una empresa

modelsim

Ejemplo de simulación en VHDL usando la herramienta Modelsim

Además el diseño en VHDL es independiente de la tecnología donde se va a implementar. Una vez descrito y simulado nuestro circuito puede ser descargado en un dispositivo FPGA o llevado a fabricar a una fundición y convertirse en un ASIC.

Si queréis aprender más sobre VHDL os recomiendo que veáis el video que hemos subido a nuestro canal de Youtube con una introducción al lenguaje.

Si elegimos una FPGA como las del fabricante Xilinx, que utilizaremos más adelante en nuestros ejemplos, utilizaremos la herramientas Vivado para poder convertir nuestra descripción VHDL en una implementación física del diseño.

Y para los impacientes os dejamos una descripción VHDL para que podáis ver qué aspecto tiene un circuito en VHDL. En este caso es un sumador de 1 bit.

library ieee;
use ieee.std_logic_1164.all;

entity add_1 is
  port (a, b, c_in: in std_logic; c_mas, s: out std_logic);
end add_1;

architecture funcional of add_1 is
begin
  s <= ((not a) and (not b) and c_in) or ((not a) and b and (not c_in)) or (a and b and c_in) or (a and (not b) and (not c_in));
  c_mas <= (a and b) or (a and c_in) or (b and c_in) ; 
end funcional;