Abstrak
Pada praktikum modul 4 Rangkaian Logika Sekuensial ini
praktikan akan mendesain sendiri state diagram dan script
VHDL untuk pengaturan empat buah lampu lalulintas di
perempatan jalan. Akan dirancang juga sebuah kalkulator
yang akan disusun dengan membagi kerja program dalam
hierarki. melakukan operasi spesifik untuk mencari FPB
dan modulo dari 2 input 4 bit. Praktikan . Praktikan akan
mengimplementasikan FSM pada FPGA. Selain itu Gambar 2-1 Ilustrasi rangkaian logika sekuensial[3]
keluaran FSM juga akan ditampilkan pada layer dengan
modul VGA driver. Hasil dari percobaan cukup baik. 2.2 FINITE STATE MACHINE
Kata kunci: sekuensial, FSM, FPB, modulo, hierarki. Terdapat beberapa model yang digunakan untuk
membantu merancang rangkaian sekuensial. Salah
1. PENDAHULUAN satunya yang paling banyak digunakan adalah
Finite State Machine (FSM). Dinamakan FSM
Percobaan pada modul ini secara umum bertujuan karena jumlah state yang mungkin terbatas dan
agar praktikan dapat merancang rangkaian logika rangkaian sekuensial bekerja mirip dengan mesin
sekuensial dengan menggunakan Bahasa VHDL yang beroperasi dengan urutan state.
serta dapat mengimplementasikannya pada FPGA.
Adapun tujuan rinci dari modul ini: Level abstraksi perancangan FSM pun bertingkat
tingkat. Pada praktikum kali ini digunakan level
1) Mendesain sekuensial rangkaian untuk abstraksi behavioral. Pada perancangan dengan
implementasi didalam FPGA. level ini, sebelum mengimplementasikan
2) Mengenal dan memahami cara menggunakan menggunakan VHDL harus terebih dahulu dibuat
hierarki dalam desain rangkaian state diagram atau flow chart transisi statenya.
Komponen ‐ komponen yang harus ada pada
3) Mengenal dan memahami cara menggunakan statediagram adalah deklasari input dan output,
FPGA sebagai prototype system untuk definisi state, transisi, dan keluarannya. Berikut
memverifikasi fungsi rangkaian. adalah contoh state diagram mealy dan
implementasinya dalam FPGA.
2. STUDI PUSTAKA
Copy script desain FSM yang telah dibuat Atur pin I/O pada pin planner seperti pada
sebagai tugas pendahuluan pada lampiran modul 2 dengan pin planner yang sudah
1 ke dalam folder tersebut. didownload dari labdasar.
Atur pin I/O pada pin planner seperti pada Gambar 3-2 Diagram alur untuk percobaan 4B
modul 2.
Gambar 3-4 Diagram alur untuk percobaan 4D Gambar 4-1 (c) Hasil implementasi FSM lampu lalulintas
pada FPGA
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 4
Pada percobaan 4A ini akan diimplementasikan Berdasarkan analisis tersebut dapat disimpulkan
sekaligus diuji desain FSM yang sudah dibuat bahwa rangkaian sekuensial berupa FSM yang
pada FPGA. Tabel 4-1 (a) menunjukkan lokasi pin kami buat beserta implementasi VHDL-nya sudah
pada FPGA. Dapat dilihat di tabel pada gambar 4-1 sesuai karena sudah memenuhi spesifikasi yang
(c), untuk setiap mode malam, siang, dan disyaratkan.
emergency pada t=0 output selalu sama engan
output pada mode reset. Hal ini menunjukkan 4.2 PERCOBAAN 4B: IMPLEMENTASI
bahwa output pada t=0 s tersebut merupakan MODUL VGA DRIVER
initial state atau kondisi awal.
Untuk mode malam, sesuai dengan lokasi keluaran
pada gambar 4-1 (b), pada mula-mula (t=0 s)
lampu berada pada state awal yaitu lampu hijau
utara selatan dan merah barat timur menyala. Saat
t=4 s, dapat kita ketahui bahwa lampu hijau utara
selatan mati digantikan oleh lampu kuning utara
selatan serta lampu merah barat timur tetap. Pada
state selanjutnya saat t=5 s atau selang waktu 1 s
dari state sebelumnya, lampu kuning utara selatan
mati digantikan oleh lampu merah utara selatan
serta lampu merah barat timur mati digantikan
oleh lampu hijau barat timur. Hasil percobaan ini
sesuai dengan spesifikasi FSM, yaitu pada malam
hari lampu hijau menyala setiap 4 detik, dikuti
lampu kuning 1 detik, setelahnya lampu merah
sebanyak 5 detik. Dapat dilihat juga untuk state
selanjutnya saat t=9 s output yang ditampilkan
sudah sesuai.
Untuk mode siang, dapat dilihat pada gambar 4-1
(b) sama seperti mode malam pada mula-mula (t=
0 s) lampu berada pada state awal yaitu lampu
hijau utara selatan dan merah barat timur menyala.
Saat t=8 s, dapat kita ketahui bahwa lampu hijau
utara selatan mati digantikan oleh lampu kuning
utara selatan serta lampu merah barat timur tetap.
Pada state selanjutnya saat t=10 s atau selang
waktu 2 s dari state sebelumnya, lampu kuning
utara selatan mati digantikan oleh lampu merah
utara selatan serta lampu merah barat timur mati
digantikan oleh lampu hijau barat timur. Hasil
percobaan ini sesuai dengan spesifikasi FSM, yaitu
pada malam hari lampu hijau menyala setiap 8
detik, dikuti lampu kuning 2 detik, setelahnya
lampu merah sebanyak 10 detik. Dapat dilihat juga
untuk state selanjutnya saat t=18 s output yang
ditampilkan juga sudah sesuai spesifikasi.
Untuk mode emergency, pada kondisi mula-mula
(t =0 s) output menunjukkan state awal saat tombol
darurat belum ditekan yaitu lampu hijau utara
selatan dan merah barat timur menyala. Saat
tombol ditekan, dapat kita lihat pada gambar 4-1
(c) lampu kuning utara selatan menyala setiap 2
detik diikuti lampu kuning barat timur selama 2
detik. Jika dijumlahkan total lampu kuning Gambar 4-2 (a) Hasil implementasi VGA percobaan 4B
menyala selama 4 detik. Hasil percobaan ini sudah Pada percobaan ini desain FSM akan
sesuai spesifikasi yaitu saat tombol darurat ditekan diimplementasikan ke VGA driver dengan
lampu kuning akan berkedip selama 4 detik. keluaran pada layar komputer menggunakan kode
DAFTAR PUSTAKA
[1] Mervin T Hutabarat dan Arif Sasongko.,
Petunjuk Praktikum Praktikum Sistem Digital,
Laboratorium Dasar Teknik Elektro, Bandung,
2022.
[2] Stephen Brown dan Zvonko Vranesic,
Fundamentals Of Digital Logic with Verilog Design,
McGrawHill, Departement of Electrical and
Computer Engineering, University of Toronto,
2002.
[3] https://www.geeksforgeeks.org/introduction-
of-sequential-circuits/ diakses pada 9
November 2022 jam 09.10.
fsmlampu.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY fsmlampu2 is
port(SIANG, MALAM, DARURAT, clk : IN STD_LOGIC;
M_US, K_US, H_US, M_BT, K_BT, H_BT : OUT STD_LOGIC);
END fsmlampu2;
ARCHITECTURE TRAFFICLIGHT OF fsmlampu2 IS
COMPONENT CLOCKDIV IS
PORT(
CLK: IN std_logic;
DIVOUT: buffer BIT);
END COMPONENT;
TYPE executionStage IS (MODE_SIANG, MODE_MALAM, MODE_DARURAT);
SIGNAL currentstate, nextstate: executionStage;
SIGNAL COUNTER : STD_LOGIC_VECTOR (4 downto 0);
SIGNAL rst : STD_LOGIC;
SIGNAL ClkAsli : BIT;
BEGIN
fsmlampu : CLOCKDIV
PORT MAP (
CLK => clk,
DIVOUT => ClkAsli);
PROCESS
BEGIN
WAIT UNTIL( ClkAsli'EVENT ) AND ( ClkAsli = '1' );
IF ( rst = '0' ) THEN
ELSE
END IF;
END PROCESS;
PROCESS(SIANG, MALAM, DARURAT, currentstate, COUNTER)
BEGIN
rst <= '1';
CASE currentstate IS
WHEN MODE_SIANG =>
IF (SIANG = '1') AND (MALAM = '0') AND (DARURAT = '0') THEN
nextstate <= MODE_SIANG;
IF (COUNTER<=10) THEN
M_US <= '1';
K_US <= '0';
H_US <= '0';
IF (COUNTER <= 8) THEN
M_BT <= '0';
K_BT <= '0';
H_BT <= '1';
ELSE
M_BT <= '0';
K_BT <= '1';
H_BT <= '0';
END IF;
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 1
ELSIF (COUNTER > 10) AND (COUNTER <= 20) THEN
M_BT <= '1';
K_BT <= '0';
H_BT <= '0';
IF (COUNTER <= 18) THEN
M_US <= '0';
K_US <= '0';
H_US <= '1';
ELSE
M_US <= '0';
K_US <= '1';
H_US <= '0';
END IF;
ELSIF (COUNTER > 20) THEN
rst <= '0';
END IF;
END IF;
IF (SIANG = '0') AND (MALAM = '1') AND (DARURAT = '0') THEN
nextstate <= MODE_MALAM;
END IF;
IF (SIANG = '0') AND (MALAM = '0') AND (DARURAT = '1') THEN
nextstate <= MODE_DARURAT;
END IF;
WHEN MODE_MALAM =>
IF (SIANG = '0') AND (MALAM = '1') AND (DARURAT = '0') THEN
nextstate <= MODE_MALAM;
IF (COUNTER<=5) THEN
M_US <= '1';
K_US <= '0';
H_US <= '0';
IF (COUNTER <= 4) THEN
M_BT <= '0';
END IF;
IF (COUNTER > 4) THEN
rst <= '0';
END IF;
END IF;
IF (SIANG = '1') AND (MALAM = '0') AND (DARURAT = '0') THEN
nextstate <= MODE_SIANG;
END IF;
IF (SIANG = '0') AND (MALAM = '1') AND (DARURAT = '0') THEN
nextstate <= MODE_MALAM;
END IF;
END CASE;
END PROCESS;
END TRAFFICLIGHT;
top_level_vhd.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY top_level_vhd IS
PORT(
CLOCK_50 : IN STD_LOGIC;
SW : IN STD_LOGIC_VECTOR( 9 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;
ARCHITECTURE behavioral OF top_level_vhd IS
SIGNAL M_US : STD_LOGIC;
SIGNAL K_US : STD_LOGIC;
SIGNAL H_US : STD_LOGIC;
SIGNAL M_BT : STD_LOGIC;
SIGNAL K_BT : STD_LOGIC;
SIGNAL H_BT : STD_LOGIC;
COMPONENT display_vhd IS
PORT(
i_clk : IN STD_LOGIC;
i_M_US : IN STD_LOGIC;
i_K_US : IN STD_LOGIC;
i_H_US : IN STD_LOGIC;
i_M_BT : IN STD_LOGIC;
i_K_BT : IN STD_LOGIC;
i_H_BT : IN STD_LOGIC;
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;
BEGIN
module_vga : display_vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY top_level_vhd IS
PORT(
CLOCK_50 : IN STD_LOGIC;
SW : IN STD_LOGIC_VECTOR( 9 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;
ARCHITECTURE behavioral OF top_level_vhd IS
SIGNAL M_US : STD_LOGIC;
SIGNAL K_US : STD_LOGIC;
SIGNAL H_US : STD_LOGIC;
SIGNAL M_BT : STD_LOGIC;
SIGNAL K_BT : STD_LOGIC;
SIGNAL H_BT : STD_LOGIC;
SIGNAL x : STD_LOGIC;
SIGNAL y : STD_LOGIC;
SIGNAL z : STD_LOGIC;
COMPONENT display_vhd IS
PORT(
i_clk : IN STD_LOGIC;
i_M_US : IN STD_LOGIC;
i_K_US : IN STD_LOGIC;
i_H_US : IN STD_LOGIC;
i_M_BT : IN STD_LOGIC;
i_K_BT : IN STD_LOGIC;
i_H_BT : IN STD_LOGIC;
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;
x <= SW(0);
y <= SW(1);
z <= SW(2);
M_US <= M_US ;
K_US <= K_US ;
H_US <= H_US ;
M_BT <= M_BT ;
K_BT <= K_BT ;
H_BT <= H_BT ;
END behavioral;
END vga;
ARCHITECTURE behavioral OF vga IS
CONSTANT TH : INTEGER := 800;
CONSTANT THB1 : INTEGER := 660;
CONSTANT THB2 : INTEGER := 756;
CONSTANT THD : INTEGER := 640;
CONSTANT TV : INTEGER := 525;
CONSTANT TVB1 : INTEGER := 494;
CONSTANT TVB2 : INTEGER := 495;
CONSTANT TVD : INTEGER := 480;
SIGNAL clock_25MHz : STD_LOGIC;
SIGNAL horiz_sync : STD_LOGIC;
SIGNAL vert_sync : STD_LOGIC;
SIGNAL video_on : STD_LOGIC;
SIGNAL video_on_v : STD_LOGIC;
SIGNAL video_on_h : STD_LOGIC;
SIGNAL h_count : STD_LOGIC_VECTOR( 9 DOWNTO 0 );
SIGNAL v_count : STD_LOGIC_VECTOR( 9 DOWNTO 0 );
BEGIN
video_on <= video_on_h AND video_on_v;
o_red <= i_red AND video_on;
o_green <= i_green AND video_on;
o_blue <= i_blue AND video_on;
o_horiz_sync <= horiz_sync;
o_vert_sync <= vert_sync;
PROCESS (i_clk)
BEGIN
IF i_clk'EVENT AND i_clk='1' THEN
IF (clock_25MHz = '0') THEN
clock_25MHz <= '1';
ELSE
clock_25MHz <= '0';
END IF;
END IF;
END PROCESS;
PROCESS
BEGIN
WAIT UNTIL( clock_25MHz'EVENT ) AND ( clock_25MHz = '1' );
IF ( h_count = TH-1 ) THEN
h_count <= (others=>'0');
ELSE
h_count <= h_count + 1;
END IF;
display_vhd.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY display_vhd IS
PORT(
i_clk : IN STD_LOGIC;
i_M_US : IN STD_LOGIC;
i_K_US : IN STD_LOGIC;
i_H_US : IN STD_LOGIC;
i_M_BT : IN STD_LOGIC;
i_K_BT : IN STD_LOGIC;
i_H_BT : IN STD_LOGIC;
VGA_R : OUT STD_LOGIC_VECTOR( 5 DOWNTO 0 );
VGA_G : OUT STD_LOGIC_VECTOR( 5 DOWNTO 0 );
END COMPONENT;
COMPONENT color_rom_vhd IS
PORT(
i_M_US : IN STD_LOGIC;
i_K_US : IN STD_LOGIC;
i_H_US : IN STD_LOGIC;
i_M_BT : IN STD_LOGIC;
i_K_BT : IN STD_LOGIC;
i_H_BT : IN STD_LOGIC;
i_pixel_column : IN STD_LOGIC_VECTOR( 9 DOWNTO 0 );
i_pixel_row : IN STD_LOGIC_VECTOR( 9 DOWNTO 0 );
o_red : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 );
COMPONENT color_rom_vhd IS
PORT(
i_M_US : IN STD_LOGIC;
i_K_US : IN STD_LOGIC;
i_H_US : IN STD_LOGIC;
i_M_BT : IN STD_LOGIC;
i_K_BT : IN STD_LOGIC;
i_H_BT : IN STD_LOGIC;
i_pixel_column : IN STD_LOGIC_VECTOR( 9 DOWNTO 0 );
i_pixel_row : IN STD_LOGIC_VECTOR( 9 DOWNTO 0 );
o_red : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 );
o_green : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 );
o_blue : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0 ));
END COMPONENT;
BEGIN
vga_driver0 : vga
pll_vhd.vhd
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY altera_mf;
USE altera_mf.all;
ENTITY pll_vhd IS
PORT
(
inclk0 : IN STD_LOGIC := '0';
c0 : OUT STD_LOGIC ;
locked : OUT STD_LOGIC
);
END pll_vhd;
ARCHITECTURE SYN OF pll_vhd IS
SIGNAL sub_wire0 : STD_LOGIC_VECTOR (5 DOWNTO 0);
SIGNAL sub_wire1 : STD_LOGIC ;
SIGNAL sub_wire2 : STD_LOGIC ;
SIGNAL sub_wire3 : STD_LOGIC ;
SIGNAL sub_wire4 : STD_LOGIC_VECTOR (1 DOWNTO 0);
SIGNAL sub_wire5_bv : BIT_VECTOR (0 DOWNTO 0);
SIGNAL sub_wire5 : STD_LOGIC_VECTOR (0 DOWNTO 0);
);
PORT (
);
END COMPONENT;
BEGIN
sub_wire5_bv(0 DOWNTO 0) <= "0";
sub_wire5 <= To_stdlogicvector(sub_wire5_bv);
sub_wire1 <= sub_wire0(0);
c0 <= sub_wire1;
locked <= sub_wire2;
sub_wire3 <= inclk0;
sub_wire4 <= sub_wire5(0 DOWNTO 0) & sub_wire3;
altpll_component : altpll
GENERIC MAP (
clk0_divide_by => 2,
clk0_duty_cycle => 50,
clk0_multiply_by => 1,
clk0_phase_shift => "0",
compensate_clock => "CLK0",
gate_lock_signal => "NO",
inclk0_input_frequency => 20000,
intended_device_family => "Cyclone II",
invalid_lock_multiplier => 5,
lpm_hint => "CBX_MODULE_PREFIX=pll_vhd",
lpm_type => "altpll",
operation_mode => "NORMAL",
port_activeclock => "PORT_UNUSED",
port_areset => "PORT_UNUSED",
port_clkbad0 => "PORT_UNUSED",
port_clkbad1 => "PORT_UNUSED",
port_clkloss => "PORT_UNUSED",
port_clkswitch => "PORT_UNUSED",
port_configupdate => "PORT_UNUSED",
port_fbin => "PORT_UNUSED",
port_inclk0 => "PORT_USED",
port_inclk1 => "PORT_UNUSED",
port_locked => "PORT_USED",
port_pfdena => "PORT_UNUSED",
port_phasecounterselect => "PORT_UNUSED",
port_phasedone => "PORT_UNUSED",
port_phasestep => "PORT_UNUSED",
port_phaseupdown => "PORT_UNUSED",
port_pllena => "PORT_UNUSED",
port_scanaclr => "PORT_UNUSED",
port_scanclk => "PORT_UNUSED",
port_scanclkena => "PORT_UNUSED",
port_scandata => "PORT_UNUSED",
port_scandataout => "PORT_UNUSED",
port_scandone => "PORT_UNUSED",
kalkulator.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 )
);
RANGKAIAN LOGIKA SEKUENSIAL 63
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
-- FSM controller
TOFSM: fsm port map( rst, clk, go_i, comparison,
enable, xsel, ysel, xld, yld );
-- Datapath
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
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB 15
);
d_o <= result;
end kalkulator_arc;
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;
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;
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 )
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;