Anda di halaman 1dari 28

Percobaan V

Synthesizable MIPS32 Microprocessor


Bagian III : Top Level Design dan Testbench
Rosana Dewi Amelinda (13213060)
Asisten : Yusrina Nur Dini (13212058)
Tanggal Percobaan : 2/12/2015
EL3111 Praktikum Arsitektur Sistem Komputer
Laboratorium Sinyal dan Sistem Sekolah Teknik Elektro dan Informatika
Institut Teknologi Bandung

Abstrak Pada modul V ini dilakukan synthesizable


MIPS32 Mikroprosesor yang berhubugan dengan Top Level
Design dan Testbench. Terdapat 2 buah tugas yang diberikan
yaitu membuat top level design atas program-program yang
telah dibuat pada praktikum sebelumnya kemudian melakukan
testbench. Dari prakatikum ini diharapkan praktikan mampu
memahami arsitektur mikroprosesor MIPS32 beserta datapath
eksekusinya, memahami instruction set MIPS lalu mampu
menggabungkan komponen-komponen design yang telah dibuat
dari praktikum sebelumnya dalam kode VHDL untuk membuat
top level design dari mikroprosesor Single-Cycle MIPS32 yang
synthesizable dan dapat disimulasikan dengan Altera Quartus.
Terakhir, yaitu praktikan mampu membuat testbench untuk
menguji desain yang telah dibuat. Software yang digunakan
selama pratikum antara lain Altera Quartus II v9.1 sp2 yang
berfungsi untuk melakukan sintesis dan simulasi rangkaian dan
Notepad++ untuk membuat kode program dalam Bahasa
VHDL. Hasil yang diperoleh pada percobaan kali ini yaitu
praktikan dapat mengimplementasikan perancangan tugastugas tersebut dalam Bahasa VHDL serta melakukan
synthesizable dan simlasinya secara functional dan timing.
Kata Kunci Top level design, Testbench, VHDL, MIPS.

I. PENDAHULUAN

ada praktikum kali ini akan mempelajari perancangan


pada mikriprosesor MIPS32. Perancangan yang
dilakukan yaitu dengan membuat instruction memory, data
memory, dan register dengan arsitektur MIPS32.
Penguasaan bahasa VHDL diperlukan pada praktikum kali ini
dikarenakan dalam pendefinisan komponen hingga
pembuatan kode program dilakukan dalam Bahasa VHDL
baik secara behavioral maupun structural. Setelah dilakukan
kompilasi, rangkaian yang dibuat selanjutnya diverifikasi
dengan simulasi functional dan timing pada Altera Quartus
9.1 sp2.
Pada praktikum ini tujuan yang ingin dicapai antara lain :
1. Praktikan memahami arsitektur mikroprosesor

MIPS32 beserta datapath eksekusinya.


2. Praktikan memahami instruction set dari MIPS32
dan dapat membuat program sederhana dalam

Bahasa assembly yang dapat dieksekusi pada


MIPS32
3.

Praktikan dapat melakukan simulasi eksekusi


program MIPS32 pada program simulasi SPIM

dan memahami cara setiap instruksi dieksekusi


4.

Praktikan dapat menggabungkan komponenkomponen desain yang telah dibuat dari praktikan
sebelumnya dalam kode VHDL untuk membuat top
level design dari mikroprosesor Single-Cycle

MIPS32 yang synthesizable dan dapat


disimulasikan dengan Altera Quartus II
v9.1sp2.
5.

Praktikan dapat membuat testbench untuk menguji


desain mikriprosesor Single-Cycle MIPS32 dalam

kode VHDL dan dapat disimulasikan dengan


Altera Quartus II v9.1sp2.
II. LANDASAN TEORETIS
Datapath dan Control
Dalam desain mikroprosesor Single-Cycle MIPS32,
rangkaian digital dapat dikelompokkan menjadi dua macam,
yaitu datapath (jalur data) dan control (kontrol). Datapath
merupakan komponen dari mikroprosesor yang melakukan
operasi aritmetik serta melakukan penyimpanan data. Dalam
datapath pula kelima tahap pemrosesan instruksi meliputi
instruction fetch, instruction decode, execute, memory access,
dan write back dilaksanakan. Sedangkan control merupakan
komponen dari mikroprosesor yang mengatur datapath
berdasarkan instruksi yang sedang dieksekusi.
Bagian kontrol telah direpresentasikan oleh control unit
yang telah kita desain pada praktikum sebelumnya. Untuk
bagian datapath, kita perlu menggabungkan komponenkomponen yang telah kita buat meliputi multiplexer, ALU,
register, data memory, instruction memory, dan sebagainya
untuk membentuk sebuah jalur yang dapat dilewati oleh data.
Dengan demikian, control dan datapath tidak dapat
dipisahkan dalam desain sebuah mikroprosesor. Datapath dan
control akan membentuk sebuah desain mikroprosesor
Single-Cycle MIPS32 yang disebut sebuah top-level design

(desain paling atas). Top-level design pada umumnya hanya


berisi port mapping dari satu komponen ke komponen lain.
Menggunakan Testbench untuk Simulasi
Dalam melakukan simulasi sebuah rangkaian digital, biasanya
kita memberikan sinyal input secara manual melalui sebuah
waveform editor. Cara ini boleh dibilang sederhana namun
akan sangat tidak efektif apabila kita melakukan simulasi
secara berulang-ulang. Cara lain untuk melakukan simulasi
suatu rangkaian digital tanpa memberikan input satu per satu
menggunakan waveform editor adalah menggunakan
testbench.
Pada dasarnya, testbench terdiri atas kode VHDL atau
Verilog HDL, tergantung pada implementasi. Testbench
sendiri dapat berisi sebuah desain yang menyimpan nilai-nilai
sinyal input yang harus diberikan kepada desain yang sedang
diuji (design under test). Kemudian, testbench ini akan
mengeluarkan masing-masing input yang harus diberikan
kepada desain yang sedang diuji berdasarkan suatu trigger,
misalnya clock.

mem(16) <= X"15400002"; -- bne $t2,$0,


loop
mem(20) <= X"00000000"; -- nop
-- if not bne, j done
-- loop :
mem(28) <= X"21080001"; -- addi $t0,
$t0, 1
mem(32) <= X"21290001"; -- addi $t1,
$t1, 1
mem(36) <= X"212afff6";
-- addi $t2,
$t1, -10
mem(40) <= X"1540fffc";
-- bne $t2,
$0, loop
mem(44) <= X"00000000"; -- nop
-- done :
mem(48) <= X"03e08021"; -- addu $s0, $ra,
$0
mem(52) <= X"0010f821"; -- addu $ra, $0,
$s0
Figure 2 Program dalam Bahasa C

III. HASIL DAN ANALISIS


A. Tugas I : Implementasi Top-Level Design MIPS32
Pada tugas pertama ini, diminta untuk menggabungkan
semua komponen yang telah dibuat pada percobaan
sebelumnya (port mapping). Data yang dimasukan berupa
kode script komponen-komponen seperti instruction memory,
data memory, register file, ALU, sign extender, comparator,
control unit, serta komponen kecil lain seperti multiplexer,
program counter dan lain sebagainya.
Output yang dihasilkan pada tugas 1 ini yaitu sebuah top level
design MIPS 32 bit, dengan susunan komponen yang telah
diport sebagai berikut :
Figure 1 Single Cycle MIPS32

Pada tugas pendahuluan dibuat kode heksadesimal instruksi


yang dimasukkan ke bagian instruction memory sebagai
berikut:
-- Isi instruction memory:
mem(0)
<= X"00000000";
-initializing
mem(4)
<= X"00004020"; -- add $t0,
$0, $0
mem(8)
<= X"00004820"; -- add
$t1,$0,$0
mem(12) <= X"212afff6"; -- addi $t2,
$t1, -10

Instruksi add $t0,$0,$0 dan add $t1,$0,$0 berfungsi untuk


menginisialisasi nilai int sum = 0 dan int i = 0. Untuk instruksi
addi $t2,$t1,-10 berfungsi untuk perhitungan branch. Kaerna
pada kasus ini nilai i-10 != 0 maka instruksi bne akan
membuat pc bernilai pc+4+immediate*4 = 28. Alamat loop
adalah nilai dari pc akibat branch (=28). Selain branch dan
jump, nilai pc akan selalu ditambah 4 untuk instruksi
berikutnya.
Instruksi nop pada tiap branch berfungsi untuk mengisi
nilai instruksi setelah branch dengan instruksi yang bernilai 0
(tidak melakukan instruksi apapun). Setelah branch pertama
dan nilai pc bernilai sesuai nilai loop, kemudian dilakukan
eksekusi dati instruksi-instrkuksi yang ada pada loop.
Instruksi addi $t0,$t0, 1 dan addi$t1,$t1,1 digunakan untuk
mengupdate nilai sum dan i yaitu sum ++ dan i++. Lalu
instruksi $t2,$t1,-10 digunakan untuk memasukan nilai i-10
yang digunakan sebagai pembanding pada instruksi branch
selanjutnya. Instruksi bne $t2,$0, loop, nilai i-10 kembali
dibandingkan dengna 0. Nilai i-10 untuk loop pertama yaitu
1-10 = -9 (!=0) sehingga dilakukan branch lagi (looping).
Proses looping ini dilakukan sampai nilai i-10 = 0. Saat nilai
i-10=0, maka nilai pc akan diupdate yaitu pada alamat done
yang berada alamat pc 48 dan nilai dari i dan sum adalah 10.
Berikut hasil simulasi fungsional tiap instruksi beserta
penjelasannya:
Keluaran yang digunakan sebagai penguji:
-ALU_result: operasi penjumlahan atau pengurangan pada
rd1out dan (rd2out/sgnsignimmout).
- clk= clock cycle

- PCinTest = nilai input PC


- PCoutTest = nilai output PC
- instrout = nilai kode heksadesimal instruksi
- PCplus4out = nilai PC+4
- outmux1out = nilai update PC
- rd1out = nilai register source
- rd2out = nilai register target
- instr_15_11_out= nomor register destination pada tipe R
- instr_20_16_out= nomor register target
- instr_25_21_out= nomor register source
- sgnaddress_regout=nomor register write back
- sgnRead_Mem1out=data yang dibaca pada memori
- sgnwritedataout= nilai yang di write back
- sgnsignimmout= nilai immediate yang sudah di extend 32
bit menggunakan sign extender.
- signoutshift2out= nilai 4*immediate 32 bit(extended)

instruksi nop ini. Pada pc=4, instruksi menjadi 0x00004020.


Pada instruksi ini nomor register destination=rd=
instr_15_11_out=8 ($t0), dan nomor register target dan source
rt=rs=0 ($0) sesuai dengan keluaran instr_25_21_out dan
instr_20_16_out. Sgnaddress_regout=8 yang berarti register
yang dipilih sebagai register write back adalah register 8=$t0.
Nilai rd1out dan rd2out =0 karena nilai $0 =0.
ALUresult=rd1out+rd2out=0.
Sinyal
sgnregwriteout=1
berarti dilakukan write back dengan nilai yang ditunjukkan
pada sgnwritedataout. Sinyal ALUSrc bernilai 0 karena
merupakan tipe R yang tidak menggunakan immediate pada
ALU. Sinyal control yang lain bernilai nol karena memang
tidak melakukan branch, jump, dan akses memori. Hal ini
bersesuaian dengan instruksi yang diberikan yaitu add $t0,
$0, $0.
Pc=8 <= X"00004820";

-- add $t1,$0,$0

Sinyal control:
- sgnregdestout = SIGRegDest;
- sgnregwriteout = SIGRegWrite;
- sgnALUSrcout = SIGALUSrc;
- sgnBranchResult = branch_result;
- sgnMemReadout = SigMemRead;
- sgnMemWriteout = SIGMemWrite;
- sgnMemToRegOut = SIGMemtoReg;
-Nilai PCplus4out adalah nilai dari output pc+4. Nilai pc in
adalah nilai update pc yang merupakan hasil seleksi
multiplexer terhadap branch, jump atau instruksi
biasa(pc+4). Untuk branch nilai dari
pcin=pc+4+immediate*4. Untuk jump, nilai pcin= hasil bus
merger dari bit 26:0 yang dishifting left 2 dan 4 bit MSB pc.
-Nilai signoutshift2out = 4* sgnsignimmout sesuai dengan
penjelasan sebelumnya.
Pc=0 <= X"00000000";
Pc=4 <= X"00004020";

-- initializing
-- add $t0, $0, $0
Pada pc=8, instruksi menjadi 0x00004820. Nomor Rd=
9($t1), rs=rt=0($0). Rd1out =Rd2out =nilai $0 =0. Sinyal
ALUSrc bernilai 0 karena merupakan tipe R yang tidak
menggunakan
immediate
pada
ALU.
ALUresult=rd1out+rd2out=0.
Sinyal
sgnregwriteout=1
berarti dilakukan write back. Sgnaddress_regout=9 yang
berarti register yang dipilih sebagai register write back adalah
register 9=$t1 dengan nilai yang ditunjukkan pada
sgnwritedataout. Sinyal control yang lain bernilai nol karena
memang tidak melakukan branch, jump, dan akses memori.
Hal ini bersesuaian dengan instruksi yang diberikan yaitu add
$t1, $0, $0.
Pc=12 <= X"212afff6";

Dari gambar di atas terlihat bahwa nilai instruksi diupdate


saat rising clock sesuai dengan kode instruction memory yang
dibuat. Pada instruksi nop yang pertama tidak ada yang
dilakukan sehingga nilai instruksi dan sinyal bernilai nol.
Nilai register dan memori tidak mengalami perubahan pada

-- addi $t2, $t1, -10

Pada pc=16, instruksi menjadi 0x15400002. Instruksi ini


adalah tipe I. Nomor register rs=10 ($t2), nomor register rt=10
($0). Nilai sgnsignimmout yang merupakan immediate yang
sudah diextend 32bit adalah 2. Nilai immediate*4= nilai
sgnoutshift2out= 8. Nilai update pc=pcplus4+sgnshift2out=
28. Sinyal sgnregwriteout=0 berarti tidak dilakukan write
back. Nilai dari rd1out=-10 dicompare dengan nilai rd2out=0
pada komparator yang menghasilkan output komparator 1.
Akibatnya sesuai dengan persamaan logika:
branch_result <= ((SIGBranch and outEQ) or (SIGBne and
(not outEQ)))
sinyal branch bernilai 1 karena sigbne=1.
Sinyal control untuk akses memori, jump, bernilai 0 karena
tidak dilakukan akses memori dan jump. Sinyal control yang
lain seperti SigAlu_src, SigRegdest,dan Sig_ALUSrc tidak
berpengaruh terhadap instruksi ini(dont care). Hal ini
bersesuaian dengan instruksi yang diberikan yaitu bne $t2,$0,
loop.
Pc=20 <= X"00000000"; -- nop
nop dilakukan pada pc=16+4=20 setelah branch.
Pada pc=12, , instruksi menjadi 0x212afff6. Instruksi ini
adalah tipe I. Nomor register rs=9 ($t1), nomor register rt=10
($t2). Nilai sgnsignimmout yang merupakan immediate yang
sudah diextend 32bit adalah -10. Sinyal sgnregwriteout=1
berarti dilakukan write back. Sgnaddress_regout=10 yang
berarti register yang dipilih sebagai register write back adalah
register 10=$t2 dengan nilai yang ditunjukkan pada
sgnwritedataout. Nilai Rd1out=0. Sinyal ALUSrc bernilai 1
karena merupakan tipe I yang menggunakan immediate pada
ALU. ALUresult=rd1out+sgnsignimmout =0. Sinyal control
yang lain bernilai nol karena memang tidak melakukan
branch, jump, dan akses memori. Hal ini bersesuaian dengan
instruksi yang diberikan yaitu addi $t2, $t1, -10.
Pc=16 <= X"15400002";

-- bne $t2,$0, loop

-- loop :
Loop pertama:

Pc=28 <= X"21080001";

-- addi $t0, $t0, 1

Akibat dari branch maka pc menjadi 28(alamat pc dari loop)


yang memiliki instruksi 0x21080001. Instruksi ini adalah tipe
I. Nomor register rs=8 ($t0), nomor register rt=8 ($t0). Nilai
sgnsignimmout yang merupakan immediate yang sudah
diextend 32bit adalah 1. Sinyal sgnregwriteout=1 berarti
dilakukan write back. Sgnaddress_regout=8 yang berarti
register yang dipilih sebagai register write back adalah register
8=$t0 dengan nilai yang ditunjukkan pada sgnwritedataout.
Nilai rd1out=rd2out=0. Nilai rd1out=nilai $t0=0 karena
sebelumnya diinisialisasi 0. Sinyal ALUSrc bernilai 1 karena
merupakan tipe I yang menggunakan immediate pada ALU.
ALUresult=rd1out+sgnsignimmout =1. Sinyal control yang
lain bernilai nol karena memang tidak melakukan branch,
jump, dan akses memori. Hal ini bersesuaian dengan instruksi
yang diberikan yaitu addi $t0, $t0, 1.
Pc=32 <= X"21290001"; -- addi $t1, $t1, 1
Pada pc=32, , instruksi menjadi 0x21290001. Instruksi ini
adalah tipe I. Nomor register rs=9 ($t1), nomor register rt=9

($t1). Nilai sgnsignimmout yang merupakan immediate yang


sudah diextend 32bit adalah 1. Sinyal sgnregwriteout=1
berarti dilakukan write back. Sgnaddress_regout=9 yang
berarti register yang dipilih sebagai register write back adalah
register 9=$t1 dengan nilai yang ditunjukkan pada
sgnwritedataout. Nilai rd1out=rd2out=0. Nilai rd1out=nilai
$t1=0 karena sebelumnya diinisialisasi 0. Sinyal ALUSrc
bernilai 1 karena merupakan tipe I yang menggunakan
immediate pada ALU. ALUresult=rd1out+sgnsignimmout
=1. Sinyal control yang lain bernilai nol karena memang tidak
melakukan branch, jump, dan akses memori. Hal ini
bersesuaian dengan instruksi yang diberikan yaitu addi $t1,
$t1, 1.
Pc=36 <= X"212afff6";
-- addi $t2, $t1, -10
Pada pc=36 , instruksi menjadi 0x212afff6. Instruksi ini
adalah tipe I. Nomor register rs=9 ($t1), nomor register rt=10
($t2). Nilai sgnsignimmout yang merupakan immediate yang
sudah diextend 32bit adalah -10. Sinyal sgnregwriteout=1
berarti dilakukan write back. Sgnaddress_regout=10 yang
berarti register yang dipilih sebagai register write back adalah
register 10=$t2 dengan nilai yang ditunjukkan pada
sgnwritedataout. Nilai Rd1out=1=$t1. Sinyal ALUSrc
bernilai 1 karena merupakan tipe I yang menggunakan
immediate pada ALU. ALUresult=rd1out+sgnsignimmout =9. Sinyal control yang lain bernilai nol karena memang tidak
melakukan branch, jump, dan akses memori. Hal ini
bersesuaian dengan instruksi yang diberikan yaitu addi $t2,
$t1, -10.
Pc=40, <= X"1540fffc"; -- bne $t2, $0, loop
Instruksi yang diberikan hampir sama dengan instruksi bne
$t2,$0, loop yang telah dieksekusi pada pc=16. Perbedaannya
hanyalah pada immediate yang diberikan dan nilai
perbandingan yang digunakan untuk branch. Nilai yang
dibandingkan pada bne ini adalah nilai $t2 dan $0. Nilai $t2=9 != $0=0 sehingga nilai sinyal branch_result=1. Nilai update
pc= pcplus4+ sgnshift2out = 28, dengan nilai sgnshift2out = 16. Akibatnya alamat pc kembali menuju alamat loop yaitu
28.

B. Tugas 2 : Pengujian Menggunakan Testbench


Berdasarkan Tugas Pendahuluan Nomor 2, diperoleh bahasa
assembly sebagai berikut :
. Instruksi
addi $s0, $0, 19
addi $s1, $0, 21
bne $s2, $s3, 8

Arti
$s0 0+19
$s1 0+21
Fungsi if, apabila
$s!2=$3, maka instruksi
akan lanjut 2 instruksi
berikutnya
nop
Jeda satu siklus untuk
instruksi branching
sub $s3, $s0, $s1
$s3 $s0 - $s1
addi $s3, $s3, 0
$s3 $s3 + 0
addi $s4, $s0, 4
$s4 $s0 + 4
sw $s1, ($s4)
Menyimpan nilai pada
register $1 ke dalam nilai
alamat register $4
lw $s5, ($s4)
Data pada memori $s4
diambil dan disimpan ke
$s5
add $s5, $s5, $0
$s5 $s5 + $0
j 00000000
Jump ke address
0x00000000
Nop
Jeda satu siklus untuk
instruksi branching
Setelah dilakukan kompilasi, hasil simulasi fungsional
diamati untuk menganalisis pengujian desain.
Hasil simulasi fungsional menunjukkan hasil yang sesuai
dengan cara kerja mikroprosesor single-cycle MIPS32
sehingga dapat disimpulkan top-level desain telah
diimplementasikan dengan benar. Hasil simulasi timing
menunjukkan adanya delay pada rangkaian logika.
IV. SIMPULAN

Pc=44 <= X"00000000"; -- nop


nop dilakukan pada pc=40+4=44 setelah branch.
Proses dari looping ini terjadi sampai perbandingan pada bne
tidak terpenuhi yaitu $t2=0 atau i=10. Hal ini dapat dilihat
pada gambar lengkap simulasi pada lampiran. Nilai dari
$t0=sum=sum+1 dan $t1=i=i+1 akan diupdate seiring dengan
berlangsungnya looping ini. Setelah looping berakhir, maka
pc selanjutnya adalah bernilai 48 yaitu alamat dari done.
Karena addu $s0, $ra, $0 dan addu $ra, $0, $s0 tidak dikenali
pada source code untuk control unit, maka nilainya tidak dapat
diverifikasi. Namun alamat pc menunjukkan hasil yang
sesuai.

Single-Cycle MIPS32 dapat dibuat dengan cara


menggabungkan komponen-komponen seperti ALU,
multiplexer, register file, instruction memory, data
memory, dan komponen lainnya ke dalam suatu top level
design. Deklarasi komponen, definisi sinyal penghubung
antar komponen, serta port mapping yang sesuai maka
akan dapat menghasilkan suatu Single-Cycle MIPS32
yang utuh.
Pengujian Single-Cycle MIPS32 dapat dilakukan dengan
memberikan instruksi-instruksi dalam Bahasa MIPS yang
dapat dieksekusi oleh mikroprosesor. Instruksi-instruksi
tersebut diubah ke dalam format instruksi MIPS32 bit
(opcode, func, rt, rs, rd) yang kemudian diubah menjadi
suatu bilangan hexadecimal 8 bit, yang disimpan pada
instruction memory sebelum akhirnya dieksekusi.
REFERENSI

Hasil simulasi fungsional menunjukkan hasil yang sesuai


dengan cara kerja dari MIPS single cycle sehingga top-level
ini dapat dianggap telah didesain dengan benar. Perbedaan
pada simulasi timing diakibatkan oleh adanya delay
rangkaian logika.

[1] Bryant, Randal E. dan David R. OHallaron.


Computer
System:
A
Programmers
Perspective.Prentice Hall. USA.2011

[2] Tim Asisten Praktikum.Modul Praktikum EL3111


Arsitektur Sistem Komputer. Laboratorium Sinyal
dan Sistem Sekolah Teknik Elektro dan Informasika
Institut Teknologi Bandung. Bandung. 2015.

Biodata Penulis

Penulis memiliki nama lengkap Rosana Dewi Amelinda.


Lahir 20 tahun silam di Baturaja, 9 April 1995 dari
pasangan suami istri Masri dan Eviyarti yang sekarang

bertempat tinggal di Jalan Bambu Kuning no 21, 22


Hadimulyo Barat, Metro, Lampung. Penulis memiliki
seorang kakak bernama Ricky Andreas Pratama yang lahir
di Baturaja, 9 Mei 1992. Kakak penulis merupakan sarjana
Ilmu Komputer di Universitas Lampung angkatan 2010.
Saat ini penulis sedang menjalani perkuliahan semester 5 di
Institut Teknologi Bandung dengan mengambil jurusan
Teknik Elektro. Sebelumnya penulis bersekolah di SMA
Negeri 1 Metro, Lampung. Selama masa perkuliahan di
ITB penulis bertempat tinggal di Jalan Cisitu Baru no 7,
Bandung.

Lampiran
Hasil simulasi Functional
0-110ns

110ns - 220ns

210 ns 320 ns

320 ns 430 ns

Hasil simulasi Timing

0 110 ns

110 ns 220 ns

230 ns 340 ns

330 ns 440 ns

Source code
1. instrucMem.vhd
----------

Praktikum EL3111 Arsitektur Sistem Komputer


Modul : 5
Percobaan : 1 dan 2
Tanggal : 2 Desember 2015
Kelompok : 30
Rombongan : C
Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
Nama File : instrucMem.vhd

-- Deskripsi : Desain instruction memory


LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
LIBRARY altera_mf;
USE altera_mf.altera_mf_components.ALL;
entity instrucMEM is
port (
ADDR : in std_logic_vector (31 downto 0);
clock : in std_logic;
INSTR : out std_logic_vector (31 downto 0)
);
end entity;
architecture behavior of instrucMEM is
type ramtype is array (255 downto 0) of std_logic_vector (31 downto 0);
signal mem: ramtype;
begin
process (clock,ADDR)
begin
if clock'event and clock='1' then
INSTR <= mem(conv_integer (ADDR));
end if;
end process;
-- Isi instruction memory
mem(0) <= X"00000000"; -mem(4) <= X"00004020"; -mem(8) <= X"00004820"; -mem(12) <= X"212afff6";-mem(16) <= X"15400002"; -mem(20) <= X"00000000"; --- if not bne, j done
-- loop :
mem(28) <= X"21080001"; -mem(32) <= X"21290001"; -mem(36) <= X"212afff6"; -mem(40) <= X"1540fffc"; -mem(44) <= X"00000000"; --- done :
mem(48) <= X"03e08021"; -mem(52) <= X"0010f821"; --

initializing
add $t0, $0, $0
add $t1,$0,$0
$t2, $t1, -10
bne $t2,$0, loop
nop
addi
addi
addi
bne
nop

$t0,
$t1,
$t2,
$t2,

$t0, 1
$t1, 1
$t1, -10
$0, loop

addu $s0, $ra, $0


addu $ra, $0, $s0

end behavior;

2. lshifter_26_28.vhd
-- Praktikum EL3111 Arsitektur Sistem Komputer
-- Modul : 5
-- Percobaan : 1 dan 2
-- Tanggal : 2 Desember 2015
-- Kelompok : 30
-- Rombongan : C
-- Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
-- Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
-- Nama File : lshifter_26_28.vhd
-- Deskripsi : Left shifter yang memiliki input data dengan lebar 26 bit dan output
data dengan lebar 28 bit

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY lshifter_26_28 IS
PORT (
D_IN : IN std_logic_vector (25 DOWNTO 0);
D_OUT : OUT std_logic_vector (27 DOWNTO 0)
);
END lshifter_26_28;
ARCHITECTURE behavior OF lshifter_26_28 IS
BEGIN
D_OUT (27 DOWNTO 2) <= D_IN (25 DOWNTO 0);
D_OUT (1 DOWNTO 0) <= (others => '0');
END behavior;

3. lshifter_32_32.vhd
-- Praktikum EL3111 Arsitektur Sistem Komputer
-- Modul : 5
-- Percobaan : 1 dan 2
-- Tanggal : 2 Desember 2015
-- Kelompok : 30
-- Rombongan : C
-- Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
-- Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
-- Nama File : lshifter_32_32.vhd
-- Deskripsi : Left shifter yang memiliki input data dengan lebar 32 bit dan output
data dengan lebar 32 bit
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY lshifter_32_32 IS
PORT (
D_IN : IN std_logic_vector (31 DOWNTO 0);
D_OUT : OUT std_logic_vector (31 DOWNTO 0)
);
END lshifter_32_32;
ARCHITECTURE behavior OF lshifter_32_32 IS
BEGIN
D_OUT (31 DOWNTO 2) <= D_IN (29 DOWNTO 0);
D_OUT (1 DOWNTO 0) <= (others => '0');
END behavior;

4. mux_2to1_32bit.vhd
----------

Praktikum EL3111 Arsitektur Sistem Komputer


Modul : 5
Percobaan : 1 dan 2
Tanggal : 2 Desember 2015
Kelompok : 30
Rombongan : C
Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
Nama File : mux_2to1_32bit.vhd

-- Deskripsi : Multiplexer 2 to 1, 32 bit


LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
LIBRARY altera_mf;
USE altera_mf.altera_mf_components.ALL;
ENTITY mux_2to1_32bit IS
PORT (
D1 : IN std_logic_vector (31 DOWNTO 0); -- Data Input 1
D2 : IN std_logic_vector (31 DOWNTO 0); -- Data Input 2
Y : OUT std_logic_vector (31 DOWNTO 0); -- Selected Data
S : IN std_logic
);
END mux_2to1_32bit;
ARCHITECTURE Behavior OF mux_2to1_32bit IS
BEGIN
PROCESS (S, D1, D2)
BEGIN
IF (S = '1') THEN
Y <= D2;
ELSE
Y <= D1;
END IF;
END PROCESS;
END Behavior;

5. mux_4to1_5bit.vhd
-----------

Praktikum EL3111 Arsitektur Sistem Komputer


Modul : 5
Percobaan : 1 dan 2
Tanggal : 2 Desember 2015
Kelompok : 30
Rombongan : C
Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
Nama File : mux_4to1_32bit.vhd
Deskripsi : Multiplexer 4 to 1, 5 bit

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY mux_4to1_5bit IS
PORT (
D1 : IN std_logic_vector (4 DOWNTO 0); -- Data Input 1
D2 : IN std_logic_vector (4 DOWNTO 0); -- Data Input 2
D3 : IN std_logic_vector (4 DOWNTO 0); -- Data Input 3
D4 : IN std_logic_vector (4 DOWNTO 0); -- Data Input 4
Y : OUT std_logic_vector (4 DOWNTO 0); -- Selected Data
S : IN std_logic_vector (1 DOWNTO 0) -- Selector
);
END mux_4to1_5bit;
ARCHITECTURE Behavior OF mux_4to1_5bit IS
BEGIN

with S select
Y <= D1 when "00",
D2 when "01",
D3 when "10",
D4 when "11";
END Behavior;

6. mux_4to1_32bit.vhd
-----------

Praktikum EL3111 Arsitektur Sistem Komputer


Modul : 5
Percobaan : 1 dan 2
Tanggal : 2 Desember 2015
Kelompok : 30
Rombongan : C
Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
Nama File : mux_4to1_32bit.vhd
Deskripsi : Multiplexer 4 to 1, 21 bit

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY mux_4to1_32bit IS
PORT (
D1 : IN std_logic_vector (31 DOWNTO 0);
D2 : IN std_logic_vector (31 DOWNTO 0);
D3 : IN std_logic_vector (31 DOWNTO 0);
D4 : IN std_logic_vector (31 DOWNTO 0);
Y : OUT std_logic_vector (31 DOWNTO 0);
S : IN std_logic_vector (1 DOWNTO 0) -);
END mux_4to1_32bit;

-- Data Input 1
-- Data Input 2
-- Data Input 3
-- Data Input 4
-- Selected Data
Selector

ARCHITECTURE Behavior OF mux_4to1_32bit IS


BEGIN
with S select
Y <= D1 when "00",
D2 when "01",
D3 when "10",
D4 when "11";
END Behavior;

7. program_counter.vhd
-----------

Praktikum EL3111 Arsitektur Sistem Komputer


Modul : 5
Percobaan : 1 dan 2
Tanggal : 2 Desember 2015
Kelompok : 30
Rombongan : C
Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
Nama File : program_counter.vhd
Deskripsi : Program counter yang berupa satu buah register dengan lebar 32 bit

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY program_counter IS
PORT (
clk : IN std_logic;
PC_in : IN std_logic_vector (31 DOWNTO 0);
PC_out : OUT std_logic_vector (31 DOWNTO 0)
);
END program_counter;
ARCHITECTURE behavior OF program_counter IS
BEGIN
PROCESS (clk)
BEGIN
if clk' EVENT and clk='1' then
PC_out <= PC_in;
end if;
END PROCESS;
END behavior;

8. reg_file.vhd
-----------

Praktikum EL3111 Arsitektur Sistem Komputer


Modul : 5
Percobaan : 1 dan 2
Tanggal : 2 Desember 2015
Kelompok : 30
Rombongan : C
Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
Nama File : reg_file.vhd
Deskripsi : Desain register

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
LIBRARY altera_mf;
USE altera_mf.ALL;
ENTITY reg_File IS
PORT
(
clock : IN STD_LOGIC;
-- Clock
WR_EN : IN STD_LOGIC;
-- Write enable
ADDR1 : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
-- Input 1
ADDR2 : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
-- Input 2
ADDR3 : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
-- Input 3
WR_Data3: IN STD_LOGIC_VECTOR(31 DOWNTO 0);
-- Write Data
RD_Data1 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); -- read data 1
RD_Data2 : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
-- read data 2
);
END entity;
ARCHITECTURE behavior OF reg_File IS
TYPE ramtype IS ARRAY (31 DOWNTO 0) OF STD_LOGIC_VECTOR (31 DOWNTO 0);
SIGNAL mem: ramtype;
BEGIN
process (clock, WR_EN, ADDR1, ADDR2, ADDR3, mem)
begin
if (clock'EVENT and clock = '0') then

RD_Data1 <= mem(conv_integer (ADDR1));


RD_Data2 <= mem(conv_integer (ADDR2));
elsif (clock'EVENT and clock = '1' and WR_EN ='1') then
mem(conv_integer (ADDR3)) <= WR_Data3;
end if;
end process;
END behavior;

9. sign_extander.vhd
-- Praktikum EL3111 Arsitektur Sistem Komputer
-- Modul : 5
-- Percobaan : 1 dan 2
-- Tanggal : 2 Desember 2015
-- Kelompok : 30
-- Rombongan : C
-- Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
-- Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
-- Nama File : sign_extender.vhd
-- Deskripsi : Menerima data input sebesar 16bit dan mengeluarkan data output
sebesar 32-bit
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY sign_extender IS
PORT (
D_IN : IN std_logic_vector (15 DOWNTO 0); --Data Input
D_OUT : OUT STD_LOGIC_VECTOR (31 DOWNTO 0) -- Data Output
);
END sign_extender;
ARCHITECTURE behavior OF sign_extender
BEGIN
PROCESS (D_IN(15))
BEGIN
if D_IN(15) = '1' then
D_OUT(31 DOWNTO 16) <= (others =>
else
D_OUT(31 DOWNTO 16) <= (others =>
END IF;
END PROCESS;
D_OUT(15 DOWNTO 0) <= D_IN(15 DOWNTO
END behavior;

IS

'1');
'0');
0);

10. ALU
-- Praktikum EL3111 Arsitektur Sistem Komputer
-- Modul : 5
-- Percobaan : 5
-- Tanggal : 2 Desember 2015
-- Kelompok : 30
-- Rombongan : C
-- Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
-- Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
-- Nama File : ALU.vhd
-- Deskripsi : Menerima dua buah operand sebagai input dengan masing-masing memiliki
lebar data 32 bit. ALU akan memberikan data hasil perhitungan melalui output dengan

lebar data 32 bit. ALU juga memiliki selektor untuk memilih operasi yang akan
dilakukan (penjumlahan => 0X00 atau penguarangan 0X01).
Library ieee;
USE IEEE.STD_LOGIC_1164.all;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY ALU IS
PORT(
OP_1 : IN std_logic_vector (31 DOWNTO 0); -- Data Input 1
OP_2 : IN std_logic_vector (31 DOWNTO 0); -- Data Input 2
OP_SEL : IN std_logic_vector (1 DOWNTO 0); -- Operation Select
OUTCOME
: OUT std_logic_vector (31 DOWNTO 0)
);
END ALU;
ARCHITECTURE behavioral of ALU is
signal op1 : STD_LOGIC_VECTOR(31 DOWNTO 0);
signal op2 : STD_LOGIC_VECTOR (31 DOWNTO 0);
signal cin : STD_LOGIC;
signal cout: STD_LOGIC;
signal hasil: STD_LOGIC_VECTOR(31 DOWNTO 0);
COMPONENT cla_32
PORT (
OPRND_1 : IN STD_LOGIC_VECTOR(31 DOWNTO 0); -- Operand 1
OPRND_2 : IN STD_LOGIC_VECTOR (31 DOWNTO 0); -- Operand 2
C_IN : IN STD_LOGIC; -- Carry In
RESULT : OUT STD_LOGIC_VECTOR (31 DOWNTO 0); -- Result
C_OUT : OUT STD_LOGIC -- Overflow
);
END COMPONENT;
BEGIN
componentcarry: cla_32
PORT MAP
(
OPRND_1 => op1,
OPRND_2 => op2,
C_IN=>cin,
C_OUT => cout,
RESULT => hasil
);
PROCESS (OP_SEL)
BEGIN
IF OP_SEL = "00" then
op1<=OP_1;
op2<=OP_2;
cin <= OP_SEL(0);
OUTCOME <= hasil;
ELSIF OP_SEL= "01" then
op1<=OP_1;
op2<=(not OP_2);
cin <= OP_SEL(0);
OUTCOME <= hasil;
END IF;
END PROCESS;
END behavioral;

11. cla_32.vhd

-- Praktikum EL3111 Arsitektur Sistem Komputer


-- Modul : 5
-- Percobaan : 1 dan 2
-- Tanggal : 2 Desember 2015
-- Kelompok : 30
-- Rombongan : C
-- Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
-- Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
-- Nama File : cla_32.vhd
-- Deskripsi : Mampu menjumlahkan dua buah input dengan lebar data masing-masing 32
bit dan mengeluarkan hasil penjumlahan dalam bentuk output dengan lebar data 32 bit
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cla_32 IS
PORT (
OPRND_1 : IN STD_LOGIC_VECTOR (31 DOWNTO 0); -- Operand 1
OPRND_2 : IN STD_LOGIC_VECTOR (31 DOWNTO 0); -- Operand 2
C_IN : IN STD_LOGIC; -- Carry in
RESULT : OUT STD_LOGIC_VECTOR (31 DOWNTO 0); -- RESULT
C_OUT : OUT STD_LOGIC -- Overflow
);
END cla_32;
ARCHITECTURE behavioral OF cla_32 IS
signal sum : std_logic_vector (31 DOWNTO 0);
signal carry_a : std_logic_vector (31 DOWNTO 0);
signal carry_b : std_logic_vector (31 DOWNTO 0);
signal carry_in : std_logic_vector (31 DOWNTO 1);
BEGIN
sum <= OPRND_1 XOR OPRND_2;
carry_a <= OPRND_1 AND OPRND_2;
carry_b <= OPRND_1 OR OPRND_2;
PROCESS (carry_a, carry_b, carry_in)
BEGIN
carry_in(1) <= carry_a(0) OR (carry_b(0) AND C_IN);
carry : for i in 1 to 30 loop
carry_in(i+1) <= carry_a(i) or (carry_b(i) and carry_in(i));
END loop;
C_OUT <= carry_a(31) or (carry_b(31) and carry_in(31));
END PROCESS;
RESULT(0) <= sum(0) XOR C_IN;
RESULT(31 DOWNTO 1) <= sum(31 DOWNTO 1) XOR carry_in(31 DOWNTO 1);
END behavioral;

12. comparator.vhd
a-- Praktikum EL3111 Arsitektur Sistem Komputer
--------

Modul : 5
Percobaan : 1 dan 2
Tanggal : 2 Desember 2015
Kelompok : 30
Rombongan : C
Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)

-- Nama File : comparator.vhd


-- Deskripsi : Program komparator
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY comparator IS
PORT (
D_1 : IN std_logic_vector (31 DOWNTO 0); -- Data Input 1
D_2 : IN std_logic_vector (31 DOWNTO 0); -- Data Input 2
EQ : OUT std_logic -- Output
);
END comparator;
ARCHITECTURE Behavior OF comparator IS
BEGIN
EQ <= '1' WHEN D_1 = D_2 ELSE '0';
END Behavior;

13. data_memory.vhd
-- Praktikum EL3111 Arsitektur Sistem Komputer
-- Modul
: 5
-- Percobaan : 1 dan 2
-- Tanggal
: 2 Desember 2015
-- Kelompok : 30
-- Rombongan : C
-- Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
-- Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
-- Nama File : data_memory.vhd
-- Deskripsi : Desain data memory dengan menggunakan template desain Altera
MegaFunction ALTSYNCRAM
LIBRARY ieee;
USE ieee.std_logic_1164.all;
LIBRARY altera_mf;
USE altera_mf.all;
ENTITY data_memory IS
PORT(
ADDR
: IN STD_LOGIC_VECTOR(7 DOWNTO 0); -- alamat
WR_EN, clock : IN STD_LOGIC; -- Indikator penulisan dan clock
RD_EN : IN STD_LOGIC; -- Indikator Pembacaan
RD_Data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
WR_Data : IN STD_LOGIC_VECTOR(7 DOWNTO 0));
END data_memory;
ARCHITECTURE structural OF data_memory IS
COMPONENT altsyncram
-- komponen memori
GENERIC (
init_file : STRING;
-- name of the .mif file
operation_mode : STRING; -- the operation mode
widthad_a : NATURAL; -- width of address_a[]
width_a : NATURAL);
-- width of data_a[]
PORT
(
wren_a : IN STD_LOGIC ; -- Write Enable Activation

clock0 : IN STD_LOGIC ; -- Clock


address_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0); -- Address Input
q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); -- Data Output
data_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0) --Data Input
);
END COMPONENT;
BEGIN
altsyncram_component : altsyncram
GENERIC MAP (
init_file => "dmemory.mif",
operation_mode => "SINGLE_PORT",
widthad_a => 8,
width_a => 8
)
PORT MAP (
wren_a => WR_EN AND not RD_EN,
data_a => WR_Data,
clock0 => clock,
address_a => ADDR,
q_a => RD_Data
);
END structural;

14. cu
-- Praktikum EL3111 Arsitektur Sistem Komputer
-- Modul
: 5
-- Percobaan : 1 dan 2
-- Tanggal
: 2 Desember 2015
-- Kelompok : 30
-- Rombongan : C
-- Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
-- Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
-- Nama File : cu.vhd
-- Deskripsi : Suato Control Unit yang melalakukan assignment sinyal kontrol
terhadap opcode dan func.
Library ieee;
USE ieee.std_logic_1164.all;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cu IS
PORT ( OP_In : IN STD_LOGIC_VECTOR (5 DOWNTO 0);
FUNCT_In : IN STD_LOGIC_VECTOR (5 DOWNTO 0);
Sig_Jmp : OUT STD_LOGIC_VECTOR (1 DOWNTO 0);
Sig_Bne : OUT STD_LOGIC;
Sig_Branch : OUT STD_LOGIC;
Sig_MemtoReg : OUT STD_LOGIC;
Sig_MemRead : OUT STD_LOGIC;
Sig_MemWrite : OUT STD_LOGIC;
Sig_RegDest : OUT STD_LOGIC_VECTOR (1 DOWNTO 0);
Sig_RegWrite : OUT STD_LOGIC;
Sig_ALUSrc : OUT STD_LOGIC_VECTOR (1 DOWNTO 0);
Sig_ALUCtrl : OUT STD_LOGIC_VECTOR (1 DOWNTO 0)
);
END cu ;
architecture behavioral of cu is

BEGIN
PROCESS (OP_In, FUNCT_In)
BEGIN
IF OP_In="000000" then
IF FUNCT_In="100000" then
Sig_Jmp <= "00";
Sig_Bne <= '0';
Sig_Branch <= '0';
Sig_MemtoReg <= '0';
Sig_MemRead <='0';
Sig_MemWrite <='0';
Sig_RegDest <="01";
Sig_RegWrite <='1';
Sig_ALUSrc <="00";
Sig_ALUCtrl<="00";
ELSIF FUNCT_In="100010" then
Sig_Jmp <= "00";
Sig_Bne <= '0';
Sig_Branch <= '0';
Sig_MemtoReg <= '0';
Sig_MemRead <='0';
Sig_MemWrite <='0';
Sig_RegDest <="01";
Sig_RegWrite <='1';
Sig_ALUSrc <="00";
Sig_ALUCtrl<="01";
ELSIF FUNCT_In="000000" then
Sig_Jmp <= "00";
Sig_Bne <= '0';
Sig_Branch <= '0';
Sig_MemtoReg <= '0';
Sig_MemRead <='0';
Sig_MemWrite <='0';
Sig_RegDest <="00";
Sig_RegWrite <='0';
Sig_ALUSrc <="00";
Sig_ALUCtrl<="00";
END IF;
ELSIF OP_In="000100" then
Sig_Jmp <= "00";
Sig_Bne <= '0';
Sig_Branch <= '1';
Sig_MemtoReg <= '0';
Sig_MemRead <='0';
Sig_MemWrite <='0';
Sig_RegWrite <='0';
ELSIF OP_In="000101" then
Sig_Jmp <= "00";
Sig_Bne <= '1';
Sig_Branch <= '0';
Sig_MemtoReg <= '0';
Sig_MemRead <='0';
Sig_MemWrite <='0';
Sig_RegWrite <='0';
ELSIF OP_In="001000" then
Sig_Jmp <= "00";
Sig_Bne <= '0';
Sig_Branch <= '0';
Sig_MemtoReg <= '0';
Sig_MemRead <='0';

Sig_MemWrite <='0';
Sig_RegDest <="00";
Sig_RegWrite <='1';
Sig_ALUSrc <="01";
Sig_ALUCtrl<="00";
ELSIF OP_In="100011" then
Sig_Jmp <= "00";
Sig_Bne <= '0';
Sig_Branch <= '0';
Sig_MemtoReg <= '1';
Sig_MemRead <='1';
Sig_MemWrite <='0';
Sig_RegDest <="00";
Sig_RegWrite <='1';
Sig_ALUSrc <="01";
Sig_ALUCtrl<="00";
ELSIF OP_In="101011" then
Sig_Jmp <= "00";
Sig_Bne <= '0';
Sig_Branch <= '0';
Sig_MemtoReg <= '0';
Sig_MemRead <='0';
Sig_MemWrite <='1';
Sig_RegDest <="00";
Sig_RegWrite <='0';
Sig_ALUSrc <="01";
Sig_ALUCtrl<="00";
ELSIF OP_In="000010" then
Sig_Jmp <= "01";
Sig_Bne <= '0';
Sig_Branch <= '0';
Sig_MemtoReg <= '0';
Sig_MemRead <='0';
Sig_MemWrite <='0';
Sig_RegWrite <='0';
END IF ;
END PROCESS;
END behavioral;

15. bus_merger.vhd
-----------

Praktikum EL3111 Arsitektur Sistem Komputer


Modul
: 5
Percobaan : 1 dan 2
Tanggal
: 2 Desember 2015
Kelompok : 30
Rombongan : C
Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
Nama File : bus_merger.vhd
Deskripsi : Program Bus Merger.

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY bus_merger IS
PORT (
DATA_IN1 : IN std_logic_vector (3 DOWNTO 0); -- Data Input 1
DATA_IN2 : IN std_logic_vector (27 DOWNTO 0); -- Data Input 2

DATA_OUT : OUT std_logic_vector (31 DOWNTO 0) -- Output


);
END bus_merger;
ARCHITECTURE Behavior OF bus_merger IS
BEGIN
DATA_OUT <= DATA_IN1 & DATA_IN2;
END Behavior;

16. dmemory.mif
WIDTH=32; -- number of bits of data per word
DEPTH=256; -- the number of addresses
ADDRESS_RADIX=HEX;
DATA_RADIX=HEX;
CONTENT
BEGIN
00 : 00000000;
04 : 00004020;
08 : 00004820;
1C : 212afff6;
20 : 15400002;
24 : 00000000;
2C : 21080001;
30 : 21290001;
34 : 212afff6;
38 : 1540fffc;
3C : 00000000;
40 : 03e08021;
44 : 0010f821;
48 : 03e00008;
END;

17. top_level_design
-----------

Praktikum EL3111 Arsitektur Sistem Komputer


Modul : 5
Percobaan : 1 dan 2
Tanggal : 2 Desember 2015
Kelompok : 30
Rombongan : C
Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
Nama (NIM) 2 : Audinata Ibrahim Sitaba (13213061)
Nama File : top_level_design.vhd
Deskripsi : Top level design

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
entity top_level_design is
PORT (
clk, rst
: IN STD_LOGIC;
ALU_result, PCinTest, PCoutTest : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
rd1out,rd2out, instrout ,sgnsignimmout : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
outmux1out, PCplus4out,sgnRead_Mem1out : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
sgnwritedataout:OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
instr_15_11_out
: OUT STD_LOGIC_VECTOR (4 downto 0);
instr_20_16_out
: OUT STD_LOGIC_VECTOR (4 downto 0);

instr_25_21_out
: OUT STD_LOGIC_VECTOR (4 downto 0);
sgnaddress_regout
: OUT STD_LOGIC_VECTOR (4 downto 0);
sgnMemReadout, sgnMemWriteout
: OUT STD_LOGIC;
sgnMemToRegOut
: OUT STD_LOGIC;
sgnregdestout,sgnALUSrcout :OUT STD_LOGIC_VECTOR (1 downto 0);
sgnregwriteout,sgnBranchResult :OUT STD_LOGIC;
signoutshift2out:OUT STD_LOGIC_VECTOR (31 DOWNTO 0)
);
end top_level_design;
architecture structural of top_level_design is
-- cu
component cu
PORT ( OP_In : IN STD_LOGIC_VECTOR (5 DOWNTO 0);
FUNCT_In : IN STD_LOGIC_VECTOR (5 DOWNTO 0);
Sig_Jmp : OUT STD_LOGIC_VECTOR (1 DOWNTO 0);
Sig_Bne : OUT STD_LOGIC;
Sig_Branch : OUT STD_LOGIC;
Sig_MemtoReg : OUT STD_LOGIC;
Sig_MemRead : OUT STD_LOGIC;
Sig_MemWrite : OUT STD_LOGIC;
Sig_RegDest : OUT STD_LOGIC_VECTOR (1 DOWNTO 0);
Sig_RegWrite : OUT STD_LOGIC;
Sig_ALUSrc : OUT STD_LOGIC_VECTOR (1 DOWNTO 0);
Sig_ALUCtrl : OUT STD_LOGIC_VECTOR (1 DOWNTO 0)
);
END COMPONENT;
-- PC
component program_counter
PORT (
clk
: IN STD_LOGIC;
PC_in
: IN STD_LOGIC_VECTOR (31 DOWNTO 0);
PC_out
: OUT STD_LOGIC_VECTOR (31 DOWNTO 0)
);
END COMPONENT;
-- cla
component cla_32
PORT ( OPRND_1 : IN STD_LOGIC_VECTOR(31 DOWNTO 0); -- Operand 1
OPRND_2 : IN STD_LOGIC_VECTOR (31 DOWNTO 0); -- Operand 2
C_IN : IN STD_LOGIC; -- Carry In
RESULT : OUT STD_LOGIC_VECTOR (31 DOWNTO 0); -- Result
C_OUT : OUT STD_LOGIC -- Overflow
);
END COMPONENT;
--ALU
COMPONENT ALU
PORT(
OP_1
: IN std_logic_vector (31 DOWNTO 0); -- Data Input 1
OP_2
: IN std_logic_vector (31 DOWNTO 0); -- Data Input 2
OP_SEL : IN std_logic_vector (1 DOWNTO 0); -- Operation Select
OUTCOME : OUT std_logic_vector (31 DOWNTO 0)
);
END COMPONENT;
-- bus_merger
COMPONENT bus_merger

PORT ( DATA_IN1 : IN STD_LOGIC_VECTOR (3 DOWNTO 0);


DATA_IN2 : IN STD_LOGIC_VECTOR (27 DOWNTO 0);
DATA_OUT : OUT STD_LOGIC_VECTOR (31 DOWNTO 0)
);
END COMPONENT;
-- data memori
COMPONENT data_memory
PORT(
ADDR
: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
WR_EN, RD_EN, clock : IN STD_LOGIC;
RD_Data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
WR_Data : IN STD_LOGIC_VECTOR(7 DOWNTO 0));
END COMPONENT;
--instrucmem
COMPONENT instrucMEM
port (
ADDR : in std_logic_vector (31 downto 0);
clock : in std_logic;
INSTR : out std_logic_vector (31 downto 0)
);
END COMPONENT;
-- komparator
COMPONENT comparator
PORT ( D_1 : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
D_2 : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
EQ : OUT STD_LOGIC -- Hasil Perbandingan EQ
);
END COMPONENT;
--mux 2 to 1
COMPONENT mux_2to1_32bit
PORT (
D1 : IN std_logic_vector (31 DOWNTO 0); -- Data Input 1
D2 : IN std_logic_vector (31 DOWNTO 0); -- Data Input 2
Y : OUT std_logic_vector (31 DOWNTO 0); -- Selected Data
S : IN std_logic -- Selector
);
END COMPONENT;
--mux 4 to 1 5 bit
COMPONENT mux_4to1_5bit
PORT ( D1 : IN std_logic_vector (4 DOWNTO 0); -- Data Input 1
D2 : IN std_logic_vector (4 DOWNTO 0); -- Data Input 2
D3 : IN std_logic_vector (4 DOWNTO 0); -- Data Input 3
D4 : IN std_logic_vector (4 DOWNTO 0); -- Data Input 4
Y : OUT std_logic_vector (4 DOWNTO 0); -- Selected Data
S : IN std_logic_vector (1 DOWNTO 0) -- Selector
);
END COMPONENT;
--mux 4 to 1 32 bit
COMPONENT mux_4to1_32bit
PORT ( D1 : IN std_logic_vector (31 DOWNTO 0); -- Data Input 1
D2 : IN std_logic_vector (31 DOWNTO 0); -- Data Input 2
D3 : IN std_logic_vector (31 DOWNTO 0); -- Data Input 3
D4 : IN std_logic_vector (31 DOWNTO 0); -- Data Input 4
Y : OUT std_logic_vector (31 DOWNTO 0); -- Selected Data

S : IN std_logic_vector (1 DOWNTO 0)
-- Selector
);
END COMPONENT;
-- register
COMPONENT Reg_File
PORT(
clock,WR_EN : IN STD_LOGIC;
ADDR1,ADDR2,ADDR3 : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
WR_Data3: IN STD_LOGIC_VECTOR(31 DOWNTO 0);
RD_Data1,RD_Data2: OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
);
END COMPONENT;
-- sign_extender
COMPONENT sign_extender
PORT(
D_In : IN std_logic_vector (15 DOWNTO 0); -- Data Input 1
D_Out : OUT std_logic_vector (31 DOWNTO 0) -- Data Input 2
);
END COMPONENT;
COMPONENT lshifter_32_32 -- lshift 32_32
PORT ( D_IN : IN STD_LOGIC_VECTOR (31 DOWNTO 0); -- Input 32-bit
D_OUT : OUT STD_LOGIC_VECTOR (31 DOWNTO 0) -- Output 32-bit
);
END COMPONENT;
COMPONENT lshifter_26_28 -- lshift 26_28
PORT ( D_IN : IN STD_LOGIC_VECTOR (25 DOWNTO 0); -- Input 32-bit
D_OUT : OUT STD_LOGIC_VECTOR (27 DOWNTO 0) -- Output 32-bit
);
END COMPONENT;
-- deklarasi sinyal-sinyal
SIGNAL pcin, pcout : STD_LOGIC_VECTOR (31 downto 0); -- PC
SIGNAL instruction : STD_LOGIC_VECTOR (31 downto 0); -- Instruction memory
SIGNAL cout1, cout2 : STD_LOGIC; -- adder
SIGNAL result1, result2 : STD_LOGIC_VECTOR (31 DOWNTO 0);-- adder1adder2
SIGNAL branch_result, outEQ : STD_LOGIC; -- gerbang and
SIGNAL Add1res
: STD_LOGIC_VECTOR (31 downto 0); -SIGNAL outmux1, outbus, outmux2, outmux5 : STD_LOGIC_VECTOR (31 downto 0);
SIGNAL outshift1
: STD_LOGIC_VECTOR (27 DOWNTO 0);
SIGNAL outshift2
: STD_LOGIC_VECTOR (31 DOWNTO 0);
SIGNAL outmux4 : STD_LOGIC_VECTOR (4 DOWNTO 0);
SIGNAL WD3, RD1, RD2 : STD_LOGIC_VECTOR (31 DOWNTO 0);
SIGNAL inshift,inshift2 : STD_LOGIC_VECTOR (31 DOWNTO 0);
SIGNAL srcB
: STD_LOGIC_VECTOR (31 DOWNTO 0);
SIGNAL ALUresult
: STD_LOGIC_VECTOR (31 DOWNTO 0);
SIGNAL Read_mem : STD_LOGIC_VECTOR (7 DOWNTO 0);
SIGNAL SIGBne : STD_LOGIC;
SIGNAL SIGBranch : STD_LOGIC;
SIGNAL SIGMemtoReg : STD_LOGIC;
SIGNAL SIGMemWrite : STD_LOGIC;
SIGNAL SigMemRead
: STD_LOGIC;
SIGNAL SIGRegDest : STD_LOGIC_VECTOR (1 DOWNTO 0);
SIGNAL SIGRegWrite : STD_LOGIC;
SIGNAL SIGJump
: STD_LOGIC_VECTOR (1 DOWNTO 0);
SIGNAL SIGALUSrc : STD_LOGIC_VECTOR (1 DOWNTO 0);
SIGNAL SIGALUControl : STD_LOGIC_VECTOR (1 DOWNTO 0);
SIGNAL Readmem: STD_LOGIC_VECTOR (31 DOWNTO 0);

BEGIN
--Instruction Fetch
Blok_PC : program_counter
PORT MAP (clk, pcin, pcout);
Blok_cla1 : cla_32
PORT MAP (pcout, x"00000004", '0', result1, cout1);
Blok_mux1 : mux_2to1_32bit
PORT MAP (result1, result2, outmux1,branch_result);
Blok_mux2 :mux_4to1_32bit
PORT MAP (outmux1, outbus,

x"00000000",x"00000000" ,outmux2,SIGJump);

Blok_mux3 :mux_2to1_32bit
PORT MAP (outmux2, x"00000000",pcin,rst);
Blok_busmerging : bus_merger
PORT MAP (result1(31 downto 28), outshift1, outbus);
Blok_instructMem : instrucMEM
PORT MAP (pcout, clk, instruction);
--Instruction Decode
control_unit : cu
PORT MAP (instruction(31 downto 26), instruction(5 downto 0), SIGJump, SIGBne,
SIGBranch, SIGMemtoReg,SigMemRead, SIGMemWrite, SIGRegDest, SIGRegWrite, SIGALUSrc,
SIGALUControl);
Blok_SL2 : lshifter_26_28
PORT MAP (instruction(25 downto 0), outshift1);
Blok_reg_file : reg_File
PORT MAP (clk, SIGRegWrite, instruction(25 DOWNTO 21), instruction(20 downto 16),
outmux4, WD3, RD1, RD2);
Blok_mux4 : mux_4to1_5bit
PORT MAP (instruction(20 downto 16), instruction(15 downto
11),"00000","00000",outmux4, SIGRegDest);
Blok_Sign_ext : sign_extender
PORT MAP (instruction(15 downto 0), inshift2);
--Execution Stage
Blok_komparator : comparator
PORT MAP (RD1, RD2, outEQ);
branch_result <= ((SIGBranch

and outEQ) or (SIGBne and (not outEQ)));

Blok_SL1 : lshifter_32_32
PORT MAP (inshift2, outshift2);
Blok_cla2 : cla_32
PORT MAP (outshift2, pcout, '0', result2, cout2);
Blok_mux5 : mux_4to1_32bit
PORT MAP (RD2, inshift2, x"00000000", x"00000000",outmux5, SIGALUSrc);
Blok_ALU : ALU
PORT MAP (RD1, outmux5, SIGALUControl, ALUresult);

--Data Memory
Blok_data_mem : data_memory
PORT MAP (ALUresult(7 Downto 0), SIGMemWrite, SigMemRead, clk, Read_mem, RD2(7
downto 0));
Readmem(31 downto 8) <= (others => Read_mem(7));
Readmem(7 downto 0)<= Read_mem;
--Write Back
Blok_mux6 : mux_2to1_32bit
PORT MAP (ALUresult, Readmem,WD3, SIGMemtoReg );

--Sinyal yang akan ditampilkan pada waveform


PCinTest <= pcin;
PCoutTest <= Pcout;
ALU_result <= ALUresult;
instrout <= instruction;
PCplus4out <= result1;
outmux1out <= outmux1;
rd1out <= RD1;
rd2out <= RD2;
instr_15_11_out<= instruction(15 downto 11);
instr_20_16_out<= instruction(20 downto 16);
instr_25_21_out<= instruction(25 downto 21);
sgnaddress_regout<= outmux4;
sgnwritedataout<=WD3;
sgnregdestout <= SIGRegDest;
sgnregwriteout<= SIGRegWrite;
sgnsignimmout<= inshift2;
sgnALUSrcout<= SIGALUSrc;
sgnBranchResult<= branch_result;
signoutshift2out<= outshift2;
sgnMemReadout<= SigMemRead;
sgnMemWriteout<=SIGMemWrite;
sgnRead_Mem1out<=Readmem;
sgnMemToRegOut<= SIGMemtoReg;
END structural;