Anda di halaman 1dari 49

TEKNIK ELEKTRO ITB

Daniel Wijaya

2011

Modul Ini telah direvisi dan dilengkapi oleh : Andri Haryono (elektro 2006) Frillazeus Goltha (elektro 2006) Niko Robbel (elektro 2006) Ardianto Satriawan (elektro 2007) Gilang Ilham (elektro 2007) Muhammad Johan A (elektro 2007) Umar Abdul Aziz (elektro 2007) Tommy Gunawan (elektro 2008)

Terima kasih atas bantuannya :

Tommy Gunawan (Elektro 2008) Koordinator Asisten

PETUNJUK PRAKTIKUM ARSITEKTUR KOMPUTER I

KOMPOSISI NILAI Buku Catatan Laboratorium (BCL) PRAKTIKUM : 20% : 40 %

Ada 6 percobaan dengan bobot 40% dari total penilaian. berikut nilai tiap percobaan (total 100%). NILAI AKTIVITAS PRAKTIKUM SOURCE CODE NILAI TEST AKHIR LAPORAN : 35 % : 40 % : 25% : 40%

TOLERANSI KETERLAMBATAN 15 MENIT


Keterlambatan lebih dari 15 menit (berdasarkan jam di lab) tidak diperbolehkan masuk ke lab.

Petunjuk Pembuatan Laporan 1. Laporan hanya terdiri atas identitas praktikan, abstrak, data praktikum, analisis, dan kesimpulan. Lampiran dan hal lainnya disertakan bila diperlukan. Format terlampir 2. Ketika melampirkan gambar terminal/command terminal/command promt berwarna putih. prompt, pastikan background

3. 4. 5. Gunakan font courier new pada kode program yang dilampirkan. #define int accum = START_VAL; START_VAL 0

int sum(int x, int y) { int t = x + y; accum += t; return t; } 6. 7. Hapus folder pekerjaan Anda setiap selesai menggunakan komputer. 8. Disarankan mencoba praktikum terlebih dahulu di rumah. 9.

SESSION Clanguage
5

PRAKTIKUM ARSITEKTUR KOMPUTER MODUL 1 KOMPILASI DAN DISASSAMBLE PROGRAM


TUJUAN
Memahami tahap-tahap kompilasi dari bahasa tingkat tinggi hingga diperoleh file eksekusi. Memahami cara memeriksa suatu program berbasis bahasa assembly.

ALAT PERCOBAAN
Personal Computer PC. Compiler GCC pada Operating System

DASAR TEORI

Sistem Kompilasi Suatu program akan mudah dibaca dan dimengerti oleh manusia jika ditulis dalam bahasa tingkat tinggi, seperti high-level C program. Tetapi, agar program dapat dijalankan pada sistem komputer, maka setiap baris pernyataan pada C harus diterjemahkan oleh suatu program lain menjadi urutan instruksi bahasa mesin tingkat rendah. Instruksi-instruksi tersebut kemudian dikemas dalam suatu bentuk yang disebut executable object program dan disimpan dalam file biner.

Langkah-langkah menerjemahkan baris-baris kode program pada C menjadi file eksekusi dilakukan dalam empat langkah meliputi pre-processor, compiler, assembler, dan linker, yang seluruhnya disebut sistem kompilasi.

program.c Source program (text)

Preprocessor (cpp)

program i Modified Source program (text)

Compiler (ccl)

program.s Assembly program (text)

Assembler (as)

program.o Relocatable object program (binary)

Linker (ld)

program Executable object program (binary)

Misalkan kita menulis program C dalam dua file p1.c dan p2.c. Kemudian kita mengkompilasi kode program tersebut dengan mengetikkan command line : $ gcc O2 o prog p1.c p2.c Perintah gcc merupakan compiler default pada Linux yang menggunakan GNU C Compiler. Secara sederhana kita juga dapat menggunakan perintah cc. Flag O2 memerintahkan compiler untuk melakukan optimasi tingkat-2. Secara umum, jika tingkat optimasi meningkat maka program akan berjalan lebih cepat, tetapi hal ini beresiko meningkatkan waktu kompilasi dan meningkatkan kesulitan ketika melakukan debugging kode program. Optimasi tingkat-2 merupakan kompromi yang baik antara kinerja optimasi dan kemudahan debugging. Flag o memerintahkan compiler untuk memberi nama file eksekusi yang dihasilkan dengan nama prog.

Perintah gcc di atas menerjemahkan kode program menjadi file eksekusi dengan melalui empat langkah. Pertama C pre-processor akan memproses semua preprocessor directive, misalnya #define, atau memasukkan isi file-file yang tertulis #include directive ke kode program. Kedua, compiler menghasilkan kode assembly untuk setiap file, menjadi p1.s dan p2.s. Selanjutnya, assembler mengkonversi kode assembly menjadi file kode objek biner p1.o dan p2.o. Terakhir, linker menggabungkan kedua file kode objek dengan kode-kode yang mengimplementasikan fungsifungsi library Unix standar (mis. printf) dan menghasilkan file eksekusi.

Untuk hanya melakukan preprocessing, kita dapat menggunakan opsi -E pada command line : $ gcc E p1.c Untuk melihat kode assembly yang dihasilkan oleh compiler C, kita dapat menggunakan opsi -S pada command line : $ gcc O2 S p1.c Perintah ini akan menyebabkan compiler hanya menghasilkan file assembly p1.s dan tidak melakukan langkah berikutnya. Kode assembly yang dihasilkan sesuai dengan format GAS (Gnu Assembler).

Jika pada command line digunakan opsi -c, maka GCC akan melakukan compile dan assemble kode program : $ gcc O2 c p1.c Perintah ini akan menghasilkan file kode object p1.o, dalam bentuk format biner dan tidak dapat dilihat secara langsung.

Untuk memeriksa isi dari file kode objek, terdapat suatu program yang bernama disassembler. Program tersebut dapat melakukan konversi file kode objek menjadi format assembly. Pada sistem Unix/Linux, program OBJDUMP (singkatan dari OBJect DUMP) dapat dipanggil menggunakan flag -d : $ objdump d p1.o Untuk menghasilkan kode yang dapat dieksekusi, kita harus menjalankan linker pada seluruh file kode objek. Program eksekusi akan dihasilkan dengan menggabungkan seluruh file kode objek pada command line : 7

$ gcc O2 o prog code.o main.c File program eksekusi prog yang dihasilkan berisi tidak hanya kode yang kita masukkan, tetapi juga informasi yang digunakan untuk memulai dan mengakhiri program. Kita juga dapat melakukan dissasamble file prog : $ objdump d prog Disassembler akan mengekstrak berbagai urutan kode yang terdapat pada file eksekusi prog.

PERCOBAAN

Percobaan 1 : 1. Buat direktori baru dengan NIM Anda. 2. Buat kode program berikut dengan menggunakan teks editor. #define int accum = START_VAL; START_VAL 0

int sum(int x, int y) { int t = x + y; accum += t; return t; }

Simpan kode program tersebut dengan nama code.c dalam direktori yang telah Anda buat tadi.

Percobaan 2 :
1. Preprocess code.c dan lihat hasilnya : $ gcc E code.c 2. Compile code.c untuk menghasilkan kode assembly : $ gcc O2 S code.c 3. Compile dan assemble code.c untuk menghasilkan file kode objek : $ gcc O2 c code.c 4. Compile dan assemble akan menghasilkan object code. Apa sebetulnya object code ini? Bagaimana komputer menyimpannya sebagai file? 5. Agar dapat diperoleh program eksekusi, diperlukan adanya fungsi main pada salah satu file kode objek-nya. Buatlah file baru dan beri nama main.c. 6. Compile seluruh kode untuk menghasilkan program eksekusi. Beri nama program eksekusi tersebut prog. $ gcc O2 o prog code.c main.c 7. Bagaimana caranya agar pada main.c variabel accum dan fungsi sum() dapat digunakan? Beri penjelasan! 8. Buka file code.s dan code.o dengan teks editor. Beri komentar.

Percobaan 3 : 1. Lakukan disassembler pada file kode objek, code.o. $ objdump d code.o Apa fungsi opsi d pada command line disassembler ? 2. Lakukan disassembler pada file program eksekusi, prog. $ objdump d prog 3. Bandingkan hasil disassembler file kode object dan file prog.

Percobaan 4 : 1. Lakukan kompilasi (seperti percobaan 2) dan disassembler (seperti percobaan 3) dengan tingkat optimasi yang berbeda, yaitu dengan opsi O1. 2. Bandingkan kode assembler yang dihasilkan antara tingkat optimasi O1 dengan tingkat optimasi O2 seperti yang dilakukan pada percobaan 2 dan 3. 3. Bagaimana dengan -O3 dan -Os? 4. Bagaimana pengaruh tingkat optimasi yang berbeda terhadap size dan speed (terutama antara O2 dan -O3)?

Percobaan 5 : 1. Buat kode program berikut dengan menggunakan teks editor.


#include "text.h"

void main() { test(); }

Simpan kode program tersebut dengan nama main_text.c dalam direktori yang telah Anda buat tadi.

2. Buat kode program berikut dengan menggunakan teks editor.


#include <stdio.h> #include "text.h"

10

void test() { printf("Arsitektur Komputer I !\n"); } Simpan kode program tersebut dengan nama text.c dalam direktori yang telah Anda buat tadi.

3. Buat kode program berikut dengan menggunakan teks editor.


#ifndef TES_H #define TES_H 100

void test();

#endif Simpan kode program tersebut dengan nama text.h dalam direktori yang telah Anda buat tadi.

4. Buat makefile berikut dengan menggunakan teks editor.


all: coba

coba: main2.o coba.o gcc main2.o coba.o -o coba

main_text.o: main_text.c gcc -c main_text.c

text.o: text.c 11

gcc -c text.c

Simpan kode program tersebut dengan nama makefile dalam direktori yang telah Anda buat tadi.

5. Jalankan perintah make pada command prompt (NB: Atur terlebih dahulu working direktori
Anda pada direktori yang Anda buat tadi). 6. Perhatikan! Apa yang terjadi? Beri komentar. 7. Sekarang edit kode program text.c yang telah Anda buat tadi menjadi: #include <stdio.h> #include "text.h"

void test() { printf("TES_H = %d\n",TES_H); }

8. Ulangi langkah 5 dan 6.

TUGAS
Buat program fibonacci sederhana, yaitu program yang akan mengeluarkan deret seperti berikut ini 1, 1, 2, 3, 5, 8, 13, Jumlah deret diinputkan oleh user melalui keyboard. Misal n = 4 akan keluar deret 1, 1, 2, 3. Program terdiri dari dua file C yaitu fibo.c dan inputn.c. inputn.c akan mengatur masalah input n yang dimasukkan dan fibo.c akan menghitung nilai berdasarkan input n. buatlah makefile yang akan mengkompilasi program ini. Lampirkan semua kode yang dibuat pada Lampiran Laporan.

12

PRAKTIKUM ARSITEKTUR KOMPUTER MODUL 2 REPRESENTASI DAN MANIPULASI LEVEL BIT


TUJUAN
Memahami representasi informasi pada level bit Melatih melakukan manipulasi informasi pada level bit

ALAT PERCOBAAN
Personal Computer PC Software compiler C misalnya MinGW atau GCC

DASAR TEORI
Bahasa pemrograman C mendukung operasi Boolean level bit. Simbol yang biasa digunakan untuk melakukan operasi Boolean pada C adalah : | untuk OR, & untuk AND, ~ untuk NOT, dan ^ untuk EXCLUSIVE-OR. Operasi-operasi ini dapat dilakukan pada berbagai tipe data, seperti char, int, short, long atau unsigned. Pada operasi logika, C juga mendukung dengan simbol : || untuk operasi logika OR, && untuk operasi logika AND, dan ! untuk operasi logika NOT. Operasi ini mudah tertukar dengan operasi Boolean level bit, tetapi sebenarnya kedua operasi ini sangat berbeda. Pada operasi logika, setiap argumen yang bukan nol merepresentasikan TRUE, sementara argumen nol (0) merepresentasikan FALSE. Fungsi logika mengembalikan nilai 1 dan 0, yang mengindikasikan TRUE dan FALSE. Selain operasi Boolean dan operasi logika, terdapat juga operasi shift. C dapat melakukan operasi shift pada level bit ke kiri dan ke kanan. Pada umumnya, seluruh mesin dapat mendukung dua bentuk operasi right shift : logical dan arithmetic. Logical right shift mengisi sisi paling kiri dengan bit 0, sementara arithmetic right shift mengisi sisi paling kiri dengan bit tanda yang direpresentasikan pada MSB.

PERCOBAAN
Pada percobaan ini anda diminta untuk membuat 10 buah fungsi yang berhubungan dengan representasi dan manipulasi informasi pada level bit. Setiap fungsi harus dilengkapi dengan fungsi main dan dikompilasi hingga diperoleh file eksekusi-nya. Penilaian dilakukan berdasarkan kebenaran dari program serta efisiensi penggunaan kode.

Persiapan lingkungan kerja : Pindah ke direktori kerja anda (nama direktori sama dengan NIM anda). Simpan seluruh program anda pada direktori tersebut. 13

Fungsi 1 : bitXor(x,y) Buat fungsi yang memiliki perilaku serupa dengan operasi ^. Operator yang boleh digunakan hanya & dan ~. Contoh : bitXor(4,5) = 1 Prototype fungsi : int bitXor(intx, int y)

Fungsi 2 : oddBits(void) Fungsi evenBits memberikan nilai return satu word, dimana seluruh bit ganjil diset menjadi 1. Setiap bit pada satu word diberi nomor dari 0 (LSB) hingga 31 (MSB). Prototype fungsi : int oddBits(void)

Fungsi 3 : getByte(x,n) Fungsi getByte mengekstrak byte n dari word data x. Urutan byte dalam word diberi nomor dari 0 (LSB) hingga 3 (MSB). Contoh : getByte(0x12345678,1) = 0x56 Prototype fungsi : int getByte(int x, int n)

Fungsi 4 : bitMask(highbit,lowbit) Fungsi bitMask menghasilkan suatu mask dimana seluruh bit antara highbit dan lowbit diset menjadi 1, dan bit sisanya diset menjadi 0. Asumsi 0 <= lowbit <= 31 dan 0 <= highbit <= 31. Jika lowbit > highbit, mask seluruhnya 0. Contoh : bitMask(5,3) = 0x38 Prototype fungsi : int bitMask(int highbit, int lowbit)

Fungsi 5 : reverseBytes(x) Fungsi reverseBytes membalikkan urutan byte dari input word dengan menukar byte 0 dengan byte 3, byte 1 dengan byte 2. Urutan byte pada word berurutan dari 0 (LSB) hingga 3 (MSB). Contoh : reverseBytes(0x01020304) = 0x04030201

14

Prototype fungsi : int reverseBytes(int x)

Fungsi 6 : tmax(void) Fungsi tmax mengembalikan nilai twos complement integer terbesar. Prototype fungsi : int tmax(void)

Fungsi 7 : minBytes(x) Fungsi minBytes menghitung nilai dari byte data pertama dikurangi byte data kedua. Sistem bilangan negaif yang digunakan adalah twos complement. Tidak boleh menggunakan operator pengurangan (-), hanya boleh menggunakan penambahan (+) dan invers (~). Contoh : minBytes(0x15,0x07) = 0x0E Prototype fungsi : int minBytes(int x, int y)

Fungsi 8 : shiftRegister(x) Fungsi untuk memasukkan data berdasarkan fungsi shift register pada sistem digital. Asunsi jumlah bit adalah 32 bit, dan setiap nilai yang dimasukkan adalah 5 bit. Nilai awal register adalah 0x00000000. Contoh : shiftRegister(0x04)= 0x00000004 shiftRegister(0x13)= 0x00000093 (dlm biner 0x...0000000100) (dlm biner 0x...0010010011)

ket : input sebelumnya berpengaruh pada nilai sekarang. Prototype fungsi : int shiftRegister (int x) TUGAS

Buatlah sebuah program enkripsi sederhana yang berfungsi untuk menyamarkan 9 digit angka. Enkripsi yang akan dibuat adalah dengan melakukan operasi XOR setiap 8 bit dari 32 bit input dengan sebuah angka desimal 8 bit. Contoh : Input angka 123456789 (00000111 01011011 11001101 00010101), angka desimal untuk enkripsi 85. Maka output hasil enkripsi adalah 1376688192 (01010010 00001110 10011000 01000000). Input 9 digit angka dan angka desimal untuk mengenkripsi merupakan input keyboard. Buat juga program untuk dekripsinya! Buatlah makefile yang akan mengkompilasi program ini.

15

PRAKTIKUM SISTEM KOMPUTER MODUL 3 POINTER DAN ARRAY


TUJUAN
Memahami konsep array, pointer dan alokasi memori Melatih penggunaan array dan pointer dalam C dan assembler

ALAT PERCOBAAN
Personal Computer PC Software compiler C misalnya MinGW atau GCC

DASAR TEORI
Array adalah kumpulan lokasi penyimpanan data, setiap data menyimpan tipe data yang sama. Setiap lokasi penyimpanan disebut elemen array Anda tahu bahwa semua bahasa pemrograman tingkat tinggi menggunakan variabel. Sedangkan pada bahasa pemrograman tingkat rendah variabel didefinisikan dengan cara yang lebih rumit. Di sinilah salah satu kelebihan C ditunjukkan, dimana ia dapat menjembatani antara bahasa kelas tinggi (unggul dengan kemudahan karena konsepnya manusiawi) dengan bahasa tingkat rendah (powerfull, karena akses maksimal terhadap hardware). Dalam C, programmer memiliki akses terhadap memory secara langsung dengan menggunakan p o i n t e r . Untuk memahami konsep pointer, anda perlu mempelajari konsep pengalamatan mempory. Definisi pointer adalah variabel yang menyimpan alamat memory.

PERCOBAAN
Percobaan 1 : 9. Masukkan kode program berikut dengan menggunakan teks editor. Simpan kode program tersebut dengan nama coba.c
void coba(int* x, int* y, int* z) { int a = *x; int b = *y; int c = *z; int d = a + b; *y = d ;

16

*z = b ; *x = c ; }

10. 11.

Kemudian kompilasi program tersebut agar didapat coba.s, pada file coba.s terdapat angkaangka yang menunjukkan penggunaan memory, apa arti angka-angka tersebut. pada file coba.c ganti keyword int dengan double, kemudian kompilasi file coba.c yang sudah diubah, lihat kode assembler yang dihasilkan, apakah berbeda dengan yang sebelumnya ? Mengapa ? seperti sebelumnya pada kode assembler yang dihasilkan akan muncul angka-angka, apa arti angka-angka ini dalam penggunaan memory?

Percobaan 2 : Pada percobaan ini anda diminta untuk membuat beberapa fungsi yang berkaitan dengan array dan pointer. Berikan juga penjelasan cara kerja programnya di laporan, terutama yang berhubungan dengan array dan pointer.

Fungsi 1 : Buat fungsi yang dapat membaca beberapa karakter dalam array (1 elemen array terdapat 1 karakter) dan menghasilkan output dalam susunan yang terbalik. Contoh: H E L L O menjadi O L L E H

Fungsi 2 : Buat fungsi yang dapat melakukan penyimpanan sebuah list (Nama) dalam two-dimensional array of char untuk menampilkan nama. Contoh: Bob Alice Jude Newton

Fungsi 3 : Buat fungsi seperti pada Fungsi 2, namun dengan menggunakan array of pointers yang menunjuk pada penyimpanan (Nama). Jelaskan perbedaan antara Fungsi 3 dengan Fungsi 2.

17

Fungsi 4 : Buat fungsi yang dapat melakukan perkalian pada dua matriks. Keluaran dari fungsi merupakan matriks hasil perkalian tersebut. Dalam melakukan operasi perkalian matriks gunakan proses loop Contoh : mulMatriks(int A[m][n], int B[n][o]) = C[m][o] = A[m][n] * B[n][o]

Catatan: Pada fungsi di atas, anda harus dapat membuat agar fungsi mengoutput sebuah matriks. Ada beberapa cara untuk melakukan ini, misalnya cara paling sederhana adalah membuat matriks hasilnya sebagai parameter fungsi dan diubah-ubah nilainya di dalam fungsi (misal C adalah outputnya):

void addMatriks(int A[m][n], int B[m][n], int C[m][n]);

Tetapi prototype ini memunculkan pertanyaan mengenai kemungkinan implementasi dan cara pemakaian fungsinya: apakah dari fungsi yang memanggil matriks C hanya merupakan pointer dan akan dialokasikan nilainya di dalam fungsi, atau matriks C sudah terbentuk sebagai array dan tinggal diubah nilainya? Biasanya prototype seperti ini lebih cenderung ke cara yang kedua, yaitu array C sudah ada dan tinggal digunakan. Yang menjadi masalah, dari dalam fungsi tidak ada jaminan bahwa array C sudah teralokasikan dengan benar dan memiliki ukuran yang benar. Apabila ternyata salah, ada kemungkinan fungsi menulis data ke alamat memori yang sebetulnya bukan milik C (misalnya karena melebihi batas indeks maksimum array yang dialokasikan untuk C).

Cara lain yang lebih aman adalah membuat fungsi mereturn pointer dari matriks yang dialokasikan secara dinamik di dalam fungsi:

int** addMatriks(int A[m][n], int B[m][n]);

Perhatikan juga bahwa anda harus dapat memberitahukan kepada fungsi berapa nilai m, n, dan o (ukuran matriks) dari fungsi yang memanggilnya. Cara paling mudah adalah membuat m, n, dan o sebagai global variable. Namun demikian cara ini biasanya tidak disukai karena penggunaan global variable membuat alur dan struktur program menjadi kurang jelas, selain membuat fungsi anda menjadi kurang fleksibel. Cara lain adalah membuat m, n, dan o menjadi parameter fungsi, :

18

int** mulMatriks(int m, int n, int o, int A[m][n], int B[n][o]);

tetapi ini membuat jumlah parameter fungsi menjadi banyak. Selain itu, dengan menyimpan ukuran matriks pada variabel terpisah, berarti perlu dibuat dua variabel tambahan, yang secara struktural dalam program tidak ada hubungannya dengan array matriksnya, untuk menyimpan ukuran matriks. Salah satu solusi adalah dengan menyimpan matriks dalam suatu struktur data, misalnya yang sederhana saja:

struct Matriks { int jumlahBaris; int jumlahKolom; int** nilai; // ini akan menjadi dynamic array 2 dimensi };

sehingga prototype fungsi menjadi:

struct Matriks mulMatriks(struct Matriks A, struct Matriks B);

atau jika ingin lebih efisien memori:

struct Matriks* mulMatriks(struct Matriks* pA, struct Matriks* pB);

Anda bebas memilih cara apapun yang disebutkan di atas, atau menggunakan cara lain jika menurut anda lebih baik.

TUGAS
Buatlah sebuah program yang mensimulasikan operasi aritmatika pada level bit 2s complement dengan menggunakan array. Array yang digunakan terdiri dari 8 bit saja dan hanya boleh diisi oleh angka 1 dan 0. Operasi aritmatika yang akan disimulasikan hanya penjumlahan dan pengurangan. Contoh : penjumlahan antara 7 dan 8. Angka 7 dimasukkan ke dalam array menjadi 00000111 dan angka 8 menjadi 00001000, maka hasil penjumlahan adalah 00001111 dan kemudian diubah kembali menjadi angka desimal, yaitu 15. Buatlah makefile yang akan mengkompilasi program ini.

19

SESSION VHDL
20

PENGENALAN VHDL
VHDL adalah salah satu bahasa programming HDL (Hardware Description Language). Berbeda hal nya dengan pemrograman menggunakan C, C++ yang mendeskripsikan behavioral dari suatu sistem, HDL digunakan untuk mendeskripsikan hardware yang digunakan dalam desain sistem digital. Selain itu, eksekusi pemrograman behavioral bersifat sekuensial (berurutan), sedangkan eksekusi HDL bersifat concurrent (bersamaan).

Pemrograman HDL menggunakan format :

LIBRARY ieee; USE ieee.std_logic_1164.all;

ENTITY <nama_entity> IS PORT( <nama_port_1> : <tipe_port> STD_LOGIC; <nama_port_1> : <tipe_port> STD_LOGIC_VECTOR(n DOWNTO 0)); END <nama_entity>;

ARCHITECTURE <nama_arsitektur> OF <nama_entity> IS BEGIN <fungsi yang didefinisikan> END <nama_arsitektur>;

Pada program VHDL yang dideskripsikan terdapat 3 bagian penting, yaitu :

Pemanggilan library yang akan digunakan, dengan syntax :


LIBRARY ieee; USE ieee.std_logic_1164.all;

Pada syntax diatas dipanggil library STD_LOGIC_1164. STD_LOGIC_1164 digunakan untuk mendefinisikan tipe data STD_LOGIC dan STD_LOGIC_VECTOR.

21

Bagian entity. Pada bagian entity akan dijelaskan modul apa yang dibuat, dengan menjelaskan port input dan output apa saja yang terlibat. Singkat kata, bagian entity akan memberi gambaran diagram blok modul yang akan dibuat. Sebagai contoh, pada percobaan ini akan dibuat Instruction Memory:

Gambar 4. Diagram blok Instruction Memory.

Pada diagram blok diatas didapati 2 port, yaitu Address (8 bit) dan Instruction (32 bit). Kedua port ini kemudian akan dideklarasikan tipe sinyalnya (berupa input atau output), dan lebar bus yang digunakan (panjang data) :

1. Deklarasi port akan dilakukan dengan keyword PORT, yaitu address dan instruction. 2. Tipe port menggunakan keyword IN atau OUT. 3. Panjang data dapat didefinisikan dengan pilihan keyword dibawah ini : Tipe data STD_LOGIC : keyword ini memiliki panjang data 1 bit, dengan beberapa nilai yang dapat direpresentasikan, diantaranya 0, 1, X, Z, U, W, L, H, -. 0 dan 1: forcing logic 0 dan forcing logic 1, yang berarti sinyal dikendalikan dengan rangkaian pengendali arus. Z : high impedance. Umumnya ditemukan pada tri-state buffer. L dan H : weak logic 0 dan weak logic 1, yang berarti sinyal diperoleh dari rangkaian wired-logic yang kendali arus nya lemah. X dan W : unknown dan weak unknown secara berurutan. Unknown adalah sinyal yang mencapai batas tegangan yang dapat diinterpretasikan sebagai logika 0 atau logika 1. U : uninitialized. Digunakan pada simulasi untuk menandakan bahwa sinyal atau variabel belum diberi value. - : dont care.

STD_LOGIC_VECTOR(n downto 0) : keyword ini memiliki panjang data n+1 bit, dengan nilai yang direpresentasikan sama dengan STD_LOGIC. BIT : keyword ini hanya dapat merepresentasikan nilai 0 atau 1.

Bagian architecture body akan menjelaskan operasi internal atau organisasi dari entity. 22

Desain prosessor single cycle


Ada lima tahap untuk mendesain prosessor : 1. Menganalisis instruction set 2. Memilih komponen datapath 3. Merancang datapath 4. Mengimplementasikan setiap instruksi untuk pengaturan control yang berkaitan dengan transfer register. 5. Pengaturan control logic

1. Menganalisis Instruction Set Instruction Set R-type I-type J-type

Op : Operasi pada Instruksi rs, rt, rd: Source register, destination register shamt: shift amount : Jumlah penggeseran bit funct: memilih salah satu dari beberapa instruksi dari operasi tertentu address / immediate: offset dari alamat atau nilai immediate target address: alamat tujuan untuk instruksi pada jump

Instruksi-instruksi Kebutuhan Instruksi set - Instruction Memory dan Data memory - Registers (32 x 32) o read RS o read RT o Write RT or RD - Program Counter (PC) - Extender - Register Add dan Sub atau extended immediate - Add 4 atau extended immediate to PC

23

2. Komponen-komponen pada datapath. Combinational Logic Element

Storage Element : Register - N bit input dan output - Write Enable : 0, data out akan Tetap (hold). 1, data out merupakan data in Storage Element : Register File - Register file terdiri dari 32 register - 32 bit Output pada register file : bus A dan bus B, merupakan tempat keluarnya data - 32 bit input untuk write. - RA (register A) memilih register untuk diletakkan di bus A - RB (register B) memilih register untuk diletakkan di bus B - RW (register W) memasukkan data ke register yang dituju 3. Merancang datapath Instruction fetch: Mengambil instruksi: mem[PC] Update PC (program counter): Sequential Code: PC <- PC + 4 Branch and Jump: PC <- branch

24

Register Operation Add, Sub, Or, And R[rd] <- R[rs] op R[rt], Contoh: add rd, rs, rt Ra, Rb, dan Rw berasal dari instruksi yang ditunjukkan oleh rs, rt, dan rd. ALUctr : Berasal dari decoder control logic unit yang menunjukkan operasi yang digunakan. Ini yang membedakan keempat instruksi di atas. Operasi dilakukan di dalam ALU. RegWr: untuk menunjukkan apakah ada penulisan pada register atau tidak. Pada instruksi add atau sub terdapat penulisan register sehingga bernilai 1. Opcode keempat instruksi ini sama, untuk membedakannya maka diperlukan func.

Immediate Operation Addi, Ori, Andi R[rt] <- R[rs] op ZeroExt[imm16] ] Source ALU untuk register B diambil tidak dari register, tapi dari immediate yang diperoleh dari Instruksi. Oleh karena itu dibutuhkan mux untuk memilih data mana yang digunakan, apakah dari register atau dari immediate. Register Destination pada instruksi immediate adalah rt, maka pada Rw ditambahkan mux untuk memilih register destination yang digunakan, apakah rd atau rt.

Load Operation
25

lw R[rt] <- Mem[R[rs] + SignExt[imm16]],Contoh: lw rt, rs, imm16 Pada instruksi ini diperlukan akses data ke data memory. Output dari ALU akan menjadi input di data memory sebagai address. Data dari memory akan keluar sesuai dengan address yang dituju. Data yang dihasilkan pada instruksi ini berasal dari data memory. Untuk memilih antara output dari ALU dan output dari data memory diperlukan mux. ExtOp diperlukan untuk setting pada extender apakah immediate merupakan bilangan negative atau positive.

Store Operation sw Mem[ R[rs] + SignExt[imm16] <- R[rt] ,contoh : sw rt, rs, imm16 Untuk melakukan store data ke memory maka dibutuhkan jalur input yang menghubungkan antara register dan memory. Dari register B akan terhubung ke Data In pada memory. Untuk melakukan write data ke memory dibutuhkan signal input MemWr. Jika MemWr bernilai 1 maka write data dapat dilakukan.

Branch instruction
26

beq rs, rt, imm16

if (R[rs] == R[rt]) , then PC <- PC + 4 + ( SignExt(imm16) x 4 ) else PC <- PC + 4 untuk membandingkan antara rs dan rt menggunakan operasi pengurangan pada ALU. Jika nilai sama, maka signal zero akan menjadi satu. PC yang digunakan jika terjadi branch adalah PC+4+( SignExt(imm16) x 4 ). Untuk memilih antara PC+4 dan PC yang berasal dari branch maka dibutuhkna mux. Sign Extender pada branch instruction merupakan offset. Jadi jika ingin digunakan untuk input ke PC harus dikali 4 terlebih dahulu dengan melakukan shift left 2 kali. Proses ini dilakukan pada PC Ext

Instruksi tambahan Sll, Slr

Sll => [rd] = [rt] << shamt Untuk melakukan shift maka dibutuhkan input berupa data sebanyak apa kita melakukan shift. Pada instruksi data tersebut adalah shamt (shift amount). Proses Shift tersebut dilakukan di dalam ALU. Oleh karen itu ALU butuh input berupa shamt (inst 10:6).

Bagian dalam ALU perlu diubah untuk dapat melakukan fungsi shift left logical
27

Slr => [rd] = [rt] >> shamt

ALU dimodifikasi lagi sehingga dapat melakukan operasi yang lebih banyak lagi. Seperti xor dan nor.

28

:0function lui lui (load upper immediate) => [rt] = {Imm<<16} Karena pada ALU sudah terdapat input shamt (yang melakukan shift sebanyak 2 bit) maka untuk melakukan shift sebanyak 16 bit yang diperlukan adalah memasukkan nilai 8 ke shamt nya. Jadi diperlukan mux untuk memilih apakah input shamt berasal dari instruksi atau bernilai 8. sehingga datapath pada ALU berubah menjadi:

Bne

29

if (not(R[rs] == R[rt])) , then PC <- PC + 4 + ( SignExt(imm16) x 4 ) else PC <- PC + 4 Untuk melakukan instruksi bne perlu adanya signal yang menunjukkan adanya bne itu sendiri. Oleh karena itu diperlukan signal control bne. Signal control tersebut dihubungkan dengan not zero kemudian di and kan. Sehingga jika ada signal bne dan kondisi tidak zero (tidak sama), maka akan dilakukan branch. Perubahan datapath menjadi:

Jump Instruction

Jump dan jump and link Jump => PC = JTA jump and link $ra = PC+4 dan PC =JTA - Untuk melakukan Instruksi jump maka untuk input ke PC diperlukan input JTA yang berasal dari inst 25:0. untuk memilih input ke PC antara JTA atau bukan maka diperlukan mux tambahan. - Register destination juga memerlukan mux tambahan untuk menunjuk pada alamat $ra yaitu 31. - Write data ke register juga memerlukan mux tambahan agar dapat memasukkan input PC+4 ke register $ra. Maka data path menjadi :

30

Jump register Jr => PC = [rs] Input PC berasal dari data yang ditunjukkan oleh register source rs. Maka dibutuhkan wire yang menghubungkan antara rs dan PC. Karena ada input tambahan maka mux yang digunakan untuk jump di perbesar.

4. Control Signal Control signal yang kita gunakan adalah:


31

1. ExtOp : Digunakan pada extender. Apakah zero atau signed extender. (Immediate positif atau negatif) 2. ALUSrc : Untuk memilih data yang masuk pada ALU. Apakah dari register B atau immediate 3. ALUCtr : Untuk memilih operasi apa yang digunakan pada ALU. 4. MemtoReg : Untuk memilih data hasil apakah berasal dari memory atau dari ALU. 5. RegDst : Untuk memilih register mana yang digunakan sebagai register destination. 6. Branch : Menunjukkan adanya instruksi branch 7. MemWrite : Signal yang menunjukkan apakah dilakukan write ke data memory atau tidak. 8. RegWrite : Signal yang menunjukkan apakah dilakukan write ke register atau tidak. 9. Bne : menunjukkan adanya instruksi bne 10. Jump : menunjukkan adanya instuksi jump 11. Jal : menunjukkan adanya instruksi jump and link 12. lui : menunjukkan adanya instruksi lui

Sehingga secara keseluruhan design menjadi :

5. Pengaturan control logic


Jum p (1:0) 00 00 00 00 00 00 00 00 ALUCt r (3:0) 0010 0010 0010 1010 1010 0001 0001 0000

Typ e R I R R R R I R

Instructio n Add Addi Addu Sub Subu Or Ori And

RegDst(1:0 ) 00 01 00 00 00 00 01 00

RegW r 1 1 1 1 1 1 1 1

ExtO p x x x x x x x x

ALUSr c 0 1 0 0 0 0 1 0

MemtoRe g 0 0 0 0 0 0 0 0

memW r 0 0 0 0 0 0 0 0

branc h 0 0 0 0 0 0 0 0

bn e 0 0 0 0 0 0 0 0

Ja l 0 0 0 0 0 0 0 0

lu i x x x x x x x x

32

I R R R R R I I I I I I J J J

Andi Nor Xor Sll Srl Slt Slti Lw Lui Sw Beq Bne Jump Jal Jr

01 00 00 00 00 00 01 01 01 xx xx xx xx xx xx

1 1 1 1 1 1 1 1 1 0 0 0 0 1 0

x x x x x x 1 1 1 1 1 1 1 1 1

1 0 0 0 0 0 1 1 1 1 1 1 x x x

0 0 0 0 0 0 0 1 0 x x x x x x

0 0 0 0 0 0 0 0 0 1 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 1 1 x x x

0 0 0 0 0 0 0 0 0 0 0 1 x x x

00 00 00 00 00 00 00 00 00 00 00 00 01 01 10

0 0 0 0 0 0 0 0 0 x x x x 1 x

x x x 0 0 x x x 1 x x x x x x

0000 0111 0110 0100 0101 0011 0011 0010 0100 0010 0110 0110 xxxx xxxx xxxx

Penjelasan : Instruction Fetch (IF): Instrucion Fetch stage berfungsi mengatur aliran instruksi yang akan diolah pada stage berikutnya. Instruksi yang akan dijalankan sekarang berasal dari memory. Pada rancangan ini, memory dipisahka menjadi 2 bagian yaitu data memory dan instruction memory (berdasarkan Harvad Architecture). Ini dilakukan untuk menghindari structural hazards.

Instruction Decode (ID): Pada cycle berikutnya, fetch instruction berpindah ke Instruction decode stage. Di sini, instruvtion yang berjumlah 32 bit dipecah berdasarkan jenis intruksi/opcode yang dipakai. Pada Processor 32 bit pipeline MIPS, terdapat 6 bit data yang digunakan sebagai opcode, artinya terdapat sebanyak 26 = 64 jenis instruksi yang bisa dibuat. Sedangkan sata 26 bit lainnya akan dipecah menjadi Rs, Rd, Rt, shamt dan function code untuk R-type; Rd, Rs dan immediate untuk I-type; atau langsung menjadi alamt 26 bit untuk J-type. Hasil dari pengodean ini akan diteruskan ke Execute Stage. Selain itu terdapat hazard detection pada stage ini. Jika terdapat suatu intrsuksi yang memungkinkan terjadinya hazard pada system, stage ini akan melakukan stall.

Execute (EX): Execute Stage adalah stage utama dimana sebagian besar operasi ALU terjadi. Pada Execute stage tempat untuk memforward alamat register kembali ke ID stage untuk hazard detection.

Data Memory (MEM): Pada Data Memory Stage, data disimpan dan/atau diambil di memory. Memory hanya dapat dsimpan atau dibaca jika ada sinyal MemRead dan/atau MemWrite yang memungkinkan hal tersebut terjadi.

33

Write Back: Write back stage, berfungsi untuk mengalirkan data dari data memory atau ALUresult kembali ke register file untuk menjalankan instruksi selanjutnya.

34

Diharapkan Sebelum praktikum praktikan telah membaca materi MIPS Processor di buku RTL HARDWARE DESIGN USING VHDL dan DIGITAL DESIGN AND COMPUTER ARCHITECTURE

35

PRAKTIKUM ARSITEKTUR KOMPUTER MODUL 4 Single Cycle MIPS-32 : Memory dan Register File
I. TUJUAN
Membuat Instruction Memory dan Data Memory dengan menggunakan lpm library Membuat Register File menggunakan array Simulasi desain

PERCOBAAN
2A. Membuat of Instruction Memory

Instruction Memory tersebut memiliki ukuran sebesar 32x32 bits. Diagram blok untuk Instruction Memory adalah:
Instruction Memory 32 x 32 bits Address (32) Instruction (32)

Instruction Memory akan menerima input Address selebar 32 bits dan mengeluarkan output 32 bits Instruction. Alamat yang berukuran 5 bit itu mengandung 32 alamat intruksi untuk dieksekusi secara berurutan. Berikut ini adalah cotoh desain Instruction memory yang berukuran 32x32 bits dengan masukan address instruksi yang dimasukkan dalam program secara langsung.
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 port ( Read_address clock reset instruction ); end entity; is : : : : in std_logic_vector (31 downto 0); in std_logic; in std_logic; out std_logic_vector (31 downto 0)

architecture behavior of instrucMEM is type ramtype is array (31 downto 0) of std_logic_vector (31 downto 0); signal mem: ramtype; begin

36

process (reset,Read_address) begin if (reset='1') then instruction <= (others => '0'); else instruction <= mem(conv_integer (Read_address)); end if; end process; -- ASSIGN INSTRUCTION mem(0) <= X"00000022"; mem(1) <= X"8c010000"; mem(2) <= X"8c020004"; mem(3) <= X"8c030008"; mem(4) <= X"00842022"; mem(5) <= X"00822020"; mem(6) <= X"0043282a"; mem(7) <= X"10a00002"; mem(8) <= X"00411020"; mem(9) <= X"1000fffb"; mem(10) <= X"ac040000"; mem(11) <= X"1000ffff"; end behavior;

Tugas 2A 1. Kompilasi dan simulasikan desain di atas. Perhatikan apakah perubahan sinyal pada waveform telah sesuai dengan address yang dimasukkan.

Buatlah program inst_mem untuk desain instruction memory yang datanya diinputkan dari luar component instruction memory. Kemudian simulasikan program tersebut, bandingkan hasilnya dengan desain di atas. Gunakan komponen lpm_rom, deklarasi komponen lpm_rom adalah :
COMPONENT LPM_ROM GENERIC (LPM_WIDTH : natural;-- MUST be greater than 0 LPM_WIDTHAD : natural; -- MUST be greater than 0

LPM_NUMWORDS : natural := 0; LPM_ADDRESS_CONTROL : string := "REGISTERED"; LPM_OUTDATA : string := "REGISTERED"; LPM_FILE : string; LPM_TYPE : string := L_ROM; INTENDED_DEVICE_FAMILY : string := "UNUSED";

LPM_HINT : string := "UNUSED"); PORT (ADDRESS : in STD_LOGIC_VECTOR(LPM_WIDTHAD-1 downto 0); INCLOCK : in STD_LOGIC := '0'; 37

OUTCLOCK : in STD_LOGIC := '0'; MEMENAB : in STD_LOGIC := '1'; Q : out STD_LOGIC_VECTOR(LPM_WIDTH-1 downto 0)); END COMPONENT; 2B. Membuat Data Memory Data Memory akan di desain dengan menggunakan lpm library yaitu lpm_ram_dq. Data memory memiliki kapasitas sebesar 256x8 bits. Diagram blok dari Data Memory adalah sebagai berikut:
MemWrite

Data Memory 256 x 8 bits Address (8) Read_Data(8) Write_Data(8)

MemRead

Input MemWrite akan membuat program menuliskan input Write_Data ke dalam Data Memory dengan alamat sesuai input Address. Output Read_Data akan mengeluarkan output dari Data Memory sesuai dengan alamat input Address ketika ada input MemRead. Deklarasi komponen dari lpm_ram_dq adalah sebagai berikut: COMPONENT lpm_ram_dq GENERIC (LPM_WIDTH: POSITIVE; LPM_TYPE: STRING := "LPM_RAM_DQ"; LPM_WIDTHAD: POSITIVE; LPM_NUMWORDS: NATURAL : = 0; LPM_FILE: STRING := "UNUSED"; LPM_INDATA: STRING := "REGISTERED"; LPM_OUTDATA: STRING := "REGISTERED"; LPM_HINT: STRING := "UNUSED"); PORT (data: IN STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0); address: 0); we: IN STD_LOGIC; IN STD_LOGIC_VECTOR(LPM_WIDTHAD-1 DOWNTO

38

inclock: IN STD_LOGIC := '0'; outclock: IN STD_LOGIC := '0'; q: OUT STD_LOGIC_VECTOR(LPM_WIDTH-1 DOWNTO 0)); END COMPONENT;

Tugas 2B Buatlah program data_mem untuk desain Data Memory dengan entity sebagai berikut. ENTITY data_mem IS PORT( address: IN STD_LOGIC_VECTOR(7 DOWNTO 0); memwrite, memread, clock: IN STD_LOGIC; read_data: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); write_data: IN STD_LOGIC_VECTOR(7 DOWNTO 0)); END data_mem;

Data Memory memiliki read cycle yang asynchronous dan write cycle yang synchronous. Oleh karena itu beberapa parameter harus diganti menjadi LPM_OUTDATA => "UNREGISTERED" LPM_INDATA => "REGISTERED" Sinkronisasi sinyal we (write enable) perlu disinkronisasi dengan input clock agar we aktif ketika signal clock adalah low. Gunakan file dmemory.mif untuk simulasi -- MIPS Data Memory Initialization File depth=256; width=32; Content Begin -- default value for memory [00..FF] : 00000000; -- initial values for test program

39

00 : 55555555; 01 : AAAAAAAA; End;

2C. Membuat Register MIPS-32 memiliki 32 register yang masing-masing memiliki lebar 32 bit. Pada desain ini kita hanya membuat 8 register yang masing-masing memiliki lebar 8 bit. Jadi kita hanya memilki register R0 sampai R7. Pada desain ini kita juga akan membuat mux yang akan digunakan untuk memilih input untuk alamat write_register dan input untuk write_data. Blok diagram dari register_file adalah sebagai berikut:

RegDst

RegWrite

Instruction [25-21] Instruction [20-16]

Register File 8 x 8 bit Read_Reg1(3) Read_Reg2(3) Read_Data 1(8) 0

Instruction [15-11] ALU _Result (8)

Write _Reg(3)

1 Read_Data 2(8) 0 Write _Data (8) 1

Read_Data (8) MemtoReg

Write cycle dari register adalah synchronous, sehingga penulisan register bergantung pada RegWrite dan clock. Input RegDst digunakan untuk memilih alamat Write_Reg dari Instruction. Input MemtoReg digunakan untuk memilih Write_Data dari ALU_Result atau Read_Data. Output Read_Data1 akan mengeluarkan nilai pada register yang dipilih melalui input Read_Reg1, dan Read_Data2 akan mengeluarkan nilai pada register yang dipilih melalui input Read_Reg2. Tugas 2C. 1. Buatlah program reg_file dengan deklarasi entity sebagai berikut ENTITY reg_file IS PORT( instruction: IN STD_LOGIC_VECTOR(31 DOWNTO 0); alu_result, readdata: IN STD_LOGIC_VECTOR(7 DOWNTO 0); regdst, memtoreg, regwrite, clock, reset: IN STD_LOGIC; 40

read_data1, 0)); END reg_file;

read_data2:

OUT

STD_LOGIC_VECTOR(7

DOWNTO

Desain mux (multiplexer) dapat dilakukan dengan konstruksi WHEN. Untuk menyederhanakan desain register digunakan konstruksi array TYPE RegArray IS ARRAY(7 DOWNTO 0) OF STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL R : RegArray;

Alamat register didefinisikan menggunakan INTEGER, oleh karena itu diperlukan fungsi konversi untuk mengubah input alamat register (STD_LOGIC_VECTOR) menjadi INTEGER. Pada saat reset, masing-masing register harus diinisialisasi (menggunakan FOR loop). Nilai awal dari R(0) adalah 0 dan tidak diperbolehkan ada perubahan pada nilai ini. Simulasi desain.

41

PRAKTIKUM ARSITEKTUR KOMPUTER MODUL 5 Single Cycle MIPS-32 : PC Processing dan ALU
I. TUJUAN
Mengimplementasikan sirkuit yang berhubungan dengan perhitungan menggunakan PC Mengimplementasikan ALU dan sign-extend Mensimulasikan semua design yang telah dibuat

PERCOBAAN
Pertama-tama, pilih devais yang akan digunakan. Lihat di assign menu dan pilih device. Kemudian pilih FLEX10K dan EPF10K70RC240-2.

2A. Implementasi dari PC Processng Unit

Figure 1. PC process

Cara kerja dari PC (Program Counter) adalah dengan menambahkan PC dengan 4 dan menyeting PC dengan branch target. Penghitungan branch target mempunyai dua buah langkah. Pertama dengan menggeser nilai sign-extended dengan 2 dan kemudian menambahkan hasil penggeseran tersebut dengan PC_plus4.

42

Untuk design kali ini, PC yang digunakan adalah PC register 10 bit. Hati-hatilah saat membaca diagram. Ada bus yang lebarnya 10 bit dan ada juga yang lebarnya 8 bit. Ingat juga bahwa kita harus memperlakukan PC sebagai signed number ketika melakukan penjumlahan. Untuk mengimplementasikan PC, dapat kita gunakan perintah seperti kita ingin menggunakan D-FF menggunakan struktur if-then. Ketika sinyal reset diberikan, nilai yang ada di PC menjadi nol. Setiap clock naik, nilai PC diupdate baik melalui PC+4 ataupun branch target. Ini adalah deklarasi entity dari PC proses:

ENTITY pc_proc IS PORT( zero, branch, clock, reset: IN STD_LOGIC; signext : IN STD_LOGIC_VECTOR(7 DOWNTO 0); pc_out: OUT STD_LOGIC_VECTOR(9 DOWNTO 0) ); END pc_proc;

Tugas: 1. Selesaian design PC tersebut 2. Simulasikan

2B. Implementasi ALU ALU yang digunakan di sini adalah ALU 8 bit. Dalam ALU ini kita dapat menggunakan fungsi AND, OR, Add, Sub, dan SLT. Sinyal kontrol ALU didefinisikan oleh tabel berikut.

ALU Control 000 001 010 011

Function And Or Add No-op

100

No-op

43

101

No-op

110 111

Subtract Set-on-lessthan

Table 1. ALU Control Signal

Sinyal kontrol ALU didapatkan dari sinyal ALUOp yang berasal dari MIPS control unit dan juga dari FUNCT Field. Perhatikan tabel di bawah ini. ALUOp Funct Field ALU Instructio n Operatio n ALU

ALUOp 1 0 0 1 1 1 1 1

ALUOp 0 0 1 X X X X X

F 5 X X X X X X X

F 4 X X X X X X X

F 3 X X 0 0 0 0 1

F 2 X X 0 0 1 1 0

F 1 X X 0 1 0 0 1

F 0 X X 0 0 0 1 0

Contro l 010 110 010 110 000 001 111 LW or SW Beq R-Type R-Type R-Type R-Type R-Type LW or SW Beq Add Subtract And Or SLT

Actions

Add Subtrac t Add Subtrac t And Or SLT

Table 2. ALU Control Signal Relationship

Tuliskan persamaan untuk ALUCtl(0), ALUCtl(1), and ALUCtl(2): ALUCtl(0) = ALUCtl(1) = ALUCtl(2) = Penanganan khusus diperlukan untuk mendeteksi fungsi SLT. dan kita gunakan MSB dari hasil pengurangan untuk mengeset nilai 1 pada LSB dari hasil ALU.

44

Figure 3. ALU Actions

Deklarasi entity: ENTITY alu IS PORT( read_data1, read_data2 : IN STD_LOGIC_VECTOR(7 DOWNTO 0); signext : IN STD_LOGIC_VECTOR(7 DOWNTO 0); ALUSrc : IN STD_LOGIC; ALUOp : IN STD_LOGIC_VECTOR(1 DOWNTO 0); Funct : IN STD_LOGIC_VECTOR(5 DOWNTO 0); Zero : OUT STD_LOGIC; ALU_Result: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END alu;

Tugas: 1. Selesaikan design ALU tersebut. 2. Simulasikan.

2C. Implementasi Sign-Extend Pada mesin MIPS, rangkaian sing-entender meng-extend sign-number dari 16 bit ke 32 bit. Kali ini kila lakukan hal sebaliknya sebab rangkaian ini hanya menggunakan 8 bit ALU dan dan pengalamatannya pun terbatas sehingga kita harus memotong 16 bit menjadi 8 bit. Deklarasi entity: ENTITY sign_ext IS PORT( inst_immed: IN STD_LOGIC_VECTOR(15 DOWNTO 0); sign_extend: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END sign_ext; Tugas: 1. Selesaikan design ALU tersebut. 2. Simulasikan.

45

PRAKTIKUM ARSITEKTUR KOMPUTER MODUL 6 Single Cycle MIPS-32 : Unit kendali, Top design, dan Testbench
I. TUJUAN
Mengimplementasikan unit kendali Menggabungkan seluruh desain dari bagian I, II, dan III menjadi sebuah desain. Mensimulasikan seluruh desain

PERCOBAAN
Persiapan
Pertama-tama, anda harus memilih devais untuk melakukan simulasi. Untuk memilih devais, klik tombol assign pada menu bar dan klik pada devais yang anda inginkan. Untuk praktikum ini pilih keluarga FLEX10K dan EPF10K70RC240-2.

2A. Implementasi unit kendali

Figure 1. Control Unit

46

Table 1. Control Unit Signals


Pada praktikum ini, anda diminta untuk membuat sebuah unit kendali sesuai dengan Tabel 1. (analogikan dengan sebuah decoder). Ketika sebuah instruksi diakses dari memori instruksi (Instruction Memory), instruksi tersebut disimpan dahulu di dalam sebuah latch untuk memastikan bahwa instruksi tersebut berada dalam troughput yang sama pada satu clock cycle. Untuk mengimplementasikan sebuah latch sederhana, kita akan menggunakan sebuah komponen primitive yang disebut LCELL. Gunakan keluaran dari LCELL (op_out) sebagai ganti port masukan opcode. Berikut ini merupakan potongan kode VHDL untuk unit kendali: ENTITY control IS PORT(opcode : IN STD_LOGIC_VECTOR(5 DOWNTO 0); regdst : OUT STD_LOGIC; alusrc : OUT STD_LOGIC; memtoreg : OUT STD_LOGIC; regwrite : OUT STD_LOGIC; memread : OUT STD_LOGIC; memwrite : OUT STD_LOGIC; branch : OUT STD_LOGIC; aluop0 : OUT STD_LOGIC; aluop1 : OUT STD_LOGIC); END control; ARCHITECTURE behavior OF control IS COMPONENT LCELL PORT (a_in: in STD_LOGIC; a_OUT: OUT STD_LOGIC); END COMPONENT; SIGNAL op_out: STD_LOGIC_VECTOR(5 Downto 0); ... BEGIN 47

Op_Buf0: LCELL PORT MAP (a_in => opcode(0), a_out => op_out(0)); Op_Buf1: LCELL Port map (a_in => opcode(1), a_out => op_out(1)); Op_Buf2: LCELL Port map (a_in => opcode(2), a_out => op_out(2)); Op_Buf3: LCELL Port map (a_in => opcode(3), a_out => op_out(3)); Op_Buf4: LCELL Port map (a_in => opcode(4), a_out => op_out(4)); Op_Buf5: LCELL Port map (a_in => opcode(5), a_out => op_out(5)); .... Latihan: 1. Selesaikan desain tersebut. 2. Simulasikan desain tersebut untuk menunjukkan bahwa desain bekerja dengan baik. Cobalah untuk semua kemungkinan yang mungkin.

2B. Top Design


Gabungkan seluruh desain menjadi sebuah top design VHDL. Penggabungan dilakukan dengan deklarasi komponen. Untuk debugging, kita perlu mengetahui apa yang terjadi di dalam mikroprosesor tersebut. Oleh karena itu, kita perlu untuk melihat beberapa sinyal. Pada percobaan ini, sinyal-sinyal tersebut telah terdaftar di deklarasi entity. Hubungkan port-port tersebut dengan sinyal-sinyal yang sesuai. Berikut ini merupakan potongan dari desain VHDL: ENTITY TOP_MIPS IS PORT(reset, clock : IN STD_LOGIC; PC,ALUresult,rr1d_bus,rr2d_bus,wrd_bus: OUT STD_LOGIC_VECTOR(7DOWNTO 0); out_inst: OUT STD_LOGIC_VECTOR(31 DOWNTO 0)); end TOP_MIPS; ARCHITECTURE structure OF TOP_MIPS IS COMPONENT pc_proc PORT(zero, branch, clock, reset: IN STD_LOGIC; signext : IN STD_LOGIC_VECTOR(7 DOWNTO 0); pc_out: OUT STD_LOGIC_VECTOR(9 DOWNTO 0)); END COMPONENT; COMPONENT inst_mem PORT(address: IN STD_LOGIC_VECTOR(7 DOWNTO 0); q: OUT STD_LOGIC_VECTOR(31 DOWNTO 0)); END COMPONENT; COMPONENT data_mem PORT(address: IN STD_LOGIC_VECTOR(7 DOWNTO 0); memwrite, memread, clock: IN STD_LOGIC; read_data: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); write_data: IN STD_LOGIC_VECTOR(7 DOWNTO 0)); END COMPONENT; COMPONENT reg_file PORT(instruction: IN STD_LOGIC_VECTOR(31 DOWNTO 0); alu_result, readdata: IN STD_LOGIC_VECTOR(7 DOWNTO 0); regdst, memtoreg, regwrite, clock, reset: IN STD_LOGIC; read_data1, read_data2: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END COMPONENT; COMPONENT sign_ext 48

PORT(inst_immed: IN STD_LOGIC_VECTOR(15 DOWNTO 0); sign_extend: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END COMPONENT; COMPONENT alu PORT(read_data1, read_data2 : IN STD_LOGIC_VECTOR(7 DOWNTO 0); signext : IN STD_LOGIC_VECTOR(7 DOWNTO 0); ALUSrc : IN STD_LOGIC; ALUOp : IN STD_LOGIC_VECTOR(1 DOWNTO 0); Funct : IN STD_LOGIC_VECTOR(5 DOWNTO 0); Zero : OUT STD_LOGIC; ALU_Result: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END COMPONENT; COMPONENT control PORT(opcode : IN STD_LOGIC_VECTOR(5 DOWNTO 0); regdst : OUT STD_LOGIC; alusrc : OUT STD_LOGIC; memtoreg : OUT STD_LOGIC; regwrite : OUT STD_LOGIC; memread : OUT STD_LOGIC; memwrite : OUT STD_LOGIC; branch : OUT STD_LOGIC; aluop0 : OUT STD_LOGIC; aluop1 : OUT STD_LOGIC); END COMPONENT; .....

2C. Tesbench Deskripsi tugas :


Berikut ini adalah contoh program dalam bahasa assembly MIPS 00: 8C020000; -- lw $2,0 ;memory(00)=55 01: 8C030001; -- lw $3,1 ;memory(01)=AA 02: 00430820; -- add $1,$2,$3 03: AC010003; -- sw $1,3 ;memory(03)=FF 04: 1022FFFF; -- beq $1,$2,-4 05: 1021FFFA; -- beq $1,$1,-24

Masukkan data heksadesimal di atas sebagai input address pada instruction memory dan pastikan MIPS processor berjalan dengan baik. Salah satu indikator keberhasilan dalam menjalankan testbench ini adalah nilai yang dihasilkan sesuai dengan keterangan di atas yaitu FF. Nilai dan program yang diinputkan dalam testbench boleh diubah sesuai keinginan untuk memastikan semua instruksi berjalan benar.

49

Anda mungkin juga menyukai