Home > Code, Programming, VHDL > Tutorial, Mari Belajar VHDL Secara Singkat (2)

Tutorial, Mari Belajar VHDL Secara Singkat (2)

Pada postingan sebelumnya telah dijelaskan garis besar dalam membuat code dengan bahasa VHDL. Tentunya latihan merupakan hal yang paling utama, tidak bisa dengan hanya membaca teorinya saja, oleh karena itu di postingan kali ini akan saya beri contoh rangkaian sederhana. Akan lebih baik jika kita mencoba membuat code-nya sendiri terlebih dulu, baru nanti dicocokkan apakah intinya sama dengan code yang ada pada postingan ini. Rangkaian sederhana tersebut adalah sebagai berikut ini:

Baris code-nya adalah sebagai berikut ini:

--deklarasi library
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_SIGNED.ALL;

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

--bagian utama komponen
ARCHITECTURE behavior OF blog_tutor IS
--membuat tipe array berukuran 4 yang berisi 8 bit std_logic
TYPE reg_4x8 IS ARRAY (3 DOWNTO 0) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
--membuat signal yang bertipe array reg_4x8
SIGNAL blok_reg     : reg_4x8;
--sinyal/kabel keluaran dari adder
SIGNAL sum          : STD_LOGIC_VECTOR(7 DOWNTO 0); 
--sinyal/kabel input adder yang pertama (kabel atas)
SIGNAL in_add1      : STD_LOGIC_VECTOR(7 DOWNTO 0);
--sinyal/kabel input adder yang kedua (kabel bawah)
SIGNAL in_add2      : STD_LOGIC_VECTOR(7 DOWNTO 0);
--sinyal/kabel yang akan dihubungkan ke output dan register bawah 
SIGNAL sig_out      : STD_LOGIC_VECTOR(7 DOWNTO 0);
--sinyal/kabel yang akan ke selector mux 
SIGNAL sel_mux      : STD_LOGIC;
--memulai menyusun rangkaian pembentuk komponen blog_tutor
BEGIN
--menghubungkan input adder 1 dengan hasil keluaran blok register
--fungsi CONV_INTEGER(input) mengubah input menjadi tipe integer
--in_add1 akan diisi dengan nilai dari array blog_reg yang mempunyai
--index masukan input
    in_add1 <= blok_reg(CONV_INTEGER(input));
--sum di-assign dengan hasil penjumlahan dari kedua input adder
    sum <= in_add1 + in_add2;
--mux 2x1, mengeluarkan sinyal sum jika bit pertama sig_out = '0'
-- mengeluarkan sinyal in_add2 jika bit pertama = '1'
    sig_out <= sum WHEN selector = '0' ELSE in_add2;
--menghubungkan sig_out dengan keluaran output
    output <= sig_out;
--memulai blok PROCESS, digunakan jika kita membuat rangkaian seq
--jika kita menggunakan IF dan WAIT perlu dibuat blok process
    PROCESS 
--(sensitivity list) tidak diberikan karena menggunakan WAIT 
-- di dalam process, jika tidak ada WAIT, diisi dengan input
-- yang dipakai dalam process
    BEGIN
--menunggu sampai rising edge clock
        WAIT UNTIL clock'EVENT AND clock = '1';
--saat input reset = '1'
        IF reset = '1' THEN
--keluaran dari register adalah "00000000"
            in_add2 <= "00000000";
--loop untuk mengisi array blog_reg, array diakses seperti 
--pada bahasa C hanya saja dengan tanda "()" bukan "[]"
--blog_reg(1) berarti isi dari blog_reg dengan index 1
--saat reset blog_reg(0) diisi dengan 0, blog_reg(1) = 1
--blog_reg(2) = 2, dan blog_reg(3) = 3
            FOR i IN 0 TO 3 LOOP
--CONV_STD_LOGIC_VECTOR(in1, in2) mengubah in1 menjadi
--bertipe STD_LOGIC_VECTOR dengan ukuran in2 bit
                blok_reg(i) <= CONV_STD_LOGIC_VECTOR(i,8);
            END LOOP;
--jika reset = '0'
        ELSE
--keluaran dari register adalah sinyal sig_out/output
            in_add2 <= sig_out;
--jangan lupa untuk memberi END IF setiap ada IF di awal
        END IF;
    END PROCESS;
END behavior;

Hasil simulasinya adalah sebagai berikut: (functional, tanpa delay)


Penjelasan tiap kotak merah dari kiri ke kanan

  1. Karena reset = 1, maka isi register = 0, input = 1, output = 1 + 0 = 1
  2. Clock rising, maka isi register = 1, input = 1, output = 1 + 1 = 2
  3. Clock belum rising, isi register belum berubah = 1, input = 2, output =  2 + 1 = 3
  4. Clock rising, output dimasukkan register, isi register = 3, input =2, output = 2 + 3= 5
  5. Clock belum rising, isi register masih = 3, input = 3, output = 3 + 3 = 6
  6. Clock rising, isi register diisi output sebelumnya = 6, input = 3, output = 3 + 6 = 9
  7. Selector = 1, output hasil dari register, isi register = 6, input tidak berpengaruh, output = 6
  8. Clock belum rising, register = 6, input =  1, output = 1 + 6 = 7
  9. Clock rising, register diisi output, register = 7, input = 1, output = 1 + 7 = 8
  10. Input = 0, output selalu 7

Jadi walaupun code beda, tapi hasil simulasi sama, berarti code-nya bisa dianggap benar, semoga bermanfaat😀

Categories: Code, Programming, VHDL
  1. faithfullover
    December 17, 2011 at 11:05 pm

    kk johan bantuin saya bikin mips dual core cache controller dong :p

  2. December 17, 2011 at 11:35 pm

    wanjir dewa vhdl muncul, sembah dulu lah m(_ _)m
    emang cache-nya udah beres?

  3. Danang
    September 28, 2013 at 10:44 am

    kakak bikin mux 4 input 2 selektor sama ada enable gimana yah? pffft gak bisa bisa nih

    • September 30, 2013 at 10:01 am

      itu 2 selektor maksudnya selektornya dua bit kan? kalo pengen ada enable coba aja bikin process yang isinya IF enable, kalo enable 0 nilai -> output diisi 0 misalnya, trus kalo enable 1 -> output dikasih signal temporary yang menampung keluaran dari CASE selektor

      • September 30, 2013 at 12:03 pm

        eh gak perlu juga pake IF, bisa pake WHEN, biar jadi rangkaian kombinasional

    • September 30, 2013 at 12:19 pm
      ARCHITECTURE behavioral OF tes_mux IS
      SIGNAL temp : STD_LOGIC_VECTOR(7 DOWNTO 0);
      BEGIN
      temp <= in1 WHEN sel = "00" ELSE
      		in2 WHEN sel = "01" ELSE
      		in3 WHEN sel = "10" ELSE
      		in4;
      out1 <= temp WHEN ena1 = '1' ELSE "00000000";
      END behavioral;
  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: