Hardware Description Language (HDL) nedir?

HDL, bir grup donanım tanımlama programlama dilidir. Sadece yazılım için programlama dilleri değil, aynı zamanda bu yazımızda da görebileceğiniz gibi bu tür bir dilden “programlayabilir” ve donanım oluşturabilirsiniz. Ayrıca bu dillerin ne olduğunu da bileceksiniz ve örnek kod ile bazı snippet’leri görebileceksiniz.

HDL nedir?

Bir HDL (Donanım Tanımlama Dili), bir donanım tanımlama dilidir, yani donanımın tasarımı ve geliştirilmesi için kullanılan bir programlama dilidir. Evet, donanım da yaratılışın ilk aşamalarında “yazılır”, böylece yapıyı, düzeni ve yapabileceği işlemleri tanımlar.

Ek olarak, bu HDL dilleri, fiziksel olarak oluşturmadan önce işlemi simüle etmenize ve olası sorunları gidermenize de olanak tanır, bu nedenle büyük avantajlarından biridir. Öte yandan, oluşturmak istediklerinizi yazmak için EDA ortamlarında da kullanılabilirler ve yazılım, sonunda devreyi üretmek için gereken düzeni oluşturmak için bileşen kitaplıklarının standart hücrelerini kullanmakla ilgilenir.

Biçimleri açısından, C gibi yazılım programlama dillerine oldukça benzerler. Yani, ifadeler, bildirimler, kontrol yapıları, değişkenler, sabitler vb. içeren metinsel bir açıklamadan oluşurlar. Bununla birlikte, yazılımların sahip olmadığı bir şeye de sahiptirler ve bu, saat güdümlü devrelerde çok gerekli olan zamanlamadır.

HDL dilleri, tasarlanmakta olan devrelerin giderek daha karmaşık hale geldiği ve tasarımcıların her şeyin daha net bir resmini elde edebilmeleri için dijital mantığın üst düzey açıklamalarını gerektirmeye başladığı 1970’lerde geliştirildi. Diğer bir deyişle HDL dilleri de programlama dilleri gibi donanım tasarımında yüksek bir soyutlama seviyesi görevi görürler çünkü onlar da soyut diller olduğundan programcılar makine dilinde düşünmek zorunda kalmazlar.

Sonuç, programcı tarafından anlaşılabilir bir dildir ve daha sonra devreyi, bağlantı listelerini veya ağ listesini oluşturacak blokların hiyerarşisini oluşturmak için “derlenebilir”, düzgün çalıştığını doğrulamak için devrenin davranışını simüle edebilir, ve son olarak analog veya dijital, baskılı veya entegre devrelerin üretiminde kullanılacak haritaları veya yerleşim planlarını oluşturur. Ayrıca bir devre oluşturmak ve daha sonra test için bir FPGA’ya iletmek için kullanılabilir.

Başlıca HDL dilleri

Daha fazla HDL dili olmasına rağmen, en önemlileri şunlardır:

  • Chisel: Scala Gömülü Dilde Donanım Oluşturma anlamına gelir ve yakın zamanda oluşturulmuş ve diğerlerine göre avantajları nedeniyle çok fazla konuşma yapan açık kaynaklı bir HDL tipi dildir. Bu HDL, dijital devrelerin ve RTL’nin (Kayıt-Aktarım Seviyesi) tanımı için kullanılabilir. Berkeley Üniversitesi tarafından oluşturulan Scala’ya dayanmaktadır ve nesne yönelimlidir. Diğer bir avantaj ise Chisel donanım açıklamalarının sentez ve simülasyon için Verilog’a dönüştürülebilmesidir. Şu anda RISC-V projesiyle yakından bağlantılıdır ve DARPA, Google tarafından TPU birimlerini geliştirmek vb. için kullanılır. Ve geliştirmesi Verilog’dan çok daha hızlıdır ve bu diğer HDL’den 5 kata kadar daha az kod gerektirir.
  • Verilog: C programlama dilinden ilham alan bir sözdizimine sahip başka bir dildir, bu nedenle mühendislere oldukça aşinadır. Ayrıca C gibi bir ön işlemciye sahiptir ve ayrılmış kelimelerin çoğu aynıdır. Ancak, C’nin kullandığı parantez {} yerine kod bloklarını açmak ve kapatmak için Begin ve End kelimeleri gibi farklılıkları vardır. Chisel gibi, her türlü donanımı geliştirmek, sentezlemek ve simüle etmek için kullanılabilir. Bu dil, Phil Moorby tarafından 1985 yılında Automated Integrated Design Systems’de (daha sonra Gateway Design Automation olarak yeniden adlandırıldı ve daha sonra Cadence tarafından satın alındı) çalışırken icat edildi. Açık kaynak değildir, ancak Cadence daha sonra VHDL’nin başarısı nedeniyle onu açık bir standart haline getirmeye karar vermiştir.
  • VHDL: VHSIC (Very High Speed ​​​​Integrated Circuit) ve HDL kısaltmalarının birleşiminden ortaya çıkan kısaltmalardır. FPGA’ları veya PLD’leri programlamak için ASIC’ler gibi her türlü devreyi tanımlamak için de kullanılır. Şu anda IEEE tarafından bir standart olarak tanımlanmaktadır ve ilk olarak 1980’lerin başında Amerika Birleşik Devletleri Savunma Bakanlığı tarafından dijital devreleri geliştirmek ve simüle etmek için ADA programlama diline dayalı olarak geliştirilmiştir. Şu anda aynı zamanda çip geliştirme için en yaygın kullanılanlardan biridir, ancak Chisel, HDL sahnesine en son gelen ürün olduğu için çok dikkat çekiyor.

HDL dillerinin pratik örnekleri

Son olarak, bitirmek için, bu dillerin neye benzediğine dair bazı örnekler göstermenin zamanı geldi. Bunu yapmak için, bir elektronik devrenin bir elemanının bunlarla nasıl tanımlanabileceğine dair küçük parçalar göstereceğim:

Chisel

CHISEL dilinde 8 bitlik bir toplayıcının HDL örneği:

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

VHDL dilinde 8 bitlik bir toplayıcının HDL örneği:

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

Verilog programlama dilinde 8 bitlik toplayıcı örneği:

`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