Anda di halaman 1dari 6

Lampu lalu lintas sederhana berbasis Field Programmable

Gate Array (FPGA) menggunakan Finite State Machine


Ferry Wahyu Wibowo1

Jurusan Teknik Informatika, STMIK AMIKOM Yogyakarta,


Jl. Ring Road Utara, Condong Catur, Sleman, Yogyakarta – Indonesia
1
ferrywahyu@gmail.com

Penggunaan state diagram untuk membuat suatu aplikasi dalam software ISE XILINX
memudahkan pengguna untuk membentuk suatu siklus keadaan, tanpa harus mengetahui
skematik dan hardware description language (HDL). Kemampuan yang dihasilkan dari aplikasi
ini membuat pengguna dapat merespon bentuk keluaran suatu algoritma yang sedang dibuat.
Namun, konversi yang dilakukan oleh kompiler mengelompokkan menjadi satu suatu variable
dalam bentuk hardware description language (HDL). Contoh sederhana ditampilkan pada
gambar 1, untuk membuat lampu lalu lintas sederhana.

Gambar 1 State Diagram FSM untuk lampu lalu lintas

Prinsip kerja dari FSM ini adalah pada state awal semua keluaran merah, kuning dan
hijau bernilai „0‟, ketika kondisi masukan timer “001” maka akan ke state awal dan akan menset
merah dan ketika masukan timer kondisinya “010” maka akan menset kuning dan ketika timer
kondisinya “011” maka akan menset hijau dan seterusnya sampai tombol reset ditekan maka
akan kembali ke kondisi state0. Hasil konversi state diagram dari gambar 1 ke VHSIC Hardware
Description Language (VHDL) ditunjukkan pada listing program 1.

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY SHELL_VM IS
PORT (CLK,RESET,timer0,timer1,timer2: IN std_logic;
hijau,kuning,merah : OUT std_logic);
END;

ARCHITECTURE BEHAVIOR OF SHELL_VM IS


TYPE type_sreg IS (STATE0,STATE1,STATE2,STATE3);
SIGNAL sreg, next_sreg : type_sreg;
SIGNAL next_BP_hijau,next_BP_kuning,next_merah : std_logic;
SIGNAL BP_hijau,BP_kuning: std_logic;
BEGIN
PROCESS(CLK,next_sreg, next_BP_hijau, next_BP_kuning, next_merah)
BEGIN
IF CLK='1' AND CLK'event THEN
sreg <= next_sreg;
BP_hijau <= next_BP_hijau;
BP_kuning <= next_BP_kuning;
merah <= next_merah;
END IF;
END PROCESS;

PROCESS (sreg,BP_hijau,BP_kuning,RESET,timer0,timer1,timer2)
BEGIN
next_BP_hijau <= BP_hijau;next_BP_kuning <= BP_kuning;
next_merah <= '0';
next_sreg<=STATE0;
IF ( RESET='1' ) THEN
next_sreg<=STATE0;
next_BP_hijau<='0';
next_BP_kuning<='0';
next_merah<='0';
ELSE
CASE sreg IS
WHEN STATE0 =>
IF ( timer0='1' AND timer1='0' AND
timer2='0' ) THEN
next_sreg<=STATE1;
next_merah<='1';
next_BP_hijau<='0';
IF (( BP_kuning='1' )) THEN
next_BP_kuning<='1';
ELSE next_BP_kuning<='0';
END IF;
ELSE
next_sreg<=STATE0;
next_merah<='0';
next_BP_kuning<='0';
next_BP_hijau<='0';
END IF;
WHEN STATE1 =>
IF ( timer0='0' AND timer1='1' AND
timer2='0' ) THEN
next_sreg<=STATE2;
next_merah<='0';
next_BP_kuning<='1';
IF (( BP_hijau='1' )) THEN
next_BP_hijau<='1';
ELSE next_BP_hijau<='0';
END IF;
ELSE
next_sreg<=STATE1;
next_merah<='1';
next_BP_hijau<='0';
IF (( BP_kuning='1' )) THEN
next_BP_kuning<='1';
ELSE next_BP_kuning<='0';
END IF;
END IF;
WHEN STATE2 =>
IF ( timer0='1' AND timer1='1' AND
timer2='0' ) THEN
next_sreg<=STATE3;
next_merah<='0';
next_BP_kuning<='0';
next_BP_hijau<='1';
ELSE
next_sreg<=STATE2;
next_merah<='0';
next_BP_kuning<='1';
IF (( BP_hijau='1' )) THEN
next_BP_hijau<='1';
ELSE next_BP_hijau<='0';
END IF;

END IF;
WHEN STATE3 =>
IF ( timer0='0' AND timer1='0' AND
timer2='1' ) THEN
next_sreg<=STATE1;
next_merah<='1';
next_BP_hijau<='0';
IF (( BP_kuning='1' )) THEN
next_BP_kuning<='1';
ELSE next_BP_kuning<='0';
END IF;
ELSE
next_sreg<=STATE3;
next_merah<='0';
next_BP_kuning<='0';
next_BP_hijau<='1';
END IF;
WHEN OTHERS =>
END CASE;
END IF;
END PROCESS;

PROCESS (BP_hijau)
BEGIN
IF (( BP_hijau='1' )) THEN hijau<='1';
ELSE hijau<='0';
END IF;
END PROCESS;

PROCESS (BP_kuning)
BEGIN
IF (( BP_kuning='1' )) THEN kuning<='1';
ELSE kuning<='0';
END IF;
END PROCESS;
END BEHAVIOR;

LIBRARY ieee;
USE ieee.std_logic_1164.all;

ENTITY VM IS
PORT (timer : IN std_logic_vector (2 DOWNTO 0);
CLK,RESET: IN std_logic;
hijau,kuning,merah : OUT std_logic);
END;

ARCHITECTURE BEHAVIOR OF VM IS
COMPONENT SHELL_VM
PORT (CLK,RESET,timer0,timer1,timer2: IN std_logic;
hijau,kuning,merah : OUT std_logic);
END COMPONENT;
BEGIN
SHELL1_VM : SHELL_VM PORT MAP
(CLK=>CLK,RESET=>RESET,timer0=>timer(0),timer1=>timer(1),
timer2=>timer(2),hijau=>hijau,kuning=>kuning,merah=>merah);
END BEHAVIOR;
Listing program 1 VHDL dari gambar 1

Sintesis merupakan suatu pemrograman dari suatu hardware description language ke


bentuk suatu teknologi. Sintesis dari listing program 1 ke suatu piranti Field Programmable Gate
Array (FPGA) menghasilkan duplikasi register dengan 4 states, 16 transitions, 3 masukan dengan
clock dan reset, 4 keluaran. Statistik makronya menunjukkan bahwa implementasinya dikonversi
menjadi 1 FSM, 5 register dan 5 Flip-flop, sehingga Register transfer logic (RTL) dalam aplikasi FPGA-
nya membutuhkan 9 slices dari 4656 (0%), 5 Flip-Flop dari 9312 (0%), 17 LUT 4 masukan dari 9312
(0%), 8 IO, 8 bonded IOBs dari 232 (3%), 1 CLKs dari 24 (4%). Register transfer logic (RTL) dari
gambar 1 ditunjukkan pada gambar 2.

Gambar 2 Register Transfer Logic dari gambar 1

Penentuan enkoding yang digunakan dalam aplikasi state machine sangat mempengaruhi waktu
tunda yang dihasilkan untuk perubahan dari state ke state. Enkoding yang digunakan dalam aplikasi state
diagram dari gambar 1 adalah enkoding Gray. Dengan demikian, perubahan state yang dihasilkan adalah
000, 001, 011, 010, dan 110. Simulasi sinyal yang dihasilkan untuk mengetahui keadaan dari state ke state
untuk aplikasi pada gambar 1 ditunjukkan pada gambar 3. Diagram bentuk gelombang digunakan untuk
mencari suatu kebenaran logika yang akan dihasilkan dari aplikasi teknologi FPGA.
Gambar 3 Diagram bentuk gelombang dari gambar 1

Waktu periode minimum dari aplikasi gambar 1 sebesar 3,550ns (Frekuensi maksimum:
281.690MHz).

Daftar Pustaka
Pedroni V.A., 2004, Circuit Design with VHDL, MIT Press, London, England.
Sjoholm, S. dan Lindh, L., 1997, VHDL for designers, Prentice Hall Europe, Great Britain.
Short, K.L., 2009, VHDL for Engineers, Pearson Education, Inc, Upper Saddle River, New
Jersey.

Anda mungkin juga menyukai