Modul06 13210044
Modul06 13210044
Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB
Abstrak
Proyek ini merupakan akhir dari praktikum Sistem Digital.
Pada percobaan ini, praktikan mengimplementasikan hal
yang telah dipelajari selama menjalani praktikum Sistem
Digital. Proyek yang dipilih oleh praktikan untuk proyek
akhir adalah Timer Countdown. Timer countdown
merupakan system yang menerima masukan untuk
menambahkan detik dan menit. Setelah detik dan menit
yang ingin tercapai, diberikan input start yang akan memulai
hitung mundur sesuai dengan jumlah detik dan menit hingga
nol. Detik dan menit akan ditampilkan dalam 4 digit 7
segment. Ketika detik dan menit mencapai nol, maka pada
layar akan ditampilkan warna yang akan berkedap-kedip.
Praktikan tidak dapat menyelesaikan proyek ini karena
beberapa kegagalan dalam FSM yang dibuat.
2.
2.1
STUDI PUSTAKA
FINITE STATE MACHINE
2.2
PENDAHULUAN
suatu
system
digital
VGA
4.
4.1
3.
METODOLOGI
SPESIFIKASI
4 Push Button
1 Switch Button
Output :
7-Segment
Layar LCD
Blok Diagram :
FSM :
Decoder State Diagram
Decoder :
Pada bagian ini system akan menerima input
langsung dari luar, input ini berupa push button
dan switch button. Bila switch button bernilai 1
maka akan aktif. Pada bagian ini lah menit dan
detik ditambahkan. Penambahan dilakukan
berdasarkan masing masing button yang
mewakili detik dan menit. Nilai detik dan menit
ini memiliki batas atas. Nilai maksimal dari detik
adalah 59 sedangkan nilai maksimal dari menit
adalah 99. Ketika penambahan sampai pada nilai
maksimal, walaupun push button ditekan nilai
dari detik dan menit tidak akan berubah. Ketika
push button start ditekan maka akan masuk pada
blok selanjutnya yaitu Countdown.
Countdown :
Ketika pushbutton start ditekan maka detik dan
menit yang telah diisi akan mulai berkurang.
Waktu akan berkurang 1 detik hingga menjadi 0
kembali. Ketika waktu telah mencapat 0, maka
blok ini akan memberikan keluaran pada blok
VGA untuk diproses.
VGA :
Pada blok ini, output akan memberikan keluaran
pada layar LCD. Output dari VGA baru terjadi
ketika Countdown memberikan keluaran yang
akan diterima sebagai input pada VGA. Hasil
yang dikeluarkan pada layarnya berupa warna
merah putih yang akan berkedip-kedip dengan
periode 1 detik. Ketika push button reset ditekan,
maka VGA akan kembali mengeluarkan warna
hitam pada layar.
4.2.1
Decoder
4.2
SIMULASI FUNGSIONAL
4.2.2
Countdown
4.3
ANALISIS KEGAGALAN
5.
KESIMPULAN
DAFTAR PUSTAKA
[1]
[2]
[3]
LAMPIRAN
Analisis Script decoder.vhd (Yang digunakan pada simulasi) :
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
USE IEEE.STD_LOGIC_ARITH.all;
USE IEEE.NUMERIC_STD.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.all;
Analisis : Bagian diatas merupakan library apa saja yang digunakan pada percobaan kali ini.
ENTITY decoder IS
PORT (
);
END decoder;
Analisis : Bagian diatas merupakan pendeklarasian input dan output dari decoder.vhd. SW merupakan
switch yang bila bernilai 1 maka seluruh system berjalan. Detik digunakan untuk menambahkan waktu
untuk detik, sedangkan menit digunakan untuk menambahkan bagian waktu untuk menit. Keluaran
cdus, cdts, cdum dan cdtm merupakan keluaran hexadecimal yang terhubung dengan 7segment sehingga
bagian 7segment yang bekerja akan menyala sesuai dengan angka dari detik atau menit.
ARCHITECTURE behavioral OF decoder IS
signal count_tma: integer range 0 to 10;
signal count_uma: integer range 0 to 10;
signal count_tsa: integer range 0 to 10;
signal count_usa: integer range 0 to 10;
Analisis : Bagian diatas merupakan sinyal yang dideklarasikan secara local pada file vhdl ini saja.
Count_usa mewakili nilai satuan detik, count_tsa mewakili nilai puluhan dari nilai puluhan detik,
count_uma mewakili nilai satuan menit dan count_tma mewakili nilai puluhan menit.
BEGIN
-- Process Counting
PROCESS (detik,menit,reset,SW)
variable count_tm: integer range 0 to 10:=0;
variable count_um: integer range 0 to 10:=1;
variable count_ts: integer range 0 to 10:=10;
variable count_us: integer range 0 to 10:=2;
Analisis : Bagian diatas merupakan deklarasi variable secara local dalam PROCESS ini saja. Nilai dari
variable ini nantinya akan diberikan kepada sinyal count yang telah dideklarasikan sebelumnya.
BEGIN
IF (reset = '0')
THEN
count_us := 0;
count_ts := 0;
count_um := 0;
count_tm := 0;
Analisis : Bagian diatas menyatakan bila Switch aktif dan reset ditekan maka semua nilai dari count akan
menjadi 0 kembali.
ELSIF (detik = '0' AND SW = 1) THEN
count_usa <= count_us;
count_tsa <= count_ts;
count_uma <= count_um;
count_tma <= count_tm;
Analisis : Bagian diatas menyatakan bila switch aktif dan detik ditekan maka nilai count dari variable
local akan diberikan kepada count yang dideklarasikan diluar proses.
IF (count_us /= 9) THEN
count_us := count_us + 1;
Analisis : Bila digit satuan detik belum mencapai 9, maka digit satuan detik akan ditambahkan 1 lagi,
ELSIF (count_us = 9 AND count_ts /= 5) THEN
count_us := 0;
count_ts := count_ts + 1;
Analisis : Bila digit satuan detik telah mencapai 9 dan digit puluhan detik belum mencapai 5, maka
satuan detik akan kembali 0 dan puluhan detik akan ditambahkan.
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB
Analisis : Bila satuan detik telah mencapai 9 dan puluhan detik telah mencapai 5 serta satuan menit
belum mencapai 9, maka satuan detik dan puluhan detik akan menjadi 0 dan satuan menit akan ditambah
1.
ELSIF (count_tm /= 9 AND count_um = 9 AND count_ts = 5 AND count_us = 9) THEN
count_us := 0;
count_ts := 0;
count_um := 0;
count_tm := count_tm + 1;
Analisis : Bila semua telah mencapai maksimal selain puluhan menit maka variable selain puluhan menit
akan menjadi 0 dan puluhan menit akan bertambah satu.
ELSIF (count_tm = 9 AND count_um = 9 AND count_ts = 5 AND count_us = 9) THEN
count_us := 9;
count_ts := 5;
count_um := 9;
count_tm := 9;
END IF;
Analisis : Bila semua telah mencapai nilai maksimal, maka tidak akan ada yang ditambahkan.
ELSIF (menitEVENT AND menit = '0' AND SW = 1) THEN
count_usa <= count_us;
count_tsa <= count_ts;
count_uma <= count_um;
count_tma <= count_tm;
Analisis : Bila switch aktif dan menit aktif maka nilai variable local count akan diberikan pada signal
count yang akan diproses.
IF (count_um /= 9) THEN
count_um := count_um + 1;
Analisis : Pada bagian diatas, bila satuan menit belum bernilai 9 maka satuan menit akan ditambah 1.
ELSIF (count_um = 9 AND count_tm /= 9) THEN
count_um := 0;
count_tm := count_tm + 1;
Analisis : Pada bagian diatas, bila satuan menit bernilai 9 dan puluhan menit belum bernilai 9, maka
satuan menit akan menjadi 0 dan puluhan menit akan bertambah 1.
ELSIF (count_um = 9 AND count_tm = 9 AND count_ts /= 5 AND count_us /= 9) THEN
count_um := 9;
count_tm := 9;
Analisis : Pada bagiaan diatas, bila satuan dan puluhan menit telah mencapai maksimal sedangkan detik
belum, maka puluhan dan satuan menit akan tetap bernilai maksimal.
ELSIF (count_tm = 9 AND count_um = 9 AND count_ts = 5 AND count_us = 9) THEN
count_us := 9;
count_ts := 5;
count_um := 9;
count_tm := 9;
END IF;
Analisis : Pada bagian diatas, bila semua variable count telah mencapai nilai maksimal maka variable
count akan tetap bernilai maksimal.
END IF;
END PROCESS;
Analisis : Pada bagian bawah, merupakan implementasi dari signal count dikonversi menjadi
hexadecimal agar dapat memberikan keluaran pada 7segment.
-- Output BCD 7-Seg
PROCESS(count_usa)
BEGIN
CASE (count_usa) IS
WHEN 0 =>
cdus <= "1000000";
WHEN 1 =>
cdus <= "1111001";
WHEN 2 =>
cdus <= "0100100";
WHEN 3 =>
cdus <= "0110000";
WHEN 4 =>
cdus <= "0011001";
WHEN 5 =>
cdus <= "0010010";
WHEN 6 =>
cdus <= "0000010";
WHEN 7 =>
cdus <= "1111000";
WHEN 8 =>
cdus <= "0000000";
WHEN 9 =>
cdus <= "0010000";
WHEN OTHERS =>
cdus <= "1111111";
END CASE;
END PROCESS;
PROCESS(count_tsa)
BEGIN
CASE (count_tsa) IS
WHEN 0 =>
cdts <= "1000000";
WHEN 1 =>
cdts <= "1111001";
WHEN 2 =>
cdts <= "0100100";
WHEN 3 =>
cdts <= "0110000";
WHEN 4 =>
cdts <= "0011001";
WHEN 5 =>
cdts <= "0010010";
WHEN OTHERS =>
cdts <= "1111111";
END CASE;
END PROCESS;
PROCESS(count_uma)
BEGIN
CASE (count_uma) IS
WHEN 0 =>
cdum <= "1000000";
WHEN 1 =>
cdum <= "1111001";
WHEN 2 =>
cdum <= "0100100";
WHEN 3 =>
cdum <= "0110000";
WHEN 4 =>
cdum <= "0011001";
WHEN 5 =>
cdum <= "0010010";
WHEN 6 =>
cdum <= "0000010";
WHEN 7 =>
cdum <= "1111000";
WHEN 8 =>
cdum <= "0000000";
WHEN 9 =>
cdum <= "0010000";
WHEN OTHERS =>
cdum <= "1111111";
END CASE;
END PROCESS;
PROCESS(count_tma)
BEGIN
CASE (count_tma) IS
WHEN 0 =>
cdtm <= "1000000";
WHEN 1 =>
cdtm <= "1111001";
WHEN 2 =>
cdtm <= "0100100";
WHEN 3 =>
cdtm <= "0110000";
WHEN 4 =>
cdtm <= "0011001";
WHEN 5 =>
cdtm <= "0010010";
WHEN 6 =>
cdtm <= "0000010";
WHEN 7 =>
cdtm <= "1111000";
WHEN 8 =>
cdtm <= "0000000";
WHEN 9 =>
cdtm <= "0010000";
WHEN OTHERS =>
cdtm <= "1111111";
END CASE;
END PROCESS;
END behavioral;
Analisis : Bagian diatas merupakan library apa saja yang digunakan pada percobaan kali ini.
ENTITY countdown IS
PORT (
SW, start, detik, menit, reset, clk : IN STD_LOGIC;
cdus : OUT STD_LOGIC_VECTOR (6 DOWNTO 0);
cdts : OUT STD_LOGIC_VECTOR (6 DOWNTO 0);
cdum : OUT STD_LOGIC_VECTOR (6 DOWNTO 0);
cdtm : OUT STD_LOGIC_VECTOR (6 DOWNTO 0);
v_out : OUT STD_LOGIC
);
END countdown;
Analisis : Bagian diatas merupakan pendeklarasian input dan output dari decoder.vhd. SW merupakan
switch yang bila bernilai 1 maka seluruh system berjalan. Detik digunakan untuk menambahkan waktu
untuk detik, sedangkan menit digunakan untuk menambahkan bagian waktu untuk menit. Keluaran
cdus, cdts, cdum dan cdtm merupakan keluaran hexadecimal yang terhubung dengan 7segment sehingga
bagian 7segment yang bekerja akan menyala sesuai dengan angka dari detik atau menit.
ARCHITECTURE behavioral OF countdown IS
signal count_tma: integer range 0 to 10;
signal count_uma: integer range 0 to 10;
signal count_tsa: integer range 0 to 10;
signal count_usa: integer range 0 to 10;
Analisis : Bagian diatas merupakan sinyal yang dideklarasikan secara local pada file vhdl ini saja.
Count_usa mewakili nilai satuan detik, count_tsa mewakili nilai puluhan dari nilai puluhan detik,
count_uma mewakili nilai satuan menit dan count_tma mewakili nilai puluhan menit.
BEGIN
-- Process Counting
PROCESS (detik,menit,reset,SW)
variable count_tm: integer range 0 to 10:=0;
Analisis : Pada bagian atas, menyatakan variable local count untuk dihitung mundur. Nilainya sudah
diberikan karena tidak dapat diisi melalui decoder. Count diatas menunjukan 1 menit 32 detik.
BEGIN
IF SW = '1' AND start = '0' THEN
IF (reset = '0')
THEN
count_us := 0;
count_ts := 0;
count_um := 0;
count_tm := 0;
Analisis : Bila switch aktif, start ditekan dan reset ditekan maka semua variable count akan menjadi 0.
ELSIF (clk'EVENT AND clk = '0') THEN
count_usa <= count_us;
count_tsa <= count_ts;
count_uma <= count_um;
count_tma <= count_tm;
IF (count_us /= 0) THEN
count_us := count_us - 1;
Analisis : Bila satuan detik 0 dan puluhan detik tidak, maka satuan detik akan menjadi 9 dan puluhan
akan dikurangi 1.
ELSIF (count_us = 0 AND count_ts = 0 AND count_um /= 0) THEN
count_us := 9;
count_ts := 5;
count_um := count_um - 1;
Analisis : Bila detik telah 0 maka nilai detik akan dikembalikan menjadi maksimal dan satuan menit
berkurang.
ELSIF (count_tm /= 0 AND count_um = 0 AND count_ts = 0 AND count_us = 0) THEN
count_us := 9;
count_ts := 5;
count_um := 9;
count_tm := count_tm - 1;
Analisis : Bila semua variable count selain puluhan menit telah 0, maka variable tersebut dikembalikan ke
nilai maksimal dan puluhan menit akan dikurangi 1.
ELSIF (count_tm = 0 AND count_um = 0 AND count_ts = 0 AND count_us = 0) THEN
v_out := 1;
END IF;
Analisis : Bila semua telah menjadi 0, maka sinyal yang menandakan VGA aktif akan menjadi 1.
END IF;
END IF;
END PROCESS;
Analisis : Pada bagian bawah, merupakan implementasi dari signal count dikonversi menjadi
hexadecimal agar dapat memberikan keluaran pada 7segment.
-- Output BCD 7-Seg
PROCESS(count_usa)
BEGIN
CASE (count_usa) IS
WHEN 0 =>
cdus <= "1000000";
WHEN 1 =>
cdus <= "1111001";
WHEN 2 =>
cdus <= "0100100";
WHEN 3 =>
cdus <= "0110000";
WHEN 4 =>
cdus <= "0011001";
WHEN 5 =>
cdus <= "0010010";
WHEN 6 =>
cdus <= "0000010";
WHEN 7 =>
cdus <= "1111000";
WHEN 8 =>
cdus <= "0000000";
WHEN 9 =>
cdus <= "0010000";
WHEN OTHERS =>
cdus <= "1111111";
END CASE;
END PROCESS;
PROCESS(count_tsa)
BEGIN
1
0
CASE (count_tsa) IS
WHEN 0 =>
cdts <= "1000000";
WHEN 1 =>
cdts <= "1111001";
WHEN 2 =>
cdts <= "0100100";
WHEN 3 =>
cdts <= "0110000";
WHEN 4 =>
cdts <= "0011001";
WHEN 5 =>
cdts <= "0010010";
WHEN OTHERS =>
cdts <= "1111111";
END CASE;
END PROCESS;
PROCESS(count_uma)
BEGIN
CASE (count_uma) IS
WHEN 0 =>
cdum <= "1000000";
WHEN 1 =>
cdum <= "1111001";
WHEN 2 =>
cdum <= "0100100";
WHEN 3 =>
cdum <= "0110000";
WHEN 4 =>
cdum <= "0011001";
WHEN 5 =>
cdum <= "0010010";
WHEN 6 =>
cdum <= "0000010";
WHEN 7 =>
cdum <= "1111000";
WHEN 8 =>
cdum <= "0000000";
WHEN 9 =>
cdum <= "0010000";
WHEN OTHERS =>
cdum <= "1111111";
END CASE;
END PROCESS;
PROCESS(count_tma)
BEGIN
CASE (count_tma) IS
WHEN 0 =>
cdtm <= "1000000";
WHEN 1 =>
cdtm <= "1111001";
WHEN 2 =>
cdtm <= "0100100";
WHEN 3 =>
cdtm <= "0110000";
WHEN 4 =>
cdtm <= "0011001";
WHEN 5 =>
cdtm <= "0010010";
WHEN 6 =>
cdtm <= "0000010";
WHEN 7 =>
cdtm <= "1111000";
WHEN 8 =>
cdtm <= "0000000";
WHEN 9 =>
cdtm <= "0010000";
WHEN OTHERS =>
cdtm <= "1111111";
END CASE;
END PROCESS;
END behavioral;
11