Sahabat Robonesia, setelah pada artikel sebelumnya, kita telah mengenal pemrograman VHDL. Pada artikel ini, kita akan melanjutkan pembelajaran pemrograman VHDL, yaitu mengenai struktur bahasa pemrograman VHDL.
1.1 Struktur Program VHDL
Struktur dasar program VHDL terdiri atas tiga bagian utama, yaitu Pertama, bagian deklarasi pustaka (LIBRARY) yang berisi daftar semua library yang akan digunakan dalam desain, misalnya library ieee, std, work, dan yang lain. Kedua, bagian entitas (ENTITY) untuk menentukan pin input dan output (I/O) desain rangkaian sistem digital, dan ketiga, bagian arsitektur (ARCHITECTURE) yang berisi pernyataan atau statement kode VHDL itu sendiri, yang menjelaskan bagaimana rangkaian sistem digital seharusnya berperilaku (berfungsi). Gambar 1 merupakan visualisasi bagian-bagian utama tersebut.

Gambar 1. Struktur dasar program VHDL
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 14
Bagian LIBRARY adalah kumpulan potongan kode VHDL yang umum digunakan. Menempatkan potongan-potongan tersebut di dalam library memungkinkan mereka untuk digunakan kembali atau dibagikan oleh desain lain. Struktur umum sebuah library diilustrasikan pada Gambar 2. Kode biasanya ditulis dalam bentuk FUNCTIONS, PROCEDURES, atau COMPONENTS, yang ditempatkan di dalam PACKAGES, dan kemudian dikompilasi ke dalam library tujuan.

Gambar 2. Bagian dasar suatu library dalam VHDL
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 14
1.1.1 Deklarasi Library dan Package
Untuk mendeklarasikan penggunaan suatu LIBRARY di dalam pemrograman VHDL, diperlukan dua baris program yang dijelaskan sebagai berikut.
Baris-1:
Kode program dengan kata kunci LIBRARY untuk memanggil suatu nama library.
Baris-2:
Kode program dengan kata kunci USE untuk memasukkan atau mengikutsertakan suatu nama package (package_name) dan bagian package (package_parts) dari suatu library ke dalam program VHDL. Nama dan bagian package ditulis setelah penulisan nama library dan masing-masing dipisahkan dengan karakter dot/titik (.).
Di bawah ini adalah syntax selengkapnya pendeklarasian library dan package dalam pemrograman VHDL:
|
|
LIBRARY library_name; USE library_name.package_name.package_parts; |
Setidaknya tiga package, dari tiga library yang berbeda, biasanya diperlukan dalam sebuah desain sistem digital menggunakan pemrograman VHDL:
- Package std_logic_1164 (dari library IEEE).
- Package standard (dari library STD).
- Package work (library work).
Berikut adalah cara mendeklarasikan ketiga package tersebut:
|
|
LIBRARY ieee; -- Deklarasi library IEEE USE ieee.std_logic_1164.all; -- Deklarasi package yang digunakan LIBRARY std; -- Deklarasi library std USE std.standard.all; LIBRARY work; -- Deklarasi library work USE work.all; |
Library std dan work yang ditampilkan di atas sudah terlihat secara default, sehingga tidak perlu dideklarasikan. Hanya library ieee yang harus ditulis secara eksplisit. Library work hanya diperlukan ketika tipe data STD_LOGIC (atau STD_ULOGIC) digunakan dalam membuat suatu program VHDL desain sistem digital.
Tujuan dari ketiga library dan package yang disebutkan di atas adalah sebagai berikut:
- Package std_logic_1164 dari library ieee digunakan untuk menetapkan sistem logika multi-level.
- Library std adalah library sumber daya (tipe data, input/output teks, dll.) untuk yang digunakan di dalam lingkungan desain program VHDL.
- Library work adalah tempat untuk menyimpan file-file desain sistem digital menggunakan pemrograman VHDL (File berektensi .vhd, beserta semua berkas yang dibuat oleh kompiler, simulator, dll.).
Library IEEE berisi beberapa paket, termasuk yang berikut:
- std_logic_1164: Menentukan sistem logika multinilai STD_LOGIC (8 level) dan STD_ULOGIC (9 level).
- std_logic_arith: Menentukan tipe data SIGNED dan UNSIGNED serta operasi aritmatika dan perbandingan terkait. Pustaka ini juga berisi beberapa fungsi konversi data, yang memungkinkan satu tipe dikonversi ke tipe lain: conv_integer(p), conv_unsigned(p, b), conv_signed(p, b), conv_std_logic_vector(p, b).
- std_logic_signed: Berisi fungsi yang memungkinkan operasi dengan data STD_LOGIC_VECTOR dilakukan seolah-olah data tersebut bertipe SIGNED.
- std_logic_unsigned: Berisi fungsi yang memungkinkan operasi dengan data STD_LOGIC_VECTOR dilakukan seolah-olah data tersebut bertipe UNSIGNED.
1.1.2 Entity
ENTITY adalah daftar spesifikasi semua pin input dan output (PORT) dari rangkaian sistem digital yang dibangun. Syntax-nya adalah sebagai berikut.
|
|
ENTITY entity_name IS PORT ( port_name : signal_mode signal_type; port_name : signal_mode signal_type; ...); END entity_name; |

Gambar 3. Mode signal
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 16
Penjelasan ENTITY:
1. Nama ENTITY (entity_name).
Pada dasarnya dapat berupa kata apa pun, kecuali kata-kata yang telah dicadangkan (reserved) dalam pemrograman VHDL.
2. Mode sinyal (signal_mode) pada bagian PORT.
Dapat berupa IN, OUT, INOUT, atau BUFFER. Seperti yang diilustrasikan pada Gambar 3, IN dan OUT merupakan pin yang benar-benar satu arah, sementara INOUT bersifat dua arah. Kemudian, mode sinyal BUFFER digunakan ketika sinyal keluaran harus digunakan atau dibaca secara internal. Tipe data sinyal dapat berupa BIT, STD_LOGIC, INTEGER, atau yang lain.
Gambar 4. Gerbang logika NAND
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 16
Contoh:
Mari kita perhatikan gerbang NAND pada Gambar 4. ENTITY dalam program VHDL-nya dapat dituliskan sebagai berikut:
|
|
ENTITY nand_gate IS PORT (a, b : IN BIT; x : OUT BIT); END nand_gate; |
Arti dari kode program ENTITY di atas adalah sebagai berikut:
Rangkaian gerbang logika NAND memiliki tiga pin/port input/output (I/O), yaitu dua input (a dan b, mode MASUK) dan satu output (x, mode OUT). Ketiga sinyal tersebut bertipe BIT. Nama yang dipilih untuk entitas tersebut adalah nand_gate.
1.1.3 Arsitektur
ARCHITECTURE adalah deskripsi tentang bagaimana rangkaian seharusnya berperilaku (berfungsi). Syntax-nya adalah sebagai berikut:
|
|
ARCHITECTURE architecture_name OF entity_name IS [declarations] BEGIN (code) END architecture_name; |
Seperti yang ditunjukkan pada syntax di atas, sebuah ARCHITECTURE memiliki dua bagian, yaitu:
1. Bagian [declarations]
Bersifat opsional, tempat sinyal dan konstanta dideklarasikan.
2. Bagian (code)
Dari kata kunci BEGIN ke bawah hingga kata kunci END.
Seperti halnya pada bagian ENTITY, nama ARCHITECTURE (architecture_name) pada dasarnya dapat berupa kata apa pun kecuali kata-kata yang telah dicadangkan (reserved) dalam pemrograman VHDL, termasuk nama yang sama dengan ENTITY tersebut.
Contoh:
Mari kita perhatikan kembali gambar gerbang logika NAND pada Gambar 4.
|
|
ARCHITECTURE myarch OF nand_gate IS BEGIN x <= a NAND b; END myarch; |
Penjelasan dari ARCHITECTURE di atas adalah sebagai berikut:
- Nama yang dipilih untuk arsitektur ini adalah myarch. Dalam contoh ini, tidak ada bagian deklarasi sinyal atau konstanta.
- Program VHDL hanya berisi satu penugasan.
- Tingkah laku (behaviour) desain rangkaian sistem digital adalah melakukan operasi logika NAND antara dua sinyal masukan (yaitu, input a dan input b) dan mengirimkan sinyal keluarannya ke pin output (Output x) menggunakan operator penugasan ‘‘<=’’.
1.2 Penting Diketahui
Berikut ini adalah beberapa hal penting yang perlu untuk diketahui oleh programmer HDL (Hardware description language) saat membangun sistem digital menggunakan bahasa pemrograman VHDL.
1.2.1 Pendeklarasian Library dan Package adalah Opsional
Perlu diketahui bahwa pendeklarasian library dan package dalam pemrograman VHDL adalah bersifat opsional. Ketika dalam pembuatan desain sistem digital tidak membutuhkan penggunaan fitur yang tersedia di dalam sebuah package (fungsi, prosedur, konstanta, atau komponen) yang ada di dalam sebuah library, maka pendeklarasian library dan package tidak diperlukan. Sehingga program VHDL langsung dimulai dengan penulisan bagian ENTITY.
1.2.2 Karakter Titik-Koma (Semi-colon) Pada Program VHDL
Setiap baris program VHDL diakhiri menggunakan karakter titik-koma (;) dan hal ini adalah wajib. Sehingga jika ada baris program yang tidak menggunakan karakter titik-koma pada bagian akhir statement/pernyataan programnya, maka kompilator (Compiler) program VHDL akan memberi peringatan kesalahan (Error).
1.2.3 Karakter double-dash Pada Program VHDL
Seperti halnya dalam bahasa pemrograman yang lain, dalam pemrograman VHDL juga dikenal adanya komentar program. Komentar program biasanya ditulis untuk memberikan informasi atau keterangan terhadap suatu baris program dan tidak ikut masuk dalam proses kompilasi program oleh compiler. Pada pemrograman VHDL, komentar dapat dituliskan di belakang dua buah karakter minus atau double-dash (–).
1.2.4 Apakah Program VHDL Case Sensitive ?
Pemrograman VHDL adalah termasuk bahasa pemrograman yang tidak case-sensitive. Sehingga compiler dan simulator program VHDL tidak membedakan antara huruf kapital (uppercase) maupun huruf non-kapital (lowercase) dalam proses kompilasi dan simulasi program VHDL.
1.3 Contoh Program VHDL
Program 1 adalah contoh program VHDL yang lengkap dengan tiga bagian utama sebuah program VHDL. Dalam program tersebut terdapat bagian deklarasi LIBRARY dan package, bagian ENTITY, dan bagian ARCHITECTURE. Sedangkan dan Program 2 adalah contoh program VHDL yang tidak memerlukan deklarasi library dan package, sehingga hanya terdiri atas dua bagian utama sebuah program VHDL, yaitu bagian ENTITY dan bagian ARCHITECTURE saja, tanpa bagian deklarasi LIBRARY dan package.
Pada kedua program tersebut juga tampak contoh penulisan baris program/statement/pernyataan yang diakhiri dengan karakter titik-koma (Semi-colon) dan penulisan komentar pada beberapa bagian program yang ditulis di belakang karakter double dash (–).
Program 1. Program VHDL yang memerlukan deklarasi library dan package
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
LIBRARY ieee; -- Deklarasi library IEEE USE ieee.std_logic_1164.all; -- Deklarasi package & package_parts ------------------------- ENTITY dff IS -- Bagian entity PORT ( d, clk, rst: IN STD_LOGIC; q: OUT STD_LOGIC); END dff; ----------------------------- ARCHITECTURE behavior OF dff IS -- Bagian arsitektur BEGIN PROCESS (rst, clk) BEGIN IF (rst='1') THEN q <= '0'; ELSIF (clk'EVENT AND clk='1') THEN q <= d; END IF; END PROCESS; END behavior; |
Penjelasan program 1:
Baris 2–3 Deklarasi library IEEE. Ingat bahwa dua pustaka penting lainnya (std dan work) dibuat terlihat secara default.
Baris 5–8 Bagian ENTITY D flipflop (dff).
Baris 10–20 Arsitektur behaviour.
Baris 6 Port masukan. Dalam contoh ini, semua sinyal masukan bertipe STD_LOGIC.
Baris 7 Port keluaran. Di sini, keluarannya juga bertipe STD_LOGIC.
Baris 11–19 Bagian kode dari arsitektur (dari kata kunci BEGIN dan hingga END PROCESS).
Baris 12–19 Sebuah PROSES (di dalamnya, kode dieksekusi secara berurutan).
Baris 12 PROSES dieksekusi setiap kali sinyal yang dideklarasikan dalam daftar sensitivitasnya berubah. Dalam contoh ini, setiap kali rst atau clk berubah, PROSES dijalankan.
Baris 14–15 Setiap kali rst mencapai ‘1’, keluaran direset, terlepas dari clk (reset asinkron).
Baris 16–17 Jika rst tidak aktif, ditambah clk telah berubah (sebuah EVENT terjadi pada clk), ditambah event tersebut adalah rising edge (clk = ‘1’), maka sinyal masukan (d) disimpan dalam flip-flop (q <= d).
Baris 15 dan 17 Operator ‘‘<=’’ digunakan untuk menetapkan nilai ke sebuah SIGNAL. Sebaliknya, ‘‘:=’’ akan digunakan untuk sebuah VARIABEL. Semua port dalam suatu entitas adalah sinyal secara default.
Baris 1, 4, 9, dan 21 Komentar program.
Program 2. Program VHDL yang tidak memerlukan deklarasi library dan package
|
|
ENTITY example IS -- Bagian entity PORT ( a, b, clk: IN BIT; q: OUT BIT); END example; ------------------------------------- ARCHITECTURE example OF example IS -- Bagian arsitektur SIGNAL temp : BIT; BEGIN temp <= a NAND b; PROCESS (clk) BEGIN IF (clk'EVENT AND clk='1') THEN q<=temp; END IF; END PROCESS; END example; |
Penjelasan program 2:
Deklarasi pustaka tidak diperlukan dalam kasus ini, karena data bertipe BIT, yang ditentukan dalam pustaka std (ingat bahwa pustaka std dan work dibuat terlihat secara default).
Baris 2–5 Bagian entitas (example).
Baris 7–16 Bagian arsitektur (example).
Baris 3 Port masukan (semua bertipe BIT).
Baris 4 Port keluaran (juga bertipe BIT).
Baris 8 Bagian deklaratif dari arsitektur (opsional). Sinyal temp, bertipe BIT, telah dideklarasikan. Perhatikan bahwa tidak ada deklarasi signal_mode dalam arsitektur (signal_mode hanya digunakan dalam entitas).
Baris 9–15 Bagian kode dari arsitektur (dari kata kunci BEGIN hingga kata kunci END PROCESS).
Baris 11–15 Blok PROSES (pernyataan berurutan yang dieksekusi setiap kali sinyal clk berubah).
Baris 10 dan 11–15 Meskipun eksekusi dalam suatu proses bersifat berurutan, proses tersebut, secara keseluruhan, bersamaan dengan pernyataan (eksternal) lainnya; sehingga baris 10 dieksekusi bersamaan dengan blok 11–15.
Baris 10 Operasi logika NAND. Hasilnya ditetapkan ke sinyal temp.
Baris 13–14 Pernyataan IF. Pada rising-edge clk, nilai temp ditetapkan ke sinyal output “q.”
Baris 10 dan 13 Operator ‘‘<=’’ digunakan untuk menetapkan nilai ke SIGNAL. Sebaliknya, ‘‘:=’’ akan digunakan untuk VARIABEL.
Baris 8 dan 10 Dapat dihilangkan, dengan mengubah ‘‘q <= a NAND b’’ pada baris 13.
Baris 1, 6, dan 17 Komentar program.