--deklarasi library
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_SIGNED.ALL;
2. ENTITY
Membuat entity yang memberikan gambaran port input dan output pada komponen yang akan kita
buat. Misal kita akan membuat rangkaian/komponen yang kita beri nama “tutor_blog”, komponen
ini menerima input yang bernama “input” yang berukuran 2 bit, kemudian “clock”, “reset”, dan
“selector” yang semuanya 1 bit. Output pada komponen ini bernama “output” yang berukuran 8
bit. Gambar komponennya adalah beserta contoh penulisan ENTITY-nya sebagai berikut:
Penjelasan dari code di atas, kata “ENTITY” diikuti dengan nama komponen yang kita buat
sekaligus nama file dot vhd yang kita buat, disini diberi nama “blog_tutor” kemudian diikuti kata
“IS”. Kali ini tidak saya bahas mengenai “GENERIC”, jadi setelah kata “IS”, diikuti dengan kata
“PORT” dan kurung buka, setelah itu baru kita tulis nama input dan output dari komponen yang
kita buat. Tanda yang diawali dengan “- -” akan dianggap comment dan tidak akan berpengaruh
apapun. Setelah itu kita tulis nama input dan output, pada code di atas ditulis nama input/output
diikuti tanda titik dua (:), setelah itu kata “IN” atau “OUT”, kata “IN” jika merupakan input dan
“OUT” jika merupakan output. Setelah kata “IN”/”OUT” dituliskan tipe data-nya di contoh di atas
tipenya ada yang STD_LOGIC dan STD_LOGIC_VECTOR yaitu array dari STD_LOGIC, misal
ukurannya 8 bit maka dituliskan (7 DOWNTO 0), misal 2 bit dituliskan (1 DOWNTO 0). Setelah itu
ditutup dengan kurung tutup “)” dan tanda titik koma (;) lalu kata END nama_komponen. Perlu
diingat bahwa nama port input/output atau signal/variabel tidak boleh sama dengan kata yang
sudah terdapat pada VHDL misal IN, OUT, SELECT, IF, ELSE, ALL dsb. Selain STD_LOGIC, ada tipe
yang lain yaitu integer, character dan real.
3. ARCHITECTURE
Menuliskan ARCHITECTURE-nya dan SIGNAL yang dibutuhkan sebelum kata BEGIN
Blok architecture adalah bagian penting karena berisi code rangkaian dari komponen tersebut,
cara penulisannya diawali dengan “ARCHITECTURE” dan diikuti dengan suatu kata terserah, tapi
biasanya dengan kata “behavior” kemudian kata “OF” dan nama komponen tersebut dalam contoh
ini adalah “blog_tutor” lalu kata “IS”. Baris selanjutnya adalah deklarasi SIGNAL yang akan
digunakan, SIGNAL disini berguna sebagai kabel penghubung ataupun tipe data baru misal array.
Cara membuat array adalah dengan menggunakan kata “TYPE” dan nama_type, kalo disini
reg_4x8 kemudian diikuti “IS ARRAY” dan ukuran array-nya, jika ukurannya 4 seperti pada contoh
ditulis “(3 DOWNTO 0)”, lalu “OF” dan isi dari array-nya, di code di atas misal isi dari array-nya
adalah std_logic berukuran 8. Agar array tadi bisa digunakan kita buat SIGNAL –nya dengan
menuliskan SIGNAL nama_signal : tipe_data.
4. RANGKAIAN UTAMA
Dalam membuat rangkaian utama, diawali dengan kata BEGIN, berikut ini apa yang biasa
dilakukan dalam membuat rangkaian, sekaligus operator yang biasa dipakai di bahasa VHDL
Assignment pada signal, operator yang digunakan adalah “<=”, digunakan saat misal kita
menginginkan agar signal in_add2 diisi dengan “00000000” atau kita ingin menghubungkan antar
kabel saat dilakukan percabangan contohnya:
Melakukan operasi bit, seperti AND, NAND, OR, NOR, XOR, atau XNOR, contohnya:
Multiplexer, dengan menggunakan operator WHEN. Suatu saat ketika kita merasa membutuhkan
operator IF akan tetapi kita tidak mengharapkan rangkaian sekuen melainkan rangkaian
kombinasional, maka WHEN menjadi pilihan yang tepat. Misal kita ingin melakukan assign
terhadap suatu sinyal sig_out dengan sinyal sum ketika sinyal selector bernilai ‘0’ dan mengisi
sig_out dengan sinyal in_add2 ketika sinyal selector bernilai ‘1’. Kita tidak perlu menggunakan IF,
dan cukup menggunakan WHEN, contoh penggunaannya seperti berikut ini:
1 signal1 <= signal2 WHEN expression [ELSE signal3 [WHEN expression ELSE
signal4 [...]]];
2
3
sig_out <= sum WHEN selector = '0' ELSE in_add2;
Membuat blok PROCESS, blok PROCESS biasanya dibuat jika kita akan menggunakan operator
tertentu karena akan dibuat rangkaian sekuensial. Pada block PROCESS ada yang namanya
sensitivity list jika kita tidak menggunakan WAIT di dalam PROCESS. Sensitivity list sendiri berisi
variabel2 yang dibutuhkan pada block PROCESS, misal di dalam block PROCESS terdapat “IF
memread = ‘1’” kita perlu memasukkan memread pada sensitivity list, selain itu jika dalam block
PROCESS terdapat assign misal “output <= written”, written juga perlu dimasukkan dalam
sensitivity list. Bentuk dari blok PROCESS adalah:
1 PROCESS [(sensitivity_list)]
2 BEGIN
[block_process]
3
END PROCESS;
4
WAIT statement, dengan menggunakan WAIT, kita tidak memerlukan sensitivity list, WAIT sendiri
cenderung lebih sering digunakan agar rangkaian menjadi synchronous terhadap clock, walaupun
WAIT sendiri bisa digunakan selain untuk clock. Pada rangkaian sekuensial terkadang clock sangat
dibutuhkan misal pada saat penulisan pada array. Cara menggunakan WAIT misal untuk clock saat
rising edge contohnya seperti berikut ini:
Sequential statement, statement disini dikhususkan untuk rangkaian sekuensial. Unsur terpenting
yang perlu diingat disini adalah konsep State, berbeda dengan sebelumnya yang bisa kita anggap
bahwa semua baris code akan dijalankan secara bersamaan, pada rangkaian sekuensial ini tidak
semua baris code akan dijalankan, hanya code yang ada pada state yang sedang aktif. Sequential
statement hanya bisa ditulis dalam block PROCESS, dan ingat ketika masuk ke dalam satu blok
misal IF, semua code dalam blok itu akan dijalankan. Jangan pernah membayangkan bahwa code
akan dijalankan berurutan dari atas ke bawah apalagi yang tidak di dalam PROCESS. Sequential
statement biasanya menggunakan IF atau CASE, contoh pemakaiannya adalah:
Pada VHDL juga terdapat looping, walaupun menurut saya lebih baik untuk jarang digunakan
kecuali memang terpaksa. Keadaan yang terpaksa misal saat mengisi nilai awal dari array yang
akan digunakan jadi kita tidak harus menuliskan satu per satu, gak bisa dibayangkan kalo kita
mau ngisi array ukuran 64 satu per satu. Ingat bahwa loop juga harus di dalam block PROCESS,
salah satu model loop yang sering saya pakai adalah FOR LOOP, cara penggunaanya adalah
sebagai berikut:
1 FOR i IN 0 TO 3 LOOP
Karena tidak mungkin untuk menuliskan tutorial secara lengkap di blog, jadi mungkin cuman garis
besarnya saja seperti di atas. Semoga postingan ini dapat bermanfaat, tentunya berlatih membuat
code VHDL adalah satu2nya cara agar kita terbiasa membuat code VHDL, untuk berlatih saya
sudah mencoba untuk membuat postingan mengenai contoh code VHDL untuk rangkaian sangat
sederhana. Terima kasih 😀