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
[email protected]
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 FPGAnya 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.