Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB
Abstrak
Percobaan modul 4 ini adalah mengenai implementasi
rangkaian sekuensial ke dalam FPGA dimana yang menjadi
persoalan utama adalah bagaimana merancang sebuah sistem
rangkaian sekuensial yang dapat bekerja sesuai dengan
memori statenya dan nantinya akan diverifikasi dengan
FPGA dan ditampilkan ke monitor melalui vga driver.
Kata kunci: FSM, FPGA, sekuensial
1.
PENDAHULUAN
3.
2.
2.1
STUDI PUSTAKA
RANGKAIAN SEKUENSIAL
Perbedaan
mendasar
rangkaian
kombinasional dengan rangkaian sekuensial
adalah ada tidaknya memori statenya. Keluaran
2.2
3.
METODOLOGI
2.3
Field-Programmable
Gate
Array(
FPGA) adalah
komponen
elektronika
dan
semikonduktor yang mempunyai komponen
gerbang terprogram (programmable logic) dan
sambungan terprogram. Komponen gerbang
terprogram yang dimiliki meliputi jenis gerbang
logikabiasa (AND, OR, XOR, NOT) maupun jenis
fungsi matematis dan kombinatorik yang lebih
kompleks (decoder, adder, subtractor, multiplier,
dll). Blok-blok komponen di dalam FPGA bisa juga
mengandung elemen memori (register) mulai
dari flip-flop sampai pada RAM (Random Access
Memory).
4.
M_US
K_US
H_US
M_BT
K_BT
H_BT
S0
S1
S2
S3
S4
S5
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;
ENTITY FSM IS
PORT (
clockin
: IN STD_LOGIC;
MODEDARURAT : IN STD_LOGIC;
MODEHARI
: IN STD_LOGIC;
M_US
: OUT STD_LOGIC;
K_US
: OUT STD_LOGIC;
H_US
: OUT STD_LOGIC;
M_BT
: OUT STD_LOGIC;
K_BT
: OUT STD_LOGIC;
H_BT
: OUT STD_LOGIC
);
END FSM;
ARCHITECTURE behavioral OF FSM IS
type executionState IS (s1, s2, s3, s4, s5,
s6);
SIGNAL currentstate : executionState;
SIGNAL counter : integer;
SIGNAL CLOCK : BIT;
COMPONENT CLOCKDIV IS
PORT ( CLK : IN STD_LOGIC;
DIVOUT : buffer BIT);
END COMPONENT;
BEGIN
Second : clockdiv PORT MAP (CLK => clockin,
DIVOUT => CLOCK);
PROCESS (CLOCK, MODEDARURAT, MODEHARI)
Variable counter : integer :=0;
BEGIN
IF (CLOCK'EVENT AND CLOCK='1') THEN
CASE MODEDARURAT IS
WHEN '0' =>
currentstate <= s1;
CASE MODEHARI IS
WHEN '0' =>
CASE currentstate IS
WHEN s1 =>
IF (counter < 5) THEN
M_US <= '0';
K_US <= '0';
H_US <= '1';
M_BT <= '1';
K_BT <= '0';
H_BT <= '0';
counter := counter + 1;
currentstate <= s1;
ELSE
currentstate <= s2;
counter := 0;
END IF;
WHEN s2 =>
IF (counter < 2) THEN
M_US <= '0';
K_US <= '1';
H_US <= '0';
M_BT <= '1';
K_BT <= '0';
H_BT <= '0';
counter := counter + 1;
currentstate <= s2;
ELSE
currentstate <= s3;
counter := 0;
END IF;
WHEN s3 =>
IF (counter < 5) THEN
M_US <= '1';
K_US <= '0';
H_US <= '0';
M_BT <= '0';
K_BT <= '0';
H_BT <= '1';
counter := counter + 1;
currentstate <= s3;
ELSE
currentstate <= s4;
counter := 0;
END IF;
WHEN s4 =>
IF (counter < 2) THEN
M_US <= '1';
K_US <= '0';
H_US <= '0';
M_BT <= '0';
K_BT <= '1';
H_BT <= '0';
counter := counter + 1;
currentstate <= s4;
ELSE
currentstate <= s1;
counter := 0;
END IF;
WHEN s5 => null;
WHEN s6 =>null;
END CASE;
WHEN '1' =>
CASE currentstate IS
WHEN s1 =>
IF (counter < 9) THEN
M_US <= '0';
K_US <= '0';
H_US <= '1';
M_BT <= '1';
K_BT <= '0';
H_BT <= '0';
counter := counter + 1;
currentstate <= s1;
ELSE
currentstate <= s2;
counter := 0;
END IF;
WHEN s2 =>
IF (counter < 3) THEN
M_US <= '0';
K_US <= '1';
H_US <= '0';
M_BT <= '1';
K_BT <= '0';
H_BT <= '0';
counter := counter + 1;
currentstate <= s2;
ELSE
currentstate <= s3;
counter := 0;
END IF;
WHEN s3 =>
IF (counter < 9) THEN
M_US <= '1';
K_US <= '0';
H_US <= '0';
M_BT <= '0';
K_BT <= '0';
H_BT <= '1';
counter := counter + 1;
currentstate <= s3;
ELSE
currentstate <= s4;
counter := 0;
END IF;
WHEN s4 =>
IF (counter < 3) THEN
M_US <= '1';
K_US <= '0';
H_US <= '0';
M_BT <= '0';
K_BT <= '1';
H_BT <= '0';
counter := counter + 1;
currentstate <= s4;
ELSE
currentstate <= s1;
counter := 0;
END IF;
WHEN s5 => null;
WHEN s6 =>null;
END CASE;
END CASE;
WHEN '1' =>
currentstate <= s5;
IF (counter < 5) THEN
CASE currentstate IS
WHEN s5 =>
M_US <= '0';
K_US <= '1';
H_US <= '0';
M_BT <= '0';
K_BT <= '1';
H_BT <= '0';
counter := counter + 1;
currentstate <= s6;
WHEN s6 =>
M_US <= '0';
K_US <= '0';
H_US <= '0';
M_BT <= '0';
K_BT <= '0';
H_BT <= '0';
counter := counter + 1;
currentstate <= s5;
WHEN s1 => null;
WHEN s2 => null;
WHEN s3 => null;
WHEN s4 => null;
END CASE;
ELSE
currentstate <= s1;
END IF;
counter := 0;
END CASE;
END IF;
END PROCESS;
END behavioral;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY top_level_vhd IS
PORT(
CLOCK_50
: IN STD_LOGIC;
SW
: IN
STD_LOGIC_VECTOR( 9 DOWNTO 0 );
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 );
VGA_HS
: OUT STD_LOGIC;
VGA_VS
: OUT STD_LOGIC;
VGA_CLK
: OUT STD_LOGIC;
VGA_BLANK : OUT STD_LOGIC;
GPIO_0
: OUT
STD_LOGIC_VECTOR( 35 DOWNTO 0 );
LEDR
: OUT
STD_LOGIC_VECTOR( 9 DOWNTO 0 ));
END top_level_vhd;
ARCHITECTURE behavioral OF
IS
SIGNAL M_US : STD_LOGIC;
SIGNAL K_US : STD_LOGIC;
SIGNAL H_US : STD_LOGIC;
SIGNAL M_BT : STD_LOGIC;
SIGNAL K_BT : STD_LOGIC;
SIGNAL H_BT : STD_LOGIC;
COMPONENT display_vhd IS
PORT(
i_clk
i_M_US
i_K_US
i_H_US
i_M_BT
i_K_BT
i_H_BT
VGA_R
STD_LOGIC_VECTOR( 5 DOWNTO
VGA_G
STD_LOGIC_VECTOR( 5 DOWNTO
VGA_B
STD_LOGIC_VECTOR( 5 DOWNTO
VGA_HS
STD_LOGIC;
VGA_VS
STD_LOGIC;
VGA_CLK
STD_LOGIC;
VGA_BLANK
STD_LOGIC);
END COMPONENT;
BEGIN
module_vga : display_vhd
PORT MAP (
i_clk
=>
i_M_US
=>
i_K_US
=>
i_H_US
=>
i_M_BT
=>
i_K_BT
=>
i_H_BT
=>
VGA_R
=>
VGA_G
=>
VGA_B
=>
VGA_HS
=>
VGA_VS
=>
VGA_CLK
=>
VGA_BLANK
=>
);
END behavioral;
top_level_vhd
: IN STD_LOGIC;
: IN STD_LOGIC;
: IN STD_LOGIC;
: IN STD_LOGIC;
: IN STD_LOGIC;
: IN STD_LOGIC;
: IN STD_LOGIC;
: OUT
0 );
: OUT
0 );
: OUT
0 );
: OUT
: OUT
: OUT
: OUT
CLOCK_50,
M_US,
K_US,
H_US,
M_BT,
K_BT,
H_BT,
VGA_R,
VGA_G,
VGA_B,
VGA_HS,
VGA_VS,
VGA_CLK,
VGA_BLANK
ENTITY top_level_vhd IS
PORT(
CLOCK_50
: IN STD_LOGIC;
SW
: IN STD_LOGIC_VECTOR( 9 DOWNTO 0 );
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 );
VGA_HS
: OUT STD_LOGIC;
VGA_VS
: OUT STD_LOGIC;
VGA_CLK
: OUT STD_LOGIC;
VGA_BLANK : OUT STD_LOGIC;
GPIO_0
: OUT STD_LOGIC_VECTOR( 35
DOWNTO 0 );
LEDR
: OUT STD_LOGIC_VECTOR( 9 DOWNTO
0 ));
END top_level_vhd;
ARCHITECTURE behavioral OF top_level_vhd
Dengan
kata
lain,
praktikan
berhasil
mengimplementasikan
VGA
driver
dan
menampilkannya di LCD sebuah traffic light
dengan 6 buah output warna yang nilainya
tergantung dari 6 buah input saklar.
IS
=>
=>
=>
=>
=>
=>
=>
CLOCK_50,
M_US,
K_US,
H_US,
M_BT,
K_BT,
H_BT,
=> SW(9),
=> SW(8)
module_vga : display_vhd
PORT MAP (
i_clk
=>
i_M_US
=>
i_K_US
=>
i_H_US
=>
i_M_BT
=>
i_K_BT
=>
i_H_BT
=>
VGA_R
=>
VGA_G
=>
VGA_B
=>
VGA_HS
=>
VGA_VS
=>
VGA_CLK
=>
VGA_BLANK
=>
);
END behavioral;
DAFTAR PUSTAKA
CLOCK_50,
M_US,
K_US,
H_US,
M_BT,
K_BT,
H_BT,
VGA_R,
VGA_G,
VGA_B,
VGA_HS,
VGA_VS,
VGA_CLK,
VGA_BLANK
5.
S1
S2
S3
S4
[1]
[2]
http://digilib.its.ac.id/public/ITS-Master13572-2208205710-Presentation.pdf. Diakses
tanggal 22 November 2015 pk. 9.38
[3]
http://riskasimaremare.wordpress.com/2013
/04/23/finite-state-automata/
Diakses
tanggal 22 November 2015 pk. 9.57
[4]
http://id.wikipedia.org/wiki/FPGA Diakses
tanggal 22 November 2015 pk. 10.13
S5
KESIMPULAN
CLOCKDIV
berfungsi
untuk
memperlambat waktu keluaran agar sesuai
dengan yang diinginkan..
FPGA
dapat
digunakan
untuk
memverifikasi fungsi rangkaian yang telah
dibuat.