You are on page 1of 14

MODUL 6 PROYEK PERANCANGAN RANGKAIAN DIGITAL

Devi Oktama Putri, Lim (13211124)


Sebastianus Reynaldi (13211125)
Asisten: Mahendra Aditya
Tanggal Percobaan: 07/12/2012
EL2195-Praktikum Sistem Digital

Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan


Informatika ITB
Abstrak

yang tidak hanya bergantung pada


masukan sekarang, melainkan juga
pada masukan sebelumnya (yang
lalu). Dari segi susunan, rangkaian
sequensial
merupakan
suatu
rangkaian yang berisi paling sedikit
satu elemen memori Sequential
Logic Circuit atau juga bisa disebut
Rangkaian
Logika
Sekuensial,
adalah rangkaian logika yang
memperhatikan adanya faktor clock
(waktu)

Rangkaian
digital
adalah
rangkaian yang paling umum dipakai
pada kehidupan kita sehari-hari akibat
kapabilitas dalam melakukan modifikasi
rangkaian
dibandingkan
rangkaian
analog.
Dalam
rangkaian
digital
memepunyai control, jalur data, dan
system itu sendiri. Dengan adanya
ketiga hal tersebut mempermudah kita
dalam implementasi rangkaian digital ke
dunia nyata. Selain itu rangkaian digital
ini masih bias dikolaborasikan dengan
beberapa sistem pendukung lainnya.

Kata kunci: Digital, sistem, kendali,


jalur data.

Prinsip Kerja
Rangkaian sekuensial memiliki
prinsip kerja yang berbeda dengan
rangkaian kombinasional. Keluaran

1. PENDAHULUAN
Pada
praktikum
ini
praktikan
diharapkan dapat membuat suatu sistem
digital dengan menggunakan semua
bahasan yang telah ada pada modul
modul praktikum sebelumnya. Adapun
tujuan
dari
praktikum
ini
adalah
praktikan dapat menspesifikasikan suatu
sistem digital sederhana, membagi
sistem menjadi satu atau lebih jalur data
dan kendali, mendesain jalur data untuk
sistem, mendesain jalur kendali untuk
sistem, mengintegrasikan jalur data dan
kendali
ke
dalam
sistem
secara
keseluruhan, melakukan tes menyeluruh
terhadap sistem, mengimplementasikan
sistem digital menggunakan FPGA dan
komponen tambahan yang diperlukan ,
serta menguji dan menganalisa sistem
yang sudah dibangun.
2. STUDI PUSTAKA
2.1Rangkaian Sekuensial
Rangkaian sekuensial adalah
rangkaian yang mempunyai output

suatu

rangkaian

sekuensial

hanya

tergantung

saluran

masukannya,

tergantung

dari

dari

tidak
kondisi

tetapi

kondisi

juga

keluaran

sebelumnya. Rangkaian sekuensial


memiliki elemen umpan balik.
[1]
2.2BCD to 7 Segment Converter
Rangkaian ini digunakan untuk
mengkonversikan
suatu
nilai
desimal terkode biner (BCD) ke
pola segmen yang sesuai pada
display 7 segment. Karena nilai
BCD adalah nilai 4-bit pada
jangkauan 0-9, bagaimana kita
memperlakukan
nilai
10-15

(dont care atau tidak) akan


berpengaruh pada desain.[2]

2.3

VGA

Interface ke VGA menggunakan 2


jenis sinyal, yaitu : sinyal warna
(Merah, Hijau, dan Biru) dan sinyal
sinkron (horizontal dan vertical).[3]
3. METODOLOGI
3.1Peralatan yang digunakan
1. Komputer/PC yang telah
terinstal program Quartus II
9.0
2. Monitor LCD
3. FPGA development board
ALTERA DE1
3.2Langkah kerja

currentstate

Merancang desain system

Membuat state diagram

Membuat state table

Membuat kode VHDL yang


sesuai dengan desain sistem

Merancang sistem kendal. data


flow, dan sistem itu sendiri

Mengimpementasikan ke FPGA
dan LCD (VGA)

4. HASIL DAN ANALISIS


Nama proyek : Simulasi Remote AC.

State
counte
r

memberikan input yang sesuai


dengan keinginan kita dan pada
akhirnya baru akan discount saat
pindah ke state counter. Kedua
state memiliki output yang berbeda
dan tidak dipengaruhi oleh nilai
input dari luar. Maksudnya di sini
bukan terletak pada perpindahan
tiap
state,
melainkan
output
diakibatkan adanya input nilai
waktu bukan dari input pindah
state.
Bila dalam state table hasilnya
adalah:

State
pilih
waktu

Untuk mode timer akan ada dua


buah state, yaitu state counter dan
state memilih waktu. Untuk state
memilih
waktu
adalah
untuk

nextstate
X=0
X=1
Pilih waktu
Pilih waktu
Counter
counter
counter
Pilih waktu
Nilai output tergantung dari switch.
SW 0 sampai 5.
Untuk temperature memiliki
beberapa state, yaitu untuk proses
increment dan proses decrement
currentstate
Std
Inc
Dec
banding

nextstate
00
01
std
dec
std
D
std
banding
std
dec

11
D
D
D
D

Nilai decrement dan increment


tergantung pada batas yang
diberikan di dalam rangkaian
digital. Di dalamnya terdapat
comparator yang berfungsi
membandingkan antara nilai input
dan nilai maksimal.
Spesifikasi :
Pada pembuatan proyek ini, akan
dibuat sebuah simulasi remote AC,
yang memiliki 3 mode : off,
temperatur, dan timer. Temperatur
pada simulasi ini memiliki range
antara 16-32 C. Harapan hasil
keluaran dari proyek ini adalah
temperatur AC dapat diatur atur
melalui push button. Satu push
button
untuk
menaikkan
temperatur, dan satu push button
untuk
menurunkan
temperatur.
Keluaran dari nilai temperatur saat

10
inc
Banding
D
inc

ini dapat dilihat melalui BCD to 7


segment yang ada pada FPGA .
Bertambah
dan
berkurangnya
temperatur AC juga diperlihatkan
melalui warna yang berubah pada
LCD. Akan ada dua kotak pada LCD,
jika temperatur bertambah , maka
akan ada perubahan warna dari
putih menjadi hijau pada kotak
sebelah
kiri,
sedangkan
jika
temperatur berkurang maka akan
ada perubahan warna dari putih
menjadi hijau pada kotak sebelah
kanan. Apabila telah melampaui
batas range, maka kotak akan
berwarna
merah,
yakni
jika
temperatur ditambah melebihi 32C
dan kurang dari 16C.
Untuk timer, dibuat FSM untuk
memilih mode antara pengatur jam
atau
pengatur
menit.
Untuk
menjalankan timer akan ada tombol
enter. Setelah timer berjalan tidak
akan
bisa
dihentikan
sampai
counter mencapai nilai nol. Setelah
mencapai nilai nol, remote akan
mati dengan sendirinya. Untuk
menampilkan
jam
dan
menit
membutuhkan
4
buah
seven
segment. Pada dasarnya counter
akan menerima input clock dari
clockdiv agar perhitungan mundur
tidak terlalu cepat. Lampu LED akan
berkedip saat hitung mundur mulai
dilakukan
dan
akan
berkedip
mengikuti clock setelah diproses di
clockdiv.
Hasil yang didapatkan pada saat
praktikum adalah :
Temperatur dan timer belum dapat
digabungkan, akan tetapi dapat
dijalankan secara terpisah. Pada
timer, terdapat tampilan pada BCD
to 7 segment berupa menit dan
detiknya. Durasi timer dapat dipilih
melalui switch switch yang
tersedia
(dalam
angka
biner)
kemudian timer dijalankan dengan
menekan push button paling kiri
pada FPGA. Misalnya diatur 30

detik, maka setelah push button


ditekan timer akan count down dari
30 sampe 0 kemudian timer
berhenti.Pada
temperatur,
digunakan 2 bcd to 7 segment ,
HEX 1 untuk puluhan dan HEX 0
untuk satuan. Temperatur ini dapat
diatur dinaikkan dengan menekan
push button paling kiri (key 3) dan
diturunkan dengan menekan push
button paling kanan (key 2).
Penaikan
dan
penurunan
temperatur ini berjalan selama
berada dalam range (16 32). Saat
dinaikkan kotak sebelah kiri pada
LCD berwarna hijau dan saat
diturunkan kotak sebelah kanan
berwarna hijau dan saat sudah
melewati range (lebihdari 32), kotak
sebelah
kiri
berwarna
merah.
Seharusnya kotak sebelah kanan
juga berwarna merah saat suhu
mencapai <16, akan tetapi hal ini
belum berjalan (jadi tetap putih
saat <16)
Penjelasan Kode VHDL :

color_rom_vhd
Pengubahan pengubahan yang
dilakukan :

ENTITY color_rom_vhd
(

selector_up:
DOWNTO 0);
selector_down:
DOWNTO 0);

IS PORT

IN

IN

STD_LOGIC_VECTOR(1

STD_LOGIC_VECTOR(1

i_pixel_column: IN STD_LOGIC_VECTOR( 9
DOWNTO 0 );
i_pixel_row
:
STD_LOGIC_VECTOR( 9 DOWNTO 0 );

IN

o_red
7 DOWNTO 0 );

: OUT STD_LOGIC_VECTOR(

o_green
7 DOWNTO 0 );

: OUT STD_LOGIC_VECTOR(

o_blue
:
STD_LOGIC_VECTOR( 7 DOWNTO 0 ));
END color_rom_vhd;

OUT

Pengubahan di bagian entity yakni pada


selector_up dan selector_down ,yang
berfungsi sebagai
selektor pemilih
warna pada LCD.
ARCHITECTURE
IS

behavioral

constant block_top

OF

color_rom_vhd

:integer:=9;

constant block_bottom :integer:=469;


constant blockA_left

:integer:=4;

constant blockB_right :integer:=634;


:std_logic;

signal blockB

:std_logic;

'0';

END IF;

Pada
bagian
ini
diproses
untuk
pemberian warna, jika berada pada
batas batas yang telah ditentukan,
maka sinyal untuk memberi warna akan
bernilai 1, jika tidak maka 0.

ELSIF (blockA = '1' AND selector= "11")


THEN
o_red <= X"00"; o_green <= X"FF";
o_blue <= X"00";

:integer:=329;

signal blockA

blockB <=

IF
(blockA = '1' AND selector= "00") THEN
o_red <= X"FF"; o_green <= X"FF"; o_blue <=
X"FF";

constant blockA_right :integer:=309;


constant blockB_left

ELSE

ELSIF (blockA = '1' AND (selector= "01"


OR selector="10")) THEN
o_red <= X"FF";
o_green <= X"00"; o_blue <= X"00";

Pada bagian ini, diatur batas batas


untuk kedua buah kotak, dengan blockA
sebagai
kotak
1 (kotak
penanda
temperatur
ditambah)
dan
blockB
sebagai
kotak2
(kotak
penanda
temperatur dikurang), sehingga batas
kiri untuk kotak 1 adalah 4, batas kanan
untuk kotak 1 adalah 309, batas kiri
untuk kotak 2 adalah 329, dan batas
kanan utuk kotak 2 adalah 634,
sedangkan batas atas dan batas bawah
untuk kedua kotak adalah sama yakni 9
dan 469.

ELSIF (blockB = '1' AND selector= "00")


THEN
o_red <= X"FF"; o_green <= X"FF";
o_blue <= X"FF";
ELSIF (blockB = '1' AND (selector= "01"
OR selector="10")) THEN
o_red <= X"FF";
o_green <= X"00"; o_blue <= X"00";
ELSIF (blockB = '1' AND selector= "11")
THEN
o_red <= X"00"; o_green <= X"FF";
o_blue <= X"00";
ELSE o_red <= X"00"; o_green <= X"00";
o_blue <= X"00";
END IF;
END PROCESS;
END behavioral;

BEGIN
PROCESS(i_pixel_row,i_pixel_column,
red,green,black,white)
BEGIN
IF ((i_pixel_row > block_top)
(i_pixel_row
<
block_bottom)
)
((i_pixel_column
>=
blockA_left)
(i_pixel_column < blockA_right)
)
blockA <= '1';
ELSE

blockA <=

AND
AND
AND
THEN

Pada bagian ini dilakukan pemberian


warna pada kotak, jika sinyal pada kotak
1 (blockA) dan bernilai 1, maka kotak 1
akan diberi warna sesuai dengan
selectornya, begitu pula jika sinyal
kotak2 bernilai 1 (block B) maka akan
diberi warna sesuai dengan selectornya.
Selector 00 berwarna putih, 11 berwarna
hijau, 01 atau 10 berwarna merah.

'0';

Pengubahan
dilakukan

END IF;
IF
((i_pixel_row
>
block_top)
(i_pixel_row
<
block_bottom)
)
((i_pixel_column
>=
blockB_left)
(i_pixel_column < blockB_right)
)
blockB <= '1';

display_vhd

AND
AND
AND
THEN

LIBRARY

USE

pengubahan

IEEE;

IEEE.STD_LOGIC_1164.ALL;

yang

USE

IEEE.STD_LOGIC_ARITH.ALL;

SIGNAL blue_on

USE

IEEE.STD_LOGIC_UNSIGNED.ALL;

Pada bagian ini ditambah sinyal red_on,


green_on, blue_on untuk menandakan
warna warna tersebut hidup.

ENTITY display_vhd

IS

COMPONENT vga

PORT(

: STD_LOGIC;

IS

PORT(

i_clk

: IN STD_LOGIC;

selector:
DOWNTO 0 );

IN

STD_LOGIC_VECTOR(

OUT

VGA_R
DOWNTO 0 );

STD_LOGIC_VECTOR(

VGA_G
DOWNTO 0 );

OUT

STD_LOGIC_VECTOR(

VGA_B
DOWNTO 0 );

OUT

STD_LOGIC_VECTOR(

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;

VGA_HS

: OUT STD_LOGIC;

o_horiz_sync :

OUT

STD_LOGIC;

VGA_VS

: OUT STD_LOGIC;

o_vert_sync

OUT

STD_LOGIC;

VGA_CLK

: OUT STD_LOGIC;

VGA_BLANK

: OUT STD_LOGIC);

o_pixel_row
9 DOWNTO 0 );

END display_vhd;

Pengubahan
pada
bagian
ini
:
ditambahkan selector seperti pada
color_rom_vhd.
ARCHITECTURE behavioral OF display_vhd

OUT

STD_LOGIC_VECTOR(

o_pixel_column: OUT
9 DOWNTO 0 ));

STD_LOGIC_VECTOR(

END COMPONENT;

IS

SIGNAL red : STD_LOGIC_VECTOR (5 DOWNTO 0);


SIGNAL
0);

green:

STD_LOGIC_VECTOR

(5

DOWNTO

IS

PORT(

SIGNAL blue: STD_LOGIC_VECTOR (5 DOWNTO 0);


SIGNAL
red_color:
DOWNTO 0);

STD_LOGIC_VECTOR

(7

SIGNAL green_color:
DOWNTO 0);

STD_LOGIC_VECTOR

(7

SIGNAL
blue_color:
DOWNTO 0);

STD_LOGIC_VECTOR

(7

SIGNAL
pixel_row:
DOWNTO 0);

STD_LOGIC_VECTOR

SIGNAL pixel_column
DOWNTO 0);

:STD_LOGIC_VECTOR

SIGNAL

COMPONENT color_rom_vhd

red_on

: STD_LOGIC;

SIGNAL green_on : STD_LOGIC;

(9

(9

selector :
DOWNTO 0 );

IN

STD_LOGIC_VECTOR(

i_pixel_column : IN STD_LOGIC_VECTOR(
9 DOWNTO 0 );
i_pixel_row : IN STD_LOGIC_VECTOR( 9
DOWNTO 0 );
o_red
DOWNTO 0 );

o_green:
DOWNTO 0 );
o_blue:
DOWNTO 0 ));
END COMPONENT;

OUT

STD_LOGIC_VECTOR(

OUT

STD_LOGIC_VECTOR(

STD_LOGIC_VECTOR(

OUT

Bagian ini menginclude color_rom_vhd


dalam display_vhd
BEGIN

END IF;

IF (green_on = '1'
green;

vga_driver0 : vga

ELSE VGA_G <=

PORT MAP (
=> i_clk,

i_red

=> '1',

i_green

=> '1',

i_blue

=> '1',

o_red

=> red_on,

o_green

=> green_on,

o_blue

=> blue_on,

o_horiz_sync

=> VGA_HS,

o_vert_sync

=> VGA_VS,

o_pixel_row

=> pixel_row,

o_pixel_column

=> pixel_column);

IF (blue_on = '1'
ELSE VGA_B <=

) THEN VGA_B <=

blue;

"000000";

END IF;
END PROCESS;
END behavioral;

Bagian ini memberi warna jika on_red


berlogika 1 maka diberi warna merah,
jika on_blue berlogika 1 maka diberi
warna biru, dan jika on_green berlogika 1
maka diberi warna hijau.

top_level_vhd

ENTITY top_level_vhd

color_rom0 : color_rom_vhd

IS

PORT(

PORT MAP (
selector

=> selector,

i_pixel_column

=> pixel_column,

i_pixel_row

=> pixel_row,

o_red

=> red_color,

o_green

=> green_color,

o_blue

=> blue_color);
<= red_color

CLOCK_50
: IN STD_LOGIC;
selector_up: IN STD_LOGIC_VECTOR( 1
DOWNTO 0 );
selector_down: IN STD_LOGIC_VECTOR( 1
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;

(7 DOWNTO 2) ;

green <= green_color(7 DOWNTO 2) ;


blue

"000000";

END IF;

i_clk

red

) THEN VGA_G <=

<= blue_color (7 DOWNTO 2) ;

Bagian ini memport map vga_vhd dan


color_rom_vhd ke display_vhd

Pada bagian entity ditambahkan selector


untuk memilih warna.

PROCESS(red_on,green_on,blue_on,red,green,b
lue)

ARCHITECTURE
IS

BEGIN

Bagian ini menginclude display_vhd ke


top_level_vhd

IF (red_on = '1'
ELSE

VGA_R <=

) THEN VGA_R <=


"000000";

red;

behavioral

COMPONENT display_vhd

IS

OF

top_level_vhd

PORT(

VGA_CLOCK : OUT STD_LOGIC;


i_clk

: IN STD_LOGIC;

VGA_BLK

selector_up: IN STD_LOGIC_VECTOR( 1
DOWNTO 0 );
selector_down: IN STD_LOGIC_VECTOR(
1 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);
END COMPONENT;

: OUT STD_LOGIC;

LEDRED
DOWNTO 0 );

: OUT STD_LOGIC_VECTOR( 9

GPIO_1
DOWNTO 0 );

: OUT STD_LOGIC_VECTOR( 35

HEX0
downto 0);

HEX1:
downto 0)

OUT

OUT

STD_LOGIC_VECTOR

STD_LOGIC_VECTOR

(6

(6

HEX2
downto 0);

OUT

STD_LOGIC_VECTOR

(6

HEX3
downto 0));

OUT

STD_LOGIC_VECTOR

(6

BEGIN

Bagian di bawah ini memport


display_vhd.vhd ke top_level_vhd

map

end temperatur;

module_vga : display_vhd
PORT MAP (
i_clk
=> CLOCK_50,
selector_up=>selector_up,
selector_down =>selector_downVGA_R
=> VGA_R,
VGA_G
=> VGA_G,
VGA_B
=> VGA_B,
VGA_HS
=> VGA_HS,
VGA_VS
=> VGA_VS,
VGA_CLK
=> VGA_CLK,
VGA_BLANK
=> VGA_BLANK
);

Pada bagian ini dideklarasikan port port


dalam temperatur, yakni clock_in dan
clock_out
untuk
mengatur
waktu,
i_tombol1
sebagai
tombol
untuk
menambah temperatur, i_tombol 2 untuk
mengurangi
temperatur,
VGA_red,
VGA_green,
VGA_blue
,
VGA_hor,
VGA_vert berfungsi untuk pewarnaan,
LEDRED berfungsi untuk menyalakan
lampu LED merah, HEX 0 untuk angka
satuan, dan HEX 1 untuk angka puluhan

LED<="0000000000";
LEDR<=LED;

architecture structural of temperatur is

END behavioral;

signal maxcount

:integer:=32;

temperatur.vhd

signal mincount

:integer:=16;

signal pilihan1
downto 0);

:std_logic_vector(1

:std_logic_vector(1

entity temperatur is
port (clock_in : in std_logic;
clock_out

: buffer std_logic;

signal pilihan2
downto 0);

i_tombol1

: IN STD_LOGIC;

signal k

:integer;

i_tombol2

: IN STD_LOGIC;

signal H0
0);

:std_logic_vector(3

downto

signal H1
0);

:std_logic_vector(3

downto

signal H2
0);

:std_logic_vector(3

downto

signal H3
0);

:std_logic_vector(3

downto

VGA_red :
downto 0);

out

std_logic_vector

(5

VGA_green: out std_logic_vector (5


downto 0);
VGA_blue:
downto 0);

out

std_logic_vector

VGA_hor : out std_logic;


VGA_vert: out std_logic;

(5

signal satuan

:integer;

signal puluhan

:integer;

VGA_G : OUT STD_LOGIC_VECTOR( 5 DOWNTO 0 );

Pada bagian ini maxcount adalah nilai


maksimum
temperatur
yakni
32,
mincount
adalah
nilai
minimum
temperatur yakni 16, pil untuk memilih
warna, k sebagai hasil dari penambahan
dan pengurangan temperatur, H0 ,H1,
satuan , puluhan memberi sinyal pada
HEX 0 dan HEX 1.
component clockdiv is
port(CLK

:in std_logic;

DIVOUT :buffer std_logic

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
0 );

: OUT STD_LOGIC_VECTOR( 35 DOWNTO

LEDR
));

: OUT STD_LOGIC_VECTOR( 9 DOWNTO 0

end component;

);
end component;

Bagian ini menginclude clockdiv.vhd,


double7segvhd dan top_level_vhd.vhd ke
temperatur.vhd

component double7seg is

BEGIN

port (

C1:clockdiv
map(CLK=>clock_in,DIVOUT=>clock_out);

in_1

:in std_logic_vector(3 downto 0);

in_2

:in std_logic_vector(3 downto 0);

warna : top_level_vhd port map (


CLOCK_50

in_3
downto 0);

:in

std_logic_vector(3

in_4
downto 0);

:in

std_logic_vector(3

out_1

:out std_logic_vector(6 downto 0);

out_2

:out std_logic_vector(6 downto 0);

out_3

:out std_logic_vector(6 downto 0);

out_4

:out std_logic_vector(6 downto 0));

port (

IN

STD_LOGIC_VECTOR(

=>pilihan2,

VGA_R

=>VGA_red,

VGA_G

=>VGA_green,

VGA_B

=>VGA_blue,

VGA_HS

=>VGA_hor,

VGA_VS

=>VGA_vert,

VGA_CLK

=>VGA_CLOCK,

VGA_BLANK

=>VGA_BLK,

GPIO_0

=>GPIO_1,

LEDR

=>LEDRED

);

selector_up
:IN
STD_LOGIC_VECTOR( 1 DOWNTO 0 );
selector_down
DOWNTO 0 );

=>pilihan1,

selector_down

component top_level_vhd is

: IN STD_LOGIC;

=>clock_in,

selector_up

end component;

CLOCK_50

port

push : in std_logic_vector(1 downto 0);


VGA_R : OUT STD_LOGIC_VECTOR( 5 DOWNTO 0 );

Bagian ini memport map clockdiv dan


top_level_vhd ke temperatur.vhd
process(i_tombol1,i_tombol2,pilihan1,piliha
n2,k)
begin
case i_tombol1 is

when '0'=>

out_2=>HEX1,

if k<32 and k>16 then

out_3=>HEX2,

pilihan1<="11";

out_4=>HEX3

elsif k>=32 and k<=16 then

);

pilihan1<="10";
end if;

end structural;

when others => pilihan1<="00";


end case;
case i_tombol2 is
when '0'=>
if k<32 and k>16 then
pilihan2<="11";
elsif k>=32 and k<=16 then
pilihan2<="10";
end if;
when others => pilihan2<="00";
end case;
end process;

process(H0,H1,H3,H2,satuan,puluhan)
begin
H0<=std_logic_vector(to_unsigned(satuan,4))
;
H1<=std_logic_vector(to_unsigned(puluhan,4)
);
H2<="0000";
H3<="0000";
end process;

sevensegment:double7seg port map(


in_1=>H0,
in_2=>H1,
in_3=>H2,
in_4=>H3,
out_1=>HEX0,

Pada bagian ini, k mula mula diberi


nilai 16. Jika tombol1 (key 3) ditekan
maka jika temperatur saat ini belum
melebihi 32 maka nilai k akan
bertambah.
Nilai
k
ini
kemudian
dikonversikan ke angka satuan dan
puluhan, yakni puluhan dengan k div 10
dan satuan dengan k mod 10. Jika
tombol 2 ditekan (key 2) maka jika
temperatur saat ini masih bernilai >= 16
maka k akan berkurang. Nilai k ini
kemudian dikonversikan ke angka satuan
dan puluhan, yakni puluhan dengan k div
10 dan satuan dengan k mod 10.
Lalu push button dicocokan dengan
warna yang muncul di LCD. Ketika
tombol1 ditekan dan nilai k masih
berada pada range maka pil menjadi 11,
dan jika diluar range menjadi 10,
sedangkan jika tidak dipencet menjadi
00. 11 adalah hijau, 10 adalah merah
dan 00 adalah putih.

timer

entity timer is
port(clock_in

:in std_logic;

clock_out :buffer std_logic;


mode

:in std_logic;

counter

:in std_logic;

in_time
downto 0);

:in

std_logic_vector(5

HEX0
downto 0);

:out

std_logic_vector(6

HEX1
downto 0);

:out

std_logic_vector(6

HEX2
downto 0);

:out

std_logic_vector(6

component double7seg is
std_logic_vector(3

:out

std_logic_vector(6

port(in_1
downto 0);

:in

HEX3
downto 0)

in_2
downto 0);

:in

std_logic_vector(3

in_3
downto 0);

:in

std_logic_vector(3

in_4
downto 0);

:in

std_logic_vector(3

out_1
downto 0);

:out

std_logic_vector(6

out_2
downto 0);

:out

std_logic_vector(6

out_3
downto 0);

:out

std_logic_vector(6

out_4
downto 0));

:out

std_logic_vector(6

);
end timer;

Bagian ini berisi pendeklarasian port


dalam
timer,
yakni
clock_in
dan
clock_out untuk mengatur waktu, mode
untuk mengatur perubahan antar mode,
in_time sebagai waktu masukan untuk
timer, dan HEX 0 serta HEX 1 berfungsi
untuk tampilan ke BCD to 7 segment.
architecture behave of timer is
signal temp_minute
:std_logic_vector(5 downto 0);
signal temp_hour
:std_logic_vector(5 downto 0);

end component;

Bagian ini menginclude double7seg pada


timer.

signal t_minute
:integer;
signal t_hour

:integer;

signal count_minute
:integer:=t_minute;

begin
clock:clockdiv
map(CLK=>clock_in,DIVOUT=>clock_out);

port

signal count_hour
:integer:=t_hour;

Bagian ini berfungsi untuk menyimpan


dahulu masukan sebelum diolah.

process(t_hour,t_minute,temp_hour,temp_minu
te)
begin

type executionstage is (s1,s2);


t_hour<=to_integer(unsigned(temp_hour));
signal currentstate

:executionstage:=s1;

signal nextstate

:executionstage;

t_minute<=to_integer(unsigned(temp_minute))
;
end process;

signal H0:std_logic_vector(3 downto 0);


signal H1:std_logic_vector(3 downto 0);

process(currentstate,mode,in_time,start_cou
nt)

signal H2:std_logic_vector(3 downto 0);


begin
signal H3:std_logic_vector(3 downto 0);
case currentstate is
signal start_count

:std_logic;
when s1=>

Pada bagian ini H0,H1,H2,H3 berfungsi


sebagai masukan timer pada keempat
bcd to 7 segment.

start_count<='0';
if mode='1' then

--adding 4 seven-segment components.


temp_hour<=in_time;

elsif mode='0' then

Bagian berikutnya memproses clock_out


temp_minute<=in_time;
process(clock_out)
end if;
begin
nextstate<=s2;
if clock_out'event and clock_out='1' then
when s2=>
if start_count='0' then
start_count<='1';
count_minute<=t_minute;
nextstate<=s1;
count_hour<=t_hour;
when
start_count<=start_count;

others

=>
else
if start_count='1' then

end case;

if count_minute>=0 then

end process;

count_minute<=count_minute1;
--adding clock divider
elsif count_minute<=0 then
component clockdiv is
count_hour<=count_hour-1;
port(CLK

:in std_logic;
count_minute<=59;

DIVOUT :buffer std_logic);


elsif
count_minute<=0
count_hour<=0 then

end component;

Pada bagian ini terdapat 2 state (s1 dan


s2). Jika s1, start_count awalnya mati,
kemudian jika mode 1 (switch dinaikkan)
untuk memasukkan nilai jam ke FPGA,
dan mode 0 (switch diturunkan) untuk
memasukkan menit ke FPGA. Jika
currentstate
s2,
maka
mulai
menghitung. Nilai current state berubah
menjadi nextstate pada bagian di bawah
ini
process(counter,clock_out)
begin
if clock_out'event and clock_out='1' then
if counter='0' then
currentstate<=nextstate;
else
currentstate<=currentstate;
end if;

and

count_hour<=0;
count_minute<=0;
end if;
end if;
end if;
end if;
end process;

Jika start_count = 0 maka nilai jam dan


menit tetap, jika start_count = 1 maka
jika menit lebih dari 0 , maka menit akan
berkurang, jika menit sudah kurang dari
0 maka menit menjadi 59, sedangkan
nilai jam dikurang 1, sedangkan jika nilai
jam dan menit sudah mencapai kurang
dari 0 , maka nilai jam dan menit
menjadi 0.
process(start_count,t_minute,t_hour,count_m
inute,count_hour)

end if;

begin

end process;

if start_count='0' then

H0<=std_logic_vector(to_unsigned(t_minute
mod 10,4));
H1<=std_logic_vector(to_unsigned(t_minute /
10,4));
H2<=std_logic_vector(to_unsigned(t_hour mod
10,4));
H3<=std_logic_vector(to_unsigned(t_hour
10,4));

elsif start_count='1' then


H0<=std_logic_vector(to_unsigned(count_minu
te mod 10,4));
H1<=std_logic_vector(to_unsigned(count_minu
te / 10,4));
H2<=std_logic_vector(to_unsigned(count_hour
mod 10,4));
H3<=std_logic_vector(to_unsigned(count_hour
/ 10,4));
else
H0<=H0;
H1<=H1;
H2<=H2;
H3<=H3;
end if;
end process;

sevenseg:double7seg port map(


in_1

=>H0,

in_2

=>H1,

in_3

=>H2,

in_4

=>H3,

out_1

=>HEX0,

out_2

=>HEX1,

out_3

=>HEX2,

out_4

=>HEX3

);

awal mod 10, HEX 1 adalah menit awal


div 10, HEX 2 adalah jam awal mod 10,
dan HEX 3 adalah jam awal div 10.
Jika start_count = 1 (mulai count
down), maka tampilan pada HEX0 adalah
menit sekarang mod 10, HEX1 adalah
menit sekarang div 10, HEX2 adalah jam
sekarang mod 10, HEX3 adalah jam
sekarang div 10.
5. KESIMPULAN
Bagian timer dan temperatur
belum dapat digabungkan, akan
tetapi
masing

masing
temperatur dan timer berjalan
dengan baik.
Untuk timer, count down berjalan
dengan baik. Untuk memulai
count down tekan push button
paling kiri, untuk reset juga
dengan menekan push button
paling kiri.
Untuk
temperatur,
untuk
menaikkan temperatur dilakukan
dengan menekan push button
paling kiri dan pada LCD kotak
sebelah kiri akan berwarna hijau
jika masih berada di dalam range
(16-32) dan akan berwarna
merah jika sudah melebihi 32.
Untuk
penurunan
temperatur
dilakukan dengan menekan push
button paling kiri kedua (key2)
dan akan berwarna hijau jika
masih berada dalam range. Untuk
indikator jika melewati range
(warna merah) masih belum
dapat berjalan sehingga jika
melewati range tetap berwarna
putih.

DAFTAR PUSTAKA
[1]http://sweetydyah.blogspot.com/2009
/05/rangkaian-sekuensial.html

end behave;

Bagian ini memproses tampilan ke BCD


to 7 segment. Jika start_count = 0 ,
maka tampilan pada HEX0 adalah menit

[2] Hutabarat, T.Mervin, et.al, Modul


Praktikum Sistem Digital, Laboratorium
Dasar Teknik Elektro Sekolah Teknik

Elektro dan Informatika, Bandung, 2012,


halaman 50-51
[3] Hutabarat, T.Mervin, et.al, Modul
Praktikum Sistem Digital, Laboratorium
Dasar Teknik Elektro Sekolah Teknik

Elektro dan Informatika, Bandung, 2012,


halaman 70-71.