labdasar.ee.itb.ac.idlabdasar.ee.itb.ac.id/lab/el2102 - sistem digital/2012... · web viewpada...
Post on 12-Jan-2020
15 Views
Preview:
TRANSCRIPT
Hal
aman
1
PERCOBAAN VI : Proyek Perancangan Rangkaian Digital (LED Ping-Pong)
Praktikan: Martha Monica (13510080) Tahta Adiguna (18111007)
Asisten: Nopiga Pahala (13209035)Waktu Percobaan: 3 Desember 2012
EL2195-Sistem DigitalLaboratorium Dasar Teknik Elektro
Sekolah Teknik Elektro dan Informatika – ITB
Abstrak
Pada percobaan ini akan dilakukan desain rangkaian digital. Kelompok kami memilih LED Ping-Pong . Perancangan ini dimulai dengan menganalisa kasus dan membagi kasus tersebut ke dalam subkasus-subkasus. Kemudaian dilakukan analisa lagi untuk tiap subkasus untuk dirancang desain penyelesiaan subkasus tersebut. Subkasus-subkasus tersebut kemudian diintegrasi menjadi suatu kesatuan rangkaian. Rangkaian LED Ping-pong ini menggunakan 3 buah push button sebagai input serta 10 buah LED yang merepresentasikan posisi bola serta keadaan pukulan bola dari tiap pemain,dan 2 buah 7 segment yang merepresentasikan score untuk kedua pemain serta menampilkan nilainya ke layar LCD.
Kata kunci : push button, LED Ping-pong, seven segment,LCD
1. Pendahuluan Pada praktikum ini, dilakukan praktikum mandiri untuk mendesain sebuah rangkaian digital. Untuk proyek perancangan ini, kelompok kami memilih LED Ping-pong. Perancangan proyek dilakukan dengan menggabungkan materi-materi yang telah diperoleh dari semua modul percobaan yang telah dilakukan sebelumnya. Proyek ini merepresentasikan prinsip kerja dari permainan ping-pong, dan mengimplementasikannya ke board FPGA dan layar LCD.2. Dasar Teori Rangkaian LED ping-pong merupakan simulasi dari permainan ping-pong yang sangat sederhana dengan mengasumsikan nyala lampu LED sebagai gerakan bola.Rangkaian LED ping-pong menggunakan blok rangkaian CLOCKDIV, BCD counter dan BCD to 7 segment di dalamnya. Rangkaian CLOCKDIV dipakai untuk memperlambat sinyal clock internal board FPGA agar pergerakan nyala LED dapat diamati oleh mata. Sedangkan rangkaian BCD counter digunakan untuk menghitung score kedua pemain yang kemudian
diimplementasikan ke board FPGA dengan menggunakan rangkaian BCD to 7 segment dan layar LCD.
3. MetodologiPeralatan yang Digunakan
- Komputer / PC yang terlah terinstal Quartus II 9.0
- Board FPGA tipe DE1- Layar LCD
- Catu daya+ kabel dan konektor tambahan
- Kabel downloader ‘ByteBlaster II’Prosedur Praktikum
1. Analisa kasus2. Bagi kasus menjadi beberapa subkasus3. Mendesain rangkaian dengan VHDL4. Simulasikan secara fungsional5. Lakukan pin assignment sesuai board
FPGA yang digunakan6. Implementasikan desain kedalam board
FPGA7. Lakukan debugging jika ada kesalahan8. Catat hasil percobaan9. Analisa hasil percobaan
4. Hasil dan Analisis
a. Spesifikasi Desain
Rangkaian LED Ping-Pong yang didesain merupakan simulasi dari permainan bola ping-pong. Dalam rangkaian yang dibuat ini, ditinjau enam keadaan dasar, yaitu reset, serve, hit, lolos, score, win. Adapun spesifikasi input-output dari sistem adalah sebagai berikut.
Input : 3 buah push button yang menunjukkan reset (mengembalikan permainan pada posisi awal) , pemain pertama memukul dan pemain kedua memukul
Hal
aman
2
Output :Tampilan di LCD yang merepresentasikan 10 buah LED, satu buah menunjukkan pemain pertama sedang memukul, delapan buah merepresentasikan posisi bola, dan yang terakhir menunjukkan pemain kedua sedang memukul serta dua buah tampilan 7 segment yang menunjukkan nilai dari kedua pemain.
Batasan-batasan permainan ini secara khusus adalah ketika pemain sedang dalam posisi menerima pukulan, maka pemain tersebut hanya bisa membalas serangan ketika bola telah mencapai posisi terakhir. Apabila sebelum bola tiba di posisi terakhir, pemain tersebut telah menekan membalas pukulan, maka pemain lawan akan mendapatkan score tambahan.
Hal
aman
3
b. Diagram ASM
Hal
aman
4
c. Desain Rangkaian
Pada dasarnya, desain yang dibuat kelompok kami dibagi menjadi beberapa blok tersendiri. Sebelum memasuki permainan,sinyal dari clock masih terlalu cepat frekuensinya sehingga perubahan dari tampilan pada layar LCD tidak bisa diamati dengan mata sehingga digunakan rangkaian CLOCKDIV. Pada rangkaian CLOCKDIV, sinyal dari clock akan diperlambat dengan menggunakan rangkaian clock div supaya perubahan tampilan pada layar LCD dapat diamati oleh mata.
Rangkaian ini diimplementasikan sebagai berikut-- Clock divider-- Digunakan untuk memperlambat frekuensi clock-- agar tampilan dapat diamati
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CLOCKDIV IS PORT ( CLK : IN STD_LOGIC; DIVOUT : BUFFER STD_LOGIC );END CLOCKDIV;
ARCHITECTURE behavioral OF CLOCKDIV ISBEGIN PROCESS (CLK) VARIABLE count : INTEGER := 0; -- Dengan div = 50E6, frekuensi aktual yang digunakan adalah 10 Hz. CONSTANT div : INTEGER := 5000000; BEGIN IF CLK'EVENT AND CLK='1' THEN IF(count < div) THEN count := count + 1; IF(DIVOUT='0') THEN DIVOUT <= '0'; ELSIF(DIVOUT='1') THEN DIVOUT <= '1'; END IF; ELSE IF(DIVOUT = '0') THEN DIVOUT <= '1'; ELSIF(DIVOUT = '1') THEN DIVOUT <= '0'; END IF; count := 0; END IF; END IF; END PROCESS;END behavioral;
Dari kode di atas, dapat kita perhatikan bahwa, kerja dari rangkaian di atas adalah memperlambat clock input sebesar 5000000 kali.
Desain dari permainan ping-pong ini dibagi menjadi enam keadaan dasar, yaitu reset, serve, hit, lolos, score, dan menang.
Adapun penjelasan dari masing-masing kasus sebagai berikut.
ResetPada saat keadaan tombol reset ditekan score untuk pemain pertama akan menjadi
0, score untuk pemain kedua akan menjadi 0, dan state selanjutnya adalah serve untuk pemain pertama. Keadaan serve baru bisa dimasuki apabila tombol reset dilepas. Posisi bola pada saat tombol reset ditekan dapat ditunjukkan sebagai berikut
ServePada saat pemain pertama melakukan serve (push button 1 ditekan), maka akan terjadi perubahan warna dari merah menjadi hijau pada tampilan layar LCD bergantian dari kiri ke kanan yang merepresentasikan pergerakan dari bola pingpong. Pergerakan posisi bola datapa ditunjukkan sebagai berikut
Ketika pemain kedua yang melakukan serve,maka tampilan pada layar LCD akan menyala bergantian dari kanan ke kiri. Pergerakan bola dapat ditunjukkan sebagai berikut
Ketika bola berada pada posisi terakhir, maka akan memasuki keadaan hit.
Hit
Hal
aman
5
Pada saat hit, maka terdapat dua keadaan, yaitu pemain memukul bola (push button ditekan) atau lolos (bola tidak dipukul balik). Apabila pemain berhasil memukul bola (ditandai dengan perubahan warna menjadi warna hijau pada layar LCD untuk pemain tersebut) maka bola akan dibalikkan ke pemain lawan(pergerakan bola sama seperti ketika pemain pertama melakukan serve). Jika bola lolos, maka akan memasuki state score.
ScorePada saat bola lolos dari pemain pertama maka score untuk pemain kedua akan bertambah, sedangkan apabila bola lolos dari pemain kedua maka score untuk pemain pertama akan bertambah. Selain itu, apabila seorang pemain berada pada keadaan diserang terlebih dahulu memukul bola sebelum posisi bola mencapai posisi terakhir bola , maka score dari pemain lawan akan bertambah. Apabila saat memasuki state score, score dari pemain yang akan ditambah telah mencapai nilai 9, maka akan memasuki state win, jika belum mencapai nilai 9, maka akan pindah ke state lolos.
Lolos Pada saat memasuki state lolos maka akan ada penanda berupa perubahan warna yang menandakan bahwa pemain tersebut kebobolan. Pola perubahan warna yang terjadi itu akan terus berulang hingga pemain yang kebobolan melakukan serve (push button ditekan).Apabila pemain pertama mengalami kebobolan, maka perubahan warna digambarkan sebagai berikut
Sebaliknya, apabila pemain kedua yang mengalami kebobolan, maka perubahan warna digambarkan sebagai berikut
WinPada saat memasuki state win maka akan ada penanda berupa pola perubahan warna pada tampilan LCD yang menandakan bahwa pemain tersebut menang. Pola itu akan terus berulang hingga pemain yang kebobolan melakukan reset (push button ditekan).
Apabila pemain pertama menang, maka pola perubahan warna dapat digambarkan sebagai berikut
Sebaliknya, apabila pemain kedua menang, maka pola perubahan warna digambarkan sebagai berikut
Pada rangkaian ini juga digunakan komponen BCD to 7 segment untuk menampilkan skor dari kedua pemain yang dihubungkan dengan tampilan pada layar LCD.
Kode VHDL untuk komponen BCD to 7 segment adalah sebagai berikutENTITY bcd_7seg ISPORT(D0,D1,D2,D3: IN BIT; A,B,C,D,E,F,G: OUT BIT);END bcd_7seg;
ARCHITECTURE behavioral OF bcd_7seg ISBEGIN A <= NOT(D3 OR D1 OR (D2 XNOR D0)); B <= NOT((NOT D2) OR (D1 XNOR D0)); C <= NOT(D2 OR (NOT D1) OR D0); D <= NOT(D3 OR (D1 AND (NOT (D0 AND D2))) OR (NOT (D2 OR D0)) OR (D2 AND (NOT D1) AND D0)); E <= NOT((NOT D0) AND (D1 OR (NOT D2))); F <= NOT(D3 OR (NOT (D1 OR D0)) OR (D2 AND (NOT (D1 AND D0)))); G <= NOT(D3 OR (D2 XNOR (NOT D1)) OR (D1 AND (NOT D0)));
Hal
aman
6
END behavioral;
Komponen di atas merupakan rangkaian yang merupakan kombinasi-kombinasi input untuk mengatur keluaran dari input tersebut pada 7 segment dengan posisi sesuai gambar berikut
Pada saat terjadi perubahan nilai yang tersimpan pada BCD, pada saat yang bersamaan yang bersamaan, nilai tersebut juga akan muncul pada layar LCD sesuai dengan nilai yang muncul pada 7 segment dengan tampilan sebagai berikut
Perbedaan dari percobaan minggu sebelumnya, pada percobaan sebelumnya, tampilan yang dimunculkan pada layar LCD hanyalah skor pemain, sedangkan permainan ping-pong nya sendiri masih diimplementasikan pada lampu LED. Pada percobaan kali ini, tampilan yang sebelumnya diimplementasikan pada lampu LED, diimplementasikan pada layar LCD.
Hal
aman
7
Berdasarkan penjelasan diatas, maka desain VHDL dirancang sebagai berikuta. color_rom_vhdLIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY color_rom_vhd IS PORT( i_a1, i_b1 : IN STD_LOGIC; i_c1 : IN STD_LOGIC; i_d1 : IN STD_LOGIC; i_e1 : IN STD_LOGIC; i_f1 : IN STD_LOGIC; i_g1 : IN STD_LOGIC; i_a2 : IN STD_LOGIC; i_b2 : IN STD_LOGIC; i_c2 : IN STD_LOGIC; i_d2 : IN STD_LOGIC; i_e2 : IN STD_LOGIC; i_f2 : IN STD_LOGIC; i_g2 : IN STD_LOGIC; i_bo1 : IN STD_LOGIC; i_bo2 : IN STD_LOGIC; i_bo3 : IN STD_LOGIC; i_bo4 : IN STD_LOGIC; i_bo5 : IN STD_LOGIC; i_bo6 : IN STD_LOGIC; i_bo7 : IN STD_LOGIC; i_bo8 : IN STD_LOGIC; i_p1 : IN STD_LOGIC; i_p2 : IN STD_LOGIC; i_c : IN STD_LOGIC; i_pixel_column : IN STD_LOGIC_VECTOR( 9 DOWNTO 0 ); i_pixel_row : IN STD_LOGIC_VECTOR( 9 DOWNTO 0 ); o_red : OUT STD_LOGIC_VECTOR( 5 DOWNTO 0 ); o_green : OUT STD_LOGIC_VECTOR( 5 DOWNTO 0 ); o_blue : OUT STD_LOGIC_VECTOR( 5 DOWNTO 0 ));END color_rom_vhd;
ARCHITECTURE behavioral OF color_rom_vhd IS
-- 7 segment yang merepresentasikan score pemain pertama
CONSTANT a1_kiri : INTEGER := 156;CONSTANT a1_kanan : INTEGER := 228;CONSTANT a1_atas : INTEGER := 120;CONSTANT a1_bawah : INTEGER := 149;
CONSTANT b1_kiri : INTEGER := 229;CONSTANT b1_kanan : INTEGER := 258;CONSTANT b1_atas : INTEGER := 150;CONSTANT b1_bawah : INTEGER := 222;
CONSTANT c1_kiri : INTEGER := 229;CONSTANT c1_kanan : INTEGER := 258;CONSTANT c1_atas : INTEGER := 256;CONSTANT c1_bawah : INTEGER := 328;
CONSTANT d1_kiri : INTEGER := 156;CONSTANT d1_kanan : INTEGER := 228;CONSTANT d1_atas : INTEGER := 329;CONSTANT d1_bawah : INTEGER := 358;
CONSTANT e1_kiri : INTEGER := 126;CONSTANT e1_kanan : INTEGER := 155;CONSTANT e1_atas : INTEGER := 256;CONSTANT e1_bawah : INTEGER := 328;
CONSTANT f1_kiri : INTEGER := 126;CONSTANT f1_kanan : INTEGER := 155;CONSTANT f1_atas : INTEGER := 150;
Hal
aman
8
CONSTANT f1_bawah : INTEGER := 222;
CONSTANT g1_kiri : INTEGER := 156;CONSTANT g1_kanan : INTEGER := 228;CONSTANT g1_atas : INTEGER := 223;CONSTANT g1_bawah : INTEGER := 255;
-- 7 segment yang merepresentasikan score pemain kedua
CONSTANT a2_kiri : INTEGER := 428;CONSTANT a2_kanan : INTEGER := 500;CONSTANT a2_atas : INTEGER := 120;CONSTANT a2_bawah : INTEGER := 149;
CONSTANT b2_kiri : INTEGER := 501;CONSTANT b2_kanan : INTEGER := 530;CONSTANT b2_atas : INTEGER := 150;CONSTANT b2_bawah : INTEGER := 222;
CONSTANT c2_kiri : INTEGER := 501;CONSTANT c2_kanan : INTEGER := 530;CONSTANT c2_atas : INTEGER := 256;CONSTANT c2_bawah : INTEGER := 328;
CONSTANT d2_kiri : INTEGER := 428;CONSTANT d2_kanan : INTEGER := 500;CONSTANT d2_atas : INTEGER := 329;CONSTANT d2_bawah : INTEGER := 358;
CONSTANT e2_kiri : INTEGER := 398;CONSTANT e2_kanan : INTEGER := 427;CONSTANT e2_atas : INTEGER := 256;CONSTANT e2_bawah : INTEGER := 328;
CONSTANT f2_kiri : INTEGER := 398;CONSTANT f2_kanan : INTEGER := 427;CONSTANT f2_atas : INTEGER := 150;CONSTANT f2_bawah : INTEGER := 222;
CONSTANT g2_kiri : INTEGER := 428;CONSTANT g2_kanan : INTEGER := 500;CONSTANT g2_atas : INTEGER := 223;CONSTANT g2_bawah : INTEGER := 255;
-- tanda titik dua di tampilan score
CONSTANT titik1_kiri : INTEGER := 309;CONSTANT titik1_kanan : INTEGER := 348;CONSTANT titik1_atas : INTEGER := 179;CONSTANT titik1_bawah : INTEGER := 218;
CONSTANT titik2_kiri : INTEGER := 309;CONSTANT titik2_kanan : INTEGER := 348;CONSTANT titik2_atas : INTEGER := 259;CONSTANT titik2_bawah : INTEGER := 298;
-- untuk tampilan LED di layar
CONSTANT bo1_kiri : INTEGER := 120;CONSTANT bo1_kanan : INTEGER := 169;CONSTANT bo1_atas : INTEGER := 400;CONSTANT bo1_bawah : INTEGER := 449;
CONSTANT bo2_kiri : INTEGER := 170;CONSTANT bo2_kanan : INTEGER := 219;CONSTANT bo2_atas : INTEGER := 400;CONSTANT bo2_bawah : INTEGER := 449;
CONSTANT bo3_kiri : INTEGER := 220;CONSTANT bo3_kanan : INTEGER := 269;CONSTANT bo3_atas : INTEGER := 400;CONSTANT bo3_bawah : INTEGER := 449;
CONSTANT bo4_kiri : INTEGER := 270;CONSTANT bo4_kanan : INTEGER := 319;CONSTANT bo4_atas : INTEGER := 400;CONSTANT bo4_bawah : INTEGER := 449;
CONSTANT bo5_kiri : INTEGER := 320;CONSTANT bo5_kanan : INTEGER := 369;CONSTANT bo5_atas : INTEGER := 400;
Hal
aman
9
CONSTANT bo5_bawah : INTEGER := 449;
CONSTANT bo6_kiri : INTEGER := 370;CONSTANT bo6_kanan : INTEGER := 419;CONSTANT bo6_atas : INTEGER := 400;CONSTANT bo6_bawah : INTEGER := 449;
CONSTANT bo7_kiri : INTEGER := 420;CONSTANT bo7_kanan : INTEGER := 469;CONSTANT bo7_atas : INTEGER := 400;CONSTANT bo7_bawah : INTEGER := 449;
CONSTANT bo8_kiri : INTEGER := 470;CONSTANT bo8_kanan : INTEGER := 519;CONSTANT bo8_atas : INTEGER := 400;CONSTANT bo8_bawah : INTEGER := 449;
-- penanda player memukul
CONSTANT p1_kiri : INTEGER := 70;CONSTANT p1_kanan : INTEGER := 119;CONSTANT p1_atas : INTEGER := 400;CONSTANT p1_bawah : INTEGER := 449;
CONSTANT p2_kiri : INTEGER := 520;CONSTANT p2_kanan : INTEGER := 569;CONSTANT p2_atas : INTEGER := 400;CONSTANT p2_bawah : INTEGER := 449;
SIGNAL B : INTEGER;
BEGIN
PROCESS(i_pixel_row,i_pixel_column,i_a1,i_b1,i_c1,i_d1,i_e1,i_f1,i_g1,i_a2,i_b2,i_c2,i_d2,i_e2,i_f2,i_g2,i_bo1,i_bo2,i_bo3,i_bo4,i_bo5,i_bo6,i_bo7,i_bo8,i_p1,i_p2)BEGIN-- bagian untuk menandai 7 segment yang menyala IF ((((i_pixel_row >= a1_atas) AND (i_pixel_row < a1_bawah) ) AND ((i_pixel_column >= a1_kiri) AND (i_pixel_column < a1_kanan)) AND (i_a1='0')) OR (((i_pixel_row >= b1_atas) AND (i_pixel_row < b1_bawah) ) AND ((i_pixel_column >= b1_kiri) AND (i_pixel_column < b1_kanan)) AND (i_b1='0')) OR (((i_pixel_row >= c1_atas) AND (i_pixel_row < c1_bawah) ) AND ((i_pixel_column >= c1_kiri) AND (i_pixel_column < c1_kanan)) AND (i_c1='0')) OR (((i_pixel_row >= d1_atas) AND (i_pixel_row < d1_bawah) ) AND ((i_pixel_column >= d1_kiri) AND (i_pixel_column < d1_kanan)) AND (i_d1='0')) OR (((i_pixel_row >= e1_atas) AND (i_pixel_row < e1_bawah) ) AND ((i_pixel_column >= e1_kiri) AND (i_pixel_column < e1_kanan)) AND (i_e1='0')) OR (((i_pixel_row >= f1_atas) AND (i_pixel_row < f1_bawah) ) AND ((i_pixel_column >= f1_kiri) AND (i_pixel_column < f1_kanan)) AND (i_f1='0')) OR (((i_pixel_row >= g1_atas) AND (i_pixel_row < g1_bawah) ) AND ((i_pixel_column >= g1_kiri) AND (i_pixel_column < g1_kanan)) AND (i_g1='0')) OR (((i_pixel_row >= a2_atas) AND (i_pixel_row < a2_bawah) ) AND ((i_pixel_column >= a2_kiri) AND (i_pixel_column < a2_kanan)) AND (i_a2='0')) OR (((i_pixel_row >= b2_atas) AND (i_pixel_row < b2_bawah) ) AND ((i_pixel_column >= b2_kiri) AND (i_pixel_column < b2_kanan)) AND (i_b2='0')) OR (((i_pixel_row >= c2_atas) AND (i_pixel_row < c2_bawah) ) AND ((i_pixel_column >= c2_kiri) AND (i_pixel_column < c2_kanan)) AND (i_c2='0')) OR (((i_pixel_row >= d2_atas) AND (i_pixel_row < d2_bawah) ) AND ((i_pixel_column >= d2_kiri) AND (i_pixel_column < d2_kanan)) AND (i_d2='0')) OR (((i_pixel_row >= e2_atas) AND (i_pixel_row < e2_bawah) ) AND ((i_pixel_column >= e2_kiri) AND (i_pixel_column < e2_kanan)) AND (i_e2='0')) OR (((i_pixel_row >= f2_atas) AND (i_pixel_row < f2_bawah) ) AND ((i_pixel_column >= f2_kiri) AND (i_pixel_column < f2_kanan)) AND (i_f2='0')) OR (((i_pixel_row >= g2_atas) AND (i_pixel_row < g2_bawah) ) AND ((i_pixel_column >= g2_kiri) AND (i_pixel_column < g2_kanan)) AND (i_g2='0')) OR (((i_pixel_row >= titik1_atas) AND (i_pixel_row < titik1_bawah) ) AND ((i_pixel_column >= titik1_kiri) AND (i_pixel_column < titik1_kanan))) OR (((i_pixel_row >= titik2_atas) AND (i_pixel_row < titik2_bawah) ) AND ((i_pixel_column >= titik2_kiri) AND (i_pixel_column < titik2_kanan)))) THEN B <= 1; ELSIF ((((i_pixel_row >= bo1_atas) AND (i_pixel_row < bo1_bawah) ) AND ((i_pixel_column >= bo1_kiri) AND (i_pixel_column < bo1_kanan)) AND (i_bo1='1')) OR (((i_pixel_row >= bo2_atas) AND (i_pixel_row < bo2_bawah) ) AND ((i_pixel_column >= bo2_kiri) AND (i_pixel_column < bo2_kanan)) AND (i_bo2='1')) OR (((i_pixel_row >= bo3_atas) AND (i_pixel_row < bo3_bawah) ) AND ((i_pixel_column >= bo3_kiri) AND (i_pixel_column < bo3_kanan)) AND (i_bo3='1')) OR (((i_pixel_row >= bo4_atas) AND (i_pixel_row < bo4_bawah) ) AND ((i_pixel_column >= bo4_kiri) AND (i_pixel_column < bo4_kanan)) AND (i_bo4='1')) OR
Hal
aman
10
(((i_pixel_row >= bo5_atas) AND (i_pixel_row < bo5_bawah) ) AND ((i_pixel_column >= bo5_kiri) AND (i_pixel_column < bo5_kanan)) AND (i_bo5='1')) OR (((i_pixel_row >= bo6_atas) AND (i_pixel_row < bo6_bawah) ) AND ((i_pixel_column >= bo6_kiri) AND (i_pixel_column < bo6_kanan)) AND (i_bo6='1')) OR (((i_pixel_row >= bo7_atas) AND (i_pixel_row < bo7_bawah) ) AND ((i_pixel_column >= bo7_kiri) AND (i_pixel_column < bo7_kanan)) AND (i_bo7='1')) OR (((i_pixel_row >= bo8_atas) AND (i_pixel_row < bo8_bawah) ) AND ((i_pixel_column >= bo8_kiri) AND (i_pixel_column < bo8_kanan)) AND (i_bo8='1'))) THEN B <= 2; -- menandai bola yang tidak menyala ELSIF ((((i_pixel_row >= bo1_atas) AND (i_pixel_row < bo1_bawah) ) AND ((i_pixel_column >= bo1_kiri) AND (i_pixel_column < bo1_kanan)) AND (i_bo1='0')) OR (((i_pixel_row >= bo2_atas) AND (i_pixel_row < bo2_bawah) ) AND ((i_pixel_column >= bo2_kiri) AND (i_pixel_column < bo2_kanan)) AND (i_bo2='0')) OR (((i_pixel_row >= bo3_atas) AND (i_pixel_row < bo3_bawah) ) AND ((i_pixel_column >= bo3_kiri) AND (i_pixel_column < bo3_kanan)) AND (i_bo3='0')) OR (((i_pixel_row >= bo4_atas) AND (i_pixel_row < bo4_bawah) ) AND ((i_pixel_column >= bo4_kiri) AND (i_pixel_column < bo4_kanan)) AND (i_bo4='0')) OR (((i_pixel_row >= bo5_atas) AND (i_pixel_row < bo5_bawah) ) AND ((i_pixel_column >= bo5_kiri) AND (i_pixel_column < bo5_kanan)) AND (i_bo5='0')) OR (((i_pixel_row >= bo6_atas) AND (i_pixel_row < bo6_bawah) ) AND ((i_pixel_column >= bo6_kiri) AND (i_pixel_column < bo6_kanan)) AND (i_bo6='0')) OR (((i_pixel_row >= bo7_atas) AND (i_pixel_row < bo7_bawah) ) AND ((i_pixel_column >= bo7_kiri) AND (i_pixel_column < bo7_kanan)) AND (i_bo7='0')) OR (((i_pixel_row >= bo8_atas) AND (i_pixel_row < bo8_bawah) ) AND ((i_pixel_column >= bo8_kiri) AND (i_pixel_column < bo8_kanan)) AND (i_bo8='0'))) THEN B<= 3; -- menandai bola yang menyala ELSIF ((((i_pixel_row >= p1_atas) AND (i_pixel_row < p1_bawah) ) AND ((i_pixel_column >= p1_kiri) AND (i_pixel_column < p1_kanan)) AND (i_p1='1')) OR (((i_pixel_row >= p2_atas) AND (i_pixel_row < p2_bawah) ) AND ((i_pixel_column >= p2_kiri) AND (i_pixel_column < p2_kanan)) AND (i_p2='1'))) THEN B<= 4; -- penanda kalau player memukul bola ELSIF ((((i_pixel_row >= p1_atas) AND (i_pixel_row < p1_bawah) ) AND ((i_pixel_column >= p1_kiri) AND (i_pixel_column < p1_kanan)) AND (i_p1='0')) OR (((i_pixel_row >= p2_atas) AND (i_pixel_row < p2_bawah) ) AND ((i_pixel_column >= p2_kiri) AND (i_pixel_column < p2_kanan)) AND (i_p2='0'))) THEN B<= 5; -- penanda kalau player tidak memukul bola ELSE B <= 0; END IF; IF (B = 1) THEN o_red <= "000000"; o_green <= "000000"; o_blue <= "111111"; ELSIF (B = 2) THEN o_red <= "111111"; o_green <= "000000"; o_blue <= "000000"; ELSIF (B = 3) THEN o_red <= "000000"; o_green <= "111111"; o_blue <= "000000"; ELSIF (B = 4) THEN o_red <= "000000"; o_green <= "111111"; o_blue <= "111111"; ELSIF (B = 5) THEN o_red <= "111111"; o_green <= "111111"; o_blue <= "000000"; ELSE o_red <= "000000"; o_green <= "000000"; o_blue <= "000000"; END IF;
END PROCESS;
END behavioral;
b. pingpongLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY PINGPONG IS PORT ( reset,clock : IN STD_LOGIC; p1_push,p2_push : IN STD_LOGIC; out1,out2,out3,out4,out5,out6,out7,out8 : OUT STD_LOGIC; hit1,hit2 : OUT STD_LOGIC; a1,b1,c1,d1,e1,f1,g1 : OUT STD_LOGIC; a2,b2,c2,d2,e2,f2,g2 : OUT STD_LOGIC);END PINGPONG;
ARCHITECTURE behavioral OF PINGPONG IS
COMPONENT bcd_7seg IS PORT ( d0, d1, d2, d3 : STD_LOGIC; a, b, c, d, e, f, g : OUT STD_LOGIC); END COMPONENT; COMPONENT CLOCKDIV IS PORT ( CLK : IN STD_LOGIC;
Deklarasi input dan output yang digunakan
Deklarasi komponen bcd_7seg
Deklarasi komponen CLOCKDIV
Pendefinisian warna yang digunakan
Hal
aman
11
DIVOUT : BUFFER STD_LOGIC ); END COMPONENT;
TYPE game_state IS (lr1, lr2, lr3, lr4, lr5, lr6, lr7,lr8, rl1, rl2, rl3, rl4, rl5, rl6, rl7,rl8, p1_hit, p2_hit, p1_serve, p2_serve, p1_score, p2_score, p1_win, p2_win, lolos11,lolos12,lolos13,lolos21,lolos22,lolos23, cele11,cele12,cele21,cele22 );
SIGNAL current_state : game_state; SIGNAL BCD_scorep1 : STD_LOGIC_VECTOR(3 downto 0); SIGNAL BCD_scorep2 : STD_LOGIC_VECTOR(3 downto 0); SIGNAL ballpos : STD_LOGIC_VECTOR(7 downto 0); SIGNAL serve1,serve2 : STD_LOGIC; SIGNAL clkout : STD_LOGIC;
BEGIN serve1 <= NOT(p1_push); serve2 <= NOT(p2_push);
melambat : CLOCKDIV PORT MAP ( CLK => clock, DIVOUT => clkout);
PROCESS (clkout, RESET, BCD_scorep1, BCD_scorep2, serve1, serve2) BEGIN IF RESET = '0' THEN ballpos <= "10000000"; BCD_scorep1 <= "0000"; BCD_scorep2 <= "0000"; current_state <= p1_serve; ELSIF (clkout'EVENT AND clkout = '1') THEN hit1 <= serve1; hit2 <= serve2;
CASE current_state IS WHEN p1_serve => hit1<= '1'; IF serve1 = '1' THEN current_state <= lr1; END IF; WHEN p2_serve => hit2 <= '1'; IF serve2 = '1' THEN current_state <= rl1; END IF;
WHEN p1_hit =>
IF serve1 = '1' THEN IF serve2='1' THEN current_state <= p1_score; ELSE current_state <= lr1; END IF; ELSE current_state <= p2_score; END IF; WHEN p2_hit => IF serve2 = '1' THEN IF serve1='1' THEN current_state <= p2_score; ELSE current_state <= rl1; END IF; ELSE current_state <= p1_score; END IF;
Deklarasi komponen bcd_7seg
Deklarasi komponen CLOCKDIV
Deklarasi komponen bcd_7seg
Deklarasi komponen CLOCKDIV
Deklarasi komponen CLOCKDIV
Deklarasi type game_state (state yang ada di dalam
permainan)
Deklarasi sinyal-sinyal yang akan digunakan
Pemetaan komponen CLOCKDIV
Menunjukkan push button ditekan (ditambah NOT karena active low)
Keadaan saat tombol reset
ditekan
Keadaan saat pemain pertama memukul
Keadaan saat pemain kedua memukul
Keadaan saat
pemain pertama
harus memukul
Jika pemain pertama tidak memukul, skor pemain kedua
bertambah
Keadaan saat
pemain kedua harus
memukul Jika pemain kedua tidak memukul, skor pemain pertama
bertambah
Hal
aman
12
WHEN p1_score => ballpos <= "00000000"; BCD_scorep1 <= BCD_scorep1 + 1; IF BCD_scorep1 = "1001" THEN current_state <= p1_win; ELSE current_state <= lolos11; END IF;
WHEN p2_score => ballpos <= "00000000"; BCD_scorep2 <= BCD_scorep2 + 1; IF BCD_scorep2 = "1001" THEN current_state <= p2_win; ELSE current_state <= lolos21; END IF; WHEN p1_win => BCD_scorep1 <= "0000"; BCD_scorep2 <= "0000"; current_state <= cele11; WHEN p2_win => BCD_scorep1 <= "0000"; BCD_scorep2 <= "0000"; current_state <= cele21;
WHEN cele11 => hit1<= '1'; ballpos <= "11110000"; current_state <= cele12; WHEN cele12 => hit1<= '0'; ballpos <= "00000000"; current_state <= cele11; WHEN cele21 => hit2<= '1'; ballpos <= "00001111"; current_state <= cele22; WHEN cele22 => hit2<= '0'; ballpos <= "00000000"; current_state <= cele21; WHEN lolos21 => ballpos <= "00110000"; IF serve1='1' THEN current_state <= p1_serve; ELSE current_state <= lolos22; END IF; WHEN lolos22 => ballpos <= "01100000"; IF serve1='1' THEN current_state <= p1_serve; ELSE current_state <= lolos23; END IF; WHEN lolos23 => ballpos <= "11000000"; IF serve1='1' THEN current_state <= p1_serve; ELSE current_state <= lolos21; END IF; WHEN lolos11 => ballpos <= "00001100"; IF serve2='1' THEN current_state <= p2_serve; ELSE
Keadaan saat pemain
pertama menambah
skor
Jika skor pemain pertama 9 dan pemain pertama mencetak skor maka pemain pertama menang
Keadaan saat
pemain kedua
menambah skor
Jika skor pemain kedua 9 dan pemain kedua mencetak skor maka pemain kedua menang
Keadaan saat pemain pertama
menang
Keadaan saat pemain kedua
menang
Pola nyala LED ketika pemain pertama menang
Pola nyala LED ketika pemain kedua menang
Pola nyala LED ketika pemain
pertama tidak berhasil memukul bola
Pola nyala LED
Hal
aman
13
current_state <= lolos12; END IF; WHEN lolos12 => ballpos <= "00000110"; IF serve2='1' THEN current_state <= p2_serve; ELSE current_state <= lolos13; END IF; WHEN lolos13 => ballpos <= "00000011"; IF serve2='1' THEN current_state <= p2_serve; ELSE current_state <= lolos11; END IF;
WHEN lr1 => IF serve2='1' THEN current_state <= p1_score; ELSE ballpos <= "10000000"; current_state <= lr2; END IF; WHEN lr2 => IF serve2='1' THEN current_state <= p1_score; ELSE ballpos <= "01000000"; current_state <= lr3; END IF; WHEN lr3 => IF serve2='1' THEN current_state <= p1_score; ELSE ballpos <= "00100000"; current_state <= lr4; END IF; WHEN lr4 => IF serve2='1' THEN current_state <= p1_score; ELSE ballpos <= "00010000"; current_state <= lr5; END IF; WHEN lr5 => IF serve2='1' THEN current_state <= p1_score; ELSE ballpos <= "00001000"; current_state <= lr6; END IF; WHEN lr6 => IF serve2='1' THEN current_state <= p1_score; ELSE ballpos <= "00000100"; current_state <= lr7; END IF; WHEN lr7 => IF serve2='1' THEN current_state <= p1_score; ELSE ballpos <= "00000010"; current_state <= lr8; END IF; WHEN lr8 => IF serve2='1' THEN current_state <= p1_score; ELSE ballpos <= "00000001"; current_state <= p2_hit; END IF; WHEN rl1 => IF serve1='1' THEN current_state <= p2_score; ELSE
Pola nyala LED
Pola nyala LED ketika bola
bergerak dari pemain pertama ke
pemain kedua
Pola nyala LED ketika bola
bergerak dari pemain kedua ke pemain perta,a
Hal
aman
14
ballpos <= "00000001"; current_state <= rl2; END IF;
WHEN rl2 => IF serve1='1' THEN current_state <= p2_score; ELSE ballpos <= "00000010"; current_state <= rl3; END IF;
WHEN rl3 => IF serve1='1' THEN current_state <= p2_score; ELSE ballpos <= "00000100"; current_state <= rl4; END IF;
WHEN rl4 => IF serve1='1' THEN current_state <= p2_score; ELSE ballpos <= "00001000"; current_state <= rl5; END IF; WHEN rl5 => IF serve1='1' THEN current_state <= p2_score; ELSE ballpos <= "00010000"; current_state <= rl6; END IF; WHEN rl6 => IF serve1='1' THEN current_state <= p2_score; ELSE ballpos <= "00100000"; current_state <= rl7; END IF; WHEN rl7 => IF serve1='1' THEN current_state <= p2_score; ELSE ballpos <= "01000000"; current_state <= rl8; END IF; WHEN rl8 => IF serve1='1' THEN current_state <= p2_score; ELSE ballpos <= "10000000"; current_state <= p1_hit; END IF; END CASE; END IF; END PROCESS;
out1 <= ballpos(7); out2 <= ballpos(6); out3 <= ballpos(5); out4 <= ballpos(4); out5 <= ballpos(3); out6 <= ballpos(2); out7 <= ballpos(1); out8 <= ballpos(0);
SCORE1 : bcd_7seg PORT MAP (d0 => BCD_scorep1(0), d1 => BCD_scorep1(1), d2 => BCD_scorep1(2), d3 => BCD_scorep1(3), a => a1, b => b1, c => c1, d => d1, e => e1, f => f1, g => g1);
Pola nyala LED ketika bola
bergerak dari pemain kedua ke pemain perta,a
Pemetaan output ke LED
Pemetaan skor pemain pertama
Hal
aman
15
SCORE2 : bcd_7seg PORT MAP (d0 => BCD_scorep2(0), d1 => BCD_scorep2(1), d2 => BCD_scorep2(2), d3 => BCD_scorep2(3), a => a2, b => b2, c => c2, d => d2, e => e2, f => f2, g => g2);END behavioral;
Pemetaan skor pemain kedua
Hal
aman
16
5. Proses Desain- Membuat spesifikasi desain- Membuat rancangan ASM- Membuat implementasi VHDL- Mencoba pada FPGA dan LCD- Debugging dan menambahkan fitur-fitur
tambahan
6. Hasil PercobaanHasil simulasi fungsional dari proyek di atas adalah
Ketika disimulasikan ke board FPGAn LCD , dapat dilihat bahwa ketika reset bernilai 1, maka rangkaian berada pada keadaan awal. Ketika pemain pertama memukul, maka bola akan bergerak dari pemain pertama ke pemain kedua, terlihat apabila bola belum tiba di ujung dan pemain telah memukul, maka akan menambah skor pemain lawannya. Hal ini terlihat dari terbentuknya pola lolos.Apabila bola telah sampai di ujung dan pemain tersebut tidak memukul bolanya, juga terbentuk pola lolos, dan berlaku sebaliknya. Ketika skor salah satu pemain telah mencapai nilai 9 dan pemain tersebut mencetak skor lagi, maka akan terbentuk pola menang seperti yang terlihat dari hasil simulasi. Dengan begitu hasil yang kita peroleh sesuai dengan yang diharapkan.Hasil implementasi ke board FPGA adalah sebagai berikuta. Hasil ketika rangkaian direset
b. Hasil ketika permainan berlangsung
c. Hasil ketika salah satu pemain gagal
memukul bola
d. Hasil ketika salah satu pemain menang
Berdasarkan percobaan yang telah dilakukan dapat dilihat bahwa hasil yang diperoleh sama dengan hasil yang diharapkan.
Pengeerjaan perancangan dan pembuatan proyek ini dilakukan secara bersama-sama / dilakukan secara bersama walaupun tidak berada di tempat yang sama.7. KesimpulanBerdasarkan percobaan yang telah dilakukan sampai saat ini, dapat diperoleh kesimpulan bahwa kita dapat merancang sebuah sistem sederhana. Sistem tersebut terlebih dahulu dirancang FSM dan atau ASM nya, kemudian sistem itu dapat direalisasikan dengan melakukan simulasi
Hal
aman
17
dengan menggunakan pendekatan bahasa VHDL melalui software Altera Quartus di mana rangkaian dapat diimplementasikan dengan menggunakan FPGA. Sistem yang dibangun tersebut kemudian diuji dan dianalisa.Dari hasil pengujian diperoleh hasil sesuai dengan yang diharapkan.
8. Daftar Pustaka
[1] http://labdasar.ee.itb.ac.id/lab/ EL2195/1213/modul6.pdf (diakses 3 Desember 2012)
[2] Mervin T. Hutabarat, dkk, PRAKTIKUM SISTEM DIGITAL, Hal 77-79,Laboratorium Dasar Teknik Elektro ITB,Bandung, 2012
top related