Percobaan V PERANCANGAN DAN IMPLEMETASI DISPLAY LCD
MENGGUNAKAN MODUL VGA PADA FPGA Nugraha Triokta Putra (13115025) Asisten : Ahmad Hasan Alfikri (13112012) Tanggal Percobaan : 26/11/2016 EL2102R Praktikum Sistem Digital Laboratorium Teknik Elektro Institut Teknologi Sumatera
Abstrak - Pada prakti kum M odul V in i dil akuakn bebe beberapa rapa percobaa percobaan, n, yaitu pertama pertama m embuat tampil an L CD computer computer agar berwana merah pada bagian bagian atas dan puti h pada bagian bawah (se (seper per ti war na bendera bendera I ndonesia). ndonesia). L alu untu k percobaan percobaan kedua kedua dibuat agar monitor menampilk menampilk an sebuah sebuah k otak berwana yang selanju tnya pada percobaa percobaan n 3, kotak tersebut tersebut dibu at agar agar dapat bergerak bergerak -gerak ke ki ri , kanan , atas, atas, dan bawah bawah dengan dengan menngu nakan pu sh button yang ada pada pada FPGA . Kata kunci: VGA, display LCD.
I. PENDAHULUAN
Implementasi fungsi gerbang logika pada rangkaian dapat dilakukan dengan berbagai cara, salah satunya adalah rangkaian logika sekuensial, yang bergantung pada memori statenya, statenya, [4]. Desain dari rangkaian logika sekuensial dapat diimplementasikan pada berbagai macam perangkat keras, seperti board FPGA dan tampilan display LCD. Pada praktikum sebelumnya, kita telah mengimplementasikan sebuah rangkaian logika sekuensial melalui studi kasus lampu lalu lintas. Pada praktikum ini, kita akan merancang dan mengimplementasikan desain menggunakan modul VGA pada sebuah layar LCD. Selain itu, kita akan mempelajari penerapan blok diagram dalam perancangan menggunakan modul VGA, yaitu membuat sebuah bujur sangkar 50 x 50 pixel (percobaan 2) dan membuat bujur sangkar tersebut bergerak (percobaan 3).
Modul VGA yang digunakan memiliki 2 jenis sinyal, yaitu sinyal warna (Merah, Hijau, dan Biru), serta sinyal sinkron (horizontal dan vertical). Dalam menghasilkan sebuah tampilan, VGA melakukan sinkronisasi pada layar, yaitu dengan scanning dengan scanning setiap baris dengan satuan pixel satuan pixel tertentu.
MODUL VGA DRIVER
Modul VGA (Video (Video Graphics Array) driver yang digunakan kali ini adalah sebuah modul yang merepresentasikan masukkan logika FPGA kedalam tampilan warna pada layar monitor LCD. Modul ini menerima masukkan port masukkan port yang ingin dinyalakan, dan mengkonversikan masukkan menjadi warna pada layar (RGB). Berikut adalah penjelasan mengenai sinyal-sinyal yang digunakan: -Sinyal sinkron, terdiri dari horizontal sync dan vertical sync. Sinyal-sinyal ini aktif pada range pixel range pixel yang valid. Jika sinyal ini tidak aktif, maka akan terjadi pergantian baris (untuk horizontal sync), serta pergantian layar / kembali ke baris pertama (untuk vertical sync). -Sinyal warna RGB, terdiri dari komponen warna merah, hijau, dan biru.
II. LANDASAN TEORETIS
Salah satu bentuk implementasi rangkaian sekuensial adalah menggunakan modul VGA dengan tampilan display LCD.
Gambar 2-1 diatas merupakan proses scanning yang terjadi pada layar LCD. Scanning tersebut dimulai dari pojok kiri atas (0,0) kearah kanan / horizontal (0,639), dilanjutkan dengan pergantian baris ke (1,0) dst.
Sinyal RGB yang sifatnya digital, dikonversikan oleh chip DAC menjadi sinyal RGB analog, yang kemudian direpresentasikan menjadi sebuah tampilan pada layar LCD.
Secara singkat, VGA melakukan proses scanning dari baris dan kolom teratas (0,0) ke (0,639), dilanjutkan ke baris selanjutnya sampai (240,639) berwarna merah, sedangkan sisanya ( (241,0) sampai (479,639) ) berwarna putih.
FIELD PROGRAMMABLE GATE ARRAY
FPGA adalah sebuah integrated circuit yang dapat dikonfigurasi dan diprogram berkali-kali. FPGA terdiri atas logika yang dapat diprogram, yang disebut dengan blok logika (logic blocks),[6]. Pada percobaan ini, FPGA digunakan sebagai penghubung antara modul VGA yang digunakan dengan display layar LCD. .
Percobaan 2
Pada percobaan ini, kita akan mengimple mentasikan sebuah desain kotak bujur sangkar (solid) berukuran 50 pixel x 50 pixel pada layar VGA. Selain itu, bujur sangkar ini akan diletakkan dengan titik-titik sudut (10,10), (10,59), (59,10), dan (59,59). Untuk itu, perhatikan kode berikut ini: CONSTANT TOPLEFT : INTEGER := 10; CONSTANT BTMRIGHT : INTEGER := 59;
III. HASIL DAN A NALISIS IMPLEMENTASI DESAIN PADA BOARD FPGA Percobaan 1
Pada percobaan ini, kita akan mengimplementasikan desain gambar bendera RI dilayar (atas merah, bawah putih). Warna merah didapatkan dengan mengatur warna merah R = 111111, G = B = 000000, sedangkan warna putih R = G = B = 111111. Sebuah layar display LCD memiliki ukuran THD x TVD = 640 x 480 pixel, sehingga untuk membuat warna bendera, kita akan membagi layar menjadi dua bagian, yaitu 0..240 berwarna merah dan 241..479 berwarna putih. Secara sederhana, kode yang digunakan (modifikasi file color_rom_vhd.vhd) adalah: IF (i_pixel_row < 241) THEN o_red <= X"FF"; o_green <= X"00"; o_blue <= X"00"; ELSE o_red <= X"FF"; o_green <= X"FF"; o_blue <= X"FF"; END IF;
Konstanta diatas adalah nilai-nilai pixel yang membatasi kotak bujur sangkar yang akan dibuat. Untuk membedakan bujur sangkar tersebut dengan layar, maka kita akan memberikan warna merah (seperti pada percobaan 1) pada bujur sangkar tersebut. Perhatikan modifikasi file color_rom_vhd.vhd berikut ini: IF ((i_pixel_column >= TOPLEFT) AND (i_pixel_column <= BTMRIGHT)) AND ((i_pixel_row >= TOPLEFT) AND (i_pixel_row <= BTMRIGHT)) THEN o_red <= X"FF"; o_green <= X"00"; o_blue <= X"00"; ELSE o_red <= X"FF"; o_green <= X"FF"; o_blue <= X"FF"; END IF; Kode diatas memberikan batasan warna merah untuk range kolom antara 10 – 59 dan range baris antara 10 – 59 (seperti pada percobaan 1, hanya dengan batasan pixel yang berbeda). Hasil tampilan bujur sangkar percobaan 2 dapat dilihat pada gambar 4-2 berikut ini:
Kode diatas memberikan perintah bahwa untuk baris yang pixel -nya kurang dari 241 akan ber warna merah , sedangkan sisanya berwarna putih. o_red <= X”FF” pada script diatas setara dengan R = ’111111’, hal ini dapat dilihat dari display_vhd.vhd bahwa red <= red_color (7 DOWNTO 2) , sehingga VGA_R <= ’111111’. Hasil tampilan bendera RI dapat dilihat pada gambar 4-1 berikut ini:
Percobaan 3
Pada percobaan ini, kita akan membuat gambar bujur sangkar yang telah dibuat pada percobaan 2 bergerak sesuai input push-button dari board FPGA. Clock divider (Clockdiv) yang digunakan pada percobaan ini diberikan constant div 1000000, hal ini bertujuan agar pengguna dapat mengamati pergerakan bujur sangkar pada layar
(karena board FPGA memiliki frekuensi 50 MHz, atau 50 juta proses per detiknya). Jika kita tidak menggunakan clockdiv, maka kita tidak dapat mengamati pergerakan bujur sangkar yang langsung bergerak menjauh dengan sekejap dari layar. Namun karena terbatasnya waktu, dalam penyelesaian percobaan ini tidak di dapatkan sebuah gerakan yg di akibatkan clockdiv dalam kode vhdl yang kami buat. SIMPULAN Kesimpulan yang didapatkan dari percobaan modul V ini, yaitu : Salah satu cara yang dapat digunakan dalam mengimplemetasikan rangkaian logika sekuensial ke dalam FPGA adalah dengan menggunakan modul VGA yang mengeluarkan output berupa tampilan pada layar LCD computer. VGA atau Video Graphic Array merupakan sebuah interface standar yang dapat digunakan untuk menghasilkan tampilan pada layar LCD monitor. Prinsip yang digunakan yaitu dengan merancang modul VGA ke dalam Bahasa VHDL yang selanjutnya akan diimplementasikan pada board FPGA yaitu dengan mentranslasikan sinyal RGB digital menjadi sinyal RGB analog sebelum ditransimiskan ke layar monitor. Implementasi yang dilakukan pada percobaan ini yaitu dengan membuat sebuah objek kotak yang dapat diubah-ubah ukurannya (menjadi seukuran bendera atau bujur sangkar) serta dapat dipindah (digerak-gerakan) sesuai keingi nan. Dalam impelmentasi yang dilakukan, digunakan berbagai input seperti Switch (mengaktifkan display) dan Push Button (menggerakan bujur sangkat ke empat arah yang berbeda) serta digunakan counter clock yang menyebabkan pergerakan objek gambar dapat teramati oleh pengguna.
R EFERENSI
[1]
Frank Vahid., Digital Design, Hal. 30-76, John Wiley & Sons Inc, New Jesey, 2007
[2]
Mervin T. Hutabarat, dkk, Petunjuk Praktikum EL2195 Sistem Digital , Hal. 1-11, Laboratorium Dasar Teknik Elektro ITB, Bandung, 2009
[3]
Stephen Brown dan Zvonko Vranesic, Fundamental of Digital Logic with VHDL Design, Hal. 20-49 75-93 118-121 , McGraw-Hill, New York, 2005
Lampiran Kode vhdl vga.vhd:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; USE ieee.std_logic_unsigned.all; ENTITY vga IS PORT( i_clk : IN STD_LOGIC; i_red : IN STD_LOGIC; i_green : IN STD_LOGIC; i_blue : IN STD_LOGIC; o_red : OUT STD_LOGIC; o_green : OUT STD_LOGIC; o_blue : OUT STD_LOGIC; o_horiz_sync : OUT STD_LOGIC; o_vert_sync : OUT STD_LOGIC; o_pixel_row : OUT STD_LOGIC_VECTOR( 9 DOWNTO 0 ); o_pixel_column : OUT STD_LOGIC_VECTOR( 9 DOWNTO 0 )); END vga; ARCHITECTURE behavioral OF vga IS CONSTANT TH : INTEGER := 800; CONSTANT THB1 : INTEGER := 660; CONSTANT THB2 : INTEGER := 756; CONSTANT THD : INTEGER := 640; CONSTANT TV : INTEGER := 525; CONSTANT TVB1 : INTEGER := 494; CONSTANT TVB2 : INTEGER := 495; CONSTANT TVD : INTEGER := 480; 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; SIGNAL h_count : STD_LOGIC_VECTOR( 9 DOWNTO 0 ); SIGNAL v_count : STD_LOGIC_VECTOR( 9 DOWNTO 0 ); BEGIN video_on <= video_on_h AND video_on_v; o_red <= i_red AND video_on; o_green <= i_green AND video_on; o_blue <= i_blue AND video_on; o_horiz_sync <= horiz_sync; o_vert_sync <= vert_sync; PROCESS (i_clk) BEGIN IF i_clk'EVENT AND i_clk='1' THEN IF (clock_25MHz = '0') THEN clock_25MHz <= '1'; ELSE clock_25MHz <= '0';
END IF; END IF; END PROCESS; PROCESS BEGIN WAIT UNTIL( clock_25MHz'EVENT ) AND ( clock_25MHz = '1' ); IF ( h_count = TH-1 ) THEN h_count <= (others=>'0'); ELSE h_count <= h_count + 1; END IF; IF ( h_count <= THB2-1 ) AND (h_count >= THB1-1 ) THEN horiz_sync <= '0'; ELSE horiz_sync <= '1'; END IF; IF ( v_count >= TV-1 ) AND ( h_count >= 699 ) THEN v_count <= (others=>'0'); ELSE IF ( h_count = 699 ) THEN v_count <= v_count + 1; END IF; END IF; IF ( v_count <= TVB2-1 ) AND ( v_count >= TVB1-1 ) THEN vert_sync <= '0'; ELSE vert_sync <= '1'; END IF; IF ( h_count <= THD-1 ) THEN video_on_h <= '1'; o_pixel_column <= h_count; ELSE video_on_h <= '0'; END IF; IF ( v_count <= TVD-1 ) THEN video_on_v <= '1'; o_pixel_row <= v_count; ELSE video_on_v <= '0'; END IF; END PROCESS; END behavioral;
Kode VHDL color_rom_vhd pada percobaan 1:
LIBRARY 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_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( 7 DOWNTO 0 ); o_green : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 ); o_blue : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 )); END color_rom_vhd;
ARCHITECTURE behavioral OF color_rom_vhd IS CONSTANT CONSTANT CONSTANT CONSTANT
R_TF_0 : INTEGER := 0; R_TF_1 : INTEGER := 240; C_TF1_R : INTEGER := 0; C_TF1_L : INTEGER := 640;
SIGNAL eno
: STD_LOGIC;
BEGIN
PROCESS(i_pixel_row,i_pixel_column) BEGIN IF ((i_pixel_row > R_TF_0) AND (i_pixel_row < R_TF_1) ) AND ((i_pixel_column >= C_TF1_R) AND (i_pixel_column < C_TF1_L) ) THEN eno <= '1'; ELSE eno <= '0'; END IF; IF
(eno = '1') THEN o_red <= X"FF"; o_green <= X"00"; o_blue <= X"00";
ELSE o_red <= X"FF"; o_green <= X"FF"; o_blue <= X"FF"; END IF;
END PROCESS;
END behavioral;
Kode VHDL color_rom_vhd pada percobaan 2:
LIBRARY 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_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( 7 DOWNTO 0 ); o_green : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 ); o_blue : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 )); END color_rom_vhd; ARCHITECTURE behavioral OF color_rom_vhd IS CONSTANT CONSTANT CONSTANT CONSTANT
R_TF_0 : INTEGER := 0; R_TF_1 : INTEGER := 240; C_TF1_R : INTEGER := 0; C_TF1_L : INTEGER := 640;
SIGNAL eno
: STD_LOGIC;
BEGIN
PROCESS(i_pixel_row,i_pixel_column) BEGIN IF ((i_pixel_row > R_TF_0) AND (i_pixel_row < R_TF_1) ) AND ((i_pixel_column >= C_TF1_R) AND (i_pixel_column < C_TF1_L) ) THEN eno <= '1'; ELSE eno <= '0'; END IF; IF
(eno = '1') THEN o_red <= X"FF"; o_green <= X"00"; o_blue <= X"00";
ELSE o_red <= X"FF"; o_green <= X"FF"; o_blue <= X"FF"; END IF;
END PROCESS;
END behavioral;
Kode VHDL color_rom_vhd pada percobaan 3:
LIBRARY 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_M_US : IN STD_LOGIC; i_K_US : IN STD_LOGIC; i_H_US : IN STD_LOGIC; i_M_BT : IN STD_LOGIC; i_K_BT : IN STD_LOGIC; i_H_BT : 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( 7 DOWNTO 0 ); o_green : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 ); o_blue : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 )); END color_rom_vhd; ARCHITECTURE behavioral OF color_rom_vhd IS CONSTANT R_TF_2 : INTEGER := 479; CONSTANT C_TF2_R : INTEGER := 639; SIGNAL M_TF1, M_TF2 SIGNAL K_TF1, K_TF2 SIGNAL H_TF1, H_TF2 SIGNAL grid
: STD_LOGIC; : STD_LOGIC; : STD_LOGIC; : STD_LOGIC;
SIGNAL SISIATAS : INTEGER := 10; SIGNAL SISIKIRI : INTEGER := 10; SIGNAL SISIKANAN : INTEGER := 60; SIGNAL SISIBAWAH : INTEGER := 60; SIGNAL SPEED : INTEGER := 0; SIGNAL clock40hz : STD_LOGIC; COMPONENT CLOCKDIV IS port( CLK: IN std_logic; DIVOUT: buffer std_logic); end component; BEGIN PROCESS(i_pixel_row,i_pixel_column, i_M_US , i_K_US , i_H_US , i_M_BT , i_K_BT , i_H_BT, M_TF1, M_TF2, K_TF1, K_TF2, H_TF1, H_TF2) BEGIN IF clock40hz'EVENT AND clock40hz = '1' THEN IF i_K_BT = '1' THEN SPEED <= 1; ELSE SPEED <= 3; END IF; END IF; IF clock40hz'EVENT AND clock40hz = '1' AND i_M_US = '0' AND i_H_US = '1' AND i_K_US = '1' AND i_M_BT = '1' THEN SISIATAS <= SISIATAS - SPEED; SISIBAWAH <= SISIBAWAH - SPEED; IF SISIATAS = -50 THEN SISIATAS <= 480; SISIBAWAH <= 529; END IF; ELSIF clock40hz'EVENT AND clock40hz = '1' AND i_K_US = '0' AND i_M_BT = '1' AND i_M_US = '1' AND i_H_US = '1' THEN SISIKIRI <= SISIKIRI + SPEED; SISIKANAN <= SISIKANAN + SPEED; IF SISIKIRI = 640 THEN SISIKANAN <= 0; SISIKIRI <= -49; END IF; ELSIF clock40hz'EVENT AND clock40hz = '1' AND i_H_US = '0' AND i_M_US = '1' AND i_K_US = '1' AND i_M_BT = '1' THEN SISIATAS <= SISIATAS + SPEED; SISIBAWAH <= SISIBAWAH + SPEED; IF SISIBAWAH = 479 THEN SISIATAS <= -49; SISIBAWAH <= 1; END IF; ELSIF clock40hz'EVENT AND clock40hz = '1' AND i_M_BT = '0' AND i_K_US = '1' AND i_H_US = '1' AND i_M_US = '1' THEN SISIKIRI <= SISIKIRI - SPEED; SISIKANAN <= SISIKANAN - SPEED; IF SISIKANAN = 1 THEN SISIKIRI <= 639; SISIKANAN <= 688; END IF; END IF;
IF ((i_pixel_row > SISIATAS) AND (i_pixel_row < SISIBAWAH) AND (i_pixel_column > SISIKIRI) AND (i_pixel_column < SISIKANAN)) THEN o_red <= X"FF"; o_green <= X"00"; o_blue <= X"00"; ELSE o_red <= X"FF"; o_green <= X"FF"; o_blue <= X"FF"; END IF; END PROCESS; load_clockdiv : clockdiv PORT MAP ( CLK=>i_H_BT, DIVOUT=>clock40hz ); END behavioral;