Jumat, 26 November 2010

Desain Unit Kendali [part1]

Salah satu judul modul dari kelas EL2195 a.k.a praktikum Sistem Digital. Apa itu unit kendali? Sebuah design atau rancangan rangkaian digital yang berfungsi untuk mengendalikan keseluruhan rangkaian lainnya. Rangkaian tersebut biasa disebut sebagai unit kendali atau controller. Praktikum tentang desain unit kendali sendiri merupakan praktikum kelima dari total 6 praktikum. Ini merupakan dasar untuk proyek terakhir pada praktikum 6.

Praktikum terakhir Sistem Digital ini, kami diminta untuk membuat sebuah projek yang bisa kami pilih sendiri. Pilihan dan sedikit spesifikasinya adalah sebagai berikut:

4‐bit serial ALU
Harus terdiri dari dua shift register, satu untuk operand pertama dengan hasilnya dan yang lainnya untuk operand kedua. ALU harus bisa melakukan delapan operasi yang berbeda termasuk penambahan dan pengurangan 2’s complement. Fasilitas Input operand harus disertakan. ALU boleh diberikan clock ataupun dikendalikan secara manual.

4‐bit Multiplier
Harus berbentuk sekuensial menggunakan prinsip shift dan penjumlahan dengan 4‐bit operand dan 8‐bit hasil. Fasilitas input operand harus disertakan. Operasi harus berjalan secara otomatis setelah proses input operand selesai. Boleh menggunakan clock secara manual, tetapi hanya sejumlah yang dibutuhkan untuk proses perkalian saja, jumlah ini tidak boleh secara manual dihitung. Ketika proses perkalian selesai, hasilnya harus tetap terpampang bagaimanapun ada clock yang diaplikasikan. Hasil hanya akan terhapus ketika operand baru dimasukkan atau proses perkalian baru dimulai.

4‐bit Divider
Harus menggunakan prinsip shift dan penjumlahan dengan 4‐bit pembagi dan 8‐bit hasil pembagian. Fasilitas input operand harus disertakan. Pemberian clock dan penghitungan jumlah langkah pembagian boleh dilakukan secara manual, tetapi control seperti kapan harus mengurangi pembagi harus otomatis.

Variable‐Speed Chaser LED
Serangkaian LED harus menyala secara bergantian dari kiri ke kanan atau kanan ke kiri dengan kecepatan seolah‐olah LED itu bergerak. Empat kecepatan yang berbeda harus bisa diberikan melalui switch. Arah pergerakan harus bisa diubah menggunakan switch yang lain. Frekuensi clock kedalam rangkaian dibuat konstan.

Asynchronous Combination Lock
Kunci kombinasi ini minimal harus memiliki 4 buah symbol masukan 2‐bit sebagai kombinasi dan terlihat kepada pengguna sebagai rangkaian asinkron. Sebenarnya itu merupakan rangkaian sinkron dengan clock yang cepat dan sinkronisasi dengan masukan pengguna. Untuk kombinasi input yang diberikan, rangkaian akan bergerak ke suatu state dan berputar disana hingga masukan berubah ke symbol yang baru. Artinya kombinasi masukan tidak boleh terdiri dari symbol yang sama dimasukkan secara berurutan. Kunci akan tertutup dengan menggunakan RESET asinkron.

Thunderbird TailLights
Gunakan empat buah LED untuk setiap lampu belakang. Dua LED pada setiap sisi harus menyala ketika penggunaan malam(1 switch ditekan), Keempat LED pada setiap sisi harus menyala ketika rem diinjak(1 Push Button ditekan) dan Keempat LED harus menyala secara bergantian kearah luar pada sisi yang bersesuaian untuk sinyal belok kiri dan kanan(2 Switch). Jika rem aktif bersamaan dengan sinyal belok aktif, kedua pola akan muncul secara bergantian. Pada keadaan darurat(1 switch), kedelapan LED akan berkedip‐kedip dengan frekuensi yang dapat dilihat.

LED Ping‐Pong
Bola pingpong akan dimodelkan oleh sebuah LED yang menyala dimana dia akan bergerak dari ujung ke ujung. Salah satu ujung satu push button harus ditekan untuk memukul bola sehingga bola pingpong akan bergerak ke ujung yang lainnya. Proyek ini memiliki tingkat kesulitan cukup tinggi sehingga akan mendapat nilai maksimal lebih tinggi.

Awalnya, gue mau buat Thunderbird Tailights. Kenapa? cuz it seems so cool. Itu kan bikin lampu sen mobil. Tapi akhirnya gue memilih untuk buat LED Ping-Pong. Alasan gue milih pingpong karena ada yang ngajarin buatnya gimana. haha :D

Gue praktikum VI hari Rabu kemarin, tanggal 24 November. Hari Minggu gue udah mulai mau ngerjain. Coach gue adalah Samuel Cahyawijaya -kita sebut SamCa-. Nah, siangnya gue diliatin ASM punya dia. Mudeng sih maksudnya gimana, tapi tetep ga ngerti cara buatnya *begonya gue*. Oh iya, buat yang ga tau ASM itu apa. ASM adalah Algorithmic State Machine. Bentuknya kayak diagram alir gitu. Nih, gue kasih contohnya.

Gambar ini gue ambil dari modul praktikumnya, yang buat bikin unit kendali di praktikum V. Pokoknya yang mau lebih tau tentang ASM atau FSM itu apa, Google punya jawabannya kok.

Lanjut, setelah gue ngeliat ASM yang dibikin Samca dan gue masih tetep ge ngerti apa yang harus gue lakukan. Gue cuma buat ENTITYnya doank. Oh, iya. Gue buat projek ini pake VHDL (VHSIC Hardware Description Language). Intinya, gue harus ngoding juga!

Kerjaan gue di hari minggu cuma buat si entity itu doank. Padahal Aul sama Hasby yang waktu itu diajarin SamCa juga udah sampe isi Architecturenya. Daripada gue menghambat mereka berdua mending, gue memilih untuk membuka akun jejaring sosial. Saat itu, gue ngerjainnya di dingdong yang memang ada fasilitas wi-fi.What I've got on Sunday is a NIL! :D :D :D

Besoknya, beres praktikum Alstrukdat yang jujur gue udah ga peduli sama praktikum yang satu ini, gue ngerjain projek SisDig lagi di dingdong. Gue udah mulai paham apa yang harus gue lakukan. Tapi gue masih bingung sama sebuah variabel yang dikasih nama X ini harus diapain. Setelah dijelasin lagi sama SamCa yang super sabar. Gue pun kembali ngoding. Sempet pindah tempat ke ruang baca dan Cafe di CC Timur. Akhirnya controllernya beres juga. Dan inilah hasil codingan yang gue buat tapi yang ngedebug SamCa XD


LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY pengontrol IS
PORT (start1, start2, button1, button2, clock: IN STD_LOGIC;
     led1,led2,led3,led4,led5,led6,led7,led8,count1,count2: OUT STD_LOGIC);
END pengontrol;

ARCHITECTURE behavioral OF pengontrol IS
    TYPE tipestate IS (scount1,scount2,wait1,wait2,L1,L2,L3,L4,L5,L6,L7,L8);
    SIGNAL state : tipestate;
    SIGNAL x: STD_LOGIC; --kl ke kanan dikasih 0 kl ke kiri dikasih 1
BEGIN
    nextstate : process(start1,start2,button1,button2,clock)
    BEGIN
    IF start1='0' THEN
        state <= wait1;
        x <= '0';
    ELSIF start2='0' THEN
        state <= wait2;
        x <= '1';
    ELSIF clock'event and clock='1' THEN
        CASE state IS
            when wait1 => x<='0';
                          if button1 = '0' then state <= L2;
                             else state <= wait1;
                          end if;
            when wait2 => x<='1';
                          if button2 = '0' then state <= L7;
                          else state <= wait2;
                          end if;
            when L1       => if button1 = '0' then state <= L2; x<='0';
                          else state <= scount2;
                          end if;
            when L2    => if x='1' then state <= L1;
                          else state <= L3;
                          end if;  
            when L3    => if x='1' then state <= L2;
                          else state <= L4;
                          end if;
            when L4    => if x='1' then state <= L3;
                          else state <= L5;
                          end if;
            when L5    => if x='1' then state <= L4;
                          else state <= L6;
                          end if;
            when L6    => if x='1' then state <= L5;
                          else state <= L7;
                          end if;
            when L7    => if x='1' then state <= L6;
                          else state <= L8;
                          end if;
            when L8    => if button2 = '0' then state <= L7; x<='1';
                          else state <= scount1;
                          end if;
            when scount1 => state <= wait2;
            when scount2 => state <= wait1;
        END CASE;
      END IF;
  end process;

  output : PROCESS (state)
    BEGIN
        CASE state  IS
        WHEN scount1 =>
            led1<='0';
            led2<='0';
            led3<='0';
            led4<='0';
            led5<='0';
            led6<='0';
            led7<='0';
            led8<='0';
            count1<='1';
            count2<='0';
        WHEN scount2 =>
            led1<='0';
            led2<='0';
            led3<='0';
            led4<='0';
            led5<='0';
            led6<='0';
            led7<='0';
            led8<='0';
            count1<='0';
            count2<='1';
        WHEN wait1 =>
            led1<='1';
            led2<='0';
            led3<='0';
            led4<='0';
            led5<='0';
            led6<='0';
            led7<='0';
            led8<='0';
            count1<='0';
            count2<='0';
        WHEN wait2 =>
            led1<='0';
            led2<='0';
            led3<='0';
            led4<='0';
            led5<='0';
            led6<='0';
            led7<='0';
            led8<='1';
            count1<='0';
            count2<='0';
        WHEN L1 =>
            led1<='1';
            led2<='0';
            led3<='0';
            led4<='0';
            led5<='0';
            led6<='0';
            led7<='0';
            led8<='0';
            count1<='0';
            count2<='0';
        WHEN L2 =>
            led1<='0';
            led2<='1';
            led3<='0';
            led4<='0';
            led5<='0';
            led6<='0';
            led7<='0';
            led8<='0';
            count1<='0';
            count2<='0';
        WHEN L3 =>
            led1<='0';
            led2<='0';
            led3<='1';
            led4<='0';
            led5<='0';
            led6<='0';
            led7<='0';
            led8<='0';
            count1<='0';
            count2<='0';
        WHEN L4 =>
            led1<='0';
            led2<='0';
            led3<='0';
            led4<='1';
            led5<='0';
            led6<='0';
            led7<='0';
            led8<='0';
            count1<='0';
            count2<='0';
        WHEN L5 =>
            led1<='0';
            led2<='0';
            led3<='0';
            led4<='0';
            led5<='1';
            led6<='0';
            led7<='0';
            led8<='0';
            count1<='0';
            count2<='0';
        WHEN L6 =>
            led1<='0';
            led2<='0';
            led3<='0';
            led4<='0';
            led5<='0';
            led6<='1';
            led7<='0';
            led8<='0';
            count1<='0';
            count2<='0';
        WHEN L7 =>
            led1<='0';
            led2<='0';
            led3<='0';
            led4<='0';
            led5<='0';
            led6<='0';
            led7<='1';
            led8<='0';
            count1<='0';
            count2<='0';
        WHEN L8 =>
            led1<='0';
            led2<='0';
            led3<='0';
            led4<='0';
            led5<='0';
            led6<='0';
            led7<='0';
            led8<='1';
            count1<='0';
            count2<='0';
        END CASE;
    END PROCESS;
END behavioral;

Senin, 01 November 2010

011110

Angka yang sangat cantik bukan? itu biner! tanggal biner -- 011110 just convert it to decimal then it'll be 30. Ini sesuai dengan jumlah hari di bulan 11. Get amazed? *random dan ga penting*

Cuma cuplikan singkat tentang biner. Hampir di semua mata kuliah yang gue dapet, gue selalu ketemu sama bilangan biner: 1 dan 0. Tidak hanya direpresentasikan dengan angka, tapi bisa juga dengan T (true) atau F (false), atau bahkan kata YA atau TIDAK.

Entah mengapa, akhir-akhir ini -atau dari dulu?- gue lebih sering  memakai logika dibandingkan hati. Entah karena pola pikir yang digodok sedemikian rupa saat kuliah, dimana kita harus selalu bermain dengan logika dan kebenaran. Gue semakin ga ngerasa punya hati. Sampai-sampai semakin lama gue selalu melakukan suatu tindakan atau memutuskan suatu hal hanya berdasarkan pada logika. *gue parah banget*

Gue cuma ga tau, gue itu siapa? Gue itu sekarang gimana? Dulu gue gimana? Apakah gue berubah? Kalau iya, apakah ke arah yang lebih baik? Argh! gue lagi galau banget hari ini, entah kenapa?
My feeling is sooo random!