Anda di halaman 1dari 15

LAPORAN PERCOBAAN V

SYNTHESIZABLE MIPS32® MICROPROCESSOR BAGIAN III :


TOP LEVEL DESIGN DAN TESTBENCH

Yuspita Ratna Tampubolon(14S17010)


[NWS3103] [Praktikum Arsitektur Sistem Komputer]
Tanggal Percobaan 4 Desember 2019
[Laboratorium Dasar Teknik Elektro] – Teknik Elektro
Institut Teknologi Del

In this fifth module, MIPS32 can be synthesized by a 1. Praktikan memahami arsitektur


Microprocessor related to High Level Design and mikroprosesor MIPS32® beserta datapath
Testbench, containing two tasks given to create a top eksekusinya.
level design of programs that have been created in 2. Praktikan memahami instruction set dari
previous practicums and then to do a testbench. From MIPS32® dan dapat membuat program
this prakatikum it is hoped that the practice of sederhana
MIPS32 microprocessor architecture can be dalam bahasa assembly yang dapat
successful together with the execution data, and dieksekusi pada MIPS32®.
disprove the MIPS32 instruction set which then is 3. Praktikan dapat melakukan simulasi
able to allow design components that have been eksekusi program MIPS32® pada program
created from previous practicums in VHDL code to simulasi SPIM
create top-level designs of Single-Cycle MIPS32 dan memahami cara setiap instruksi
microprocessors that can be synthesized and can be dieksekusi.
used dis contrary to Altera Quartus. Finally, the 4. Praktikan dapat menggabungkan komponen-
praktikan is expected to be able to make a testbench komponen desain yang telah dibuat dari
for the approved design that has been made. The praktikum sebelumnya dalam kode VHDL
software used during the pratikum includes Altera untuk membuat top level design dari
Quartus® II v9.1 sp2 which functions to synthesize mikroprosesor
and simulate packages and Notepad ++ to make Single-Cycle MIPS32® yang synthesizable
program code in VHDL Language. The results dan dapat disimulasikan dengan Altera®
obtained in this experiment are the implementation Quartus®
that can be done per these tasks in VHDL Language II v9.1sp2.
and to be synthesized and functionally functional and 5. Praktikan dapat membuat testbench untuk
timed. menguji desain mikroprosesor Single-Cycle
MIPS32® dalam kode VHDL dan dapat
Keywords—Top level design, disimulasikan dengan Altera® Quartus® II
MIPS,Testbench,VHDL v9.1sp2.

I PENDAHULUAN
Dalam praktikum modul 5 ini akan mempelajari
perancangan pada mikriprosesor MIPS32, dimana II. LANDASAN TEORI
perancangan yang dilakukan yaitu dengan membuat
instruction memory, data memory, dan register 2.1 Datapath dan Control
dengan arsitektur MIPS32®. Penguasaan pada Dalam desain mikroprosesor Single-Cycle
bahasa VHDL diperlukan pada praktikum modul 5 MIPS32®, rangkaian digital dapat dikelompokkan
ini dikarenakan dalam pendefinisan komponen menjadi dua macam, yaitu datapath (jalur data) dan
hingga pembuatan kode program dilakukan dalam control (kontrol). Datapath merupakan komponen
Bahasa VHDL baik secara behavioral maupun dari mikroprosesor yang melakukan operasi aritmetik
structural. Setelah dilakukan kompilasi,maka serta melakukan penyimpanan data. Dalam
rangkaian yang dibuat selanjutnya diverifikasi datapath pula kelima tahap pemrosesan instruksi
dengan simulasi functional dan timing pada Altera meliputi instruction fetch, instruction decode,
Quartus 9.1 sp2. Pada praktikum modul 5 ini tujuan – execute,memory access, dan write back dilaksanakan.
tujuam yang akan dicapai ialah, sebagai berikut ini ; Sedangkan control merupakan komponen dari

1
mikroprosesor yang mengatur datapath berdasarkan
instruksi yang sedang dieksekusi. Bagian kontrol A. Tugas 1 : Implementasi Top-Level Design
telah direpresentasikan oleh control unit yang telah MIPS32®
kitadesain pada praktikum sebelumnya. Untuk bagian 0-125 ns
datapath, kita perlu menggabungkan komponen- Functional Simulation
komponen yang telah kitabuat meliputi multiplexer,
ALU, register, data memory, instruction memory,
dan sebagainya untuk membentuk sebuah jalur yang
dapat dilewati oleh data. Dengan demikian,
controldan 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.

2.2Menggunakan Testbench untuk Simulasi

Dalam melakukan simulasi sebuah Timing Simulation


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.

650ns – 780 ns

Pada dasarnya, testbench terdiri atas kode VHDL


atau Verilog HDL, tergantung pada implementasi.
Testbench sendiri dapat berisi sebuah desain yang
menyimpan nilai-nilai sinyal inputyang harus
diberikan kepada desain yang sedang diuji (design
under test). Kemudian, testbench ini akan
mengeluarkan masingmasing input yang harus
diberikan kepada desain yang sedang diuji
berdasarkan suatu trigger, misalnya Timing Simulation
clock.

III. HASIL DAN ANALISIS

2
mem(4) <= X"20080000"; -- add
$t0, $0, $0
mem(8) <= X"20090000"; -- add
$t1,$0,$0
mem(12) <= X"3401000a";-- beq
$t1, 10, Exit

mem(16) <= X"00000000"; -- nop

mem(20) <= X"21080001"; -- addi


$t0, $t0, 1
760 ns -870 ns mem(24) <= X"21290001"; -- add
Functional Simulation $t1, $t1, 1
mem(28) <= X"3401000a"; -- bne
$t1, 10, loop
mem(32) <= X"1429fff9"; -- bne
$1, $9, -28 [loop-0x00400044]
mem(36) <= X"00000000"; -- nop

Dan kode ini dimasukkan pada instrucMEM untuk


diproses dan dapat dianalisa. Dapat diperhatikan dari
hexadesimalnya bahwa, pada memory 0x20080000
terdapat instruksi add $t0, $0, 0 yang artinya pada
Timing Simulation
bagian ini adalah memberikan nilai 0 pada sebuah
memory dalam artian pada bahasa C, bagian ini
berada pada int sum = 0;. 0x20090000 terdapat
instruksi add $t1,$0, 0 mengartikan bahwa diberikan
integer 0 pada memory t1 , dalam bahasa C nya
menandakan int i = 0;.

Dapat dilihat lebih jelas pada code sibawah ini :


Berikut code 1 bahasa C Language of Sum
int sum = 0; //addi $t0, $0, 0
int i =0; //addi $t1, $0, 0
while (i != 10){ //bne $t1, 10,
loop, nop
Analisis : sum = sum + 1; //addi $t0, $t0,
Dalam tugas pendahuluan bagian a, diperoleh 1
data kode hexadesimal dari masing-masing i = i+1; //add $t1, $t1, 1
} //beq $t1, 10, Exit
instruksi sebagai berikut :
Berikut code 2 bahasa Assembly code of Sum
-- Isi instruction memory
main:
mem(0) <= X"00000000"; -- addi $t0, $0, 0
initializing addi $t1, $0, 0
loop:
beq $t1, 10, Exit

3
nop Merupakan nilai input dari PC. Masing-
addi $t0, $t0, 1 masing register akan dimasukkan dengan
add $t1, $t1, 1 penambahan 4 pada PCnya. Dari data yang
bne $t1, 10, loop
diperoleh penambahan PC pada vwf adalah
nop
Exit :

Pada tugas yang pertama ini, kami diminta untuk


menggabungkan semua komponen yang telah pada 4. PCoutTest
percobaan yang sebelumnya. Data yang akan Nilai output PC dengan syarat -4 dari
dimasukkan berupa kode script komponen-komponen PCinTest. Sehingga pada keluaran dari
seperti instruction memory, data memory, refister instruksi ini diawali dengan 0 seperti terlihat
file, ALU, sign extender, komparator, control unit, pada gambar dibawah
beserta komponen kecil lainnya seperti multiplexer,
program counter dan lain sebagainya.
Keluaran atau output yang akan dihasilkan pada tugas 5. PCplus4out
1 ini yaitu sebuah top level design MIPS denga 32
Instruksi ini adalah mebambahkan 4 pada PC
bit.
Dan perubahan memory dilakukan dengan out. Nilai ini adalah nilai update dari PC
pembuatan nilai dari pc bernilai +4 untuk instruksi yangmerupakan hasil seleksi dari multiplexer
selanjutnya. Dalam code terdapat instruksi nop yang untuk setiap branch, atau instruksi biasa.
artinya adalah untuk mengisi nilai instruksi setelah 6. instrout
Merupakan nilai hexadesimal dari masing-
brach dengan instruksi yang bernilai 0 (tidak
masing instruksi.
melakukan instruksi apapun). Setelah branch pertama
dan nilai pc bernilai sesuai dengan loopnya, maka
dilakukan eksekusi dari instruksi instruksi yang ada
pada loop. Pada code diatas, instruksi addi $t0, $t0, 1 7. outmux1out
dan add $t0, $t0, 1 merupakan pengupdatean nilai Instruksi ini adalah berguna untuk mengupdate
sum dan i secara increment. Kemudian dalam nilai dari PC
instruksi beq $t1, 10, Exit menyatakan pembanding 8. rd1out
dari nilai i, jika i sama dengan 10 maka akan keluar Merupakan nilai register dari source
dari loop dan masuk kedalam lokasi exit, dimana 9. rd2out
lokasi exit tidak diberikan instruksi apa-apa dalam Merupakan nilai register dari target (tujuan)
artian lain, berhenti. Dalam fungsi loop, instruksi bne 10. instr_15_11_out
$t1, 10, loop menyatakan untuk memasuki lokasi OUT dari instrucMEM yang merupakan
loop secara berulang hinga tak menyamai kondisi instruksi untuk pemberian nomor register
(dalam hal ini disertakan integer 10). tujuan pada tipe R
11. instr_20_16_out
Berikut penjelasan dari masing-masing instruksi OUT dari instrucMEM yang merupakan
output yang sudah diimplementasikan dalam instruksi untuk pemberian nomor register target
top_level_design.vhd. 12. instr_25_21_out
OUT dari intrucMEM yang merupakan
1. ALU_result
instruksi untuk pemberian nomor register pada
ALU_result ini mengimplementasikan operasi
source
penjumlahan atau pengurangan dari rd1out dan
13. sgnaddresss_regout
rd2out.
Merupakan instruksi untuk memberikan nomor
2. clk
register secara writeback
Merupakan clock cycle dari setiap instruksinya.
14. sgn_Read_Mem1out
Dan mode pada clk ini adalah inputan
Merupakan instruksi data untuk dibaca pada
3. PcinTest memori
15. sgnwritedataout

4
Merupakan memberikan nilai yang di Sinyal ALUSrc bernilai 0 karena merupakan tipe R
writeback yang tidak menggunakan immediate pada ALU.
16. sgnsignimmout Sinyal control yang lain bernilai nol karena memang
Merupakan nilai terdekat yang sudah di extend tidak melakukan branch, jump, dan akses memori.
dengan 32 bit dengan menggunakan sign
extender (1) Mem(8)
17. signoutshift2out mem(8) <= X"20090000"; -- add
Nilai 4*immadiate 32 bit (extended) $t1,$0,$0

Adapun sinyal kontrol adalah sebagai berikut : Hal ini bersesuaian dengan instruksi yang diberikan
yaitu add $t0, $0, $0.
1. sgnregdestout => SIGRegDest
2. sgnregwriteout => SIGRegWrite
3. sgnALUSrcout => SIGALUSrc
4. sgnBranchResult => branch_result
5. sgnMemReadout => SigMemRead
6. sgnMemWriteout => SIGMemWrite
7. sgnMemToRegOut => SIGMemtoReg

Mem (0) dan Mem (4)


mem(0) <= X"00000000"; --
initializing
mem(4) <= X"20080000"; -- add
$t0, $0, $0

Pada mem(8), instruksi menjadi 0x20090000. 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.
Dapat dilihat bahwa nilai instruksinya masing-masing Sgnaddress_regout=9 yang berarti register yang
diupdate saat rising clock pada clock cycle yang dipilih sebagai register write back adalah register
bersesuaian dengan instruction memory yang telah 9=$t1 dengan nilai yang ditunjukkan pada
dibuat. Sinyal akan bernilai 0 pada instruksi pertama sgnwritedataout. Sinyal control yang lain bernilai nol
dikarenakan instruksi nop pertama yang tidak karena memang tidak melakukan branch, jump, dan
dilakukan. Nilai register dan memori tidak akan akses memori. Hal ini bersesuaian dengan instruksi
mengalami perubahan pada instruksi nop. Pada yang diberikan yaitu add $t1, $0, $0.
mem(4) instruksi berubah menjadi 0x20080000. Pada
instruksi ini, nomor register destination adalah 8 dan (1) Mem(12)
nomor target dan source adalah 0. Sgnaddress_regout mem(12) <= X"212afff6"; -- addi
= 8, berarti register yang dipilih sebagai register write $t2, $t1, -10
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.

5
Pada mem(16), instruksi menjadi 0x15400001.
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=
Sinyal control yang lain bernilai nol karena memang
8. Nilai update pc=pcplus4+sgnshift2out= 28. Sinyal
tidak melakukan branch, jump, dan akses memori.
Hal ini bersesuaian dengan instruksi yang diberikan sgnregwriteout=0 berarti tidak dilakukan write back.
yaitu addi $t2, $t1, -10. Nilai dari rd1out=-10 dicompare dengan nilai
rd2out=0 pada komparator yang menghasilkan output
(1) Mem(16)
mem(16) <= X"15400001"; -- bne komparator 1. Akibatnya sesuai dengan persamaan
$t2,$0, loop 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(don’t care). Hal
ini bersesuaian dengan instruksi yang diberikan yaitu
bne $t2,$0, loop.

loop.
(1) Mem(20)
mem(20) <= X"00000000"; -- nop -
- if not bne, j done -- loop :

6
Nop dilakukan pada memory 16+4 = 20 setelah ALUresult=rd1out+sgnsignimmout =1. Sinyal
melakukan branch control yang lain bernilai nol karena memang tidak
(2) Mem(28) melakukan branch, jump, dan akses memori. Hal ini
mem(28) <= X"21080001"; -- addi bersesuaian dengan instruksi yang diberikan yaitu
$t0, $t0, 1 addi $t0, $t0, 1.

(1) Mem(32)
mem(32) <= X"21290001"; -- addi
$t1, $t1, 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.

7
Pada mem(32), , instruksi menjadi 0x21290001. adalah register 10=$t2 dengan nilai yang ditunjukkan
Instruksi ini adalah tipe I. Nomor register rs=9 ($t1), pada sgnwritedataout. Nilai Rd1out=1=$t1. Sinyal
nomor register rt=9 ($t1). Nilai sgnsignimmout yang ALUSrc bernilai 1 karena merupakan tipe I yang
merupakan immediate yang sudah diextend 32bit menggunakan immediate pada ALU.
adalah 1. Sinyal sgnregwriteout=1 berarti dilakukan ALUresult=rd1out+sgnsignimmout =-9. Sinyal
write back. Sgnaddress_regout=9 yang berarti control yang lain bernilai nol karena memang tidak
register yang dipilih sebagai register write back melakukan branch, jump, dan akses memori. Hal ini
adalah register 9=$t1 dengan nilai yang ditunjukkan bersesuaian dengan instruksi yang diberikan yaitu
pada sgnwritedataout. Nilai rd1out=rd2out=0. Nilai addi $t2, $t1, -10
rd1out=nilai $t1=0 karena sebelumnya diinisialisasi
0. Sinyal ALUSrc bernilai 1 karena merupakan tipe I mem(40) <= X"1540fffc"; -- bne
yang menggunakan immediate pada ALU. $t2, $0, loop
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

(1) Mem(36)
mem(36) <= X"212afff6"; -- addi
$t2, $t1, -10

Instruksi yang diberikan hampir sama dengan


Pada mem(36) , instruksi menjadi 0x212afff6. instruksi bne $t2,$0, loop yang telah dieksekusi pada
Instruksi ini adalah tipe I. Nomor register rs=9 ($t1), pc=16. Perbedaannya hanyalah pada immediate yang
nomor register rt=10 ($t2). Nilai sgnsignimmout yang diberikan dan nilai perbandingan yang digunakan
merupakan immediate yang sudah diextend 32bit untuk branch. Nilai yang dibandingkan pada bne ini
adalah -10. Sinyal sgnregwriteout=1 berarti dilakukan adalah nilai $t2 dan $0. Nilai $t2=-9 != $0=0
write back. Sgnaddress_regout=10 yang berarti sehingga nilai sinyal branch_result=1. Nilai update
register yang dipilih sebagai register write back pc= pcplus4+ sgnshift2out = 28, dengan nilai

8
sgnshift2out = -16. Akibatnya alamat pc kembali add $s5, $s5, $0 #$s5 <- $s5 +
menuju alamat loop yaitu 28. $s0
j 00000000 #jump ke address
(1) Mem(44) 00000000
mem(44) <= X"00000000"; -- nop -- done : nop #jeda siklus untuk
branching
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 Analisisnya adalah sebagai berikut ;
lampiran. Nilai dari $t0=sum=sum+1 dan $t1=i=i+1
akan diupdate seiring dengan berlangsungnya looping Dalam percobaan pengujian menggunakan testbench
ini. Setelah looping berakhir, maka pc selanjutnya ini dilakukan penganalisisan dari code assembly yang
adalah bernilai 48 yaitu alamat dari done. Karena sudah diberikan. Namun setelah dilakukan
addu $s0, $ra, $0 dan addu $ra, $0, $s0 tidak dikenali pengambilan address dari PCSpim, terdapat error
pada source code untuk control unit, maka nilainya yang menyebabkan tidak memperolehnya address
tidak dapat diverifikasi. Namun alamat pc sesuai yang diinginkan. Kemudian error yang terjadi
menunjukkan hasil yang sesuai Jika diperhatikan memungkinkan keambiguan dari assembly yang
pada simulasi fungsional, hasil yang diperoleh tidak seharusnya. Sehingga dari percobaan ini tidak
berbeda jauh, namun yang perlu ditambahkan adalah dilakukan simulasi timing dan simulasi
bahwa terdapat delay pada output simulasi. Untuk functionalnya.
memperoleh data yang signifikan, maka diperlukan
penambahan time. Perbedaan dari simulasi ini
IV. KESIMPULAN
diakibatkan oleh adanya delay yang ada pada
Setelah kami melakukan setiap percobaan pada
rangkaian logika. Dan telah didapat hasilnya tersebut. modul 5 ini, sehingga dapat disimpulkan bahwa ;
1. Single-Cycle MIPS32 dapat dibuat dengan
B. Tugas 2 : Pengujian Menggunakan cara menggabungkan komponen-komponen
TestBench seperti ALU, multiplexer, register file,
instruction memory, data memory, serta
Berikut di dapat code dari assembly komponen lainnya ke dalam suatu top level
design. Deklarasi dari komponen tersebut
main : adalah definisi sinyal penghubung antar
addi $s0, $0, 19 #$s0 <- 0 + komponen, serta port mapping yang sesuai
19 maka akan dapat menghasilkan suatu Single-
addi $s1, $0, 21 #$s1 <- 0 + Cycle MIPS32 yang utuh.
21 2. Pengujian dari Single-Cycle MIPS32 dapat
bne $s2, $s3, 8 #Jika $s2 != dilakukan dengan memberikan instruksi-
$s3, menuju 2 instruksi instruksi dalam Bahasa MIPS yang dapat
dieksekusi oleh mikroprosesor tersebut.
selanjutnya Kemudian instruksi-instruksi tersebut diubah
nop #Jeda siklus untuk ke dalam format instruksi MIPS32 bit
branching (opcode, func, rt, rs, rd) yang kemudian
sub $s3, $s0, $s1 #$s3 <- $s0 diubah lagi menjadi suatu bilangan
- $s1 hexadecimal 8 bit, yang disimpan pada
addi $s3, $s3, 0 #$s3 <- $s3 + instruction memory sebelum akhirnya
0 dieksekusi.
addi $s4, $s0, 4 #$s4 <- $s0 +
4
sw $s1, ($s4) #Simpan register
$s1 ke alamat register $s4 DAFTAR PUSTAKA
lw $s5, ($s4) #Data pada [1] Modul Praktikum Arsitektur Sistem Komputer
[2] Bryant, Randal E. dan David R. O’Hallaron.
memori $s4 diambil dan Computer System: A Programmer’s
disimpan di $s5 Perspective.Prentice Hall. USA.

9
end behavior;
SOUSCE CODE
1.) instrucMEM.vhd 2.) lshifter_32_32.vhd
-- Praktikum Arsitektur Sistem Komputer
-- Modul : 5 --Praktikum Arsitektur Sistem Komputer
-- Percobaan : 1 dan 2 --Modul 5
--Tanggal 4 Desember 2019
-- Tanggal : 4 Desember 2019
--Kelompok 3
-- Kelompok : 3 --Nama (NIM) 1: Amelina Samosir
-- Nama (NIM) 1 : Amelina Samosir (14S17014) (14S17014)
--Nama (NIM)2 :Rosmauli Siringoringo --Nama (NIM) 1 : Rosmauli Siringoringo
(14S17011) (14S17011)
-- Nama (NIM) 3 :Yuspita Ratna Tampubolon --Nama (NIM) 1 : Yuspita Ratna
(14S17010) Tampubolon (14S17010)
-- Nama File : instrucMem.vhd -- Nama File : lshifter_32_32.vhd
-- Deskripsi : Left shifter yang
-- Deskripsi : Desain instruction memory
memiliki input data dengan lebar 32 bit
LIBRARY IEEE; dan output
USE IEEE. STD_LOGIC_1164. ALL; data dengan lebar 32 bit
USE IEEE. STD_LOGIC_ARITH. ALL; LIBRARY IEEE;
USE IEEE. STD_LOGIC_UNSIGNED. ALL; USE IEEE. STD_LOGIC_1164. ALL;
LIBRARY altera_mf; USE IEEE. STD_LOGIC_ARITH. ALL;
USE altera_mf. altera_mf_components. ALL; USE IEEE. STD_LOGIC_UNSIGNED. ALL;
entity instrucMEM is ENTITY lshifter_32_32 IS
PORT (
port ( D_IN : IN std_logic_vector (31 DOWNTO
ADDR : in std_logic_vector (31 downto 0); 0);
clock : in std_logic; D_OUT: OUT std_logic_vector (31 DOWNTO
INSTR : out std_logic_vector (31 downto 0) 0)
); );
end entity; END lshifter_32_32;
architecture behavior of instrucMEM is ARCHITECTURE behavior OF lshifter_32_32
type ramtype is array (255 downto 0) of IS
BEGIN
std_logic_vector (31 downto 0); D_OUT (31 DOWNTO 2) <= D_IN (29 DOWNTO
signal mem: ramtype; 0);
begin D_OUT (1 DOWNTO 0) <= (others => ' 0' );
process (clock, ADDR) END behavior;
begin
if clock' event and clock=' 1' then 3.) Mux_2tol_32bit.vhd
INSTR <= mem(conv_integer (ADDR)); -- Deskripsi : Multiplexer 2 to 1, 32
end if; bit
end process; LIBRARY IEEE;
USE IEEE. STD_LOGIC_1164. ALL;
-- Isi instruction memory
USE IEEE. STD_LOGIC_ARITH. ALL;
mem(0) <= X"00000000"; -- initializing USE IEEE. STD_LOGIC_UNSIGNED. ALL;
mem(4) <= X"00004020"; -- add $t0, $0, $0 LIBRARY altera_mf;
mem(8) <= X"00004820"; -- add $t1,$0,$0 USE altera_mf. altera_mf_components.
mem(12) <= X"212afff6"; -- $t2, $t1, -10 ALL;
mem(16) <= X"15400002"; -- bne $t2,$0, loop ENTITY mux_2to1_32bit IS
mem(20) <= X"00000000"; -- nop PORT (
-- if not bne, j done D1 : IN std_logic_vector (31 DOWNTO 0);
-- Data Input 1
-- loop :
D2 : IN std_logic_vector (31 DOWNTO 0);
mem(28) <= X"21080001"; -- addi $t0, $t0, 1 -- Data Input 2
mem(32) <= X"21290001"; -- addi $t1, $t1, 1 Y : OUT std_logic_vector (31 DOWNTO 0);
mem(36) <= X"212afff6"; -- addi $t2, $t1, -10 -- Selected Data
mem(40) <= X"1540fffc"; -- bne $t2, $0, loop S : IN std_logic
mem(44) <= X"00000000"; -- nop );
-- done : END mux_2to1_32bit;
mem(48) <= X"03e08021"; -- addu $s0, $ra, $0 ARCHITECTURE Behavior OF mux_2to1_32bit
IS
mem(52) <= X"0010f821"; -- addu $ra, $0, $s0

10
BEGIN END behaviour;
PROCESS (S, D1, D2)
BEGIN
IF (S = ' 1' ) THEN
Y <= D2;
ELSE
Y <= D1;
END IF;
END PROCESS;
32 bit
LIBRARY IEEE;
USE IEEE. STD_LOGIC_1164. ALL;
4.) mux_4to1_5bit.vhd USE IEEE. STD_LOGIC_ARITH. ALL;
USE IEEE. STD_LOGIC_UNSIGNED. ALL;
Praktikum Arsitektur Sistem Komputer ENTITY program_counter IS
--Modul 5 PORT (
--Tanggal 4 Desember 2019 clk : IN std_logic;
--Kelompok 3 PC_in: IN std_logic_vector (31 DOWNTO
--Nama (NIM) 1: Amelina Samosir 0);
(14S17014) PC_out : OUT std_logic_vector (31 DOWNTO
--Nama (NIM) 1 : Rosmauli Siringoringo 0)
(14S17011) );
--Nama (NIM) 1 : Yuspita Ratna END program_counter;
Tampubolon (14S17010) ARCHITECTURE behavior OF program_counter
-- Nama File : mux_4to1_32bit.vhd IS
-- Deskripsi : Multiplexer 4 to 1, 5 bit BEGIN
LIBRARY IEEE; PROCESS (clk)
USE IEEE. STD_LOGIC_1164. ALL; BEGIN
USE IEEE. STD_LOGIC_ARITH. ALL; if clk' EVENT and clk=' 1' then
USE IEEE. STD_LOGIC_UNSIGNED. ALL; PC_out <= PC_in;
ENTITY mux_4to1_5bit IS end if;
PORT ( END PROCESS;
D1 : IN std_logic_vector (4 DOWNTO 0); -
- Data Input 1
D2 : IN std_logic_vector (4 DOWNTO 0); - 6.) reg_file.vhd
- Data Input 2
D3 : IN std_logic_vector (4 DOWNTO 0); -
- Data Input 3 -- Nama File : reg_file.vhd
D4 : IN std_logic_vector (4 DOWNTO 0); - -- Deskripsi : Desain register
- Data Input 4 LIBRARY IEEE;
Y : OUT std_logic_vector (4 DOWNTO 0); - USE IEEE. STD_LOGIC_1164. ALL;
- Selected Data USE IEEE. STD_LOGIC_ARITH. ALL;
S : IN std_logic_vector (1 DOWNTO 0) -- USE IEEE. STD_LOGIC_UNSIGNED. ALL;
Selector LIBRARY altera_mf;
); USE altera_mf. ALL;
END mux_4to1_5bit; ENTITY reg_File IS
ARCHITECTURE Behavior OF mux_4to1_5bit PORT
IS (
BEGIN clock : IN STD_LOGIC; -- Clock
with S select WR_EN : IN STD_LOGIC; -- Write enable
Y <= D1 when "00", ADDR1 : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
D2 when "01", -- Input 1
D3 when "10", ADDR2 : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
D4 when "11"; -- Input 2
END Behavior; ADDR3 : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
-- Input 3
WR_Data3: IN STD_LOGIC_VECTOR(31 DOWNTO
0); -- Write Data
5.) program counter RD_Data1 : OUT STD_LOGIC_VECTOR(31
DOWNTO 0); -- read data 1
-- Nama File : program_counter.vhd RD_Data2 : OUT STD_LOGIC_VECTOR(31
-- Deskripsi : Program counter yang DOWNTO 0) -- read data 2
berupa satu buah register dengan lebar );

11
END entity; 0); -- Operand 1
ARCHITECTURE behavior OF reg_File IS OPRND_2 : IN STD_LOGIC_VECTOR (31 DOWNTO
TYPE ramtype IS ARRAY (31 DOWNTO 0) OF 0); -- Operand 2
STD_LOGIC_VECTOR (31 DOWNTO 0); C_IN : IN STD_LOGIC; -- Carry In
SIGNAL mem: ramtype; RESULT : OUT STD_LOGIC_VECTOR (31 DOWNTO
BEGIN 0); -- Result
process (clock, WR_EN, ADDR1, ADDR2, C_OUT : OUT STD_LOGIC -- Overflow
ADDR3, mem) );
begin END COMPONENT;
if (clock' EVENT and clock = ' 0' ) then BEGIN
RD_Data1 <= mem(conv_integer (ADDR1)); componentcarry: cla_32
RD_Data2 <= mem(conv_integer (ADDR2)); PORT MAP
elsif (clock' EVENT and clock = ' 1' and (
WR_EN =' 1' ) then OPRND_1 => op1,
mem(conv_integer (ADDR3)) <= WR_Data3; OPRND_2 => op2,
end if; C_IN=>cin,
end process; C_OUT => cout,
END behavior; RESULT => hasil
);
PROCESS (OP_SEL)
BEGIN
7.) ALU IF OP_SEL = "00" then
op1<=OP_1;
op2<=OP_2;
Praktikum Arsitektur Sistem Komputer cin <= OP_SEL(0);
--Modul 5 OUTCOME <= hasil;
--Tanggal 4 Desember 2019 ELSIF OP_SEL= "01" then
--Kelompok 3 op1<=OP_1;
--Nama (NIM) 1: Amelina Samosir op2<=(not OP_2);
(14S17014) cin <= OP_SEL(0);
--Nama (NIM) 1 : Rosmauli Siringoringo OUTCOME <= hasil;
(14S17011) END IF;
--Nama (NIM) 1 : Yuspita Ratna END PROCESS;
Tampubolon (14S17010) END behavioral;
--
Library ieee;
USE IEEE. STD_LOGIC_1164. all;
USE IEEE. STD_LOGIC_UNSIGNED. ALL; 8.) top_level_design
USE IEEE. STD_LOGIC_ARITH. ALL;
ENTITY ALU IS -- Nama File : top_level_design.vhd
PORT( -- Deskripsi : Top level design
OP_1 : IN std_logic_vector (31 DOWNTO LIBRARY ieee;
0); -- Data Input 1 USE ieee. std_logic_1164. all;
OP_2 : IN std_logic_vector (31 DOWNTO USE IEEE. STD_LOGIC_ARITH. ALL;
0); -- Data Input 2 USE IEEE. STD_LOGIC_UNSIGNED. ALL;
OP_SEL : IN std_logic_vector (1 DOWNTO entity top_level_design is
0); -- Operation Select PORT (
OUTCOME : OUT std_logic_vector (31 clk, rst : IN STD_LOGIC;
DOWNTO 0) ALU_result, PCinTest, PCoutTest : OUT
); STD_LOGIC_VECTOR (31 DOWNTO 0);
END ALU; rd1out, rd2out, instrout , sgnsignimmout
ARCHITECTURE behavioral of ALU is : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
signal op1 : STD_LOGIC_VECTOR(31 DOWNTO outmux1out, PCplus4out, sgnRead_Mem1out
0); : OUT STD_LOGIC_VECTOR (31 DOWNTO 0);
signal op2 : STD_LOGIC_VECTOR (31 DOWNTO sgnwritedataout: OUT STD_LOGIC_VECTOR
0); (31 DOWNTO 0);
signal cin : STD_LOGIC; instr_15_11_out : OUT STD_LOGIC_VECTOR
signal cout: STD_LOGIC; (4 downto 0);
signal hasil: STD_LOGIC_VECTOR(31 DOWNTO instr_20_16_out : OUT STD_LOGIC_VECTOR
0); (4 downto 0);
COMPONENT cla_32 instr_25_21_out : OUT STD_LOGIC_VECTOR
PORT ( (4 downto 0);
OPRND_1 : IN STD_LOGIC_VECTOR(31 DOWNTO sgnaddress_regout : OUT STD_LOGIC_VECTOR

12
(4 downto 0); OP_2 : IN std_logic_vector (31 DOWNTO
sgnMemReadout, sgnMemWriteout : OUT 0); -- Data Input 2
STD_LOGIC; OP_SEL : IN std_logic_vector (1 DOWNTO
sgnMemToRegOut : OUT STD_LOGIC; 0); -- Operation Select
sgnregdestout, sgnALUSrcout : OUT OUTCOME : OUT std_logic_vector (31
STD_LOGIC_VECTOR (1 downto 0); DOWNTO 0)
sgnregwriteout, sgnBranchResult : OUT );
STD_LOGIC; END COMPONENT;
signoutshift2out: OUT STD_LOGIC_VECTOR -- bus_merger
(31 DOWNTO 0) COMPONENT bus_merger
); PORT ( DATA_IN1 : IN STD_LOGIC_VECTOR (3
end top_level_design; DOWNTO 0);
architecture structural of DATA_IN2 : IN STD_LOGIC_VECTOR (27
top_level_design is DOWNTO 0);
-- cu DATA_OUT : OUT STD_LOGIC_VECTOR (31
component cu DOWNTO 0)
PORT ( OP_In : IN STD_LOGIC_VECTOR (5 );
DOWNTO 0); END COMPONENT;
FUNCT_In : IN STD_LOGIC_VECTOR (5 DOWNTO -- data memori
0); COMPONENT data_memory
Sig_Jmp : OUT STD_LOGIC_VECTOR (1 DOWNTO PORT(
0); ADDR : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
Sig_Bne : OUT STD_LOGIC; WR_EN, RD_EN, clock : IN STD_LOGIC;
Sig_Branch : OUT STD_LOGIC; RD_Data : OUT STD_LOGIC_VECTOR(7 DOWNTO
Sig_MemtoReg : OUT STD_LOGIC; 0);
Sig_MemRead : OUT STD_LOGIC; WR_Data : IN STD_LOGIC_VECTOR(7 DOWNTO
Sig_MemWrite : OUT STD_LOGIC; 0));
Sig_RegDest : OUT STD_LOGIC_VECTOR (1 END COMPONENT;
DOWNTO 0); --instrucmem
Sig_RegWrite : OUT STD_LOGIC; COMPONENT instrucMEM
Sig_ALUSrc : OUT STD_LOGIC_VECTOR (1 port (
DOWNTO 0); ADDR : in std_logic_vector (31 downto
Sig_ALUCtrl : OUT STD_LOGIC_VECTOR (1 0);
DOWNTO 0) clock : in std_logic;
); INSTR : out std_logic_vector (31 downto
END COMPONENT; 0)
-- PC );
component program_counter END COMPONENT;
PORT ( -- komparator
clk : IN STD_LOGIC; COMPONENT comparator
PC_in : IN STD_LOGIC_VECTOR (31 DOWNTO PORT ( D_1 : IN STD_LOGIC_VECTOR (31
0); DOWNTO 0);
PC_out : OUT STD_LOGIC_VECTOR (31 DOWNTO D_2 : IN STD_LOGIC_VECTOR (31 DOWNTO 0);
0) EQ : OUT STD_LOGIC -- Hasil Perbandingan
); EQ
END COMPONENT; );
-- cla END COMPONENT;
component cla_32 --mux 2 to 1
PORT ( OPRND_1 : IN STD_LOGIC_VECTOR(31 COMPONENT mux_2to1_32bit
DOWNTO 0); -- Operand 1 PORT (
OPRND_2 : IN STD_LOGIC_VECTOR (31 DOWNTO D1 : IN std_logic_vector (31 DOWNTO 0);
0); -- Operand 2 -- Data Input 1
C_IN : IN STD_LOGIC; -- Carry In D2 : IN std_logic_vector (31 DOWNTO 0);
RESULT : OUT STD_LOGIC_VECTOR (31 DOWNTO -- Data Input 2
0); -- Result Y : OUT std_logic_vector (31 DOWNTO 0);
C_OUT : OUT STD_LOGIC -- Overflow -- Selected Data
); S : IN std_logic -- Selector
END COMPONENT; );
--ALU END COMPONENT;
COMPONENT ALU --mux 4 to 1 5 bit
PORT( COMPONENT mux_4to1_5bit
OP_1 : IN std_logic_vector (31 DOWNTO PORT ( D1 : IN std_logic_vector (4
0); -- Data Input 1 DOWNTO 0); -- Data Input 1

13
D2 : IN std_logic_vector (4 DOWNTO 0); - -- deklarasi sinyal-sinyal
- Data Input 2 SIGNAL pcin, pcout : STD_LOGIC_VECTOR
D3 : IN std_logic_vector (4 DOWNTO 0); - (31 downto 0); -- PC
- Data Input 3 SIGNAL instruction : STD_LOGIC_VECTOR
D4 : IN std_logic_vector (4 DOWNTO 0); - (31 downto 0); -- Instruction memory
- Data Input 4 SIGNAL cout1, cout2 : STD_LOGIC; --
Y : OUT std_logic_vector (4 DOWNTO 0); - adder
- Selected Data SIGNAL result1, result2 :
S : IN std_logic_vector (1 DOWNTO 0) -- STD_LOGIC_VECTOR (31 DOWNTO 0); --
Selector adder1adder2
); SIGNAL branch_result, outEQ : STD_LOGIC;
END COMPONENT; -- gerbang and
--mux 4 to 1 32 bit SIGNAL Add1res : STD_LOGIC_VECTOR (31
COMPONENT mux_4to1_32bit downto 0); --
PORT ( D1 : IN std_logic_vector (31 SIGNAL outmux1, outbus, outmux2, outmux5
DOWNTO 0); -- Data Input 1 : STD_LOGIC_VECTOR (31 downto 0);
D2 : IN std_logic_vector (31 DOWNTO 0); SIGNAL outshift1 : STD_LOGIC_VECTOR (27
-- Data Input 2 DOWNTO 0);
D3 : IN std_logic_vector (31 DOWNTO 0); SIGNAL outshift2 : STD_LOGIC_VECTOR (31
-- Data Input 3 DOWNTO 0);
D4 : IN std_logic_vector (31 DOWNTO 0); SIGNAL outmux4 : STD_LOGIC_VECTOR (4
-- Data Input 4 DOWNTO 0);
Y : OUT std_logic_vector (31 DOWNTO 0); SIGNAL WD3, RD1, RD2 : STD_LOGIC_VECTOR
-- Selected Data (31 DOWNTO 0);
S : IN std_logic_vector (1 DOWNTO 0) -- SIGNAL inshift, inshift2 :
Selector STD_LOGIC_VECTOR (31 DOWNTO 0);
); SIGNAL srcB : STD_LOGIC_VECTOR (31
END COMPONENT; DOWNTO 0);
-- register SIGNAL ALUresult : STD_LOGIC_VECTOR (31
COMPONENT Reg_File DOWNTO 0);
PORT( SIGNAL Read_mem : STD_LOGIC_VECTOR (7
clock, WR_EN : IN STD_LOGIC; DOWNTO 0);
ADDR1, ADDR2, ADDR3 : IN SIGNAL SIGBne : STD_LOGIC;
STD_LOGIC_VECTOR(4 DOWNTO 0); SIGNAL SIGBranch : STD_LOGIC;
WR_Data3: IN STD_LOGIC_VECTOR(31 DOWNTO SIGNAL SIGMemtoReg : STD_LOGIC;
0); SIGNAL SIGMemWrite : STD_LOGIC;
RD_Data1, RD_Data2: OUT SIGNAL SigMemRead : STD_LOGIC;
STD_LOGIC_VECTOR(31 DOWNTO 0) SIGNAL SIGRegDest : STD_LOGIC_VECTOR (1
); DOWNTO 0);
END COMPONENT; SIGNAL SIGRegWrite : STD_LOGIC;
-- sign_extender SIGNAL SIGJump : STD_LOGIC_VECTOR (1
COMPONENT sign_extender DOWNTO 0);
PORT( SIGNAL SIGALUSrc : STD_LOGIC_VECTOR (1
D_In : IN std_logic_vector (15 DOWNTO DOWNTO 0);
0); -- Data Input 1 SIGNAL SIGALUControl : STD_LOGIC_VECTOR
D_Out : OUT std_logic_vector (31 DOWNTO (1 DOWNTO 0);
0) -- Data Input 2 SIGNAL Readmem: STD_LOGIC_VECTOR (31
); DOWNTO 0);
END COMPONENT; BEGIN
COMPONENT lshifter_32_32 -- lshift 32_32 --Instruction Fetch
PORT ( D_IN : IN STD_LOGIC_VECTOR (31 Blok_PC : program_counter
DOWNTO 0); -- Input 32-bit PORT MAP (clk, pcin, pcout);
D_OUT : OUT STD_LOGIC_VECTOR (31 DOWNTO Blok_cla1 : cla_32
0) -- Output 32-bit PORT MAP (pcout, x"00000004", ' 0' ,
); result1, cout1);
END COMPONENT; Blok_mux1 : mux_2to1_32bit
COMPONENT lshifter_26_28 -- lshift 26_28 PORT MAP (result1, result2, outmux1,
PORT ( D_IN : IN STD_LOGIC_VECTOR (25 branch_result);
DOWNTO 0); -- Input 32-bit Blok_mux2 : mux_4to1_32bit
D_OUT : OUT STD_LOGIC_VECTOR (27 DOWNTO PORT MAP (outmux1, outbus, x"00000000",
0) -- Output 32-bit x"00000000" , outmux2, SIGJump);
); Blok_mux3 : mux_2to1_32bit
END COMPONENT; PORT MAP (outmux2, x"00000000", pcin,

14
rst); PCoutTest <= Pcout;
Blok_busmerging : bus_merger ALU_result <= ALUresult;
PORT MAP (result1(31 downto 28), instrout <= instruction;
outshift1, outbus); PCplus4out <= result1;
Blok_instructMem : instrucMEM outmux1out<= outmux1;
PORT MAP (pcout, clk, instruction); rd1out <= RD1;
--Instruction Decode rd2out <= RD2;
control_unit : cu instr_15_11_out<= instruction(15 downto
PORT MAP (instruction(31 downto 26), 11);
instruction(5 downto 0), SIGJump, instr_20_16_out<= instruction(20 downto
SIGBne, 16);
SIGBranch, SIGMemtoReg, SigMemRead, instr_25_21_out<= instruction(25 downto
SIGMemWrite, SIGRegDest, SIGRegWrite, 21) ;
SIGALUSrc, sgnaddress_regout<= outmux4;
SIGALUControl); sgnwritedataout<=WD3;
Blok_SL2 : lshifter_26_28 sgnregdestout <= SIGRegDest;
PORT MAP (instruction(25 downto 0), sgnregwriteout<= SIGRegWrite;
outshift1); sgnsignimmout<= inshift2;
Blok_reg_file : reg_File sgnALUSrcout<= SIGALUSrc;
PORT MAP (clk, SIGRegWrite, sgnBranchResult<= branch_result;
instruction(25 DOWNTO 21), signoutshift2out<= outshift2;
instruction(20 downto 16), sgnMemReadout<= SigMemRead;
outmux4, WD3, RD1, RD2); sgnMemWriteout<=SIGMemWrite;
Blok_mux4 : mux_4to1_5bit sgnRead_Mem1out<=Readmem;
PORT MAP (instruction(20 downto 16), sgnMemToRegOut<= SIGMemtoReg;
instruction(15 downto END structural;
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;

15

Anda mungkin juga menyukai