Count Up Down Fpga
Count Up Down Fpga
PIRANTI TERPROGRAM
LAPORAN
PERCOBAAN : 3
KELAS : 2 D3 EB
NRP : 1103191043
FPGA merupakan kepanjangan dari Field Programmable Gate Array yaitu programmable
device besar yang tersusun atas modul-modul logika independen yang dapat di konfigurasi oleh
pemakai yang di hubungkan melalui kanal-kanal routing yang dapat di program.
Field Programmable Gate Array (FPGA) mempunyai kelebihan sebagai berikut :
• Dikonfigurasi oleh End User
• Tidak memerlukan proses Fabrikasi
• Tersedia solusi yang mendukung chip customized VLSI
• Mampu menimplementasikan logic circuit, instant manufacturring, very-low cost
prototype
• Pemrograman yang singkat untuk fungsi dan kemampuan yang setara dengan ASIC
FPGA ini sendiri juga merupakan IC tipe HDL yang mana pemakai dapat mendesain
hardware sesuai yang diinginkan di dalam IC FPGA. Sedangkan perkembangan FPGA pada
saat ini berlangsung dengan cepat dan dewasa ini terdapat bermacam-macam keluarga FPGA
dengan kebutuhan perancangan dan perangkat perancangan ( design tools ) yang berbeda.
Xilinx merupakan salah satu perusahaan yang memproduksi FPGA disamping perusahaan lain
yang juga memproduksi FPGA seperti ACTEL dan PLESSEY Semiconductor. Xilinx sendiri
memproduksi beberapa jenis FPGA yaitu VIRTEX, SPARTAN, XC3000, XC4000 dan
XC5000.
Arsitektur FPGA
Secara umum arsitektur bagian dalam dari IC FPGA terdiri atas tiga elemen utama yaitu
Input/Output Blok ( IOB ), Configurable Logic Block (CLB) dan Interkoneksi. Configurable
Logic Blocks :
• Look up table based complex structure
• Implement the sequential circuit
Programmable Interconnect :
• Berisi wire segments dan programmable switches
• Menghubungkan anata Configurable Logic Blocks yang berbeda
Input/output block :
• Sebagai interface antara external package pin dari device dan internal user logic
Placement
After mapping the circuit into logic blocks placement algorithms are used to place
each block in the FPGA’s array
Typically these minimize the total length of interconnect required for placement
Routing software
Mengatur FPGA’s wire segments dan menentukan programmable switches untuk
menghubungkan antar FPGA blocks
Memastikan 100% connections telah terbentuk
Meminimalkan propagation delay pada time-critical connections
Programming unit
Mengkonfigurasi chip setelah placement & routing step tuntas
Keseluruhan proses memakan waktu antara beberapa menit sampai beberapa jam
1.4.Langkah Percobaan
3. Beri nama project dan letakkan project pada folder yang ditentukan serta Top-
level source type adalah HDL
4. Setting jenis FPGA dan konfigurasi lainnya sesuai gambar dibawah, dimana
Family: Spartan-3E
Package: CP132
Speed: -4
6. Selanjutnya buat file VHDL dengan cara klik kanan pada nama project,
selanjutnya pilih New Source
7. Pilih jenis source VHDL Module dan berilah nama, misalnya My_Counter
8. Selanjutnya langsung klik Next kemudian Finish, karena kita akan membuat port
secara manual dengan text.
9. Maka anda akan mendapatkan file baru (*.vhd), tetapi tanpa deskripsi port yang
akan digunakan.
10. Untuk percobaan ini kita akan membuat Counter 4-bit. Dimana input akan
didapatkan dari Switch dan Clock dari externa, Output akan ditampilkan pada
Seven-Segment. Percobaan akan dilakukan pada board Basys2 dengan IC FPGA
Spartan 3E.
library IEEE;
use
IEEE.STD_LOGIC_1164.ALL;
use
IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Decoder is
Port ( mclk : in STD_LOGIC;
Switch : in STD_LOGIC_VECTOR (7 downto 0); -- 3-bit input
Seven_Segment : out STD_LOGIC_VECTOR (0 to 6);
Led : out STD_LOGIC_VECTOR (7 downto 0) -- 8-bit output
); -- enable input
end Decoder;
begin
Led <= Switch;
reset <=
Switch(6);
end process;
--Counter
process(mclk,CE,Reset)
begin if Reset='1' then
sign_Count_Out <= "0000";
elsif(rising_edge(mclk))
then
if CE='1' then
if sign_Count_Out="1111" then
sign_Count_Out<="0000";
else
sign_Count_Out<=sign_Count_Out + 1;
end if;
end if;
end if;
end process;
13. Buat file deskripsi untuk penggunaan pin pada FPGA. Pada langkah ini Lokasi
Switch akan disetting untuk tepat terhubung dengan FPGA. Klik kanan pada
nama project, NEW Source kemudian pilih Implementation Constraints File
14. Buat file baru yang bernama my_Counter.ucf. Edit file ini menjadi seperti berikut
kemudian save:
# clock pin for Basys2 Board
16. Lakukan Generate Programming File untuk mendapatkan bit file yang akan di
upload ke FPGA. Apabila tidak ada error, maka anda akan mendapatkan bit file.
17. Sampai dengan tahap ini, anda sudah berhasil membuat file bit yang siap untuk
diupload ke FPGA.
18. Persiapkan board BASYS 2 FPGA. Hubungkan kabel USB ke board dan Switch-
On kan. Maka led merah dekat USB dan switch akan menyala.
19. Aktifkan software Adept Digilent, maka board akan otomatis dikenali oleh
software.
20. Klik Browse yang sejajar dengan FPGA XC3S dan upload file decoder.bit yang
sudah dibuat sebelumnya. Lokasi ada di folder project, misal COBA1_FPGA.
Klik Yes untuk memprogram FPGA.
21. Amati pada Board FPGA, apakah output pada Seven-segmen sesuai dengan yang
dirancang.
➢ TUGAS PRAKTIKUM 3
Tugas untuk dikerjakan di LAB
A. Rubahlah nilai batas pada “ if cntDiv = X"F00000" then”, dengan nilai yang jauh lebih
kecil dan jauh lebih besar, jelaskan apa yang terjadi?
Family: Spartan-3E
Package: CP132
Speed: -4
6. Selanjutnya membuat file VHDL dengan cara klik kanan pada nama project,
selanjutnya pilih New Source
9. Maka saya akan mendapatkan file baru (*.vhd), tetapi tanpa deskripsi port yang
akan digunakan. Sebagaimana gambar dibawah:
10. Untuk percobaan ini kita akan membuat Counter 4-bit. Dimana input akan
didapatkan dari Switch dan Clock dari externa, Output akan ditampilkan pada
Seven-Segment. Percobaan akan dilakukan pada board Basys2 dengan IC FPGA
Spartan 3E.
11. Edit VHDL code menjadi seperti berikut:
12. Melakukan pengecekan penulisan,dengan cara RUN Check Syntax sebagaimana
gambar berikut.
Lanjutkan ke langkah 13, jika tidak ada error.
13. Selanjutnya sebelum membuat file implementationnya, maka harus membuat
simulasinya menggunakan testbench terlebih dahulu agar kita tahu apakah
program sudah berjalan dengan yang diharapkan atau belum. Untuk programnya
dapat dilihat dibawah ini :
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY TB_perc1 IS
END TB_perc1;
COMPONENT percobaan1
PORT(
mclk : IN std_logic;
Switch : IN std_logic_vector(7 downto 0);
Seven_Segment : OUT std_logic_vector(0 to 6);
count_out : OUT std_logic_vector(3 downto 0);
Led : OUT std_logic_vector(7 downto 0)
);
END COMPONENT;
--Inputs
signal mclk : std_logic := '0';
signal Switch : std_logic_vector(7 downto 0) := (others => '0');
--Outputs
signal Seven_Segment : std_logic_vector(0 to 6);
signal count_out : std_logic_vector(3 downto 0);
signal Led : std_logic_vector(7 downto 0);
BEGIN
-- Stimulus process
stim_proc: process
begin
Switch(6) <= '1';
wait for 100 ns;
Switch(6) <= '0';
wait;
end process;
END;
14. Kemudian menjalankan simulate behavioral model, setelah dijalankan
simulasinya didapat hasil simulasi seperti di bawah ini
15. Membuat file deskripsi untuk penggunaan pin pada FPGA. Pada langkah ini
Lokasi Switch akan disetting untuk tepat terhubung dengan FPGA. Meng-klik
kanan pada nama project, NEW Source kemudian memilih Implementation
Constraints File
16. Saya akan mendapatkan file baru yang berformat .ucf. Mengedit file ini menjadi
seperti berikut kemudian save:
# clock pin for Basys2 Board
NET "mclk" LOC = "B8"; # Bank = 0, Signal name = MCLK
#NET "uclk" LOC = "M6"; # Bank = 2, Signal name = UCLK
NET "mclk" CLOCK_DEDICATED_ROUTE = FALSE;
#NET "uclk" CLOCK_DEDICATED_ROUTE = FALSE;
Catatan :
19. Sampai dengan tahap ini, anda sudah berhasil membuat file bit yang siap untuk
diupload ke FPGA.
20. Persiapkan board BASYS 2 FPGA. Hubungkan kabel USB ke board dan Switch-
On kan. Maka led merah dekat USB dan switch akan menyala.
21. Aktifkan software Adept Digilent, maka board akan otomatis dikenali oleh
software.
22. Klik Browse yang sejajar dengan FPGA XC3S dan upload file decoder.bit yang
sudah dibuat sebelumnya. Lokasi ada di folder project, misal COBA1_FPGA.
Klik Yes untuk memprogram FPGA.
23. Amati pada Board FPGA, rubahlah posisi Switch dan perhatikan apakah output
pada LED sesuai dengan yang dirancang.
Hasil Percobaan (Tugas 1):
Tugas untuk dikerjakan di LAB
C. Rubahlah nilai batas pada “ if cntDiv = X"F00000" then”, dengan nilai yang jauh lebih
kecil dan jauh lebih besar, jelaskan apa yang terjadi?
entity tugas3 is
Port ( mclk : in STD_LOGIC;
Switch : in STD_LOGIC_VECTOR (7 downto 0); -- 3-bit input
Seven_Segment : out STD_LOGIC_VECTOR (0 to 6);
count_out : out STD_LOGIC_VECTOR (3 downto 0);
Led : out STD_LOGIC_VECTOR (7 downto 0) -- 8-bit output
);
end tugas3;
architecture Behavioral of tugas3 is
signal sign_Count_Out : STD_LOGIC_VECTOR(3 downto 0);
signal CE,reset, UpDown: STD_LOGIC;
signal cntDiv: std_logic_vector(23 downto 0) := (OTHERS => '0'); -- general
clock div/cnt
begin
Led <= Switch;
reset <= Switch(6);
UpDown <= Switch(7);
if reset='1' then
sign_Count_Out <= "0000";
elsif(rising_edge(mclk)) then
if CE='1' then
if UpDown ='1' then
if sign_Count_Out="1111" then
sign_Count_Out<="0000";
else
sign_Count_Out <= sign_Count_Out + 1;
end if;
else
if sign_Count_Out="0000" then
sign_Count_Out<="1111";
else
sign_Count_Out<= sign_Count_Out - 1;
end if;
end if;
end if;
end if;
end process;
count_out <= sign_Count_Out;
-- Seven Segment Decoder
process (sign_Count_Out)
begin
case sign_Count_Out is
when "0000" => Seven_Segment <= "0000001"; ---0
when "0001" => Seven_Segment <= "1001111"; ---1
when "0010" => Seven_Segment <= "0010010"; ---2
when "0011" => Seven_Segment <= "0000110"; ---3
when "0100" => Seven_Segment <= "1001100"; ---4
when "0101" => Seven_Segment <= "0100100"; ---5
when "0110" => Seven_Segment <= "0100000"; ---6
when "0111" => Seven_Segment <= "0001111"; ---7
when "1000" => Seven_Segment <= "0000000"; ---8
when "1001" => Seven_Segment <= "0000100"; ---9
when "1010" => Seven_Segment <= "0001000"; ---A
when "1011" => Seven_Segment <= "1100000"; ---b
when "1100" => Seven_Segment <= "0110001"; ---C
when "1101" => Seven_Segment <= "1000010"; ---d
when "1110" => Seven_Segment <= "0110000"; ---E
when "1111" => Seven_Segment <= "0111000"; ---F
when others => Seven_Segment <= "1111111"; ---null
end case;
end process;
end Behavioral;
3. Selanjutnya melakukan pengecekan penulisan,dengan cara RUN Check Syntax
sebagaimana gambar berikut.
Jika tidak ada error dapat melanjutkan ke langkah selanjutnya, jika ada error harus
merevisi Kembali syntax yang ditulis.
4. Selanjutnya sama seperti langkah-langkah percobaan dimana kita harus membuat
simulasi test bench terlebih dahulu sebelum membuat implementasi ke hardware, agar
kita tahu apakah program sudah berjalan benar apa tidak. Untuk koding test bench dapat
dilihat seperti dibawah ini:
5. Selanjutnya membuat file deskripsi untuk penggunaan pin pada FPGA. Pada
langkah ini Lokasi Switch akan disetting untuk tepat terhubung dengan FPGA.
Meng-klik kanan pada nama project, NEW Source kemudian memilih
Implementation Constraints File
9. Selanjutnya jika semua proses sukses maka tampilan akan menjadi seperti di
bawah ini :
Family: Spartan-3E
Package: CP132
Speed: -4
Kemudian membuat New Source File untuk deskripsi port hardware yang nantinya akan
ditulis dengan syntax sebagai berikut:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity percobaan1 is
Port ( mclk : in STD_LOGIC;
Switch : in STD_LOGIC_VECTOR (7 downto 0); -- 3-bit input
Seven_Segment : out STD_LOGIC_VECTOR (0 to 6);
count_out : out STD_LOGIC_VECTOR (3 downto 0);
Led : out STD_LOGIC_VECTOR (7 downto 0) -- 8-bit output
);
end percobaan1;
architecture Behavioral of percobaan1 is
signal sign_Count_Out : STD_LOGIC_VECTOR(3 downto 0);
signal CE,reset : STD_LOGIC;
signal cntDiv: std_logic_vector(23 downto 0) := (OTHERS => '0'); -- general clock
div/cnt
begin
Led <= Switch;
reset <= Switch(6);
-- clock divider, untuk menurunkan frkuensi dari clock input (eksternal)
ckDivider: process(mclk)
begin
if mclk'event and mclk='1' then
cntDiv <= cntDiv + '1';
if cntDiv = X"1" then
CE <= '1';
cntDiv <= X"000000";
else
CE <= '0';
end if;
end if;
end process;
--Counter
process(mclk,CE,Reset)
begin
if reset='1' then
sign_Count_Out <= "0000";
elsif(rising_edge(mclk)) then
if CE='1' then
if sign_Count_Out="1111" then
sign_Count_Out<="0000";
else
sign_Count_Out <= sign_Count_Out + 1;
end if;
end if;
end if;
end process;
count_out <= sign_Count_Out;
-- Seven Segment Decoder
process (sign_Count_Out)
begin
case sign_Count_Out is
when "0000" => Seven_Segment <= "0000001"; ---0
when "0001" => Seven_Segment <= "1001111"; ---1
when "0010" => Seven_Segment <= "0010010"; ---2
when "0011" => Seven_Segment <= "0000110"; ---3
when "0100" => Seven_Segment <= "1001100"; ---4
when "0101" => Seven_Segment <= "0100100"; ---5
when "0110" => Seven_Segment <= "0100000"; ---6
when "0111" => Seven_Segment <= "0001111"; ---7
when "1000" => Seven_Segment <= "0000000"; ---8
when "1001" => Seven_Segment <= "0000100"; ---9
when "1010" => Seven_Segment <= "0001000"; ---A
when "1011" => Seven_Segment <= "1100000"; ---b
when "1100" => Seven_Segment <= "0110001"; ---C
when "1101" => Seven_Segment <= "1000010"; ---d
when "1110" => Seven_Segment <= "0110000"; ---E
when "1111" => Seven_Segment <= "0111000"; ---F
when others => Seven_Segment <= "1111111"; ---null
end case;
end process;
end Behavioral;
Setelah itu selesai selanjutnya melakukan pengecekan syntax untuk melihat apakah syntax
telah benar. Selanjutnya melakukan simulasi testbench terlebih dahulu agar mengetahui
apakah program sudah berjalan seperti yang diharapkan atau tidak sehingga resiko upload
ulang dapat diminamlisir. Hasil dari program testbench yang sudah tertera pada data hasil
praktkum terlihat seperti berikut :
Terlihat bahwa saat switch(6) atau reset bernilai ‘1’ maka tidak ada proses yang berjalan
pada sistem, namun saat reset bernilai ‘0’ maka sistem akan berjalan dengan program
counter akan menghitung dan hasil hitung tersebut disambung ke dalam seven segment
sehingga nantinya seven segment akan terlihat seperti counter yang terus menerus berjalan
dari 0 sampai 15 dan akan mengulang lagi ke 0 asalkan reset bernilai ‘0’.
Jika simulasi sudah berjalan lancer, selanjutnya membuat file Implementation Constraint
File, sebagai file inisialisasi terhadap 3 buah input dan 8 buah output, kemudia dimasukan
program dibawah ini :
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity tugas3 is
Port ( mclk : in STD_LOGIC;
Switch : in STD_LOGIC_VECTOR (7 downto 0); -- 3-bit input
Seven_Segment : out STD_LOGIC_VECTOR (0 to 6);
count_out : out STD_LOGIC_VECTOR (3 downto 0);
Led : out STD_LOGIC_VECTOR (7 downto 0) -- 8-bit output
);
end tugas3;
if reset='1' then
sign_Count_Out <= "0000";
elsif(rising_edge(mclk)) then
if CE='1' then
if UpDown ='1' then
if sign_Count_Out="1111" then
sign_Count_Out<="0000";
else
sign_Count_Out <= sign_Count_Out + 1;
end if;
else
if sign_Count_Out="0000" then
sign_Count_Out<="1111";
else
sign_Count_Out<= sign_Count_Out - 1;
end if;
end if;
end if;
end if;
end process;
count_out <= sign_Count_Out;
-- Seven Segment Decoder
process (sign_Count_Out)
begin
case sign_Count_Out is
when "0000" => Seven_Segment <= "0000001"; ---0
when "0001" => Seven_Segment <= "1001111"; ---1
when "0010" => Seven_Segment <= "0010010"; ---2
when "0011" => Seven_Segment <= "0000110"; ---3
when "0100" => Seven_Segment <= "1001100"; ---4
when "0101" => Seven_Segment <= "0100100"; ---5
when "0110" => Seven_Segment <= "0100000"; ---6
when "0111" => Seven_Segment <= "0001111"; ---7
when "1000" => Seven_Segment <= "0000000"; ---8
when "1001" => Seven_Segment <= "0000100"; ---9
when "1010" => Seven_Segment <= "0001000"; ---A
when "1011" => Seven_Segment <= "1100000"; ---b
when "1100" => Seven_Segment <= "0110001"; ---C
when "1101" => Seven_Segment <= "1000010"; ---d
when "1110" => Seven_Segment <= "0110000"; ---E
when "1111" => Seven_Segment <= "0111000"; ---F
when others => Seven_Segment <= "1111111"; ---null
end case;
end process;
end Behavioral;
Selanjutnya sama seperti percobaan yaitu melakukan simulasi testbench, untuk program
testbench terlihat seperti pada data hasil percobaan dan hasil dari testbench terlihat seperti
dibawah ini :
Terlihat pada hasil simulasi tersebut yaitu counter akan berjalan saat reset dalam keadaan
‘0’ dan saat switch(7) bernilai ‘1’ maka counter up akan terjadi dan saat switch(7) bernilai
‘0’ maka counter down akan terjadi hal itu bisa dilihat pada hasil simulasi.
Jika hasil simulasi sudah berjalan lancer maka selanjutnya membuat file Implementation
Constraint File sama seperti pada percobaan.
Setelah memasukkan koding inisiasi selanjutnya menjalankan Synthesize dan jika sudah
sukses selanjutnya meng-Generating Programming File agar mendapatkan file bit yang
siap untuk diupload pada hardware FPGA.
Untuk hasil dari program ini yaitu terlihat di bawah ini:
Switch(7) counter Seven segment (A,B,C,D,E,F,G)
‘1’ 0 0 0 0 0 0 0 0 0 0 1
0 0 0 1 1 0 0 1 1 1 1
0 0 1 0 0 0 1 0 0 1 0
0 0 1 1 0 0 0 0 1 1 0
0 1 0 0 1 0 0 1 1 0 0
0 1 0 1 0 1 0 0 1 0 0
0 1 1 0 0 1 0 0 0 0 0
0 1 1 1 0 0 0 1 1 1 1
Dst.
‘0’ 1 1 1 1 0 1 1 1 0 0 0
1 1 1 0 0 1 1 0 0 0 0
1 1 0 1 1 0 0 0 0 1 0
1 1 0 0 0 1 1 0 0 0 1
1 0 1 1 1 1 0 0 0 0 0
1 0 1 0 0 0 0 1 0 0 0
1 0 0 1 0 0 0 0 1 0 0
1 0 0 0 0 0 0 0 0 0 0
Dst.
KESIMPULAN
Setelah melakukan Percobaan dan Tugas pada praktikum ke-3 kali ini, didapat sebuah
analisa dan dari analisa itu didapat sebuah kesimpulan yaitu :
a. Field-Programmable Gate Array (FPGA) merupakan sebuah IC digital yang sering
digunakan untuk mengimplementasikan rangkaian digital.
b. Membuat program untuk FPGA menggunakan software Xilinx ISE Design Suite.
c. Sebelum diupload ke dalam FPGA, program harus telah sukses disimulasi didalam
software ISE Design Suite, sehingga tidak perlu memprogram ulang jika terdapat
kesalahan dalam program.
d. Program menggunakan bahasa VHDL.
e. Sebelum membuat file Implementation ke hardware, sebelumnya harus membuat simulasi
dari program tersebut agar dapat mengetahui apakah program yang dibuat sudah benar apa
tidak. Hal itu dilakukan agar resiko mengupload ulang program ke hardware tidak
dilakukan.
f. Percobaan membuat counter seven segment dimana menggunakan input counter 4 bit dan
7 output LED seven segment yang jika distart counter akan berjalan dari 0 sampai 15 dan
tampilannya dapat dilihat pada seven segment, untuk hasil sesuai tabel pada analisa.
g. Tugas membuat counter updown seven segment dimana menggunakan input counter 4 bit
dan 7 output LED seven segment, dimana saat switch(7) bernilai ‘1’ maka counter akan
berjalan maju dari 0 – 15 sedangkan apabila switch(7) bernilai ‘0’ maka counter akan
berjalan mundur dari 15 sampai 0.
h. Field Programmable Gate Array (FPGA) mempunyai kelebihan sebagai berikut :
• Dikonfigurasi oleh End User.
• Tidak memerlukan proses Fabrikasi.
• Tersedia solusi yang mendukung chip customized VLSI.
• Mampu menimplementasikan logic circuit, instant manufacturring, very-low cost
prototype.
• Pemrograman yang singkat untuk fungsi dan kemampuan yang setara dengan ASIC.
i. FPGA ini merupakan IC tipe HDL yang mana pemakai dapat mendesain hardware sesuai
yang diinginkan di dalam IC FPGA.