Home > Code, Tips, VHDL > Tutorial, Mari Belajar VHDL Secara Singkat (1)

Tutorial, Mari Belajar VHDL Secara Singkat (1)

Tanpa saya duga ternyata ada satu-dua hasil search yang intinya ingin tau tentang bahasa VHDL di hasil statistik blog saya. Sekali lagi saya merasa bersalah karena setelah membuka link ke blog saya ini ternyata tidak mendapatkan apa yang mereka inginkan yaitu tutorial tentang bahasa VHDL. Walaupun saya belum jago dalam menggunakan bahasa ini juga, mungkin tidak banyak yang bisa saya tulis disini, dan mungkin hanya garis besarnya juga. Seperti yang saya beritahu pada postingan sebelumnya mengenai VHDL, perlu diingat bahwa bahasa VHDL intinya adalah membuat rangkaian bukan program. Pada bagian pertama ini akan saya beri contoh pembuatan awal dan operator2 yang biasa dipakai pada bahasa VHDL, dan membuat suatu komponen tertentu

1. LIBRARY

Deklarasi library merupakan hal penting dalam pembuatan kode vhdl, terutama jika kita membuat sesuatu dengan struktur data atau komponen yang membutuhkan library tertentu. Misal kita menggunakan bentukan STD_LOGIC_VECTOR dan operator matematis yang akan digunakan pada std_logic maka perlu dideklarasi di awal:

--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:

--deklarasi entity, port input dan output
ENTITY blog_tutor IS
PORT (
    --input
    input   : IN STD_LOGIC_VECTOR(1 DOWNTO 0); --2 bit
    clock   : IN STD_LOGIC;
    reset   : IN STD_LOGIC;
    selector: IN STD_LOGIC;
    --output
    output  : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) --8 bit
);
END blog_tutor;

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

ARCHITECTURE behavior OF blog_tutor IS
TYPE reg_4x8 IS ARRAY (3 DOWNTO 0) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL blok_reg     : reg_4x8;
SIGNAL sum          : STD_LOGIC_VECTOR(7 DOWNTO 0);

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:
in_add2 <= "00000000";
output <= sig_out;
  • Melakukan operasi bit, seperti AND, NAND, OR, NOR, XOR, atau XNOR, contohnya:
output <= in_add1 OR in_add2;
  • 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:
signal1 <= signal2 WHEN expression [ELSE signal3 [WHEN expression ELSE signal4 [...]]];

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:
PROCESS [(sensitivity_list)]
BEGIN
	[block_process]
END PROCESS;
  • 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:
WAIT UNTIL clock'EVENT AND clock = '1';
  • 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:
IF reset = ‘1’ THEN
    output <= “0000”;
ELSIF memread = ‘1’ THEN
    output <= reg_memory;
ELSE
    output <= input;
END IF;

CASE states IS
WHEN “00” 	=> output <= inA OR inB;
WHEN “01” 	=> output <= inA AND inB;
WHEN “10” 	=> output <= inA XOR inB;
WHEN OTHERS	=> output <= “0000”
  • 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:
FOR i IN 0 TO 3 LOOP
      blok_reg(i) <= “00000000”;
END 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😀

Categories: Code, Tips, VHDL
  1. gde
    June 19, 2016 at 1:05 am

    keren gan

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: