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.
650ns – 780 ns
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
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 :
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
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
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
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