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.
Índice de contenidos
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.
Aunque existen más lenguajes HDL, los más importantes son:
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:
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
}
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;
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];
Te recomendamos la lectura de nuestra guía sobre los mejores procesadores. Como puedes ver, son muy diferentes unos de otros. ¿Tú con cuál te quedas?
endmodule
CHIEFTEC acaba de presentar dos nuevas cajas para PC, Visio y Visio Air con un…
Asus ZenWiFi BT8 es un sistema Mesh Wi-Fi 7 el cual se sitúa por debajo…
Qualcomm anuncia nuevos SoC Snapdragon X, pero no se trata de una nueva generación, sino…