VHDL #3: Tipe Data dalam Pemrograman VHDL

December 13, 2025

 

Sahabat Robonesia, untuk menulis kode VHDL secara efisien, penting untuk mengetahui tipe data apa yang diizinkan dalam pembuatan desain sistem digital, cara menentukan tipe data yang tepat, dan cara menggunakannya. Pada sub-bab selanjutnya, akan dijelaskan mengenai tipe data – tipe data yang digunakan dalam pemrograman VHDL.

3.1 Tipe Data Standard IEEE 1076/1164 (Pre-Defined)

VHDL berisi serangkaian tipe data yang telah ditentukan sebelumnya, yang ditentukan melalui standar IEEE 1076 dan IEEE 1164. Lebih spesifiknya, definisi tipe data tersebut dapat ditemukan dalam package/library berikut:

Tabel 1. Daftar tipe data dalam pemrograman VHDL

Berikut adalah detail penjelasan semua tipe data yang telah disebutkan dalam table 1.

 

3.1.1 Tipe Data BIT dan BIT_VECTOR
Tipe data bit dan bit_vector hanya memiliki dua buah nilai yaitu ‘0’ dan ‘1’.

Contoh:

Penjelasan:

“x” dideklarasikan sebagai sinyal satu digit bertipe BIT.

Penjelasan:

“y” adalah vektor 4-bit, dengan bit paling kiri adalah MSB.

Penjelasan:

“w” adalah vektor 8-bit, dengan bit paling kanan adalah MSB.

 

Berdasarkan sinyal-sinyal di atas, maka penugasan-penugasan berikut ini akan sah (legal) untuk menetapkan suatu nilai pada suatu sinyal, operator ‘‘<=’’ harus digunakan:

Penjelasan:

“x” adalah sinyal bit tunggal (seperti yang ditentukan di atas), yang nilainya ‘1’. Perhatikan bahwa tanda kutip tunggal (‘ ‘) digunakan untuk bit tunggal.

Penjelasan:

“y” adalah sinyal 4-bit (seperti yang ditentukan di atas), yang nilainya “0111.” (MSB=’0′). Perhatikan bahwa tanda kutip ganda (” “) digunakan untuk vektor.

Penjelasan:

“w” adalah sinyal 8-bit, yang nilainya “01110001” (MSB=’1’).

 

3.1.2 Tipe Data STD_LOGIC dan STD_LOGIC_VECTOR
Sistem logika 8-nilai yang diperkenalkan dalam standar IEEE 1164.

X : Forcing Unknown (synthesizable unknown)
0 : Forcing Low (synthesizable logic ‘1’)
1 : Forcing High (synthesizable logic ‘0’)
Z : High impedance (synthesizable tri-state buffer)
W : Weak unknown
L : Weak low
H : Weak high
– : Don’t care

Contoh:

Penjelasan:

“x” dideklarasikan sebagai sinyal satu digit (skalar) bertipe STD_LOGIC.

Penjelasan:

“y” dideklarasikan sebagai vektor 4-bit, dengan bit paling kiri adalah MSB. Nilai awal (opsional) y adalah “0001”. Perhatikan bahwa operator “:=” digunakan untuk menetapkan nilai awal.

Sebagian besar level std_logic digunakan hanya untuk simulasi. Namun, ‘0’, ‘1’, dan ‘Z’ dapat disintesis tanpa batasan. Mengenai nilai ‘weak’, nilai-nilai tersebut diselesaikan demi nilai ‘force’ pada multipel-driven node (lihat tabel 2). Jika ada dua sinyal std_logic yang terhubung ke node yang sama, maka level logika yang bertentangan akan diselesaikan (Resolved) secara otomatis sesuai tabel 2.

Tabel 2. Resolved logic system (STD_LOGIC)

 

3.1.3 Tipe Data STD_ULOGIC dan STD_ULOGIC_VECTOR
Sistem logika 9 level yang diperkenalkan dalam standar IEEE 1164 (‘U’, ‘X’, ‘0’, ‘1’, ‘Z’, ‘W’, ‘L’, ‘H’, ‘–’). Sistem STD_LOGIC yang dijelaskan di atas memang merupakan sub-tipe dari STD_ULOGIC. Sistem STD_ULOGIC memiliki nilai logika tambahan, yaitu ‘U’, yang berarti unresolved (tidak terselesaikan). Oleh karena itu, berbeda dengan STD_LOGIC, level logika yang bertentangan tidak secara otomatis terselesaikan di sini, sehingga kabel keluaran tidak boleh dihubungkan secara langsung. Namun, jika dua kabel keluaran tidak seharusnya dihubungkan, sistem logika ini dapat digunakan untuk mendeteksi kesalahan desain.

3.1.4 Tipe Data BOOLEAN
Tipe data yang hanya memiliki dua buah nilai, yaitu True dan False.

3.1.5 Tipe Data INTEGER
Tipe data integer memiliki nilai berupa bilangan bulat 32-bit dengan rentang nilai, dari -3.147.483.647 hingga +2.147.483.647.

3.1.6 Tipe Data NATURAL
Tipe data natural memiliki nilai berupa bilangan bulat non-negatif, dengan rentang nilai dari 0 hingga +2.147.483.647.

3.1.7 Tipe Data REAL
Tipe data real memiliki nilai berupa bilangan riil dengan rentang dari -1,0E38 hingga +1,0E38. Tidak dapat disintesis.

3.1.8 Tipe Data Literal Fisis
Digunakan untuk menginformasikan besaran fisis, seperti waktu, tegangan, dan lain-lain. Berguna dalam simulasi, tapi tidak dapat disintesis.

3.1.9 Tipe Data Literal Karakter
Karakter ASCII tunggal atau serangkaian karakter tersebut. Tidak dapat disintesis.

3.1.10 Tipe Data SIGNED dan UNSIGNED
Tipe data Signed dan Unsigned merupakan tipe data yang didefinisikan dalam package std_logic_arith dari library IEEE. Tipe data ini memiliki kesamaan seperti STD_LOGIC_VECTOR, tetapi menerima operasi aritmatika, yang merupakan ciri khas tipe data INTEGER. Sebagai contoh, mari kita lihat tabel 3 berikut:

Tabel 3. Contoh operasi tipe data SIGNED dan UNSIGNED

 

3.1.11 Contoh Operasi Tipe Data Standar (Pre-Define)
Contoh operasi tipe data standar (Pre-define) yang legal (yang diperbolehkan) dan ilegal (yang tidak diperbolehkan) antar data dengan tipe data yang berbeda.

Contoh deklarasi variabel SIGNAL:

Tabel 4 menunjukkan contoh operasi tipe data berdasarkan contoh deklarasi variable SIGNAL di atas:

Tabel 4. Contoh Operasi variabel SIGNAL (Tipe data standar/Pre-define)

 

3.2 Tipe Data Buatan User (User-Defined)

Pada pemrograman VHDL juga memungkinkan pengguna untuk menentukan tipe datanya sendiri. Dua kategori tipe data yang ditentukan pengguna ditunjukkan di bawah ini: integer dan enumerasi.

 

3.2.1 Tipe data integer yang ditentukan pengguna

Penjelasan: Ini memang tipe data INTEGER yang telah ditentukan sebelumnya (Pre-define).

Penjelasan: Ini memang tipe data NATURAL yang telah ditentukan sebelumnya (Pre-define).

Penjelasan: Subset tipe data integer yang ditentukan pengguna (User-define).

Penjelasan: Subset tipe data integer atau natural yang ditentukan pengguna (User-define).

 

3.2.2 Tipe data enumerasi yang ditentukan pengguna

Penjelasan: Ini memang tipe data BIT yang telah ditentukan sebelumnya (Pre-define).

Penjelasan: Bagian tipe data std_logic yang ditentukan pengguna (User-define).

Penjelasan:
Ini memang tipe data BIT_VECTOR yang telah ditentukan sebelumnya (Pre-define). RANGE <> digunakan untuk menunjukkan bahwa rentang tersebut tidak dibatasi. NATURAL RANGE <>, di sisi lain, menunjukkan bahwa satu-satunya batasan adalah rentang tersebut harus berada dalam rentang NATURAL.

Penjelasan: Tipe data enumerasi, tipikal untuk finite state machine (FSM).

Penjelasan:
Ini merupakan tipe data enumerasi lainnya. Pengodean tipe enumerasi dilakukan secara berurutan dan otomatis (kecuali ditentukan lain oleh atribut yang ditentukan oleh pengguna). Misalnya, untuk warna tipe di atas, diperlukan dua bit (ada empat status), yaitu:
“00” untuk status pertama (red),
“01” untuk status kedua (green),
“10” untuk status ketiga (blue),
“11” untuk status keempat (white).

 

3.3 Tipe Data Subtype

SUBTYPE adalah tipe data dengan batasan. Alasan utama penggunaan subtype, alih-alih menentukan tipe data baru, adalah karena meskipun operasi antar data bertipe berbeda tidak diperbolehkan, operasi tersebut diperbolehkan antara subtype dan tipe data dasarnya.

Contoh tipe data subtype:

Penjelasan:
Seperti yang diharapkan, NATURAL adalah subtype (subset) dari INTEGER.

Penjelasan:
Ingat kembali bahwa STD_LOGIC=(‘X’,’0′,’1′,’Z’,’W’,’L’,’H’,’-‘). Oleh karena itu, my_logic=(‘0′,’1′,’Z’).

Penjelasan:
Karena color=(red, green, blue, white), maka my_color=(red, green, blue).

Penjelasan: Subtipe dari INTEGER.

Contoh operasi legal dan ilegal antar tipe data dasar dan subtype.

Operasi tipe data berdasarkan deklarasi variable SIGNAL di atas:

Tabel 5. Contoh operasi variabel SIGNAL (tipe data subtype)

 

3.4 Tipe Data Array

Array adalah kumpulan objek bertipe data sama. Array dapat berdimensi satu (1D), dua dimensi (2D), atau satu dimensi x satu dimensi (1D x 1D). Array juga dapat berdimensi lebih tinggi, tetapi umumnya tidak dapat disintesis. Gambar 1 mengilustrasikan konstruksi data array. Gambar 1(a) adalah nilai bit tunggal (skalar), gambar 1(b) adalah vektor (Array 1D), gambar 1(c) adalah Array vektor (Array 1D x 1D), dan gambar 1(d) adalah array skalar (Array 2D).

Gambar 1. Ilustrasi konstruksi data array
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 31

 

Tipe data pre-define VHDL yang telah jelaskan pada sub-bab 3.1 di atas, hanya mencakup kategori skalar (bit tunggal) dan vektor (Array bit satu dimensi). Tipe data pre-define yang dapat disintesis dalam kedua kategori tersebut adalah sebagai berikut:

Skalar:
BIT, STD_LOGIC, STD_ULOGIC, dan BOOLEAN.

Vektor:
BIT_VECTOR, STD_LOGIC_VECTOR, STD_ULOGIC_VECTOR, INTEGER, SIGNED, dan UNSIGNED.

Seperti yang dapat dilihat, tidak ada pre-define array 2D atau array 1Dx1D, yang apabila diperlukan, maka harus ditentukan oleh pengguna. Untuk melakukannya, TYPE yang baru harus didefinisikan terlebih dahulu, kemudian SIGNAL, VARIABEL, atau CONSTANT yang baru dapat dideklarasikan menggunakan tipe data tersebut. Sintaks berikut harus digunakan.

Untuk menentukan tipe array baru:

Untuk memanfaatkan tipe data array baru:

Dalam sintaksis di atas, sebuah SIGNAL dideklarasikan. Namun, SIGNAL juga bisa berupa KONSTAN atau VARIABEL. Perhatikan bahwa nilai awal (initial value) bersifat opsional (hanya untuk simulasi).

 

Contoh: Array 1Dx1D (Contoh 1)
Misalkan kita ingin membangun array yang berisi empat vektor, masing-masing berukuran delapan bit. Ini kemudian menjadi array 1Dx1D (lihat gambar 1). Mari kita sebut setiap vektor dengan baris, dan array lengkap dengan matriks. Selain itu, misalkan kita ingin bit paling kiri dari setiap vektor menjadi MSB (most significant bit), dan kita ingin baris teratas menjadi baris 0. Maka implementasi array-nya adalah sebagai berikut.

Pada contoh di atas, perhatikan bahwa sebuah sinyal, yang diberi nama dengan “x,” bertipe data matriks yang merupakan user-define tipe data array.

 

Contoh: Array 1Dx1D (Contoh 2)
Cara lain untuk mengkonstruksi array 1Dx1D adalah sebagai berikut:

Dari sudut pandang kompatibilitas data, cara terakhir mungkin lebih menguntungkan dibandingkan contoh sebelumnya (Contoh 1).

 

Contoh: Array 2D
Array di bawah ini benar-benar dua dimensi. Perhatikan bahwa konstruksinya tidak didasarkan pada vektor, melainkan sepenuhnya pada skalar (bit tunggal).

Contoh: Inisialisasi Array.
Seperti yang ditunjukkan pada syntax di atas, nilai awal SIGNAL atau VARIABEL bersifat opsional. Namun, ketika inisialisasi diperlukan, hal itu dapat dilakukan seperti pada contoh di bawah ini.

 

Contoh: Penetapan array yang legal dan ilegal.
Penetapan dalam contoh ini didasarkan pada definisi tipe data dan deklarasi SIGNAL berikut:

Scalar Assignment:

Tabel 6. Contoh operasi array (Legal dan ilegal) – Scalar Assignment

Vector Assignment:

Tabel 7. Contoh operasi array (Legal dan ilegal) – Vector Assignment

 

3.5 Tipe Data Port Array

Seperti yang telah diketahui, tidak ada Pre-define tipe data dengan lebih dari satu dimensi. Namun, dalam spesifikasi pin input atau output (PORTS) suatu rangkaian sistem digital (yang dibuat dalam ENTITY), kita mungkin perlu untuk menentukan port-port tersebut sebagai array vektor. Karena deklarasi TYPE tidak diperbolehkan dalam ENTITY, solusinya adalah mendeklarasikan User-define tipe data dalam sebuah PACKAGE, yang kemudian akan terlihat oleh seluruh desain (termasuk ENTITY). Contohnya adalah sebagai berikut:

Penjelasan program:

Pada contoh program VHDL di atas, sebuah pre-define tipe data, yang dinamai dengan vector_array, telah dibuat. Tipe data ini dapat berisi vektor dalam jumlah tak terbatas dengan ukuran masing-masing delapan bit. NATURAL RANGE <> menandakan bahwa rentangnya tidak tetap, dengan satu-satunya batasan adalah harus berada dalam rentang NATURAL, yang berkisar dari 0 hingga +2.147.483.647). Tipe data ini disimpan dalam sebuah PACKAGE bernama my_data_types, dan kemudian digunakan dalam sebuah ENTITY untuk menentukan sebuah PORT bernama inp. Perhatikan dalam kode utama penyertaan kata kunci USE tambahan untuk membuat paket yang ditentukan pengguna my_data_types terlihat oleh desain.
Opsi lain untuk PACKAGE my_data_types di atas adalah seperti tampak pada contoh potongan program VHDL di bawah ini, di mana deklarasi CONSTANT disertakan.

 

3.6 Tipe Data Records

Tipe data RECORD mirip dengan tipe data array, hanya saja perbedaannya adalah tipe data record berisi objek dengan tipe yang berbeda.
Contoh:

 

3.7 Tipe Data Signed dan Unsigned

Tipe data SIGNED dan UNSIGNED adalah tipe data yang didefinisikan dalam package std_logic_arith dari library IEEE. Syntax-nya diilustrasikan dalam contoh di bawah ini.
Contoh:

Nilai UNSIGNED adalah angka yang tidak pernah lebih rendah dari nol. Misalnya, ‘‘0101’’ mewakili desimal 5, sedangkan ‘‘1101’’ menandakan 13. Jika tipe SIGNED digunakan, nilainya bisa positif atau negatif (dalam format komplemen dua). Oleh karena itu, “0101” akan mewakili desimal 5, sementara “1101” akan berarti -3 (negatif).

Untuk menggunakan tipe data SIGNED atau UNSIGNED, package std_logic_arith dari library IEEE harus dideklarasikan. Terlepas dari syntax-nya, tipe data SIGNED dan UNSIGNED dipergunakan untuk operasi aritmatika, namun operasi logika menggunakan tipe data SIGNED dan UNSIGNED tidak diperbolehkan. Hal ini berkebalikan dengan tipe data STD_LOGIC_VECTOR, di mana tipe data STD_LOGIC_VECTOR dapat digunakan untuk operasi logika, namun tidak boleh digunakan untuk operasi aritmatika.
Sedangkan untuk operasi relasional (perbandingan), baik tipe data SIGNED, UNSIGNED, maupun STD_LOGIC_VECTOR semuanya dapat dipergunakan (tidak ada batasan).

Contoh: Operasi legal dan ilegal dengan tipe data signed/unsigned.

Contoh: Operasi legal dan ilegal dengan std_logic_vector.


Meskipun terdapat batasan yang disebutkan di atas, terdapat cara sederhana untuk memungkinkan data bertipe STD_LOGIC_VECTOR digunakan langsung dalam operasi aritmatika. Untuk itu, library ieee menyediakan dua package, std_logic_signed dan std_logic_unsigned, yang memungkinkan operasi dengan data STD_LOGIC_VECTOR dilakukan seolah-olah data tersebut bertipe SIGNED atau UNSIGNED.

Contoh: Operasi aritmatika dengan std_logic_vector.


 

3.8 Konversi Data

VHDL tidak mengizinkan operasi langsung (aritmatika, logika, dll.) antar data dengan tipe data yang berbeda. Oleh karena itu, seringkali perlu melakukan konversi data dari satu tipe data ke tipe data lainnya. Hal ini pada dasarnya dapat dilakukan dengan dua cara:
  1. Menulis program VHDL khusus untuk tujuan konversi data.
  2. Memanggil FUNGSI dari pre-define package dari suatu library yang mampu melakukan konversi data.
Jika data terkait erat (yaitu, kedua operan memiliki tipe dasar yang sama, meskipun dideklarasikan sebagai milik dua kelas tipe data yang berbeda), maka std_logic_1164 dari library IEEE menyediakan fungsi konversi yang mudah. Contohnya ditunjukkan di bawah ini.
Contoh: Operasi legal dan ilegal dengan subset.

Beberapa fungsi konversi data dapat ditemukan di dalam paket std_logic_arith dari library IEEE. Fungsi-fungsi tersebut adalah:

Tabel 8. Fungsi konversi data dalam package std_logic_arith

 

Contoh: Konversi data.

Penjelasan program:
Nilai SIGNAL “a+b” (Input) dikonversi dari tipe data UNSIGNED menjadi nilai tipe data STD_LOGIC_VECTOR 8-bit, lalu ditugaskan menuju SIGNAL “y” (Output).

Konversi data juga dapat dilakukan dengan langkah alternatif, yaitu penggunaan paket std_logic_signed atau std_logic_unsigned dari pustaka IEEE. Paket-paket tersebut memungkinkan operasi dengan data STD_LOGIC_VECTOR dilakukan seolah-olah data tersebut bertipe SIGNED atau UNSIGNED. Silakan membaca kembali penjelasan mengenai tipe data SIGNED dan UNSIGNED pada sub-bab 3.1.10 di atas. Selain fungsi konversi data yang telah dijelaskan, beberapa fungsi lain sering ditawarkan oleh vendor alat sintesis.

 

3.9 Daftar Tipe Data Dalam Pemrograman VHDL yang Dapat di Sintesis

Tabel 9. Daftar tipe data VHDL yang dapat di sintesis

 

3.10 Penugasan Tipe Data (Legal vs Ilegal)

Contoh lebih lanjut penugasan tipe data yang legal dan ilegal berikut di bawah ini, disajikan berdasarkan pada definisi jenis dan deklarasi TYPE dan SIGNAL berikut:

 

Author

Taufiq Dwi Septian Suyadhi

Degrees from electronics and industrial engineering. Enthusiast on electronics, embedded systems, automation, internet of things, robotics, and artificial intelligence. Never ending learning and sharing valuable knowledge.

Leave a Reply

Post Related