I. PENDAHULUAN
Praktikan dapat menggabungkan komponenkomponen desain yang telah dibuat dari praktikan
sebelumnya dalam kode VHDL untuk membuat top
level design dari mikroprosesor Single-Cycle
-- 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";
-- loop :
Loop pertama:
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
Biodata Penulis
Lampiran
Hasil simulasi Functional
0-110ns
110ns - 220ns
210 ns 320 ns
320 ns 430 ns
0 110 ns
110 ns 220 ns
230 ns 340 ns
330 ns 440 ns
Source code
1. instrucMem.vhd
----------
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
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
----------
5. mux_4to1_5bit.vhd
-----------
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
-----------
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
7. program_counter.vhd
-----------
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
-----------
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
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
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)
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
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
-----------
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
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
-----------
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
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
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 );