C. Bahasa VHDL
Terdapat lima tahap yang dilakukan ketika VHDL (Very High Speed Integrated Circuit Hardware
mikroprosesor MIPS32® melakukan eksekusi Description Language) atau VHSIC Hardware
suatuinstruksi. Kelima tahap tersebut adalah sebagai Description Language merupakan bahasa untuk
berikut. mendeskripsikan perangkat keras yang digunakan dalam
desain elektronik digital dan mixed signal, contohnya
1. Instruction Fetch (IF) Field-Programmable Gate Array (FPGA) atau Integrated
Tahap instruction fetch berfungsi mengatur aliran Circuit (IC). Sistem digital sangat erat kaitannya dengan
instruksi yang akan diolah pada tahap berikutnya. sinyal. Sinyal dapat dianalogikan sebagai wire dan dapat
Instruksi yang sedang dijalankan merupakan berubah ketika input berubah. Dalam VHDL, terdapat
instruksi yang berasal dan disimpan dari memory. definisi sinyal bernama std_logic yang sesuai dengan
Pada arsitektur ini, memory dipisahkan menjadi standar IEEE 1164. Terdapat sembilan jenis nilai sinyal
dua bagian yaitu instruction memory yang yang didefinisikan dalam std_logic. Untuk menggunakan
berfungsi menyimpan instruksi-instruksi yang akan nilai sinyal standar std_logic, kita dapat menggunakan
dieksekusi dan data memory yang berfungsi untuk library yang telah tersedia yaitu ieee.std_logic_1164.all.
menyimpan data untuk menghindari structural
hazard. Dengan demikian, arsitektur ini menganut Tidak seperti bahasa Verilog HDL, VHDL merupakan
Harvard Architectur bahasa yang case insensitive. Abstraksi utama dalam
bahasa VHDL disebut entitas desain (design entity) yang
2. Instruction Decode (ID) terdiri atas input, output, dan fungsi yang didefinisikan
secara benar. Entitas desain dalam VHDL terdiri atas dua
bagian
masing-masing komponen dan menghubungkan port input
1. Deklarasi Entitas (entity declaration) yang dan port output dari masing-masing komponen dengan top
mendefinisikan antarmuka entitas tersebut level design atau dengan komponen lain.
terhadap dunia luar (contohnya port input dan
port output) Contoh berikut digunakan untuk merealisasikan 2-to-1
multiplexer 4-bit dari empat buah 2-to-1 multiplexer 1-bit.
2. Arsitektur Entitas (entity architecture) yang
mendefinisikan fungsi dari entitas (contohnya LIBRARY IEEE;
rangkaian logika di dalam entitas tersebut). USE IEEE.STD_LOGIC_1164.ALL;
Pendefinisian arsitektur dapat dilakukan secara ENTITY Mux2_4b IS
behavioral maupun secara structural. PORT (
);
Setiap entitas desain harus disimpan dalam file VHDL yang END Mux2_4b;
terpisah dengan nama file sesuai dengan nama entitas yang A_IN : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
dideklarasikan (contohnya nama_entity.vhd ). Berikut ini B_IN : IN STD_LOGIC_VECTOR (3 DOWNTO 0);
template deklarasi sebuah entitas dan arsitektur entitas S_IN : IN STD_LOGIC;
tersebut dalam bahasa VHDL C_OUT : OUT STD_LOGIC_VECTOR (3 DOWNTO 0)
ARCHITECTURE Structural OF Mux2_4b IS
LIBRARY IEEE; COMPONENT Mux2 IS
USE IEEE.STD_LOGIC_1164.all; PORT (
ENTITY <nama_entity> IS A : IN STD_LOGIC;
PORT( B : IN STD_LOGIC;
<nama_port_1> : <tipe_port> STD_LOGIC; S : IN
<nama_port_2> : <tipe STD_LOGIC_VECTOR(n STD_LOGIC; D :
DOWNTO 0) OUT STD_LOGIC
);
); END COMPONENT;
END <nama_entity>; BEGIN
mux2_0 : Mux2
ARCHITECTURE <nama_arsitektur> OF <nama_entity> PORT MAP
IS mux2_1 : Mux2
BEGIN
<fungsi yang didefinisikan> (
END <nama_arsitektur>; A => A_IN(0),
B => B_IN(0),
S => S_IN,
Setiap entitas desain dalam file VHDL yang berbeda dapat D => C_OUT(0)
dipanggil dan dirangkai menjadi rangkaian yang lebih besar. PORT MAP
Hal ini sangat penting dilakukan dalam melakukan desain
hardware. Pertama, hardware yang akan didesain harus kita );
pecah-pecah menjadi komponen-komponen logika yang mux2_2 : Mux2
cukup kecil, contohnya menjadi multiplexer, adder, flip- PORT MAP
flop, dan sebagainya. Kemudian, kita mendesain masing- (
masing komponen logika tersebut dan melakukan simulasi A => A_IN(1),
fungsional dan simulasi timing untuk setiap komponen B => B_IN(1),
untuk meyakinkan bahwa setiap komponen dapat berfungsi S => S_IN,
dengan baik. Setelah itu, kita menggabungkan masing- D => C_OUT(1
masing komponen untuk membentuk entitas desain yang );
lebih besar (top level entity). mux2_3 : Mux2
PORT MAP
Langkah pertama dalam membentuk top level entity adalah (
dengan mendefinisikan top level entity tersebut seperti A => A_IN(2),
halnya kita membuat entitas desain biasa. Kemudian, pada B => B_IN(2),
arsitektur top level entity, kita memanggil desain entitas lain S => S_IN,
menggunakan construct component. Construct component D => C_OUT(2)
ini memiliki isi yang sama persis dengan deklarasi entitas );
desain yang akan dipanggil oleh top level entity. Kemudian, END Structural;
kita harus melakukan instansiasi
Terdapat tiga jenis concurent signal assignment (CSA) WITH select_expression SELECT
dalam bahasa VHDL, yaitu simple CSA,conditional CSA, signal_name <= value_expr_1 WHEN choice_1,
dan selected CSA. Ketiga jenis concurent signal assignment value_expr_2 WHEN choice_2,
tersebut dijelaskan menggunakan contoh sebagai berikut. value_expr_3 WHEN choice_3,
...
1. Simple CSA. Assignment sinyal dilakukan dengan value_expr_n WHEN OTHERS;
ekspresi logika biasa. Hasil implementasi Simple
CSA akan berupa gerbang logika biasa.
ARCHITECTURE Behavioral OF
Example IS
BEGIN
f <= (x1 AND x3) OR (NOT x3 AND
x2);
g <= (NOT x3 OR x1) AND (NOT x3
OR x4); Selain concurent signal assignment, dalam bahasa VHDL
END Behavioral; juga dikenal dengan construct PROCESS yang berfungsi
melakukan assignment sinyal secara se kuensial. Sebuah
proses (PROCESS) dapat dianalogikan sebagai bagian dari
rangkaian yang dapat aktif dan dapat nonaktif. Sebuah
proses akan diaktifkan ketika sinyal-sinyal (SIGNAL) dalam
daftar sensitivitas (sensitivity list) mengalami perubahan
nilai. Ketika diaktifkan, semua ekspresi dan pernyataan
(statement) akan dieksekusi secara sekuensial hingga akhir
dari proses tersebut.
2. Conditional CSA. Assignment sinyal dilakukan
dengan construct WHEN-ELSE.Hasil implementasi PROCESS (sensitivity_list)
Conditional CSA akan berupa kumpulan 2-to-1 declarations;
BEGIN
multiplexer yang disusun secara bertahap dengan
sequential_statement_1;
boolean_expr sebagai selektor dan value_expr
sequential_statement_2;
sebagai nilai sinyal yang dapat dipilih.
...
sequential_statement_n;
signal_name <= value_expr_1 WHEN
END PROCESS
boolean_expr_1 ELSE
value_expr_2 WHEN boolean_expr_2
Terdapat dua jenis construct yang digunakan dalam
ELSE
construct PROCESS, yaitu construct IF-THEN-ELSE dan
value_expr_3 WHEN boolean_expr_3
construct CASE. Kedua jenis construct tersebut diberikan
ELSE
... sebagai contoh berikut ini.
value_expr_n;
ARCHITECTURE ARCHITECTURE
Behavioral OF mux2to1 IS Behavioral OF mux2to1 IS
BEGIN BEGIN
PROCESS (w0, w1, s) PROCESS (w0, w1, s)
BEGIN BEGIN
IF s = '0' THEN CASE s IS
f <= w0; WHEN '0' =>
ELSE f <= w0;
f <= w1; WHEN OTHERS =>
END IF; f <= w1;
END PROCESS; END CASE;
3. Selected CSA. Assignment sinyal dilakukan END Behavioral; END PROCESS;
dengan construct WITH-SELECT. Hasil END Behavioral;
implementasi Selected CSA akan berupa satu buah
n-to-1 multiplexer dengan select_expression Dalam bahasa VHDL, kita juga dapat mendefinisikan
sebagai selektor dan value_expr_3 sebagai nilai beberapa jenis elemen memory. Dua jenis elemen memory
sinyal yang dapat dipilih. yang sering digunakan dalam bahasa VHDL adalah Gated D
Latch dan D Flip-flop. Gated D Latch memiliki karakteristik
yaitu output akan berubah mengikuti input saat clock high
(atau clock low, tergantung implementasi). Sedangkan D
Flip-flop memiliki karakteristik yaitu output akan berubah
mengikuti input saat transisi clock dari low ke high (atau
high ke low, tergantung implementasi). Untuk elemen
memory lain seperti Gated S-R Latch, T Flip-flop, dan JK
Flip-flop juga dapat diimplementasikan pada bahasa VHDL
namun mereka jarang digunakan. D. Simulasi MIPS32® menggunakan PCSpim
F. REFERENSI
[1] Haryoni, Andri. dkk., Praktikum Arsitektur Sistem
Hasil Simulasi menggunakan timing :
Komputer, Sekolah Teknik Elektro dan Informatika
ITB, Bandung, 2017.
E. SIMPULAN
1. Counter adalah bagian dari microprocessor yang
menyimpan address instruksi yang akan dieksekusi
Lampiran
i. Source Code 1 LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE
-- Praktikum NWS3103 Arsitektur Sistem Komputer IEEE.STD_LOGIC_ARITH.ALL; USE
-- Modul :3 IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Percobaan :1 LIBRARY altera_mf;
-- Tanggal : 26 Oktober 2017 USE altera_mf.altera_mf_components.ALL;
-- Kelompok :3 ENTITY Tugas1 IS PORT (
-- Rombongan :1 ADDR : IN std_logic_vector (31
-- Nama (NIM)1 : Eglin Noverinda (14S16043) DOWNTO 0);
-- Nama File : instrucMEM.vhd clock : IN std_logic;
-- Deskripsi : Implementasi instruction memory reset : IN std_logic;
INSTR : OUT std_logic_vector (31
DOWNTO 0) -- Praktikum NWS3103 Arsitektur Sistem Komputer
); -- Modul :3
END ENTITY; -- Percobaan :2
-- Tanggal : 26 Oktober 2017
ARCHITECTURE behavior OF Tugas1 IS -- Kelompok :3
TYPE ramtype IS ARRAY (31 DOWNTO 0) OF -- Rombongan :1
std_logic_vector (31 DOWNTO 0); -- Nama (NIM)1 : Eglin Noverinda (14S16043)
SIGNAL mem: ramtype; -- Nama File : instruction_memory.vhd
BEGIN -- Deskripsi : Implementasi instruction
PROCESS (reset,ADDR,mem) memory
BEGIN
IF (reset='1') THEN LIBRARY ieee;
INSTR <= (OTHERS => '0'); USE ieee.std_logic_1164.all;
ELSE LIBRARY altera_mf;
INSTR <= mem(conv_integer USE altera_mf.all;
(ADDR));
END IF; END ENTITY instruction_memory IS
PROCESS; PORT (
-- Isi dalam instruction memory ADDR : IN STD_LOGIC_VECTOR (31
mem(0) <= X"00000022"; DOWNTO 0); -- alamat
mem(1) <= X"8c010000"; mem(2) <= clock : IN STD_LOGIC := '1'; -- clock
X"8c020004"; mem(3) <= INSTR : OUT STD_LOGIC_VECTOR (31
X"8c030008"; mem(4) <= DOWNTO 0) -- output
X"00842022"; mem(5) <= );
X"00822020"; mem(6) <= END ENTITY;
X"0043282a"; mem(7) <=
X"10a00002"; mem(8) <= ARCHITECTURE structural OF
X"00411020"; instruction_memory IS
mem(9) <= X"1000fffb"; SIGNAL sub_wire0 : STD_LOGIC_VECTOR (31
mem(10) <= X"ac040000"; DOWNTO 0);
mem(11) <= X"1000ffff"; -- signal keluaran output
END behavior; COMPONENT altsyncram
-- komponen memori
GENERIC
(
ii. Source code 2 init_file : STRING; -- name of the .mif file
operation_mode : STRING; -- the operation
Imemory.mif mode
widthad_a : NATURAL; -- width of address_a[]
width_a : NATURAL -- width of data_a[]
WIDTH=32; -- number of bits of data per word );
DEPTH=256; -- the number of addresses
ADDRESS_RADIX=HEX; PORT
DATA_RADIX=HEX; (
CONTENT clock0 : IN STD_LOGIC ;
BEGIN address_a : IN STD_LOGIC_VECTOR (31
00 : 8c020000; DOWNTO 0);
04 : 8c030001; q_a : OUT STD_LOGIC_VECTOR (31
08 : 00430820; DOWNTO 0)
0C : ac010003; );
10 : 1022ffff; END COMPONENT;
14 : 1021fffa;
06 : 0043282a;
07 : 10a00002; iii. Source Code 3
09 : 1000fffb;
10 : ac040000; -- Praktikum NWS3103 Arsitektur Sistem Komputer
11 : 1000ffff; -- Modul :3
END
-- Percobaan :3
-- Tanggal : 26 Oktober 2017
-- Kelompok :3 q_a => ???????????, -- isi yang sesuai
-- Rombongan :1 data_a => WR_Data
-- Nama (NIM)1 : Eglin Noverinda (14S16043) );
-- Nama File : data_memory.vhd
-- Deskripsi : Implementasi desain data ENTITY data_memory IS
memory PORT (
ADDR : IN STD_LOGIC_VECTOR (31
ENTITY data_memory IS DOWNTO 0); -- alamat
PORT ( WR_EN : IN STD_LOGIC; --Indikator
ADDR : IN STD_LOGIC_VECTOR (31 Penulisan
DOWNTO 0); -- alamat RD_EN : IN STD_LOGIC; --Indikator
WR_EN : IN STD_LOGIC; --Indikator Pembacaan
Penulisan clock : IN STD_LOGIC := '1'; -- clock
RD_EN : IN STD_LOGIC; --Indikator RD_Data : OUT STD_LOGIC_VECTOR (31
Pembacaan DOWNTO 0);
clock : IN STD_LOGIC := '1'; -- clock WR_Data : IN STD_LOGIC_VECTOR (31
RD_Data : OUT STD_LOGIC_VECTOR (31 DOWNTO 0)
DOWNTO 0); );
WR_Data : IN STD_LOGIC_VECTOR (31 END ENTITY;
DOWNTO 0)
); COMPONENT altsyncram
END ENTITY; -- komponen memori
GENERIC
COMPONENT altsyncram (
-- komponen memori init_file : STRING; -- name of the .mif file
GENERIC operation_mode : STRING; -- the operation
( mode
init_file : STRING; -- name of the .mif file widthad_a : NATURAL; -- width of address_a[]
operation_mode : STRING; -- the operation width_a : NATURAL -- width of data_a[]
mode );
widthad_a : NATURAL; -- width of address_a[]
width_a : NATURAL -- width of data_a[] PORT
); (
wren_a : IN STD_LOGIC; -- Write Enable
PORT Activation
( clock0 : IN STD_LOGIC ; -- Clock
wren_a : IN STD_LOGIC; -- Write Enable address_a : IN STD_LOGIC_VECTOR (31
Activation DOWNTO 0); -- Address Input
clock0 : IN STD_LOGIC ; -- Clock q_a : OUT STD_LOGIC_VECTOR (31
address_a : IN STD_LOGIC_VECTOR (31 DOWNTO 0); -- Data Output
DOWNTO 0); -- Address Input data_a : IN STD_LOGIC_VECTOR (31
q_a : OUT STD_LOGIC_VECTOR (31 DOWNTO 0) -- Data Input
DOWNTO 0); -- Data Output );
data_a : IN STD_LOGIC_VECTOR (31 END COMPONENT;
DOWNTO 0) -- Data Input
); altsyncram_component : altsyncram
END COMPONENT; GENERIC MAP
(
altsyncram_component : altsyncram init_file => "dmemory.mif", operation_mode
GENERIC MAP => "SINGLE_PORT", widthad_a => 32,
( width_a => 32
init_file => "dmemory.mif", operation_mode )
=> "SINGLE_PORT", widthad_a => 32, PORT MAP
width_a => 32 (
) wren_a => ???????????, -- isi yang sesuai
PORT MAP clock0 => clock,
( address_a => ADDR,
wren_a => ???????????, -- isi yang sesuai q_a => ???????????, -- isi yang sesuai
clock0 => clock, data_a => WR_Data
);
address_a => ADDR,
iv. Source Code 4
ENTITY reg_file IS
PORT (
clock : IN STD_LOGIC; -- clock
WR_EN : IN STD_LOGIC; -- write enable
ADDR_1 : IN STD_LOGIC_VECTOR (4 DOWNTO
0); -- Input 1
ADDR_2 : IN STD_LOGIC_VECTOR (4 DOWNTO
0); -- Input 2
ADDR_3 : IN STD_LOGIC_VECTOR (4 DOWNTO
0); -- Input 3
WR_Data_3 : IN STD_LOGIC_VECTOR (31
DOWNTO 0);-- write data
RD_Data_1 : OUT STD_LOGIC_VECTOR(31
DOWNTO 0);-- read data 1
RD_Data_2 : OUT STD_LOGIC_VECTOR(31
DOWNTO 0) -- read data 2
);
END ENTITY;