MODUL 6 PROYEK PERANCANGAN RANGKAIAN DIGITAL Iskandar Setiadi (13511073) Asisten: Rizka Widyarini / 13209096 Tanggal Percobaan: 30/11/2012 EL2195-Praktikum Sistem Digital
Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB Abstrak Pada praktikum Sistem Digital, kita telah mempelajari berbagai macam aplikasi rangkaian logika, seperti salah satunya rangkaian sekuensial. Selain itu, kita telah mempelajari integrasi dan implementasi bahasa VHDL dengan FPGA maupun simulasi-simulasi yang menggunakan display LCD. Pada praktikum ini, praktikan merancang sebuah proyek perancangan berupa permainan BricksBreaker sederhana. Simulasi ini terintegrasi dengan modul VGA, sehingga BricksBreaker dapat dimainkan pada display LCD. Kompilasi dilakukan menggunakan ALTERA QUARTUS serta board FPGA DE-1. Kata kunci: Perancangan BricksBreaker, VHDL. 1.
Rangkaian
Digital,
PENDAHULUAN
Setelah melakukan serangkaian percobaan praktikum Sistem Digital, pada kesempatan ini setiap kelompok praktikan diminta untuk merancang sebuah proyek rangkaian digital. Proyek ini bertujuan untuk mempelajari cara mengimplementasikan serta mendesain jalur data dan kendali untuk sistem. Seluruh jalur data tersebut akan dihubungkan menggunakan pemodelan FSM (Finite State Machine) dan menampilkan hasil keluaran pada layar LCD. Selain itu, percobaan ini akan mengintegrasikan berbagai komponen dan interface seperti VGA, koneksi serial, display LCD, dll. Proyek ini bersifat interaktif, artinya pengguna dapat memberikan masukkan kedalam sistem untuk mempengaruhi jalannya sistem yang didesain, dalam hal ini adalah permainan BricksBreaker. Setelah sistem berhasil diimplementasikan, maka kita akan menguji serta menganalisis sistem yang sudah selesai dibangun tersebut.
2.
STUDI PUSTAKA
Dalam perancangan sebuah proyek rangkaian digital, desain dapat dibuat menggunakan berbagai macam struktur formal seperti tabel kebenaran diagram keadaan, FSM, dan metodemetode pemodelan lainnya. Selain itu, desain strategi pengujian yang baik juga perlu dilakukan
untuk menganalisis sistem yang telah dibuat tersebut. Proyek perancangan ini menggunakan berbagai macam komponen yang telah dirancang pada praktikum sebelumnya, seperti Clock untuk mengatur framerate pada display LCD, Counter yang diimplementasikan dalam BCD-to-7-Segment yang berfungsi untuk menampilkan angka pad layar, maupun modul VGA yang berfungsi untuk mengubah sinyal-sinyal menjadi tampilan layar.
2.1
BCD-TO-7-SEGMENT
BCD-to-7-Segment menerima masukkan sebuah bilangan integer yang telah dikonversikan menjadi bilangan biner 4-bit. Komponen ini akan mencetak tampilan angka pada keluaran sinyal 7-bit.. Gambar 2-1 berikut menunjukkan tabel kebenaran dan tampilan yang dihasilkan oleh BCD-to-7Segment, [4]:
Gambar 2-1 BCD-to-7-Segment
2.2
MODUL VGA DRIVER
Modul VGA (Video Graphics Array) yang digunakan kali ini adalah salah satu modul VGA yang pernah diimplementasikan pada percobaan yang lalu. Driver ini berfungsi untuk merepresentasikan masukkan logika FPGA menjadi tampilan warna pada layar display LCD. Modul ini menerima masukkan port yang ingin dinyalakan, dan mengkonversikan masukkan menjadi warna pada layar (RGB).
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
1
3.
METODOLOGI
3.1
USE
ALAT PERCOBAAN
Board FPGA tipe DE1
Catu daya + kabel dan konektor tambahan serta kabel downloader
Monitor LCD
3.2
IEEE.MATH_REAL.ALL;
--Komponen utama bricksbreaker, menerima 4 masukkan dari pengguna, 1 clock, serta mengeluarkan sinyal untuk display LCD ENTITY bricksbreaker
IS
PORT(
PROSEDUR PERCOBAAN
Percobaan ini mengintegrasikan berbagai macam modul yang telah kita pelajari pada praktikumpraktikum sebelumnya. Secara garis besar, proyek ini menggunakan 5 files VHDL, yaitu bricksbreaker.vhd, Bricks_MainGame.vhd, clockdiv.vhd, vga.vhd, dan Bcd_7seg.vhd.
PushKanan : IN STD_LOGIC; -Sebagai tombol arah kanan (RIGHT) PushKiri : IN STD_LOGIC; -Sebagai tombol arah kiri (LEFT) Reset : IN STD_LOGIC; -Sebagai tombol untuk mengulang permainan LevelMode : IN STD_LOGIC; -Untuk mengatur kecepatan bujursangkar ClockSystem : IN STD_LOGIC; -CLOCK AUTOMATIC dari sistem VGA_R : OUT STD_LOGIC_VECTOR( 5 DOWNTO 0 ); VGA_G : OUT STD_LOGIC_VECTOR( 5 DOWNTO 0 ); VGA_B : OUT STD_LOGIC_VECTOR( 5 DOWNTO 0 );
Gambar 3-1 Mock-Up Permainan BricksBreaker
VGA_HS
: OUT STD_LOGIC;
Gambar 3-1 diatas menunjukkan skema kasar dari proyek yang akan dibuat. Proyek ini memiliki 4 buah masukkan, yaitu 3 push_button (arah kiri, arah kanan, reset) serta 1 buah switch (mode mudah / sulit). Secara singkat, pemain dinyatakan menang apabila semua bricks berhasil dihancurkan, sedangkan pemain dinyatakan kalah jika bola (kotak) telah melewati batas atas pantulan papan.
VGA_VS
: OUT STD_LOGIC;
VGA_CLK
: OUT STD_LOGIC;
VGA_BLANK
: OUT STD_LOGIC);
3.3
--Sinyal sinyal untuk proses scanning pixel pada layar
SCRIPT VHDL YANG DIGUNAKAN 1.
BricksBreaker.vhd
Kode ini merupakan top_level_entity dari proyek yang dirancang. Secara garis besar, kode ini bertujuan untuk menghubungkan antar komponen yang digunakan dalam proyek ini dengan input/output yang digunakan (melalui PORT MAP). -- Created by Iskandar Setiadi freedomofkeima and Yusuf Fajar Ardiana LIBRARY
IEEE;
USE
IEEE.STD_LOGIC_1164.ALL;
USE
IEEE.STD_LOGIC_ARITH.ALL;
USE
IEEE.STD_LOGIC_UNSIGNED.ALL;
END bricksbreaker; ARCHITECTURE behavioral OF bricksbreaker IS
SIGNAL red : STD_LOGIC_VECTOR (5 DOWNTO 0); SIGNAL green : STD_LOGIC_VECTOR (5 DOWNTO 0); SIGNAL blue : STD_LOGIC_VECTOR (5 DOWNTO 0); SIGNAL red_color : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL green_color : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL blue_color : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL pixel_row : STD_LOGIC_VECTOR (9 DOWNTO 0);
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
2
SIGNAL pixel_column : STD_LOGIC_VECTOR (9 DOWNTO 0);
i_pixel_row : IN STD_LOGIC_VECTOR( 9 DOWNTO 0 );
SIGNAL red_on STD_LOGIC;
:
o_red : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 );
SIGNAL green_on STD_LOGIC;
:
o_green : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 );
SIGNAL blue_on STD_LOGIC;
:
o_blue : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 )); --Keluaran sebagai sinyal warna RGB END COMPONENT;
--Mengintegrasikan modul vga COMPONENT vga
IS BEGIN
PORT( i_clk
:
IN
STD_LOGIC;
--Melakukan PORT MAP modul vga
i_red
:
IN
STD_LOGIC;
vga_driver0 : vga
i_green
:
IN
STD_LOGIC;
PORT MAP (
i_blue
:
IN
STD_LOGIC;
i_clk
=> ClockSystem,
--Untuk menentukan warna keluaran
i_red
=> '1',
o_red
:
OUT
STD_LOGIC;
i_green
=> '1',
o_green
:
OUT
STD_LOGIC;
i_blue
=> '1',
o_blue
:
OUT
STD_LOGIC;
o_red
=> red_on,
--Untuk sinkronisasi sinyal sync
o_green
=> green_on,
o_horiz_sync
:
OUT
STD_LOGIC;
o_blue
=> blue_on,
o_vert_sync
:
OUT
STD_LOGIC;
o_horiz_sync
=> VGA_HS,
--Untuk menentukan koordinat pixel pada layar LCD
o_vert_sync
=> VGA_VS,
o_pixel_row
=> pixel_row,
o_pixel_row : OUT STD_LOGIC_VECTOR( 9 DOWNTO 0 );
o_pixel_column
=> pixel_column);
o_pixel_column : OUT STD_LOGIC_VECTOR( 9 DOWNTO 0 ));
--Melakukan PORT MAP main game
END COMPONENT;
maingame : Bricks_MainGame PORT MAP ( PushKanan
=> PushKanan,
PORT(
PushKiri
=> PushKiri,
PushKanan : IN STD_LOGIC; -Sebagai tombol arah kanan (RIGHT)
Reset
COMPONENT Bricks_MainGame
IS
PushKiri : IN STD_LOGIC; -Sebagai tombol arah kiri (LEFT) Reset : IN STD_LOGIC; -Sebagai tombol untuk mengulang permainan LevelMode : IN STD_LOGIC; -Untuk mengatur kecepatan bujursangkar ClockSystem : IN STD_LOGIC; -CLOCK AUTOMATIC dari sistem i_pixel_column : IN STD_LOGIC_VECTOR( 9 DOWNTO 0 );
=> Reset,
LevelMode
=> LevelMode,
ClockSystem
=> ClockSystem,
i_pixel_column
=> pixel_column,
i_pixel_row
=> pixel_row,
o_red
=> red_color,
o_green
=> green_color,
o_blue
=> blue_color);
red
<= red_color
(7 DOWNTO 2) ;
green <= green_color(7 DOWNTO 2) ; Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
3
blue
<= blue_color (7 DOWNTO 2) ;
ENTITY Bricks_MainGame
IS
PORT( --Melakukan pemrosesan, menerima masukkan logika sinyal warna dan mengirimkannya ke VGA
PushKanan : IN STD_LOGIC; -Sebagai tombol arah kanan (RIGHT), Tombol ke-1
PROCESS(red_on,green_on,blue_on,red,g reen,blue)
PushKiri : IN STD_LOGIC; -Sebagai tombol arah kiri (LEFT), Tombol ke-2
BEGIN
Reset : IN STD_LOGIC; --Sebagai tombol untuk mengulang permainan, Tombol ke-3
IF (red_on = '1' ) THEN VGA_R <= red; -- Jika merah aktif ELSE
VGA_R <=
"000000";
END IF;
LevelMode : IN STD_LOGIC; -Untuk mengatur kecepatan bujursangkar
-
ClockSystem : IN STD_LOGIC; -CLOCK AUTOMATIC dari sistem
-
IF (green_on = '1' ) THEN VGA_G <= green; -- Jika hijau aktif
i_pixel_column : IN STD_LOGIC_VECTOR( 9 DOWNTO 0 );
ELSE VGA_G <=
i_pixel_row : IN STD_LOGIC_VECTOR( 9 DOWNTO 0 );
"000000";
END IF;
o_red : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 );
IF (blue_on = '1' ) THEN VGA_B <= blue; -- Jika biru aktif ELSE VGA_B <=
-
o_green : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 );
"000000";
o_blue : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 ));
END IF;
--Keluaran sebagai sinyal warna RGB END Bricks_MainGame; END PROCESS; END behavioral; -- All Rights Reserved 2012 2.
ARCHITECTURE behavioral OF Bricks_MainGame IS
Bricks_MainGame.vhd
Kode ini merupakan bagian utama dari permainan. Proses dalam kode ini dihubungkan dengan clockdiv, yang berfungsi untuk mengatur waktu / framerate dari layar. State utama serta pergerakanpergerakan setiap obyek pada layar (pantulan, bola, skor, lampu state, bricks) didefinisikan dalam kode ini.
--Tipe eksekusi FSM TYPE executionStage IS (s1,s2,s3,s4); SIGNAL currentstate, nextstate : executionStage;
-- Created by Iskandar Setiadi freedomofkeima and Yusuf Fajar Ardiana
--Untuk mengatur arah pantulan
LIBRARY
SHARED VARIABLE ROTASIY : INTEGER := -1;
IEEE;
USE
IEEE.STD_LOGIC_1164.ALL;
USE
IEEE.STD_LOGIC_ARITH.ALL;
use
IEEE.NUMERIC_STD.ALL;
USE
IEEE.STD_LOGIC_UNSIGNED.ALL;
USE
IEEE.MATH_REAL.ALL;
SHARED VARIABLE ROTASIX : INTEGER := 1;
CONSTANT TVD : INTEGER := 479; -THD, batas horizontal layar CONSTANT THD : INTEGER := 639; -TVD, batas vertikal layar Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
4
--Batas arah bujur sangkar yang akan digerakkan --Ubah bentuknya menjadi bola // menggunakan persamaan kuadrat x^2 + y^2 SHARED VARIABLE BOLAATAS INTEGER := 340;
:
SHARED VARIABLE BOLAKIRI INTEGER := 295;
:
SHARED VARIABLE BOLAKANAN INTEGER := 344;
:
SHARED VARIABLE BOLABAWAH INTEGER := 389;
:
SHARED VARIABLE Y5 : INTEGER := 450; SHARED VARIABLE Y6 : INTEGER := 455; --Mengatur lampu state menang dan kalah SHARED VARIABLE X5 : INTEGER := 400; SHARED VARIABLE X6 : INTEGER := 500; SHARED VARIABLE X7 : INTEGER := 600; --Variabel state permainan SHARED VARIABLE IsKalah : BOOLEAN := FALSE; SHARED VARIABLE IsMenang: BOOLEAN := FALSE;
--Mengatur posisi papan pemantul SHARED VARIABLE PAPANKIRI INTEGER := 260;
:
SHARED VARIABLE PAPANKANAN INTEGER := 380;
:
--Mengatur kondisi lampu untuk counter
SHARED VARIABLE PAPANATAS INTEGER := 390;
:
SIGNAL IsCounter : STD_LOGIC_VECTOR (6 downto 0) := "0000000";
SHARED VARIABLE PAPANBAWAH INTEGER := 400;
: --Mengatur skor dari permainan SHARED VARIABLE SCORE : INTEGER := 0; SIGNAL BCDPortInput : STD_LOGIC_VECTOR (3 downto 0) := "0000";
--Mengatur posisi bricks (TestBeta) SHARED VARIABLE BRICKONEATAS INTEGER := 150;
:
SHARED VARIABLE BRICKONEKIRI INTEGER := 260;
: --Mengatur kecepatan dari bujur sangkar
SHARED VARIABLE BRICKONEKANAN : INTEGER := 340;
SHARED VARIABLE SPEED INTEGER := 0;
SHARED VARIABLE BRICKONEBAWAH : INTEGER := 180;
:
--Clock sebagai buffer CLOCKDIV SIGNAL clock40hz
--Mengatur posisi Counter dari BCDto-7-Segment, Koordinat X SHARED VARIABLE X1 : INTEGER := 20;
: STD_LOGIC;
--Komponen Clockdiv digunakan agar pergerakan bujur sangkar dapat terlihat oleh pengguna
SHARED VARIABLE X2 : INTEGER := 25; SHARED VARIABLE X3 : INTEGER := 40;
COMPONENT CLOCKDIV IS
SHARED VARIABLE X4 : INTEGER := 45;
port( CLK: IN std_logic; DIVOUT: buffer std_logic);
--Mengatur posisi Counter dari BCDto-7-Segment, Koordinat Y
end component;
SHARED VARIABLE Y1 : INTEGER := 410; SHARED VARIABLE Y2 : INTEGER := 415; SHARED VARIABLE Y3 : INTEGER := 430; SHARED VARIABLE Y4 : INTEGER := 435;
--Komponen BCD to 7 Segment untuk mengkonversikan skor menjadi tampilan COMPONENT Bcd_7seg
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
5
PORT ( D0, D1, D2, D3 STD_LOGIC ; A, B, C, D, E, F, G STD_LOGIC );
: IN
PAPANBAWAH
: OUT
:= 400;
nextstate <= s2;
END COMPONENT; WHEN s2 => IF LevelMode = '1' THEN
BEGIN PROCESS
SPEED := 1; --saat SW[0] = '1' maka mode lambat
BEGIN
ELSE
WAIT UNTIL (clock40hz'EVENT) AND (clock40hz = '1');
SPEED := 2; --saat SW[0] = '0' maka mode cepat
--Melakukan konversi skor menjadi binary 4 bit
END IF;
BCDPortInput <= STD_LOGIC_VECTOR(TO_UNSIGNED(SCORE, 4));
IF BOLAATAS <= 0 THEN ROTASIY := 1; ELSIF BOLABAWAH >= TVD THEN ROTASIY := -1;
--Jika tombol Reset ditekan
ELSE ROTASIY := ROTASIY; --Delete this later
IF (Reset = '0') THEN currentstate <= s1;
END IF;
ELSE currentstate <= nextstate;
IF BOLAKIRI <= 0 THEN ROTASIX := 1;
END IF;
ELSIF BOLAKANAN >= THD THEN ROTASIX := -1;
END PROCESS;
ELSE ROTASIX := ROTASIX; PROCESS(currentstate, i_pixel_row,i_pixel_column, PushKanan, PushKiri, LevelMode)
END IF;
BEGIN
--Kondisi Papan, PAPANATAS = 390
IF (clock40hz'EVENT) AND (clock40hz = '1') THEN
IF (BOLABAWAH >= PAPANATAS) AND (BOLABAWAH <= PAPANBAWAH) THEN
--Mengatur kecepatan bujursangkar sesuai dengan state SW[0]
--Jika sumbu x bola Valid
CASE currentstate IS WHEN s1 =>
IF ((BOLAKANAN >= PAPANKIRI) AND (BOLAKANAN <= PAPANKANAN)) OR ((BOLAKIRI >= PAPANKIRI) AND (BOLAKIRI <= PAPANKANAN)) THEN
--Inisialisasi Variabel
--Inversi arah Y
IsKalah
:= FALSE;
IF ROTASIY = 1 THEN ROTASIY := -1;
BOLAATAS
:= 340;
ELSE ROTASIY := 1;
BOLABAWAH := 389;
END IF;
BOLAKIRI
:= 295;
END IF;
BOLAKANAN := 344;
END IF;
PAPANKIRI
PAPANKANAN := 380;
--Kondisi masih hijau (lampu merah belum menyala)
PAPANATAS
IF BOLABAWAH <= 395 THEN
:= 260; := 390;
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
6
BOLAATAS := BOLAATAS + ROTASIY * SPEED;
PAPANKIRI
BOLABAWAH := BOLABAWAH + ROTASIY * SPEED;
END IF;
:= 0;
PAPANKANAN := 380 - 260; ELSE
BOLAKIRI := BOLAKIRI + ROTASIX * SPEED;
PAPANKIRI := PAPANKIRI; PAPANKANAN := PAPANKANAN;
BOLAKANAN := BOLAKANAN + ROTASIX * SPEED;
END IF;
END IF; --Jika bola melewati batas atas papan --Mengecek apakah Bola mengenai Bricks
IF BOLABAWAH > 395 THEN nextstate <= s3;
--Bagian Atas
ELSE nextstate <= currentstate; END IF;
--Bagian Kiri
WHEN s3 =>
--Bagian Kanan
IsKalah := TRUE; nextstate <= currentstate;
--Bagian Bawah
WHEN s4 =>
--Jika Bola mengenai Bricks, hancurkan Bricks, Tambahkan Skor
IsMenang := TRUE; nextstate <= currentstate;
--Testing Skor
END CASE;
SCORE := SCORE + 1;
END IF;
IF ISCOUNTER = 10 THEN
--Untuk mengatur posisi bola
SCORE := 0;
IF ((i_pixel_row > BOLAATAS) AND (i_pixel_row < BOLABAWAH) AND (i_pixel_column > BOLAKIRI) AND (i_pixel_column < BOLAKANAN)) AND (NOT IsKalah) THEN o_red <= X"FF"; o_green <= X"00"; o_blue <= X"00";
END IF; --Mengatur pergerakan papan IF (PushKanan = '0') AND (PushKiri = '1') THEN -- Arah Kanan PAPANKIRI := PAPANKIRI + 5;
--Untuk mengatur posisi papan
PAPANKANAN := PAPANKANAN + 5;
ELSIF ((i_pixel_row > PAPANATAS) AND (i_pixel_row < PAPANBAWAH) AND (i_pixel_column > PAPANKIRI) AND (i_pixel_column < PAPANKANAN)) THEN o_red <= X"00"; o_green <= X"00"; o_blue <= X"FF";
IF PAPANKIRI >= THD - (380 - 260) THEN --Jika Papan mencapai batas kanan PAPANKIRI
:= THD - (380 - 260);
PAPANKANAN := THD; END IF; ELSIF (PushKanan = '1') AND (PushKiri = '0') THEN -- Arah Kiri PAPANKIRI := PAPANKIRI - 5; PAPANKANAN := PAPANKANAN - 5; IF PAPANKANAN <= (380 - 260) THEN -Jika Papan mencapai batas kiri
ELSIF ((i_pixel_row >= Y1) AND (i_pixel_row <= Y2) AND ( i_pixel_column >= X2) AND (i_pixel_column <= X3) AND (IsCounter(0) = '1')) THEN o_red <= X"FF"; o_green <= X"FF"; o_blue <= X"00"; --Lampu A ELSIF ((i_pixel_row >= Y2) AND (i_pixel_row <= Y3) AND ( i_pixel_column >= X3) AND
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
7
(i_pixel_column <= X4) AND (IsCounter(1) = '1')) THEN o_red <= X"FF"; o_green <= X"FF"; o_blue <= X"00"; --Lampu B
THEN o_red <= X"FF"; o_green <= X"00"; o_blue <= X"00"; --Lampu Kalah ELSIF ((i_pixel_row >= Y3) AND (i_pixel_row <= Y5) AND ( i_pixel_column >= X6) AND (i_pixel_column < X7)) AND (NOT IsKalah) THEN o_red <= X"EE"; o_green <= X"EE"; o_blue <= X"EE"; --Lampu Kalah Mati
ELSIF ((i_pixel_row >= Y4) AND (i_pixel_row <= Y5) AND ( i_pixel_column >= X3) AND (i_pixel_column <= X4) AND (IsCounter(2) = '1')) THEN o_red <= X"FF"; o_green <= X"FF"; o_blue <= X"00"; --Lampu C
ELSE o_red <= X"00"; o_green <= X"00"; o_blue <= X"00";
ELSIF ((i_pixel_row >= Y5) AND (i_pixel_row <= Y6) AND ( i_pixel_column >= X2) AND (i_pixel_column <= X3) AND (IsCounter(3) = '1')) THEN o_red <= X"FF"; o_green <= X"FF"; o_blue <= X"00"; --Lampu D
END IF; --END IF; END PROCESS;
ELSIF ((i_pixel_row >= Y4) AND (i_pixel_row <= Y5) AND ( i_pixel_column >= X1) AND (i_pixel_column <= X2) AND (IsCounter(4) = '1')) THEN o_red <= X"FF"; o_green <= X"FF"; o_blue <= X"00"; --Lampu E
--Melakukan PORT MAP terhadap clockdiv load_clockdiv : clockdiv PORT MAP (
ELSIF ((i_pixel_row >= Y2) AND (i_pixel_row <= Y3) AND ( i_pixel_column >= X1) AND (i_pixel_column <= X2) AND (IsCounter(5) = '1')) THEN o_red <= X"FF"; o_green <= X"FF"; o_blue <= X"00"; --Lampu F
CLK=>
ClockSystem,
DIVOUT=> clock40hz ); --Melakukan PORT MAP / load BCD to 7 Segment
ELSIF ((i_pixel_row >= Y3) AND (i_pixel_row <= Y4) AND ( i_pixel_column >= X2) AND (i_pixel_column <= X3) AND (IsCounter(6) = '1')) THEN o_red <= X"FF"; o_green <= X"FF"; o_blue <= X"00"; --Lampu G
load_bcdtest :
Bcd_7Seg
PORT MAP( D0 => BCDPortInput(0), D1 => BCDPortInput(1),
ELSIF ((i_pixel_row >= Y3) AND (i_pixel_row <= Y5) AND ( i_pixel_column >= X5) AND (i_pixel_column < X6)) AND (IsMenang) THEN o_red <= X"00"; o_green <= X"FF"; o_blue <= X"00"; --Lampu Menang
D2 => BCDPortInput(2), D3 => BCDPortInput(3), A
=> IsCounter(0),
B
=> IsCounter(1),
C
=> IsCounter(2),
ELSIF ((i_pixel_row >= Y3) AND (i_pixel_row <= Y5) AND ( i_pixel_column >= X5) AND (i_pixel_column < X6)) AND (NOT IsMenang) THEN o_red <= X"EE"; o_green <= X"EE"; o_blue <= X"EE"; -Lampu Menang Mati
D
=> IsCounter(3),
E
=> IsCounter(4),
F
=> IsCounter(5),
G
=> IsCounter(6));
--Keterangan Programmer : Ganti warnanya
END behavioral;
ELSIF ((i_pixel_row >= Y3) AND (i_pixel_row <= Y5) AND ( i_pixel_column >= X6) AND (i_pixel_column < X7)) AND (IsKalah)
-- All Rights Reserved 2012
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
8
3.
clockdiv.vhd
end if;
Komponen Clock yang digunakan didefinisikan dalam kode ini. Seperti percobaan-percobaan sebelumnya, kita dapat mengatur lamanya clock dengan memodifikasi parameter konstanta div. Semakin kecil nilai div, maka tampilan pergerakan bola (kotak) pada layar akan semakin halus dan cepat. -- Created by Iskandar Setiadi freedomofkeima and Yusuf Fajar Ardiana
USE
IEEE.STD_LOGIC_UNSIGNED.ALL;
USE
IEEE.MATH_REAL.ALL;
end if; end process; end behavioral;
4.
vga.vhd
Seperti yang digunakan dalam percobaan sebelumnya, modul VGA direalisasikan dalam script vga.vhd ini. Kode ini berfungsi untuk menghubungkan dan mengirimkan sinyal-sinyal sehingga terbentuk display pada layar LCD.
USE IEEE.STD_LOGIC_1164.ALL; IEEE.STD_LOGIC_ARITH.ALL;
end if;
-- All Rights Reserved 2012
LIBRARY IEEE; USE
count:=0;
-- Created by Iskandar Setiadi freedomofkeima and Yusuf Fajar Ardiana
--Mendefinisikan entitas Clock entity CLOCKDIV is port(
LIBRARY
CLK: IN std_logic; DIVOUT: buffer std_logic); end CLOCKDIV;
IEEE;
USE
IEEE.STD_LOGIC_1164.ALL;
USE
IEEE.STD_LOGIC_ARITH.ALL;
USE
IEEE.STD_LOGIC_UNSIGNED.ALL;
--Mendefinisikan entitas modul VGA
architecture behavioral of CLOCKDIV is
ENTITY vga
IS
begin
PORT(
PROCESS(CLK)
i_clk
:
IN
STD_LOGIC;
variable count: integer:=0;
i_red
:
IN
STD_LOGIC;
--Konstanta untuk mengatur framerate
i_green
:
IN
STD_LOGIC;
constant div: integer:=900000;
i_blue
:
IN
STD_LOGIC;
begin
--Untuk menentukan warna keluaran
if CLK'event and CLK='1' then
o_red
:
OUT
STD_LOGIC;
--Counter
o_green
:
OUT
STD_LOGIC;
if(count
o_blue
:
OUT
STD_LOGIC;
count:=count+1;
--Untuk sinkronisasi sinyal sync
if(DIVOUT='0') then
o_horiz_sync
:
OUT
STD_LOGIC;
DIVOUT<='0';
o_vert_sync
:
OUT
STD_LOGIC;
elsif(DIVOUT='1') then
--Untuk menentukan koordinat pixel pada layar LCD
DIVOUT<='1'; end if; else
o_pixel_row : OUT STD_LOGIC_VECTOR( 9 DOWNTO 0 );
if(DIVOUT='0') then
o_pixel_column : OUT STD_LOGIC_VECTOR( 9 DOWNTO 0 ));
DIVOUT<='1';
END vga;
elsif(DIVOUT='1') then DIVOUT<='0';
ARCHITECTURE behavioral OF vga
IS
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
9
IF (clock_25MHz = '0') THEN --Konstanta pengatur scanning horizontal
clock_25MHz <= '1';
CONSTANT TH
: INTEGER := 800;
clock_25MHz <= '0';
CONSTANT THB1
: INTEGER := 660;
END IF;
CONSTANT THB2
: INTEGER := 756;
END IF;
CONSTANT THD
: INTEGER := 640;
END PROCESS;
ELSE
--Konstanta pengatur scanning vertical
PROCESS BEGIN
--Scanning vertical dilakukan satu kali setelah satu proses scanning horizontal selesai dieksekusi
WAIT UNTIL( clock_25MHz'EVENT ( clock_25MHz = '1' );
CONSTANT TV
: INTEGER := 525;
IF ( h_count
CONSTANT TVB1
: INTEGER := 494;
h_count
CONSTANT TVB2
: INTEGER := 495;
ELSE
CONSTANT TVD
: INTEGER := 480;
h_count
) AND
= TH-1 ) THEN
<= (others=>'0'); <= h_count
+ 1;
END IF; SIGNAL clock_25MHz
:
STD_LOGIC;
SIGNAL horiz_sync
:
STD_LOGIC;
SIGNAL vert_sync
:
STD_LOGIC;
SIGNAL video_on
:
STD_LOGIC;
SIGNAL video_on_v
:
STD_LOGIC;
SIGNAL video_on_h
:
STD_LOGIC;
IF ( h_count <= THB2-1 ) AND (h_count >= THB1-1 ) THEN horiz_sync
<= '0';
ELSE horiz_sync
<= '1';
END IF;
SIGNAL h_count : STD_LOGIC_VECTOR( 9 DOWNTO 0 );
IF ( v_count >= TV-1 ) AND ( h_count >= 699 ) THEN
SIGNAL v_count : STD_LOGIC_VECTOR( 9 DOWNTO 0 );
v_count
<= (others=>'0');
ELSE IF ( h_count
BEGIN
v_count video_on <= video_on_h video_on_v;
<= v_count
= 699 ) THEN + 1;
END IF;
AND
END IF;
o_red
<= i_red AND video_on;
o_green
<= i_green AND video_on;
IF ( v_count <= TVB2-1 ) AND ( v_count >= TVB1-1 ) THEN
o_blue
<= i_blue AND video_on;
vert_sync
<=
'0';
ELSE o_horiz_sync
<= horiz_sync;
vert_sync
o_vert_sync
<= vert_sync;
END IF;
<= '1';
PROCESS (i_clk)
IF
( h_count
BEGIN
video_on_h
IF i_clk'EVENT AND i_clk='1' THEN
o_pixel_column
<= THD-1 ) THEN
<= '1'; <= h_count;
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
1 0
ELSE video_on_h
A <= (D1 OR D3 OR ((NOT D0) AND (NOT D2)) OR (D0 AND D2));
<= '0';
B <= ((NOT D2) OR (D0 AND D1) OR ((NOT D0) AND (NOT D1)));
END IF;
C <= (D0 OR (NOT D1) OR D2); IF ( v_count video_on_v
<= TVD-1 ) THEN
D <= (D3 OR (D1 AND (NOT D2)) OR ((NOT D0) AND (NOT D2)) OR (D0 AND (NOT D1) AND D2) OR (D1 AND (NOT D0)));
<= '1';
o_pixel_row
<= v_count;
ELSE video_on_v
E <= (((NOT D0) AND (NOT D2)) OR ((NOT D0) AND D1));
<= '0';
END
IF;
F <= (D3 OR ((NOT D0) AND (NOT D1)) OR ((NOT D0) AND D2) OR ((NOT D1) AND D2));
END
PROCESS;
G <= (D3 OR (D1 AND (NOT D2)) OR ((NOT D1) AND D2) OR ((NOT D0) AND D2));
END behavioral; -- All Rights Reserved 2012 5.
Bcd_7Seg.vhd
END behavioural;
Komponen BCD yang digunakan dalam proyek ini direalisikan pada script BCD_7Seg.vhd ini. Perhitungan skor dilakukan dengan mengkonversikan jumlah bricks yang berhasil dihancurkan menjadi bilangan binary 4-bit. Selain itu, hasil konversi akan memberikan keluaran 7bit, yang berfungsi untuk mencetak display skor pada layar. -- Created by Iskandar Setiadi freedomofkeima and Yusuf Fajar Ardiana
-- All Rights Reserved 2012
4.
HASIL DAN ANALISIS
Tahap awal yang diekseksusi dalam pengerjaan proyek sistem digital adalah menentukan desain sistem yang ingin diimplementasikan. Bricksbreaker, seperti yang telah dituliskan pada bagian prosedur percobaan, menerima 4 masukkan dari pengguna.
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --Mendefinisikan entitas BCD-to-7segment ENTITY Bcd_7seg IS PORT ( D0, D1, D2, D3 STD_LOGIC ; A, B, C, D, E, F, G STD_LOGIC );
: IN : OUT
Gambar 4-1 Pin Planner yang digunakan
end Bcd_7seg; --Convert to STD LOGIC VECTOR, untuk INTEGER --> BINARY 4 BIT
Pada gambar 4-1 diatas, dapat terlihat bahwa 4 masukkan pengguna yang digunakan adalah: -
Level Mode yang di-assign PIN_L22 atau SW[0], berfungsi untuk mengatur kecepatan dari pergerakan balok
-
PushKanan yang di-assign PIN_T22 atau Push_Button[2], berfungsi untuk menggerakkan papan kearah kanan
-
PushKiri yang di-assign PIN_T21 atau Push_Button[3], berfungsi untuk menggerakan papan kearah kiri
ARCHITECTURE behavioural OF Bcd_7seg IS BEGIN --Logika masing-masing blok penunjuk angka yang telah disederhanakan
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
11
-
Reset yang di-assign PIN_R21 atau Push_Button[1], berfungsi untuk mengulang dan memulai permainan kembali dari awal.
menyalanya lampu merah dan hilangnya bola (kotak merah) dari layar display LCD.
Selama percobaan di laboratorium, berikut ini adalah hasil implementasi sementara yang telah berhasil dilakukan:
Perancangan proyek sistem digital yang bertemakan permainan BricksBreaker ini telah diimplementasikan sekitar 50% dari rancangan awal yang telah didesain sebelumnya. Beberapa komponen yang telah berhasil diimplementasikan adalah BCD-to-7-Segment, pin planner untuk input/output, pendeteksi pantulan serta kotak yang dipantulkan, maupun state seperti kondisi menang maupun kalah. Selain itu, tedapat switch pada SW[0] yang berfungsi untuk mengatur kecepatan bricks (mode mudah / sulit), serta tombol reset pada push_button.
Perhatikan gambar 4-2 dibawah ini:
5.
KESIMPULAN
Beberapa hal yang akan diimplementasikan selanjutnya adalah penambahan bricks serta collision detection antara bricks dengan kotak yang dipantulkan. Perancangan ini akan dibuat menggunakan struktur data array dari tipe bentukan bricks. Selain itu, akan dilakukan perbaikan terhadap skematik dari FSM yang digunakan maupun optimasi pada script diatas.
Gambar 4-2 BricksBreaker State Menang
Permainan dimulai dengan bola (kotak merah) dipantulkan dari papan (biru). Setiap kali bola mengenai daerah atas, kiri, kanan, maupun bagian atas papan, maka arah gerak bola akan dipantulkan. Warna kuning (angka 8) pada pojok kiri bawah akan berfungsi sebagai counter penghitung skor yang diintegrasikan dengan BCD-to-7-Segment. Sedangkan warna hijau (lampu Menang) menyala apabila permainan telah berakhir dan pemain telah memenangkan permainan.
Pengujian sistem yang telah didesain menggunakan FPGA bertipe DE-1, yang diintegrasikan dengan display LCD.
DAFTAR PUSTAKA [1]
Brian Holdsworth and Clive Woods, Digital Logic Design Fourth Edition, N.wnes, 2002
[2]
R.H. Katz, Contemporary Logic Design Second Edition, Pearson Prentince-Hall, NJ, 2005
[3]
Stephen Brown and Zvonko Vranesic, Fundamentals of Digital Logic with VHDL Design Third Edition, McGraw-Hill, San Francisco, 2009
[4]
http://www.thelearningpit.com/lp/doc/7seg /7truth.gif, 3 Desember 2012, pukul 23:15:20
[5]
http://labdasar.ee.itb.ac.id/lab/EL2195/pen dukung%20praktikum/de1_usermanual_v101 7.pdf, 4 Desember 2012, pukul 02:21:10
Gambar 4-3 BricksBreaker State Kalah
Selain itu terdapat pula kondisi ketika pemain kalah dari permainan (Gambar 4-3). Pemain dinyatakan kalah apabila bola telah melewati papan pemantul. State kalah dinyatakan dengan Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
12