VHDL #13: PACKAGE dan COMPONENT dalam Pemrograman VHDL

January 2, 2026

 

Sahabat Robonesia, seperti telah disebutkan dalam artikel sebelumnya (VHDL #2: Struktur program VHDL) di dalam pemrograman VHDL dikenal adanya LIBRARY. Library disediakan atau dibuat untuk membuat program menjadi lebih modular karena dengan library, potongan-potongan kode program yang sama dan sering digunakan secara berulang tidak ditulis berulang-ulang di dalam program utama (main code) secara langsung, namun dikemas di dalam suatu bagian program VHDL yang disebut dengan “PACKAGE.”

 


Gambar 1. Struktur program VHDL
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 234

 

Di dalam suatu PACKAGE terdapat potongan/bagian kode atau blok program yang sering digunakan dan ditulis dalam bentuk COMPONENT, FUNCTION, atau PROCEDURE (Lihat gambar 1). Pembagian kode program seperti ini akan sangat bermanfaat ketika programmer akan membuat desain rangkaian digital yang komplek dan panjang.

Seperti telah dijelaskan pada artikel sebelumnya (VHDL #2: Struktur program VHDL), dalam pemrograman VHDL terdapat library utama yang umumnya dibutuhkan dalam pembuatan desain digital, yaitu library IEEE, library std, dan library work. Setelah mempelajari artikel kali ini, diharapkan kita akan dapat membuat library kita sendiri, yang kemudian dapat ditambahkan ke dalam daftar library selain tiga library utama tersebut.

 

13.1 PACKAGE

Seperti yang disebutkan di atas, potongan kode program VHDL yang sering digunakan biasanya ditulis dalam bentuk COMPONENT, FUNCTION, atau PROCEDURE. Kode-kode tersebut kemudian ditempatkan di dalam sebuah PACKAGE dan dikompilasi menjadi library tujuan. Pentingnya strategi ini adalah memungkinkan pembagian kode, berbagi kode, dan penggunaan kembali kode.

Kita mulai dengan menjelaskan struktur sebuah PACKAGE. Selain COMPONENT, FUNCTION, atau PROCEDURE, PACKAGE juga dapat berisi definisi TYPE dan CONSTANT. Syntax-nya disajikan berikut ini.

Syntax PACKAGE:

 

Seperti yang terlihat, sintaksnya terdiri dari dua bagian: PACKAGE dan PACKAGE BODY. Bagian PACKAGE bersifat wajib dan berisi semua deklarasi yang diperlukan, sedangkan bagian PACKAGE BODY hanya diperlukan jika satu atau lebih sub-program (FUNCTION atau PROCEDURE) dideklarasikan di bagian PACKAGE, dalam hal ini harus berisi deskripsi (Body) sub-program. PACKAGE dan PACKAGE BODY harus memiliki nama yang sama.

Daftar deklarasi di dalam bagian PACKAGE dapat berisi COMPONENT, FUNCTION, PROCEDURE, TYPE, CONSTANT, dan lainnya.

 

Contoh 13.1: Package sederhana

Contoh 13.1 menunjukkan sebuah PACKAGE bernama my_package. PACKAGE ini hanya berisi deklarasi TYPE dan CONSTANT, sehingga PACKAGE BODY tidak diperlukan.

Program 1: Untuk contoh 13.1

 

Contoh 13.2: Package dengan FUNCTION

Contoh 13.2 berisi, selain deklarasi TYPE dan CONSTANT, terdapat juga deklarasi sebuah FUNCTION. Oleh karena itu, sebuah PACKAGE BODY sekarang diperlukan (detail tentang cara menulis FUNCTION akan dibahas pada artikel berjudul “VHDL #14: FUNCTION dan PROCEDURE dalam Pemrograman VHDL”). Fungsi ini mengembalikan TRUE ketika terjadi positive_edge pada clk.

 

Program 2: Untuk contoh 13.2

 

Salah satu PACKAGE di atas (contoh 13.1 atau contoh 13.2) sekarang dapat dikompilasi, dan kemudian menjadi bagian dari LIBRARY “work” kita. Untuk menggunakannya dalam kode program VHDL, kita harus menambahkan klausa USE baru ke kode utama (USE work.my_package.all), seperti yang ditunjukkan pada potongan kode program VHDL di bawah ini.

 

 

13.2 COMPONENT

Sebuah KOMPONEN hanyalah bagian dari kode konvensional (yaitu, deklarasi LIBRARY + ENTITY + ARCHITECTURE, seperti penjelasan dalam artikel VHDL #2: Struktur program VHDL). Namun, dengan mendeklarasikan kode tersebut sebagai COMPONENT, kode tersebut kemudian dapat digunakan dalam rangkaian (Circuits) lain, sehingga memungkinkan pembangunan desain yang bertingkat (hierarkis).

COMPONENT juga merupakan cara lain untuk mempartisi kode, menyediakan kode yang bisa dibagikan, dan penggunaan kembali kode (Code reuse). Misalnya, rangkaian yang umum digunakan, seperti flip-flop, multiplexer, adder, gerbang dasar, dan lain sebagainya, dapat ditempatkan di LIBRARY, sehingga proyek apa pun dapat menggunakannya tanpa harus menulis ulang kode tersebut.

Untuk dapat menggunakan (meng-instansiasi) sebuah COMPONENT, COMPONENT tersebut harus dideklarasikan terlebih dahulu. Sintaks yang sesuai ditunjukkan di bawah ini.

Syntax deklarasi COMPONENT:

 

Syntax penggunaan (instansiasi) COMPONENT:

 

Syntaks deklarasi COMPONENT mirip dengan ENTITY (VHDL #2: Struktur program VHDL), yaitu nama-nama port harus ditentukan, bersama dengan modenya (IN, OUT, BUFFER, atau INOUT) dan tipe datanya (STD_LOGIC_VECTOR, INTEGER, BOOLEAN, dll.). Untuk menginstansiasi COMPONENT, diperlukan label, diikuti oleh nama COMPONENT dan deklarasi PORT MAP. Terakhir, “port_list” hanyalah daftar yang menghubungkan port dari rangkaian sebenarnya dengan port dari komponen yang telah dirancang sebelumnya yang sedang diinstansiasi.

Sebagai contoh kita akan membuat desain sebuah inverter dan dikompilasi ke dalam LIBRARY “work.” Kita dapat menggunakannya melalui kode yang ditunjukkan di bawah ini. Label yang dipilih untuk komponen ini adalah U1. Nama-nama port dalam rangkaian sebenarnya adalah x dan y, yang masing-masing ditugaskan ke PORT a dan PORT b. Pada rancangan desain inverter ini dibuat pemetaan posisi PORT (PORT MAP), karena sinyal pertama di satu rangkaian sesuai dengan sinyal pertama di rangkaian lainnya, sinyal kedua di satu rangkaian sesuai dengan sinyal kedua di rangkaian lainnya, dan seterusnya.

 

 

Ada dua cara dasar untuk mendeklarasikan sebuah COMPONENT (gambar 3 dan gambar 5). Setelah kita mendesainnya dan menempatkannya di LIBRARY tujuan, kita dapat mendeklarasikannya di kode utama itu sendiri, seperti yang ditunjukkan pada gambar 3, atau kita dapat mendeklarasikannya menggunakan PACKAGE, seperti pada gambar 5. Cara yang terakhir menghindari pengulangan deklarasi setiap kali COMPONENT diinstansiasi. Contoh dari kedua pendekatan tersebut disajikan di bawah ini.

 

Contoh 13.3: Deklarasi COMPONENT di dalam kode utama (Main)


Gambar 2. Rangkaian contoh 13.3
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 240

 

Kita ingin mengimplementasikan rangkaian pada gambar 2 hanya dengan menggunakan COMPONENT (inverter, nand_2, dan nand_3), tetapi tanpa membuat PACKAGE khusus untuk mendeklarasikannya, seperti pada gambar 3.


Gambar 3. Deklarasi COMPONENT di dalam kode utama (main)
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 239

 

Maka dibutuhkan empat bagian kode VHDL. Satu kode program tersendiri untuk setiap COMPONENT, ditambah satu kode program untuk proyek secara keseluruhan (kode utama/Main code). Keempat file tersebut ditunjukkan di bawah ini. Perhatikan bahwa, karena kita belum membuat PACKAGE, COMPONENT harus dideklarasikan dalam kode utama (di bagian deklaratif ARCHITECTURE).

 

Program 3.1: Untuk contoh 13.3 – Kode program inverter

 

Program 3.2: Untuk contoh 13.3 – Kode program nand_2

 

Program 3.3: Untuk contoh 13.3 – Kode program nand_3

 

Program 3.4: Untuk contoh 13.3 – Kode program proyek

 

Hasil simulasi contoh 13.3 dapat kita lihat pada gambar 4.

 


Gambar 4. Hasil simulasi – Contoh 13.3 (Program 3.4 dan Program 4.5)

 

Contoh 13.4: Deklarasi COMPONENT di dalam sebuah PACKAGE


Gambar 5. Deklarasi COMPONENT di dalam package
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 239

 

Contoh 13.4 akan mengimplementasikan proyek yang sama seperti contoh 13.3 sebelumnya (Gambar 2). Namun, sekarang kita akan membuat sebuah PACKAGE di mana semua COMPONENT (inverter, nand_2, dan nand_3) akan dideklarasikan di dalamnya, seperti pada gambar 5.

Dengan demikian, sekarang dibutuhkan lima bagian kode program VHDL. Satu kode program tersendiri untuk setiap COMPONENT, satu kode program untuk PACKAGE, dan terakhir satu kode program untuk proyek. Meskipun memiliki file tambahan (PACKAGE), file tambahan tersebut hanya perlu dibuat sekali, sehingga menghindari kebutuhan untuk mendeklarasikan komponen dalam kode utama setiap kali komponen tersebut diinstansiasi (Digunakan).

Perhatikan bahwa kata kunci USE tambahan (USE work.my_components.all) sekarang diperlukan, agar PACKAGE “my_components” terlibat di dalam desain rangkaian. Hasil simulasi sama dengan hasil simulasi pada contoh 13.3 sebelumnya (Lihat gambar 4).

Program 4.1: Untuk contoh 13.4 – Kode program inverter

 

Program 4.2: Untuk contoh 13.4 – Kode program nand_2

 

Program 4.3: Untuk contoh 13.4 – Kode program nand_3

 

Program 4.4: Untuk contoh 13.4 – Kode program PACKAGE “my_components”

 

Program 4.5: Untuk contoh 13.4 – Kode program proyek

 

13.3 PORT MAP

Ada dua cara untuk memetakan PORT dari sebuah COMPONENT selama instansiasi, yaitu:

  1. Pemetaan PORT posisional.
  2. Pemetaan PORT nominal.

 

Mari kita perhatikan contoh berikut:

 

Di dalam contoh program VHDL di atas, pemetaan PORT bersifat posisional, yaitu PORT x dan y masing-masing sesuai dengan PORT a dan PORT b.

Di sisi lain, pemetaan PORT nominal akan seperti berikut:

 

Pemetaan PORT posisional lebih mudah ditulis, tetapi pemetaan PORT nominal lebih kecil kemungkinannya terjadi kesalahan. PORT juga dapat dibiarkan tidak terhubung (menggunakan kata kunci OPEN).

Sebagai contoh:

 

13.4 GENERIC MAP

Unit GENERIC (dibahas pada artikel sebelumnya, VHDL #6: Parameter Generic dalam Pemrograman VHDL) juga dapat diinstansiasi. Dalam hal ini, GENERIC MAP harus digunakan dalam instansiasi COMPONENT untuk meneruskan informasi ke parameter GENERIC. Berikut ini adalah sintaksnya.

 

 

Seperti yang terlihat, satu-satunya perbedaan dari sintaks yang telah disajikan sebelumnya adalah penambahan kata GENERIC MAP dan daftar parameter (parameter list). Tujuannya adalah untuk memberi tahu bahwa parameter-parameter tersebut harus dianggap sebagai generik. Penggunaan GENERIC MAP diilustrasikan dalam contoh di bawah ini.

 

Contoh 13.5: Membuat Instansi Komponen Generic

Mari kita simak generator paritas generik pada gambar 6, yang menambahkan satu bit ke vektor input (di sisi kirinya). Bit tersebut harus bernilai ‘0’ jika jumlah ‘1’ dalam vektor input adalah genap, atau bernilai ‘1’ jika ganjil, sehingga vektor hasil akan selalu berisi jumlah ‘1’ yang genap.

Gambar 6. Generator paritas generik yang akan diinstansiasi dalam contoh 13.5
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 245

 

Kode yang disajikan di bawah ini bersifat generik, yaitu berfungsi untuk bilangan bulat positif “n” apa pun. Dua file ditampilkan: Pertama, terkait dengan COMPONENT (parity_gen), yang memang dapat kita asumsikan telah dirancang sebelumnya dan tersedia di LIBRARY “work,” dan Kedua, terkait dengan proyek itu sendiri (kode utama), di mana COMPONENT parity_gen diinstansiasi.

 

Program 5.1: Untuk contoh 13.5 – Parity generator

 

Program 5.2: Untuk contoh 13.5 – Aktual proyek

 

Perhatikan bahwa nilai default (n = 7) dari GENERIC dalam file COMPONENT (parity_gen) akan ditimpa oleh nilai n = 2 yang diberikan kepadanya melalui pernyataan GENERIC MAP dalam instansiasi COMPONENT. Perhatikan juga bahwa deklarasi GENERIC yang muncul bersamaan dengan deklarasi COMPONENT dalam file kedua diperlukan, karena merupakan bagian dari ENTITY asli (COMPONENT). Namun, tidak perlu mendeklarasikan nilai default-nya lagi.

Hasil simulasi dari rangkaian yang disintesis dengan program 5.2 ditunjukkan pada gambar 7.

 

Gambar 7. Hasil simulasi – Contoh 13.5

 

Contoh 13.6: ALU Terbuat dari COMPONENT

Pada artikel sebelumnya (VHDL #9: Kode Program Concurrent dalam Pemrograman VHDL, Contoh 9.5) telah disajikan desain ALU (Arithmetic Logic Unit) dengan gambar diagram ditampilkan ulang pada gambar 8. Pada contoh tersebut, kode program yang digunakan hanya bersifat mandiri, yaitu tidak ada COMPONENT, FUNCTION, atau PROCEDURE eksternal yang dipanggil/digunakan. Namun, pada contoh ini, kita akan mengasumsikan bahwa LIBRARY kita berisi tiga COMPONENT (logic_unit, arith_unit, dan mux) yang dapat digunakan untuk membangun ALU.

Gambar 8. Desain ALU yang dibangun dari tiga KOMPONEN
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 248

 

Kode program  di bawah ini, selain kode program utama (alu.vhd), kita juga perlu membuat desain dari tiga COMPONENT yang disebutkan di atas. Seperti yang dapat dilihat, COMPONENT dideklarasikan dalam kode utama itu sendiri.

 

Program 6.1: Untuk contoh 13.6 – COMPONENT Unit Arithmetic

 

Program 6.2: Untuk contoh 13.6 – COMPONENT Unit Logic

 

Program 6.3: Untuk contoh 13.6 – COMPONENT Unit Multiplexer (Mux)

 

Program 6.4: Untuk contoh 13.6 – Proyek ALU

 

Hasil simulasi rangkaian ALU di atas ditunjukkan pada gambar 9.

 

Gambar 9. Hasil simulasi – Contoh 13.6

 

 

Author

Taufiq Dwi Septian Suyadhi

Degrees from electronics and industrial engineering. Enthusiast on electronics, embedded systems, and robotics. Motivation: “Never ending learning and sharing valuable knowledge to the others”.

Leave a Reply

Post Related

error: Content is protected !!