Anda di halaman 1dari 37

KEMENTRIAN RISET TEKNOLOGI DAN PENDIDIKAN TINGGI

POLITEKNIK ELEKTRONIKA NEGERI SURABAYA


ELECTRONIC ENGINERING POLYTECHNIC INSTITUTE OF SURABAYA
(EEPIS)
JL. RAYA ITS KEPUTIH SUKOLILO SURABAYA 60111 INDONESIA
TELP.(031) 5947280 FAX. (031) 5946114

Praktikum VLSI & Perancangan Logika

LAPORAN

JUDUL : Perancangan Rangkaian Kombinasional dan

Sekuensial pada Device FPGA

PERCOBAAN : 6

NAMA : Made Wira Narendra Wirsuyana

KELAS : D4 LJ Elektronika

NRP : 2122640013

DOSEN : Bapak Arif Irwansyah

TANGGAL : 8 Desember 2023


Percobaan 6
Perancangan Rangkaian Kombinasional dan Sekuensial pada divais FPGA
1.1.Tujuan :
• Mampu merancang dan mendemonstrasikan rangkaian kombinasional dan
sequential pada FPGA serta melaporkan hasil percobaannya
• Membuat rangkaian sequential counter dengan VHDL
• Membuat rangkaian kombinasional dengan VHDL
• Implementasi rancangan pada FPGA devais

1.2. Landasan Teori

Field-Programmable Gate Array (FPGA) merupakan sebuah IC digital yang sering


digunakan untuk mengimplementasikan rangkaian digital. FPGA berbentuk komponen
elektronika dan semikonduktor yang terdiri dari komponen gerbang terprogram (programmable
logic) dan sambungan terprogram (interkoneksi). Komponen gerbang terprogram yang dimiliki
meliputi jenis gerbang logika biasa (AND, OR, NOT) maupun jenis fungsi matematis dan
kombinatorik yang lebih kompleks, seperti 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). FPGA sangat sesuai untuk pemrosesan
komputasi dari algoritme integrasi numerik. Keuntungan implementasi FPGA digunakan untuk
meningkatkan efisiensi rancangan dengan cara mengurangi pemakaian pemrograman
perangkat lunak (software). FPGA mempunyai koreksi error yang kecil dan merupakan
teknologi yang bebas (technology-independent) untuk diimplementasikan dalam berbagai
algoritme. Kinerja aplikasi FPGA lebih cepat dibandingkan dengan aplikasi mikrokontroler,
karena FPGA hanya mensintesis perangkat keras (hardware) saja, sementara mikrokontroler
mengeksekusi instruksi perangkat lunak (software) yang digunakan untuk mengendalikan
perangkat keras (hardware), sehingga waktu tunda yang diimplementasikan hanya memakan
waktu tunda perambatan (propagation delay) saja. Pemodelan FPGA membutuhkan informasi
terkait dengan tingkat perbedaan abstraksi dan jenis model yang digunakan. Seorang perancang
FPGA harus mampu mengambil beberapa tahapan pemodelan untuk memastikan hasil model
rancangannya melalui model simulasi yang telah disediakan oleh vendor FPGA masing-
masing.
Pengertian terprogram (programmable) dalam FPGA adalah mirip dengan interkoneksi
saklar dalam breadboard yang bisa diubah oleh pembuat desain sesuai kebutuhan pengguna.
Dalam FPGA, interkoneksi ini bisa diprogram kembali oleh pengguna maupun pendesain di
dalam lab atau lapangan (field). Oleh karena itu jajaran gerbang logika (Gate Array) ini
disebut field-programmable. Jenis gerbang logika yang bisa diprogram meliputi semua gerbang
dasar untuk memenuhi kebutuhan yang manapun.
Vendor-vendor FPGA berbasis static random access memory (SRAM) dibuat oleh Xilinx
Inc., Altera Corp., Atmel dan Lattice Semiconductor; sedangkan, vendor-vendor FPGA
berbasis flash dan antifuse dibuat oleh Actel Corp. dan Quick Logic Corp. Pemain lainnya yang
kemudian pupus di tengah jalan diantaranya adalah Intel, Texas Instrument, Motorola, NSC,
AMD, Cypress, Philips. Pendatang dalam dunia FPGA yang telah diserap dan gagal dalam
pemasaran produknya adalah Dynachip, PlusLogic, Triscend, SiliconSpice, Chameleon,
Quicksilver, Morphics, Adaptive Silicon. Kecepatan inovasi dalam dunia FPGA ditentukan
oleh vendor yang memimpin pemasaran produknya. Dua vendor FPGA yang sering dipakai
oleh perancang adalah Xilinx, Inc. dan Altera Corp.
Alasan menggunakan FPGA :

• Memiliki kemampuan untuk menangani beban komputasi yang begitu berat


• Menghilangkan tugas-tugas intensif dari Digital Signal Processing
• Kustomisasi arsitektur agar sesuai dengan algoritme ideal.
• Mengurangi biaya sistem.
• Efisiensi biaya.

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

Gambar Arsitektur FPGA


Fungsi logika dan interkoneksi FPGA ditentukan oleh data yang tersimpan pada sel
memori statik internal. Ada beberapa cara untuk membuat data konfigurasi ke dalam sel
memori ini, baik yang dilakukan secara otomatis pada waktu catu daya diberikan maupun
dengan membaca konfigurasi data dari eksternal Serial atau byte Paralel PROM (mode master)
atau Data dapat dituliskan pada FPGA dari eksternal device ( mode slave dan peripheral).

Proses Implementasi FPGA


FPGAs diimplementasikan dengan efficient CAD systems
Design Entry dapat dilakukan dengan cara
Schematic capture program,
VHDL / Verilog
Logic Optimization
Memodifikasi Boolean Expression untuk mengooptimalkan penggunaan
Logic berbasis area dan kecepatan atau kombinasi keduanya
Technology Mapping
Transformasi dari Boolean Expression atau VHDL kedalam bentuk circuit pada
FPGA logic blocks
Area optimization – meminimalkan penggunaan block
Delay optimization – meminimalkan jumlag stage pada critical path

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

Programmable Logic - Design Flow


Design Entry dengan cara schematic, ABEL, VHDL, dan/atau Verilog.
Implementation yaitu Placement & Routing dan bitstream generation. Juga, analyze timing,
view layout,
Download meng-upload bitstream ke Hardware (FPGA chip)
Aplikasi FPGA
Prototyping
• Ideal untuk aplikasi pembuatan prototype
On-site re-configuration of hardware
• Untuk aplikasi hardware yang bisa dikonfigurasi ulang secara cepat

FPGA-based computation engines


FPGA sebagai processor aplikasi computasi
Pemrograman IC FPGA

Gambar Proses Pemrograman IC FPGA


1.3. Peralatan yang dibutuhkan
• Komputer yang sudah terinstall software XILINX ISE Design Suite 14.7 dan Adept
Digilent.
• BASYS 2 FPGA board.

1.4.Langkah Percobaan

1. Buka software ISE Design Suite 14.7

2. Klik pada tombol “New Project” untuk membuat project baru.

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

Device: XC3S100E atau XC3S250E, tergantung jenis chip board anda

Package: CP132

Speed: -4

Preferred Language: VHDL


5. Klik Next dan anda akan mendapat konfirmasi konfigurasi yang telah dilakukan.
Selanjutnya klik Finish

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.

11. Edit VHDL code menjadi seperti berikut:

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;

architecture Behavioral of Decoder is

signal sign_Count_Out : STD_LOGIC_VECTOR(3 downto 0);


signal CE,reset : STD_LOGIC;
signal cntDiv: std_logic_vector(23 downto 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"F00000" 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;

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

12. Lakukan pengecekan penulisan,dengan cara RUN Check Syntax sebagaimana


gambar berikut.

Lanjutkan ke langkah 13, jika tidak ada error.

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

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;

# Pin assignment for LEDs


NET "Led<7>" LOC = "G1" ; # Bank = 3, Signal name = LD7

NET "Led<6>" LOC = "P4" ; # Bank = 2, Signal name = LD6

NET "Led<5>" LOC = "N4" ; # Bank = 2, Signal name = LD5

NET "Led<4>" LOC = "N5" ; # Bank = 2, Signal name = LD4

NET "Led<3>" LOC = "P6" ; # Bank = 2, Signal name = LD3

NET "Led<2>" LOC = "P7" ; # Bank = 3, Signal name = LD2

NET "Led<1>" LOC = "M11" ; # Bank = 2, Signal name = LD1

NET "Led<0>" LOC = "M5" ; # Bank = 2, Signal name = LD0

# Pin assignment for SWs

NET "Switch<7>" LOC = "N3"; # Bank = 2, Signal name = SW7

NET "Switch<6>" LOC = "E2"; # Bank = 3, Signal name = SW6

NET "Switch<5>" LOC = "F3"; # Bank = 3, Signal name = SW5

NET "Switch<4>" LOC = "G3"; # Bank = 3, Signal name = SW4

NET "Switch<3>" LOC = "B4"; # Bank = 3, Signal name = SW3

NET "Switch<2>" LOC = "K3"; # Bank = 3, Signal name = SW2

NET "Switch<1>" LOC = "L3"; # Bank = 3, Signal name = SW1

NET "Switch<0>" LOC = "P11"; # Bank = 2, Signal name = SW0

# Pin assignment for DispCtl

# Connected to Basys2 onBoard 7seg display

NET "Seven_Segment<0>" LOC = "L14"; # Bank = 1, Signal name = CA

NET "Seven_Segment<1>" LOC = "H12"; # Bank = 1, Signal name = CB

NET "Seven_Segment<2>" LOC = "N14"; # Bank = 1, Signal name = CC

NET "Seven_Segment<3>" LOC = "N11"; # Bank = 2, Signal name = CD

NET "Seven_Segment<4>" LOC = "P12"; # Bank = 2, Signal name = CE


NET "Seven_Segment<5>" LOC = "L13"; # Bank = 1, Signal name = CF

NET "Seven_Segment<6>" LOC = "M12"; # Bank = 1, Signal name = CG

#NET "dp" LOC = "N13"; # Bank = 1, Signal name = DP

15. Selanjutnya RUN Synthesize

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.
1.5. Data Hasil Percobaan dan Tugas
Hasil Percobaan :
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?
- Yang terjadi adalah proses counting akan semakin lambat saat nilai
tersebut diperbesar, dan semakin cepat saat counting diperkecil.
b. Edit kode VHDL untuk mendapatkan rangkaian UP-Down counter. Gunakan
Switch(7) sebagai pengatur counter up atau down.
c. Membuat counter dari 0 sampai 9999.
d. Membuat counter dengan kelipatan, dari switch 0 dan 1 jika bernilai 01 maka
kelipatan 1, jika 10 maka kelipatan 2, dan terakhir 11 maka kelipatan 3.

Informasi, tambahan untuk tugas:


1. Langkah-langkah awal dalam pembuatan file sama dengan langkah-langkah
seperti pada “Percobaan 1” yaitu langkah 1 sampai langkah 10 kemudian
menuliskan syntax seperti pada langkah di bawah.
2. Berikut syntax dari program tugas percobaan A, B, C :
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 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
5. Berikut koding Implementation Constraints File yang diketikan pada TUGAS 1 :
# 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;

# Pin assignment for LEDs

NET "Led<7>" LOC = "G1" ; # Bank = 3, Signal name = LD7

NET "Led<6>" LOC = "P4" ; # Bank = 2, Signal name = LD6

NET "Led<5>" LOC = "N4" ; # Bank = 2, Signal name = LD5

NET "Led<4>" LOC = "N5" ; # Bank = 2, Signal name = LD4

NET "Led<3>" LOC = "P6" ; # Bank = 2, Signal name = LD3

NET "Led<2>" LOC = "P7" ; # Bank = 3, Signal name = LD2

NET "Led<1>" LOC = "M11" ; # Bank = 2, Signal name = LD1

NET "Led<0>" LOC = "M5" ; # Bank = 2, Signal name = LD0

# Pin assignment for SWs

NET "Switch<7>" LOC = "N3"; # Bank = 2, Signal name = SW7

NET "Switch<6>" LOC = "E2"; # Bank = 3, Signal name = SW6

NET "Switch<5>" LOC = "F3"; # Bank = 3, Signal name = SW5

NET "Switch<4>" LOC = "G3"; # Bank = 3, Signal name = SW4

NET "Switch<3>" LOC = "B4"; # Bank = 3, Signal name = SW3

NET "Switch<2>" LOC = "K3"; # Bank = 3, Signal name = SW2

NET "Switch<1>" LOC = "L3"; # Bank = 3, Signal name = SW1

NET "Switch<0>" LOC = "P11"; # Bank = 2, Signal name = SW0

# Pin assignment for DispCtl


# Connected to Basys2 onBoard 7seg display

NET "Seven_Segment<0>" LOC = "L14"; # Bank = 1, Signal name = CA

NET "Seven_Segment<1>" LOC = "H12"; # Bank = 1, Signal name = CB

NET "Seven_Segment<2>" LOC = "N14"; # Bank = 1, Signal name = CC

NET "Seven_Segment<3>" LOC = "N11"; # Bank = 2, Signal name = CD

NET "Seven_Segment<4>" LOC = "P12"; # Bank = 2, Signal name = CE

NET "Seven_Segment<5>" LOC = "L13"; # Bank = 1, Signal name = CF

NET "Seven_Segment<6>" LOC = "M12"; # Bank = 1, Signal name = CG

#NET "dp" LOC = "N13"; # Bank = 1, Signal name = DP

NET "DSatuan" LOC = "K14"; # Bank = 2, Signal name = CD

NET "DPuluhan" LOC = "M13"; # Bank = 2, Signal name = CE

NET "DRatusan" LOC = "J12"; # Bank = 1, Signal name = CF

NET "DRibuan" LOC = "F12"; # Bank = 1, Signal name = CG

6. Selanjutnya Run Synthesize


7. Melakukan Generate Programming File untuk mendapatkan bit file yang akan
di upload ke FPGA. Apabila tidak ada error, maka file bit akan didapatkan.

8. Selanjutnya jika semua proses sukses maka tampilan akan menjadi seperti di
bawah ini :

Selanjutnya hanya tingggal mengupload file bit ke dalam hardware.


9. Untuk tugas D yaitu membuat counter dengan kelipatan tergantung dari input
switch dilakukan dengan memodifikasi program VHDL menjadi seperti di bawah
ini:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity my_counter 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
DSatuan,DPuluhan,DRatusan,DRibuan : out std_logic
);
end my_counter;

architecture Behavioral of my_counter is


signal sign_Count_Out : STD_LOGIC_VECTOR(3 downto 0);
signal CE, CE1, reset : STD_LOGIC;
signal cntDiv, cntDiv1: std_logic_vector(23 downto 0); -- general clock div/cnt
signal up_down : STD_LOGIC;
signal satuan : STD_LOGIC_VECTOR(3 downto 0);
signal puluhan : STD_LOGIC_VECTOR(3 downto 0);
signal ratusan : STD_LOGIC_VECTOR(3 downto 0);
signal ribuan : STD_LOGIC_VECTOR(3 downto 0);
signal SelectSegment : STD_LOGIC_VECTOR(1 downto 0);
signal increment : STD_LOGIC_VECTOR(1 downto 0);

begin
Led <= Switch;
reset <= Switch(6);
up_down <= Switch(7);
increment <= Switch(1 downto 0);

-- clock divider, untuk menurunkan frkuensi dari clock input (eksternal)


ckDivider: process(mclk)
begin
if mclk'event and mclk='1' then
cntDiv <= cntDiv + '1';
cntDiv1 <= cntDiv1 + '1';
if cntDiv = X"F00000" then
CE <= '1';
cntDiv <= X"000000";
else
CE <= '0';
end if;
if cntDiv1 = X"040000" then
CE1 <= '1';
cntDiv1 <= X"000000";
else
CE1 <= '0';
end if;
end if;
end process;
-- Counter
process(mclk, CE, reset, up_down, increment)
begin
if reset = '1' then
satuan <= "0000";
puluhan <= "0000";
ratusan <= "0000";
ribuan <= "0000";
elsif rising_edge(mclk) then
if CE = '1' then
if up_down = '1' then -- Up Counter
if increment = "01" then
satuan <= satuan + 1;
if satuan = "1001" then
satuan <= "0000";
puluhan <= puluhan + 1;
end if;
elsif increment = "10" then
satuan <= satuan + 2;
if satuan = "1000" then
satuan <= "0000";
puluhan <= puluhan + 1;
elsif satuan = "1001" then
satuan <= "0001";
puluhan <= puluhan + 1;
end if;
elsif increment = "11" then
satuan <= satuan + 3;
if satuan = "0111" then
satuan <= "0000";
puluhan <= puluhan + 1;
elsif satuan = "1000" then
satuan <= "0001";
puluhan <= puluhan + 1;
elsif satuan = "1001" then
satuan <= "0010";
puluhan <= puluhan + 1;
end if;
end if;
if puluhan = "1001" then
puluhan <= "0000";
ratusan <= ratusan + 1;
if ratusan = "1001" then
ratusan <= "0000";
ribuan <= ribuan + 1;
if ribuan = "1001" then
satuan <= "0000";
puluhan <= "0000";
ratusan <= "0000";
ribuan <= "0000";
end if;
end if;
end if;
end if;
end if;
end if;
end process;
process(mclk,satuan,puluhan,ratusan,ribuan,CE)
BEGIN
if (rising_edge(mclk)) then
if CE1='1' then
if(SelectSegment = "11") then
SelectSegment <= "00";
else
SelectSegment <= SelectSegment + 1;
end if;

if(SelectSegment = "00") then -- satuan


DSatuan <= '1';
DPuluhan <= '1';
DRatusan <= '1';
DRibuan <= '0';
if(satuan = "0000") then
Seven_Segment <= "0000001";
elsif(satuan = "0001") then
Seven_Segment <= "1001111";
elsif(satuan = "0010") then
Seven_Segment <= "0010010";
elsif(satuan = "0011") then
Seven_Segment <= "0000110";
elsif(satuan = "0100") then
Seven_Segment <= "1001100";
elsif(satuan = "0101") then
Seven_Segment <= "0100100";
elsif(satuan = "0110") then
Seven_Segment <= "0100000";
elsif(satuan = "0111") then
Seven_Segment <= "0001111";
elsif(satuan = "1000") then
Seven_Segment <= "0000000";
elsif(satuan = "1001") then
Seven_Segment <= "0000100";
else end if;

elsif(SelectSegment = "01") then -- puluhan


DSatuan <= '1';
DPuluhan <= '1';
DRatusan <= '0';
DRibuan <= '1';
if(puluhan = "0000") then
Seven_Segment <= "0000001";
elsif(puluhan = "0001") then
Seven_Segment <= "1001111";
elsif(puluhan = "0010") then
Seven_Segment <= "0010010";
elsif(puluhan = "0011") then
Seven_Segment <= "0000110";
elsif(puluhan = "0100") then
Seven_Segment <= "1001100";
elsif(puluhan = "0101") then
Seven_Segment <= "0100100";
elsif(puluhan = "0110") then
Seven_Segment <= "0100000";
elsif(puluhan = "0111") then
Seven_Segment <= "0001111";
elsif(puluhan = "1000") then
Seven_Segment <= "0000000";
elsif(puluhan = "1001") then
Seven_Segment <= "0000100";
else end if;

elsif(SelectSegment = "10") then -- ratusan


DSatuan <= '1';
DPuluhan <= '0';
DRatusan <= '1';
DRibuan <= '1';
if(ratusan = "0000") then
Seven_Segment <= "0000001";
elsif(ratusan = "0001") then
Seven_Segment <= "1001111";
elsif(ratusan = "0010") then
Seven_Segment <= "0010010";
elsif(ratusan = "0011") then
Seven_Segment <= "0000110";
elsif(ratusan = "0100") then
Seven_Segment <= "1001100";
elsif(ratusan = "0101") then
Seven_Segment <= "0100100";
elsif(ratusan = "0110") then
Seven_Segment <= "0100000";
elsif(ratusan = "0111") then
Seven_Segment <= "0001111";
elsif(ratusan = "1000") then
Seven_Segment <= "0000000";
elsif(ratusan = "1001") then
Seven_Segment <= "0000100";
else end if;

elsif(SelectSegment = "11") then -- ribuan


DSatuan <= '0';
DPuluhan <= '1';
DRatusan <= '1';
DRibuan <= '1';
if(ribuan = "0000") then
Seven_Segment <= "0000001";
elsif(ribuan = "0001") then
Seven_Segment <= "1001111";
elsif(ribuan = "0010") then
Seven_Segment <= "0010010";
elsif(ribuan = "0011") then
Seven_Segment <= "0000110";
elsif(ribuan = "0100") then
Seven_Segment <= "1001100";
elsif(ribuan = "0101") then
Seven_Segment <= "0100100";
elsif(ribuan = "0110") then
Seven_Segment <= "0100000";
elsif(ribuan = "0111") then
Seven_Segment <= "0001111";
elsif(ribuan = "1000") then
Seven_Segment <= "0000000";
elsif(ribuan = "1001") then
Seven_Segment <= "0000100";
else end if;
end if;
end if;
end if;
end process;
end Behavioral;
10. Untuk hasilnya saat switch 1 dan 0 bernilai “01” maka counting berkelipatan 1,
saat switch bernilai “10” maka counting berkelipatan 2, dan terakhir saat switch
bernilai “11” maka counting berkelipatan 3.
11. Hasil demo :
1.6. Analisa dan Kesimpulan
ANALISA
Pada praktikum piranti terprogram ini, saya melakukan percobaan “Sekuensial dan
Kombinasional pada FPGA”. Dengan melakukan percobaan ini maka saya diharapkan mampu
merancang dan mendemonstrasikan rangkaian kombinasional dan sekuensial pada FPGA,
membuat rangkaian sekuensial counter dengan VHDL, membuat rangkaian kombinasional
dengan VHDL, dan mengimplementasikan rancangan pada device FPGA . Seperti yang kita
tahu Field-Programmable Gate Array (FPGA) merupakan sebuah IC digital yang sering
digunakan untuk mengimplementasikan rangkaian digital. FPGA berbentuk komponen
elektronika dan semikonduktor yang terdiri dari komponen gerbang terprogram (programmable
logic) dan sambungan terprogram (interkoneksi) atau 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.
Pada praktikum ini terdapat 2 percobaan, hal pertama yang saya kerjakan yaitu membuat
rangkaian counter 4 bit yang terhubung dengan seven segment. Hal yang saya lakukan paling
awal yaitu membuat “New Project” pada software ISE Design Suite dan kemudian memberikan
nama file dan mensetting Top-level source type-nya HDL, selanjutnya mengatur format
konfigurasi file sebagai berikut:

Family: Spartan-3E

Device: XC3S100E atau XC3S250E, tergantung jenis chip board anda

Package: CP132

Speed: -4

Preferred Language: VHDL

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.
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 :

# 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;

# Pin assignment for LEDs


NET "Led<7>" LOC = "G1" ; # Bank = 3, Signal name = LD7
NET "Led<6>" LOC = "P4" ; # Bank = 2, Signal name = LD6
NET "Led<5>" LOC = "N4" ; # Bank = 2, Signal name = LD5
NET "Led<4>" LOC = "N5" ; # Bank = 2, Signal name = LD4
NET "Led<3>" LOC = "P6" ; # Bank = 2, Signal name = LD3
NET "Led<2>" LOC = "P7" ; # Bank = 3, Signal name = LD2
NET "Led<1>" LOC = "M11" ; # Bank = 2, Signal name = LD1
NET "Led<0>" LOC = "M5" ; # Bank = 2, Signal name = LD0

# Pin assignment for SWs


NET "Switch<7>" LOC = "N3"; # Bank = 2, Signal name = SW7
NET "Switch<6>" LOC = "E2"; # Bank = 3, Signal name = SW6
NET "Switch<5>" LOC = "F3"; # Bank = 3, Signal name = SW5
NET "Switch<4>" LOC = "G3"; # Bank = 3, Signal name = SW4
NET "Switch<3>" LOC = "B4"; # Bank = 3, Signal name = SW3
NET "Switch<2>" LOC = "K3"; # Bank = 3, Signal name = SW2
NET "Switch<1>" LOC = "L3"; # Bank = 3, Signal name = SW1
NET "Switch<0>" LOC = "P11"; # Bank = 2, Signal name = SW0

# Pin assignment for DispCtl


# Connected to Basys2 onBoard 7seg display
NET "Seven_Segment<0>" LOC = "L14"; # Bank = 1, Signal name = CA
NET "Seven_Segment<1>" LOC = "H12"; # Bank = 1, Signal name = CB
NET "Seven_Segment<2>" LOC = "N14"; # Bank = 1, Signal name = CC
NET "Seven_Segment<3>" LOC = "N11"; # Bank = 2, Signal name = CD
NET "Seven_Segment<4>" LOC = "P12"; # Bank = 2, Signal name = CE
NET "Seven_Segment<5>" LOC = "L13"; # Bank = 1, Signal name = CF
NET "Seven_Segment<6>" LOC = "M12"; # Bank = 1, Signal name = CG
#NET "dp" LOC = "N13"; # Bank = 1, Signal name = DP

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.

INPUT OUTPUT
(counter) (seven segment)
A B C D E F G
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
1 0 0 0 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 1 0 0
1 0 1 0 0 0 0 1 0 0 0
1 0 1 1 1 1 0 0 0 0 0
1 1 0 0 0 1 1 0 0 0 1
1 1 0 1 1 0 0 0 0 1 0
1 1 1 0 0 1 1 0 0 0 0
1 1 1 1 0 1 1 1 0 0 0
Selanjutnya hal ke-2 yang saya kerjakan yaitu membuat counter up dan counter down,
dimana langkah-langkah awal sama seperti percobaan 1, yang berbeda hanya kodingan seperti
yang ditunjukkan pada hasil 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.
Pada tugas C dan D di percobaan ini membuat 2 counter yang pertama untuk proses
counting kemudian yang kedua sebagai selector dari 7 segment mana yang aktif, kemudian
nantinya proses counting akan berjalan sesuai dengan switch yang aktif apakah 01, 10, dan 11
dimana setiap switch tersebut mempunyai program counter yang berbeda seperti yang terlihat
pada program hasil percobaan untuk tugas C dan D.
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.

Anda mungkin juga menyukai