HDL o Lenguaje de descripción de hardware: ¿Qué es?

0

El HDL es un grupo de lenguajes de programación para descripción de hardware. No solo existen los lenguajes de programación para software, también se puede «programar» y crear hardware a partir de  un lenguaje de este tipo como podrás comprobar en este artículo. Además, también conocerás cuáles son estos lenguajes y podrás ver algunos snippets con código de ejemplo.

¿Qué es HDL?

Un HDL (Hardware Description Language) es un lenguaje de descripción de hardware, es decir, un lenguaje de programación empleado para el diseño y desarrollo del hardware. Sí, el hardware también se «escribe» en sus primeras etapas de creación, definiendo así la estructura, el diseño, y las operaciones que puede hacer.

Además, estos lenguajes HDL también permiten simular el funcionamiento y depurar posibles problemas antes de crearlo de forma física, de ahí una de sus grandes ventajas. Por otro lado, también pueden usarse en entornos EDA para escribir lo que se desea crear y el software se encargará de usar las celdas estándar de las bibliotecas de componentes para crear finalmente el layout que se necesita para fabricar el circuito.

En cuanto a su forma, se parecen bastante a los lenguajes de programación de software, como pueden ser C, etc.  Es decir, consisten en una descripción textual con expresiones, declaraciones, estructuras de control, variables, constantes, etc. Sin embargo, también tienen algo que los de software no tienen, y es la temporización, tan necesaria en los circuitos gobernados por un reloj.

Los lenguajes HDL fueron desarrollados en la década de los 70, cuando los circuitos que se diseñaban eran cada vez más complejos y comenzaron a necesitar descripciones de alto nivel de la lógica digital para que los diseñadores pudieran tener una idea más clara de todo. Es decir, que los lenguajes HDL actúan como un nivel de alta abstracción en el diseño de hardware como los de programación hacen por su parte, ya que también son lenguajes abstractos para que los programadores no tengan que pensar en lenguaje máquina.

El resultado es un lenguaje comprensible por el programador, y que luego se puede «compilar» para crear la jerarquía de bloques que compondrán el circuito, las listas de conexiones o netlist, simular el comportamiento del circuito para comprobar que funciona adecuadamente, y finalmente crear los mapas o layouts que se emplearán para la fabricación de los circuitos analógicos o digitales, impresos o integrados. También podría usarse para crear un circuito y luego pasarlo a un FPGA para probarlo.

Lenguajes HDL más importantes

Aunque existen más lenguajes HDL, los más importantes son:

  • Chisel: son las siglas de Constructing Hardware in a Scala Embedded Language, y es un lenguaje de código abierto de tipo HDL que se ha creado recientemente y que está dando mucho que hablar, por sus ventajas frente a otros. Este HDL se puede usar para la descripción de de circuitos digitales y RTL (Register-Transfer Level). Está basado en Scala, creado por la Universidad de Berkeley, y está orientado a objetos. Otra ventaja es que las descripciones de hardware de Chisel se pueden convertir a Verilog para su síntesis y simulación. Actualmente está muy ligado al proyecto RISC-V, y es usado por el DARPA, Google para desarrollar su unidad TPU, etc. Y es que es mucho más rápido para desarrollar que Verilog y necesita hasta 5 veces menos código que éste otro HDL.
  • Verilog: es otro lenguaje con una sintaxis inspirada en el lenguaje de programación C, por lo que resulta bastante familiar a los ingenieros. También tiene un preprocesador como C y la mayoría de palabras reservadas son idénticas. Sin embargo, tiene sus diferencias, como las palabras Begin y End para abrir y cerrar bloques de código en vez de las llaves {} que usa C. Al igual que Chisel, se puede usar para desarrollar, sintetizar y simular todo tipo de hardware, desde un ASIC, hasta para grabar en FPGA o CPLD. Este lenguaje fue inventado por Phil Moorby en 1985 mientras trabajaba en Automated Integrated Design Systems (más tarde renombrado Gateway Design Automation y luego comprada por Cadence). No es de código abierto, aunque Cadence decidió convertirlo en estándar abierto más tarde, debido al éxito de VHDL.
  • VHDL: son las siglas que surgen de la combinación del acrónimo VHSIC (Very High Speed Integrated Circuit) y de HDL. También se usa para describir todo tipo de circuitos, como ASIC, para programar FPGAs o PLDs, etc. Actualmente está definido como estándar por la IEEE y originalmente fue desarrollado por el Departamento de Defensa de Estados Unidos en los inicios de los 80, basándose en el lenguaje de programación ADA para desarrollar y simular circuitos digitales. Actualmente también es uno de los más empleados para el desarrollo de chips, aunque Chisel está centrando muchas miradas al ser el último que ha llegado al panorama de los HDLs.

Ejemplos prácticos de lenguajes HDL

Por último, para finalizar, es el momento de mostrar algunos ejemplos de cómo son estos lenguajes. Para ello, mostraré pequeños snippets de cómo se podría describir un elemento de un circuito electrónico con ellos:

Chisel:

Ejemplo de HDL de un sumador de 8 bits en lenguaje CHISEL:

class Add extends Module {

val io = IO(new Bundle {

val a = Input(UInt(8.W))

val b = Input(UInt(8.W))

val y = Output(UInt(8.W))})

io.y := io.a + io.b
}

VHDL

Ejemplo de HDL de un sumador de 8 bits en lenguaje VHDL:

library ieee;
use ieee.std_logic_1164.all;


entity FA_8bit is
port(x,y : in std_logic_vector(7 downto 0);
cin : in std_logic;
sum : out std_logic_vector(7 downto 0);
co : out std_logic);
end FA_8bit;

architecture FA_arch of FA_8bit is
signal cary : std_logic_vector(6 downto 0);

component full_adder is
port (p,q,r:in std_logic; sm,cr: out std_logic);
end component;
begin
a0:full_adder port map (x(0),y(0),cin,sum(0),cary(0));
a1:full_adder port map (x(1),y(1),cary(0),sum(1),cary(1));
a2:full_adder port map (x(2),y(2),cary(1),sum(2),cary(2));
a3:full_adder port map (x(3),y(3),cary(2),sum(3),cary(3));
a4:full_adder port map (x(4),y(4),cary(3),sum(4),cary(4));
a5:full_adder port map (x(5),y(5),cary(4),sum(5),cary(5));
a6:full_adder port map (x(6),y(6),cary(5),sum(6),cary(6));
a7:full_adder port map (x(7),y(7),cary(6),sum(7),co);
end FA_arch;

library ieee;
use ieee.std_logic_1164.all;
entity full_adder is
port (p,q,r:in std_logic; sm,cr: out std_logic);
end full_adder;

architecture FA_arc of full_adder is
begin
sm <= p xor q xor r;
cr <= (p and q) or (q and r) or (r and p);
end FA_arc;

Verilog

Ejemplo de sumador de 8-bits en lenguaje de programación Verilog:

timescale 1ns / 1ps

module adder8(
output cout, //MSB, determines if answer is positive or negative
output [7:0] s,
input [7:0] a,
input [7:0] b,
input cin // if 1, subtract, if 0, add. This is XOR'ed with b
);

wire [7:0] bin;
assign bin[0] = b[0]^cin;
assign bin[1] = b[1]^cin;
assign bin[2] = b[2]^cin;
assign bin[3] = b[3]^cin;
assign bin[4] = b[4]^cin;
assign bin[5] = b[5]^cin;
assign bin[6] = b[6]^cin;
assign bin[7] = b[7]^cin;

wire [8:1] carry;
full_adder FA0(carry[1],s[0],a[0],bin[0],cin);
full_adder FA1(carry[2],s[1],a[1],bin[1],carry[1]);
full_adder FA2(carry[3],s[2],a[2],bin[2],carry[2]);
full_adder FA3(carry[4],s[3],a[3],bin[3],carry[3]);
full_adder FA4(carry[5],s[4],a[4],bin[4],carry[4]);
full_adder FA5(carry[6],s[5],a[5],bin[5],carry[5]);
full_adder FA6(carry[7],s[6],a[6],bin[6],carry[6]);
full_adder FA7(carry[8],s[7],a[7],bin[7],carry[7]);

assign cout = cin^carry[8];

endmodule


Tags

Publicar un comentario

0 Comentarios
* Por favor, no envíe spam aquí. Todos los comentarios son revisados ​​por el administrador.
Publicar un comentario (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Learn More
Accept !
Subir