Anda di halaman 1dari 24

FOTO

MODUL 4 RANGKAIAN LOGIKA SEKUENSIAL

Shafira Rahmania Adi Cahyani (13221053)


Asisten: Diaz Zaid Abdurrahman/ 13219028
Tanggal Percobaan: 08/11/2022
EL2102-Praktikum Sistem Digital
Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB

Abstrak irio dengan mesin yang beroperasi dengan urutan


state.
Praktikum Sistem Digital Modul 4 berisi tentang Rangkaian
Logika Sekuensial dan pengaplikasiannya pada FPGA dan Level abstraksi perancangan FSM pun bertingkat-
VGA driver. Praktikan akan mempelajari rangkaian logika tingkat. Pada pratikum kali ini disarankan
sekuensial yaitu rangkaian mealy dan rangkaian moore. menggunakan level abstraksi behavioural. Pada
Penerapan dari pemahaman rangkaian sekuensial akan perancangan dengan level ini, sebelum
dibuktikan dengan mencoba membuat rambu lalu lintas dan mengimplementasikan menggunakan VHDL,
kalkulator melalui rangkaian mealy dan diaplikasikan pada praktikan cukup membuat state diagram atau flow
FPGA dan VGA Driver. chart transisi statenya. Pada praktikum kali ini
akan dicontohkan cara membuat FSM dengan
Kata kunci: Sekuensial, FSM, VGA Driver,
menggunakan state diagram. Komponen-
Kalkulator
komponen yang harus ada pada state diagram
1. PENDAHULUAN adalah deklarasi input dan output, definisi state,
transisi, dan keluarannya.
Tujuan dari percobaan pada modul ini adalah
Gambar dibawah adalah contoh gambar state
sebagai berikut.
diagram FSM Mealy dan implementasinya dalam
• Mendesain sekuensial rangkaian untuk im VHDL.
plementasi didalam FPGA.
• Mengenal dan memahami cara mengguna
kan hierarki dalam desain rangkaian.
• Mengenal dan memahami cara mengguna
kan FPGA sebagai prototype system untu
k memverifikasi fungsi rangkaian.
Pada modul ini, ada 4 percobaan yaitu percobaan
implementasi desain FSM pada FPGA, Gambar 2-1 Contoh bentuk FSM mealy
implementasi modul VGA Driver,
menggabungkan desain FSM dengan VGA Driver,
dan merancang kalkulator untuk melakukan
operasi spesifik (FPB dan Modulo)

2. STUDI PUSTAKA
Pada praktikum kali ini praktikan akan mencoba
merancangan rangkaian sekuensial. Perbedaan
mendasar rangkaian kombinasional dengan
rangkaian sekuensial adalah ada tidaknya memory
statenya. Keluaran rangkaian sekuensial
bergantung pada statw dan bergantung pada
masukannya (rangkaian Mealy) atau hanya
bergantung pada statenya (rangkaian Moore).
Terdapat perbedaan beberapa model yang
digunakan untuk membantu erancang rangkaian
sekuensial. Salah satunya yang paling banyak
digunakan adalah Finite State Machine (FSM).
Dinamakan FSM karena jumlah state yang
mungkin terbatas dan rangkaian sekuensial bekerja
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 1
b. Percobaan 4B

Buat folder sebagai direktori kerja


baru, buat project baru dengan
modul-modul yang disediakan untuk
praktikum ("display_DE1.rar")

Gambar 2-2 Implementasi FSM Mealy dalam VHDL

3. METODOLOGI
Implementasikan desain tersebut
Pada saat percobaan, praktikan menggunakan alat pada FPGA dengan pin planner yang
sudah diunduh (deklarasi pin dapat
dan komponen sebagai berikut: dilihat di file "qsf").
1. Komputer/PC yang telah terinstal
program Quartus II 9.0
2. Monitor LCD
3. FPGA development board, tipe ALTERA Lakukan beberapa perubahan posisi
DE1 beserta perlengkapannya yang wsitch pada board FPGA untuk
meliputi: melihat efek dan perubahannya
pada layar LCD! pelajari input dan
keluaran dari desain tersebut untuk
a. Board FPGA tipe DE1 selanjutnya digabungkan dengan
modul FSM yang telah dibuat.
b. Catu daya + kabel dan konektor
tambahan
Gambar 3-2 Diagram alur percobaan 4B
c. Kabel USB‐Blaster
c. Percobaan 4C
Percobaan-percobaan pada modul ini dilakukan
sebagai berikut:
Hubungkan keluaran FSM dengan
a. Percobaan 4A masukan modul VGA. Lakukan
compile dan download gabungan
desain FSM dan modul VGA ke
Buat folder sebagai direktori dalam board FPGA. Amati hasil
kerja baru untuk praktikum yang didapat.
modul ini lalu copy script
yang sudah dikerjakan saat
TP ke dalam folder tersebut. Gambar 3-3 Diagram alur percobaan 4C

Jalankan Program ALTERA


QUARTUS, kemudian buka
file yang berisi script tadi

Implementasi desain FSM


dengan keluaran pada LED
FPGA

Gambar 3-1 Diagram alur membuka percobaan 4A

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 2


d. Percobaan 4D didapatkan hasil gelombang berupa
waveform sebagai berikut:

Buat file-file VHDL untuk


masing-masing blok dengan
script yang sudah tersedia pada
Buat project baru pada folder modul dan simpan dalam
yang berbeda dengan folder project yang sudah
percobaan-percobaan dibuat. Nama masing-masing
sebelumnya. file harus sama dengan entity.
(terdapat 6 file yaitu kalkulator,
mux, comparator, register,
subtractor, dan fsm.

Lakukan kompilasi Analysis & Lakukan kompilasi secara Gambar 4-2 Waveform Percobaan 4A
Synthesis menyeluruh

Saat percobaan dilakukan di dalam Laboratorium,


praktikan menemukan masalah saat
menghubungkan PC ke FPGA karena PC yang
Lakukan langkah-langkah
sebelumnya untuk kalkulator
digunakan belum ter-install USB Blaster sehingga
Lakukan simulasi timing untuk
beberapa nilai input
operasi modulo, modifikasi
terlebih dahulu program pada
memakan waktu yang cukup lama. Setelah itu,
blok fsm. praktikan membuat script VHDL dengan asumsi
bahwa emergency berupa button bukan switch
sehingga terdapat perbedaan pada keluaran FPGA.
Gambar 3-4 Diagram alur percobaan 4D
Percobaan 4A tidak berjalan dengan lancar.
Namun, praktikan mencari tahu secara teoritis
melalui Bahasa VHDL yang telah dibuat.
4. HASIL DAN ANALISIS Implementasi FSM ke FGPA yang seharusnya
adalah sebagai berikut:
a. Percobaan 4A
Pada percobaan 4A, praktikan sudah
membuat FSM kasus rambu lalu lintas
pada tugas pendahuluan dengan ilustrasi
sebagai berikut:

Gambar 4-3 Implementasi FSM dengan Keluaran LED


FPGA

Durasi LED Hasil


(detik)
(7 Segment) (State)

US BT

Mode H_US = 0
Gambar 4-1 Gambar FSM Rambu Lalu Lintas malam:
M_BT = 0
t<8
Selain itu, praktikan juga sudah
melakukan pencarian waveform dengan Mode
pendekatan VHDL. Dalam kasus lampu siang:
lalu lintas, praktikan menggunakan 3 blok t<4
yaitu FSM, Clockdiv, dan trafficlight
sebagai top level. Bahasa VHDL untuk Mode K_US = 0
percobaan 4A, 4B, dan 4C akan malam:
ditampilkan pada lampiran. Dari M_BT = 0
percobaan yang sudah dilakukan, t<1

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 3


Mode b. Percobaan 4B
siang:
Pada percobaan 4B, file .vhd dan .qsf sudah
t<2 disediakan pada modul dan hanya perlu diunduh
dengan nama (“display_DE1.rar”). File-file
Mode M_US = 0 tersebut dikompilasi terlebih dahulu supaya dapat
malam: diimplementasikan pada VGA driver dan FPGA.
H_BT = 0
Switch yang digunakan pada percobaan 4B adalah
t<8
Switch 0 – Switch 5 ( SW1[0] – SW1[5]). Percobaan
Mode ini bertujuan untuk membuktikan bahwa model
siang: VGA, FPGA, dan layar monitor dapat terhubung.
Output yang dihasilkan akan keluar pada layar
t<4
LCD komputer Laboratorium. Berikut merupakan
blok diagram dari percobaan 4B.
Mode M_US = 0
malam:
K_BT = 0
t<1
FPGA
Mode FSM Display
siang: _VHD
t<2 MONITOR
LCD
Mode K_US = 0 Encounter VGA

darurat
K_BT = 0
menyala
( t = 4) Gambar 4-4 Blok diagram sederhana terkait hubungan
FPGA, VGA, dan monitor
Mode Semua
darurat lampu mati Berdasarkan blok diagram yang telah ditunjukkan
Kembali (= 1) pada gambar 4-4, berikut merupakan beberapa
ke awal hasil percobaan 4B.

Tabel 4-1 Hasil yang dapat diperoleh percobaan 4A

Switch yang Lampu


Pada tabel 4-1, FSM sudah sesuai dengan
menyala
implementasi FPGA. FPGA menggunakan
pendekatan active low sehingga lampu
menyala dengan logika = 0. Pada saat mode SW1[0] M_US
malam, ketika waktu dibawah 8 detik, lampu
merah pada Utara Selatan dan lampu hijau SW1[1] K_US
pada Barat Timur akan menyala, begitu pula
sebaliknya. Pada saat transisi dari lampu hijau SW1[2] H_US
ke lampu merah, lampu kuning akan menyala
selama 2 detik sehingga ada kondisi saat lampu SW1[3] M_BT
kuning di salah satu sisi menyala, lampu merah
juga menyala. Pada kondisi darurat, salah satu SW1[4] K_BT
switch akan dinyalakan dan dengan adanya
clockdiv, maka lampu kuning akan otomatis SW1[5] H_BT
menyala selama 4 detik. Setelah 4 detik berjalan,
Tabel 4-2 Keterangan Switch dan Keluaran lampu
lampu lalu lintas akan otomatis mati dan
Kembali ke setelah awal.

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 4


Gambar 4-8 Gambar SW1[3] = 1
Gambar 4-5 Gambar SW1[0] = 1

Gambar 4-9 Gambar SW1[4] = 1


Gambar 4-6 Gambar SW1[1] = 1

Gambar 4-10 Gambar SW1[5] = 1


Gambar 4-7 Gambar SW1[2] = 1

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 5


Durasi LED Hasil
(detik)
(7 Segment) (State)

US BT

Mode H_US = 0
malam:
M_BT = 0
t<8
Mode
siang:
t<4
Gambar 4-11 Gambar SW1[0], SW1[1], SW1[2] = 1
Mode K_US = 0
malam:
M_BT = 0
t<1
Mode
siang:
t<2

Mode M_US = 0
malam:
H_BT = 0
t<8
Mode
siang:
Gambar 4-12 Gambar SW1[3], SW1[4], SW1[5] = 1 t<4

Dengan percobaan 4B, implementasi FSM pada Mode M_US = 0


lampu lalu lintas dapat menggunakan VGA driver malam:
supaya hasilnya lebih tergambarkan. K_BT = 0
t<1
Mode
c. Percobaan 4C siang:
Percobaan 4C merupakan gabungan dari t<2
percobaan 4A dan 4B sehingga untuk
menyelesaikan percobaan 4C, praktikan perlu Mode K_US = 0
untuk menyelesaikan percobaan 4A. Karena darurat
praktikan belum berhasil melakukan percobaan 4A, K_BT = 0
menyala
maka praktikan hanya dapat menyimpulkan hasil ( t = 4)
percobaan 4C dengan hasil teoritis yang praktikan
dapatkan dari percobaan 4A.
Karena praktikan berhasil menyelesaikan Mode Semua
percobaan 4B, maka hasil percobaan 4C dapat darurat lampu
dianalisis melalui hasil teoritis percobaan 4A dan Kembali mati (= 1)
digabung dengan pembuktian percobaan 4B. Oleh ke awal
karena itu, berikut merupakan tabel hasil
percobaan 4C yang didapatkan secara teoritis.
Tabel 4-3 Hasil yang dapat diperoleh percobaan 4C

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 6


d. Percobaan 4D
Pada percobaan 4D, praktikan membuat dua
jenis kalkulator dengan fungsi spesifik yaitu
kalkulator FPB (Faktor Persekutuan Terbesar)
dan modulo (sisa pembagian).
Kalkulator ini akan menggunakan 6 blok yaitu
blok kalkulator (sebagai top level), subtractor Gambar 4-15 FSM Kalkulator Modulo
(pengurangan), comparator (komparasi), mux
(selector), regis (register), dan fsm (controller). FSM pada kedua kalkulator menggunakan FSM
Blok untuk kalkulator FPB sudah disediakan di mealy karena kalkulator menggunakan rangkaian
modul dan akan ditampilkan pada lampiran. sekuensial yang bergantung pada state dan
masukannya. Hal ini terbukti melalui waveform
Percobaan ini akan melihat output dari yang berhasil didapatkan praktikan Ketika
kalkulator bedasarkan waveform secara timing. melakukan simulasi secara timing, berikut
Untuk melakukan operasi dalam kalkulator, merupakan gambarnya.
berikut merupakan FSM serta diagram blok
dari kalkulator FPB dan modulo.

Gambar 4-16 Waveform kalkulator FPB

Gambar 4-13 Blok Diagram Kalkulator FPB


(Sumber: http://esd.cs.ucr.edu/)

Gambar 4-16 Waveform kalkulator modulo

5. KESIMPULAN
Dari percobaan yang telah dilakukan, praktikan
dapat membuat kesimpulan sebagai berikut.
1. Rangkaian logika sekuensial adalah
rangkaian yang bergantung pada state
sebelumnya sehingga terdapat memori
yang menyimpan output sementara untuk
dijadikan input (looping).
2. Rangkaian logika sekuensial dapat
diimplementasikan ke dalam FPGA seperti
simulasi lampu lalu lintas dan kalkulator
Gambar 4-14 FSM Kalkulator FPB spesifik.
3. FSM (Finite State Machine) merupakan
salah satu model hierarki dalam rangkaian

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 7


logika sekuensial yang memudahkan
seseorang dalam mendesain rangkaian
logika sekuensial.
4. FPGA berfungsi sebagai salah satu
prototype system untuk memverifikasi
fungsi rangkaian serta VGA driver dapat
membantu rangkaian untuk mengeluarkan
hasil output ke dalam monitor.

DAFTAR PUSTAKA
[1] Alexander, Charles K, dan Sadiku, Matthew
N.O,Fundamental of Electric Circuit Fifth Edition,
2013
[2] http://esd.cs.ucr.edu/, 10 November 2022,
02.51
[3] Hutabarat, Mervin T, dkk, Petunjuk Praktikum
RangkaiaN Elektrik, 2022

Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 8


LAMPIRAN

1. Source code percobaan 4A


trafficlight.vhd (top level)
library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity trafficlight is

port ( internal_clk : in std_logic;

mode_darurat : in std_logic;

mode_siang : in std_logic;

M_US, K_US, H_US, M_BT, K_BT, H_BT : out std_logic);

end trafficlight;

architecture structural of trafficlight is

component CLOCKDIV is

port( CLK : in std_logic;

DIVOUT : buffer BIT);

end component;

component FSM is

port (

counter_clk : in std_logic;

mode_darurat : in std_logic;

mode_siang : in std_logic;

M_US, K_US, H_US, M_BT, K_BT, H_BT : out std_logic);

end component;

M_BT, K_BT =>

K_BT, H_BT => H_BT);

end structural;
Clockdiv.vhd

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
entity CLOCKDIV is
port(
CLK : IN std_logic;
DIVOUT : buffer BIT);
end CLOCKDIV;
architecture behavioural of CLOCKDIV is
begin
PROCESS(CLK)
variable count: integer:=0;
constant div: integer:=50000000;
begin
if (CLK'event) and (CLK='1') then
if(count<div) then
count:=count+1;
if(DIVOUT='0') then
DIVOUT<='0';
elsif(DIVOUT='1') then
DIVOUT<='1';
end if;
else
if(DIVOUT='0') then
DIVOUT<='1';
elsif(DIVOUT='1') then
DIVOUT<='0';
end if;
count:=0;
end if;
end if;
end process;
end behavioural;
Fsm.vhd

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity FSM is

port (

counter_clk : in std_logic;

mode_darurat : in std_logic;

mode_siang: in std_logic; -- mode_malam saat mode_siang = '0'

M_US, K_US, H_US, M_BT, K_BT, H_BT : out std_logic);

end FSM;

architecture behavioral of FSM is

type state is (s0, s1, s2, s3, s4, s5);

signal currentstate : state;

signal count : integer := 0;

begin

process(counter_clk, mode_darurat, mode_siang)

begin

if (mode_darurat = '1') then

if (count < 4) then

if ((count = 0) or (count = 2)) then

currentstate <= s4;

count <= count + 1;

elsif ((count = 1) or (count = 3 )) then

currentstate <= s5;

count <= count + 1;

end if;
else

currentstate <= s0;

count <= 0;

end if;

elsif ((counter_clk'event and counter_clk = '1') and (mode_siang = '1'))

then

case currentstate is

when s0 =>

if (count < 8) then

currentstate <= s0;

count <= count + 1;

else

currentstate <= s1;

count <= 0;

end if;

when s1 =>

if (count < 2) then

currentState <= s1;

count <= count + 1;

else

currentstate <= s2;

count <= 0;

end if;

when s2 =>

if (count < 8) then

currentstate <= s2;

count <= count + 1;

else

currentstate <= s3;

count <= 0;

end if;
when s3 =>
if (count < 2) then
currentstate <= s3;
count <= count + 1;
else
currentstate <= s0;
count <= 0;
end if;
when others =>
currentstate <= s0;
end case;
elsif ((counter_clk'event and counter_clk = '1') and (mode_siang = '0'))
then
case currentstate is
when s0 =>
if (count < 4) then
currentstate <= s0;
count <= count + 1;
else
currentstate <= s1;
count <= 0;
end if;
when s1 =>
if (count < 1) then
currentstate <= s1;
count <= count + 1;
else
currentstate <= s2;
count <= 0;
end if;
when s2 =>
if (count < 4) then
currentstate <= s2;
count <= count + 1;
else
currentstate <= s3;

count <= 0;

end if;

when s3 =>

if (count < 1) then

currentstate <= s3;

count <= count + 1;

else

currentstate <= s0;

count <= 0;

end if;

when others =>

currentstate <= s0;

end case;

end if;

end process;

Output : process(currentstate)

Begin

case currentstate is

when s0 => M_US <= '0';

K_US <= '0';

H_US <= '1';

M_BT <= '1';

K_BT <= '0';

H_BT <= '0';

when s1 => M_US <= '0';

K_US <= '1';

H_US <= '0';

M_BT <= '1';

K_BT <= '0';

H_BT <= '0';


when s2 => M_US <= '1';

K_US <= '0';

H_US <= '0';

M_BT <= '0';

K_BT <= '0';

H_BT <= '1';

when s3 => M_US <= '1';

K_US <= '0';

H_US <= '0';

M_BT <= '0';

K_BT <= '1';

H_BT <= '0';

when s4 => M_US <= '0';

K_US <= '1';

H_US <= '0';

M_BT <= '0';

K_BT <= '1';

H_BT <= '0';

when s5 => M_US <= '0';

K_US <= '0';

H_US <= '0';

M_BT <= '0';

K_BT <= '0';

H_BT <= '0';

end case;

end process;
2. Source code percobaan 4D
Blok klakulator.vhd
library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.std_logic_arith.all;

use IEEE.std_logic_unsigned.all;

use work.all;

entity kalkulator is

port( rst, clk, go_i: in std_logic;

x_i, y_i: in std_logic_vector( 3 downto 0 );

d_o: out std_logic_vector( 3 downto 0 )

);

end kalkulator;

architecture kalkulator_arc of kalkulator is

component fsm is

port( rst, clk, proceed: in std_logic;

comparison: in std_logic_vector( 1 downto 0 );

enable, xsel, ysel, xld, yld: out std_logic

);

end component;

component mux is

port( rst, sLine: in std_logic;

load, result: in std_logic_vector( 3 downto 0 );

output: out std_logic_vector( 3 downto 0 )

);

end component;

component comparator is

port( rst: in std_logic;

x, y: in std_logic_vector( 3 downto 0 );

output: out std_logic_vector( 1 downto 0 )

);

end component;
component subtractor is

port( rst: in std_logic;

cmd: in std_logic_vector( 1 downto 0 );

x, y: in std_logic_vector( 3 downto 0 );

xout, yout: out std_logic_vector( 3 downto 0 )

);

end component;

component regis is

port( rst, clk, load: in std_logic;

input: in std_logic_vector( 3 downto 0 );

output: out std_logic_vector( 3 downto 0 )

);

end component;

signal xld, yld, xsel, ysel, enable: std_logic;

signal comparison: std_logic_vector( 1 downto 0 );

signal result: std_logic_vector( 3 downto 0 );

signal xsub, ysub, xmux, ymux, xreg, yreg: std_logic_vector( 3

downto 0 );

begin

TOFSM: fsm port map( rst, clk, go_i, comparison,

enable, xsel, ysel, xld, yld );

X_MUX: mux port map( rst, xsel, x_i, xsub, xmux );

Y_MUX: mux port map( rst, ysel, y_i, ysub, ymux );

X_REG: regis port map( rst, clk, xld, xmux, xreg );

Y_REG: regis port map( rst, clk, yld, ymux, yreg );

U_COMP: comparator port map( rst, xreg, yreg, comparison

);

X_SUB: subtractor port map( rst, comparison, xreg, yreg,

xsub, ysub );

OUT_REG: regis port map( rst, clk, enable, xsub, result

);

d_o <= result;

end kalkulator_arc;
Blok mux.vhd

library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.std_logic_arith.all;

use IEEE.std_logic_unsigned.all;

entity mux is

port( rst, sLine: in std_logic;

load, result: in std_logic_vector( 3 downto 0 );

output: out std_logic_vector( 3 downto 0 )

);

end mux;

architecture mux_arc of mux is

begin

process( rst, sLine, load, result )

begin

if( rst = '1' ) then

output <= "0000"; -- do nothing

elsif sLine = '0' then

output <= load; -- load inputs

else

output <= result; -- load results

end if;

end process;

end mux_arc;
Blok comparator.vhd

library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.std_logic_arith.all;

use IEEE.std_logic_unsigned.all;

entity comparator is

port( rst: in std_logic;

x, y: in std_logic_vector( 3 downto 0 );

output: out std_logic_vector( 1 downto 0 )

);

end comparator;

architecture comparator_arc of comparator is

begin

process( x, y, rst )

begin

if( rst = '1' ) then

output <= "00"; -- do nothing

elsif( x > y ) then

output <= "10"; -- if x greater

elsif( x < y ) then

output <= "01"; -- if y greater

else

output <= "11"; -- if equivalance.

end if;

end process;

end comparator_arc;
Blok regis.vhd
library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.std_logic_arith.all;

use IEEE.std_logic_unsigned.all;

entity regis is

port( rst, clk, load: in std_logic;

input: in std_logic_vector( 3 downto 0 );

output: out std_logic_vector( 3 downto 0 )

);

end regis;

architecture regis_arc of regis is

begin

process( rst, clk, load, input )

begin

if( rst = '1' ) then

output <= "0000";

elsif( clk'event and clk = '1') then

if( load = '1' ) then

output <= input;

end if;

end if;

end process;

end regis_arc;
Blok subtractor.vhd
library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.std_logic_arith.all;

use IEEE.std_logic_unsigned.all;

entity subtractor is

port( rst: in std_logic;

cmd: in std_logic_vector( 1 downto 0 );

x, y: in std_logic_vector( 3 downto 0 );

xout, yout: out std_logic_vector( 3 downto 0 )

);

end subtractor;

architecture subtractor_arc of subtractor is

begin

process(rst, cmd, x, y)

begin

if( rst = '1' or cmd = "00" ) then -- not active.

xout <= "0000";

yout <= "0000";

elsif( cmd = "10" ) then -- x is greater

xout <= ( x - y );

yout <= y;

elsif( cmd = "01" ) then -- y is greater

xout <= x;

yout <= ( y - x );

else

xout <= x ; -- x and y are equal

yout <= y;

end if;

end process;

end subtractor_arc;
Blok fsm.vhd

library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.std_logic_arith.all;

use IEEE.std_logic_unsigned.all;

entity fsm is

port( rst, clk, proceed: in std_logic;

comparison: in std_logic_vector( 1 downto 0 );

enable, xsel, ysel, xld, yld: out std_logic

);

end fsm;

architecture fsm_arc of fsm is

type states is ( init, s0, s1, s2, s3, s4, s5 );

signal nState, cState: states;

begin

process( rst, clk )

begin

if( rst = '1' ) then

cState <= init;

elsif( clk'event and clk = '1' ) then

cState <= nState;

end if;

end process;

process( proceed, comparison, cState )

begin

case cState is

when init => if( proceed = '0' ) then

nState <= init;

else

nState <= s0;

end if;
when s0 => enable <= '0';

xsel <= '0';

ysel <= '0';

xld <= '0';

yld <= '0';

nState <= s1;

when s1 => enable <= '0';

xsel <= '0';

ysel <= '0';

xld <= '1';

yld <= '1';

nState <= s2;

when s2 => xld <= '0';

yld <= '0';

if( comparison = "10" ) then

nState <= s3;

elsif( comparison = "01" ) then

nState <= s4;

elsif( comparison = "11" ) then

nState <= s5;

end if;

when s3 => enable <= '0';

xsel <= '1';

ysel <= '0';

xld <= '1';

yld <= '0';

nState <= s2;

when s4 => enable <= '0';

xsel <= '0';

ysel <= '1';

xld <= '0';

yld <= '1';

nState <= s2;


when s5 => enable <= '1';

xsel <= '1';

ysel <= '1';

xld <= '1';

yld <= '1';

nState <= s0;

when others => nState <= s0;

end case;

end process;

end fsm_arc;

Modifikasi percobaan 4D untuk kalkulator Modulo


Fsm.vhd

- ----
when s2 => xld <= '0';
yld <= '0';
if( comparison = "10" ) then
nState <= s3;
elsif( comparison = "01" ) then
nState <= s5;
elsif( comparison = "11" ) then
nState <= s3;
end if;
- - - - - - -

Subtractor.vhd

- --------

else

xout <= ( x - y ); -- x and y are equal

yout <= y;

- ------

Anda mungkin juga menyukai