Anda di halaman 1dari 25

LAPORAN TUGAS PRAKTIKUM ARSITEKTUR DAN ORGANISASI KOMPUTER MENGGUNAKAN XILINX ISE 10.

Nama Kelompok: 1. Suprapto 2. Rian Fidiyani 3. Riswandha Bayu H. 4. Nurfatihah Azizatul M. 5. Primana Oky Rahmanda (4611412006) (4611412017) (4611412023) (4611412030) (4611412031)

PROGRAM STUDI TEKNIK INFORMATIKA FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM UNIVERSITAS NEGERI SEMARANG TAHUN 2013

PENDAHULUAN VHDL (sing. V HSIC H ardware D escription L anguage , diterjemahkan bahasa parsing hardware sirkuit berkecepatan sangat tinggi ) adalah sebuah bahasa parsing hardware yang sering digunakan untuk bahasa entri-desain untuk FPGA , CPLD dan sirkuit terpadu penggunaan khusus(ASIC) di dalam pengautomatan desain elektronik untuk sirkuit digit . Verilog juga adalah bahasa parsing hardware seperti VHDL, tetapi digunakan die USA, dan VHDL pula merupakan bahasa utama digunakan di Europa. VHDL dibuat untuk membantu dalam produksi sirkuit yang semakin kompleks. Ini sesuai dengan Hukum Moore yang memprediksi jumlah transistor di dalam chip meningkat 2 kali lipat dalam setiap 18 bulan. VHDL digunakan dengan luas di bidang Pengolahan sinyal digital di mana kecepatan pemrosesan data memainkan peran utama. TUJUAN Membuat Instruction Memory dan Data Memory dengan menggunakan altsyncram Membuat Register File menggunakan array Simulasi desain

PEMBAHASAN VHDL adalah salah satu bahasa programming HDL (Hardware Description Language). Terdapat beberapa perbedaan antara pemrograman dengan bahasa C atau C++ dengan HDL. Program dalam bahasa C atau C++ mendeskripsikan behavioral dari suatu sistem, sedangkan 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 secara umum menggunakan format sebagai berikut. 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>;

Program VHDL yang telah dideskripsikan di atas dapat dibagi ke dalam 3 bagian penting. a) Pemanggilan library yang akan digunakan, dengan sintaks berikut. 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. b) 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 mengenai diagram blok modul yang akan dibuat. Sebagai contoh, pada percobaan ini akan dibuat Instruction Memory:

Gambar : Diagram blok intruction Memory. Pada diagram blok diatas didapati 2 port, yaitu Address (8 bit) dan Instruction (32 bit). Kedua port ini 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 : i. 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, . 1. 0 dan 1: forcing logic 0 dan forcing logic 1, yang berarti sinyal dikendalikan dengan rangkaian pengendali arus. 2. Z : high impedance. Umumnya ditemukan pada tristate buffer. 3. L dan H : weak logic 0 dan weak logic 1, yang berarti sinyal diperoleh dari rangkaian wiredlogic yang kendali arus nya lemah. 4. 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. 5. U : uninitialized. Digunakan pada simulasi untuk menandakan bahwa sinyal atau variabel belum diberi value. 6. : dont care. ii. STD_LOGIC_VECTOR(n downto 0) : keyword ini memiliki panjang data n+1 bit, dengan nilai yang direpresentasikan sama dengan STD_LOGIC.

iii.

BIT : keyword ini hanya dapat merepresentasikan nilai 0 atau 1.

c) Bagian architecture body menjelaskan operasi internal atau organisasi dari entity.

LANGKAH-LANGKAH PERCOBAAN Membuat New Project Langkah membuat sebuah new project: 1. Memilih File > New Project... The New Project Wizard appears. 2. Type tutorial didalam Project Name field. 3. Masukkan atau pilih lokasi (directory path) untuk new project. Secara otomatis akan membuat subdirectory. 4. Verifikasi HDL dengan memilih Top-Level Source Type list. 5. Klik Next untuk berpindah ke properties page. 6. Isi pada tabel dengan yang ada dibawah ini: Product Category: All Family: Spartan3 Device: XC3S200 Package: FT256 Speed Grade: -4 Top-Level Source Type: HDL Synthesis Tool: XST (VHDL/Verilog) Simulator: ISE Simulator (VHDL/Verilog) Preferred Language: Verilog (or VHDL) Verify that Enable Enhanced Design Summary is selected. Biarkan secara default, akan muncul tampilan dibawah ini:

Klik Next untuk proses pembuatan New Source, setelah itu pada langkah terakhir, New Project sudah Komplit.

Membuat sebuah HDL Source Langkah-langkahnya adalah: 1. Klik New Source pada menu New Project Wizard. 2. Pilih VHDL Module. 3. Ganti pada file name counter. 4. Verifikasi untuk Add to project lalu ceklist. 5. Klik Next. 6. Klik Next, lalu Finish pada New Source Wizard Summary. 7. Klik Next, lalu Next, kemudian Finish.
DATA PRAKTIKUM

Memasukkan Templates (VHDL) Langkahnya: 1. Tempatkan kursor pada begin statement dengan counter architecture. 2. Buka Language Templates dengan cara Edit Language Templates 3. Gunakan simbol +, lalu lakukan langkah: VHDL Synthesis Constructs Coding Examples Counters Binary Up/Down Counters Simple Counter 4. Lalu lakukan langkah Edit Use in File. Setelah memasukkan templates maka hasilnya akan seperti dibawah ini:

5. Setelah itu di Save

6. Klik All Constraints Met link pada Timing Constraints field untuk melihat Timing Constraints report. Verifikasikan.

7. Lalu setelah itu Close Design Summary

HASIL DARI PRAKTIKUM PERCOBAAN 4A. Membuat of Instruction Memory Input : instrucMEM.vhd, instrucMEM.vwf Output : instrucMEM.vwf Hasil waveform:

Gambar 1: Address 0C, instruksi 00000000

Gambar 2: Address 01, instruksi 8c010000

Gambar 3: Address 0B, instruksi 1000ffff TUGAS 4A Input : instruction_memory.vhd, instruction_memory.vwf Output : instruction_memory.vwf Hasil waveform:

Gambar 4: Address 1-9

PERCOBAAN 4B. Membuat Data Memory Input : data_mem.vhd, data_mem.vwf Output : data_mem.vwf Hasil waveform:

Gambar 5: Hasil simulasi data_mem PERCOBAAN 4C. Membuat Register Input : reg_file.vhd, reg_file.vwf Output : reg_file.vwf Hasil waveform:

Gambar 6: Hasil simulasi reg_file

ANALISIS Percobaan 4A Contoh kode VHDL di modul langsung disimulasikan. Hasilnya sesuai dengan yang diharapkan: untuk address belum di-assign dengan instruksi apapun, akan dihasilkan instruksi 0. Sementara apabila instruksi ada di memori, isi instruction adalah isi instruksi yang disimpan. Tugas 4A Pada percobaan ini, source code pada modul tidak bisa dicompile karena lebar memori untuk address terlalu lebar, sehingga diubah menjadi sebesar 10 bit (widthad_a = 10, address_a : STD_LOGIC_VECTOR (9 DOWNTO 0)). Hasil percobaan menunjukkan bahwa program sudah benar, karena menghasilkan output yang mirip seperti instrucMEM. Instruction memory assignment yang digunakan diletakkan diluar dari kode VHDL menggunakan file extension .mif. Percobaan 4B Dengan tools MegaWizard Plug-in Manager, dengan memilih RAM. Ada delay sekitar 1 clock cycle output instruction dari input yang terjadi karena program membutuhkan waktu clock untuk mengambil instruksi. Saat data dan wren aktif, address pada saat wren diaktifkan akan berisi input address yang akan ditulis. Awalnya, nilai address 00 adalah 00, lalu diberi signal input data 65 dan signal wren aktif, isi address 00 ditimpa menjadi 65. Kemudian address 00 ini akan ditimpa lagi dengan nilai input data EF di akhir aktifnya wren. Saat address 00 dibaca lagi, akan dihasilkan output EF karena itulah isi terakhir address tersebut. Percobaan 4C Register file MIPS-32 sebesar 8x8 bit ini dibuat dengan 2 multiplexer sebagai komponen untuk memilih input untuk write_data dan write_reg. Array digunakan untuk menyederhanakan desain register. Hasil pada Read_Data1 dan Read_Data2 sudah sesuai dengan input dari instruction. Penulisan register bergantung pada RegWirte dan clock karena write cycle register berlangsung secara synchronous. Register ini terlebih dahulu di reset agar inisialisasi menggunakan for loop terjadi terlebih dahulu, membuat nilai awal register jadi 00000000.

KESIMPULAN a) b) c) d) Altsyncram digunakan untuk menghubungkan file eksternal untuk digunakan pada program. Instruksi memori bersifat Read-Only. Data memori harus bisa dibaca dan ditulis. Untuk menginisialisasi komponen altsyncram yang menggunakan memory yang kecil, dapat dibuat menggunakan tools MegaWizard Plug-in Manager.

DAFTAR PUSTAKA
Bryant, Randal E. dan David R. OHallaron. Computer Systems: A Programmers Perspective, 2nd Edition.Prentice Hall, 2011. http://praktikumarsikom.files.wordpress.com/2012/10/mif_help.pdf http://quartushelp.altera.com/9.1/mergedProjects/hdl/mega/mega_file_altsynch_ram.htm

LAMPIRAN A. instrucMEM.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.altera_mf_components.ALL; entity instrucMEM is port ( Read_address : in std_logic_vector (31 downto 0); clock : in std_logic; reset : in std_logic; instruction : out std_logic_vector (31 downto 0) ); end entity; architecture behavior of instrucMEM is type ramtype is array (31 downto 0) of std_logic_vector (31 downto 0); signal mem: ramtype; begin 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; B. instuction_memory.vhd LIBRARY ieee; USE ieee.std_logic_1164.all; LIBRARY altera_mf; USE altera_mf.all; ENTITY instruction_memory IS PORT ( address : IN STD_LOGIC_VECTOR (9 DOWNTO 0); -- alamat input clock : IN STD_LOGIC := '1'; -- clock q : OUT STD_LOGIC_VECTOR (31 DOWNTO 0) -- output ); END instruction_memory; ARCHITECTURE structural OF instruction_memory IS -- signal keluaran output SIGNAL sub_wire0 : STD_LOGIC_VECTOR (31 DOWNTO 0); -- komponen memori COMPONENT altsyncram 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 ( clock0 : IN STD_LOGIC ; address_a : IN STD_LOGIC_VECTOR (9 DOWNTO 0); q_a : OUT STD_LOGIC_VECTOR (31 DOWNTO 0)); END COMPONENT; BEGIN q <= sub_wire0(31 DOWNTO 0);

altsyncram_component : altsyncram GENERIC MAP ( init_file => "imemory.mif", operation_mode => "ROM", widthad_a => 10, width_a => 32 ) PORT MAP ( clock0 => clock, address_a => address, q_a => sub_wire0 ); END structural; C. imemory.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 : 8c020000; 04 : 8c030001; 08 : 00430820; 0C : ac010003; 10 : 1022ffff; 14 : 1021fffa; 06 : 0043282A; 07 : 10A00002; 09 : 1000FFFB; 10 : AC040000; 11 : 1000FFFF; END; D. data_mem.vhd LIBRARY ieee; USE ieee.std_logic_1164.all; LIBRARY altera_mf;

USE altera_mf.all; ENTITY data_mem IS PORT ( address : IN STD_LOGIC_VECTOR (4 DOWNTO 0); clock : IN STD_LOGIC := '1'; data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); wren : IN STD_LOGIC ; q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); END data_mem; ARCHITECTURE SYN OF data_mem1 IS SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0);

COMPONENT altsyncram GENERIC ( clock_enable_input_a : STRING; clock_enable_output_a : STRING; init_file : STRING; intended_device_family : STRING; lpm_hint : STRING; lpm_type : STRING; numwords_a : NATURAL; operation_mode : STRING; outdata_aclr_a : STRING; outdata_reg_a : STRING; power_up_uninitialized : STRING; widthad_a : NATURAL; width_a : NATURAL; width_byteena_a : NATURAL ); PORT ( wren_a : IN STD_LOGIC ; clock0 : IN STD_LOGIC ; address_a : IN STD_LOGIC_VECTOR (4 DOWNTO 0); q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); data_a : IN STD_LOGIC_VECTOR (7 DOWNTO 0) );

END COMPONENT; BEGIN q

<= sub_wire0(7 DOWNTO 0);

altsyncram_component : altsyncram GENERIC MAP ( clock_enable_input_a => "BYPASS", clock_enable_output_a => "BYPASS", init_file => "dmemory.mif", intended_device_family => "Cyclone II", lpm_hint => "ENABLE_RUNTIME_MOD=NO", lpm_type => "altsyncram", numwords_a => 32, operation_mode => "SINGLE_PORT", outdata_aclr_a => "NONE", outdata_reg_a => "CLOCK0", power_up_uninitialized => "FALSE", widthad_a => 5, width_a => 8, width_byteena_a => 1 ) PORT MAP ( wren_a => wren, clock0 => clock, address_a => address, data_a => data, q_a => sub_wire0 ); END SYN; E. dmemory.mif WIDTH=8; -- number of bits of data per word DEPTH=256; -- the number of addresses ADDRESS_RADIX=HEX; DATA_RADIX=HEX; CONTENT BEGIN 00 : 00; 04 : 04;

08 : 80; 0C : C0; END; F. reg_file.vhd LIBRARY ieee; USE ieee.std_logic_1164.all; LIBRARY altera_mf; USE altera_mf.all; use IEEE.numeric_std.all; ENTITY reg_file IS PORT ( instruction : IN STD_LOGIC_VECTOR(31 DOWNTO 0); alu_result : IN STD_LOGIC_VECTOR(7 DOWNTO 0); read_data : IN STD_LOGIC_VECTOR(7 DOWNTO 0); reg_dst : IN STD_LOGIC; mem_to_reg : IN STD_LOGIC; reg_write : IN STD_LOGIC; clock : IN STD_LOGIC; reset : IN STD_LOGIC; read_data1 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); read_data2 : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END reg_file; ARCHITECTURE structural OF reg_file IS COMPONENT MUX_5 PORT ( sel : IN STD_LOGIC; in0 : IN STD_LOGIC_VECTOR(4 DOWNTO 0); in1 : IN STD_LOGIC_VECTOR(4 DOWNTO 0); output : OUT STD_LOGIC_VECTOR(4 DOWNTO 0) ); END COMPONENT; COMPONENT MUX_8 PORT (

sel : IN STD_LOGIC; in0 : IN STD_LOGIC_VECTOR(7 DOWNTO 0); in1 : IN STD_LOGIC_VECTOR(7 DOWNTO 0); output : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END COMPONENT; SIGNAL W_MUX_5 : STD_LOGIC_VECTOR(4 downto 0); SIGNAL W_MUX_8 : STD_LOGIC_VECTOR(7 downto 0); SIGNAL REG1 : INTEGER; SIGNAL REG2 : INTEGER; SIGNAL REG3 : INTEGER; TYPE reg_array IS ARRAY(7 DOWNTO 0) OF STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL R : reg_array; BEGIN MUX_5_component : MUX_5 PORT MAP ( sel => reg_dst, in0 => instruction(20 DOWNTO 16), in1 => instruction(15 DOWNTO 11), output => W_MUX_5 ); MUX_8_component : MUX_8 PORT MAP ( sel => mem_to_reg, in0 => alu_result, in1 => read_data, output => W_MUX_8 ); REG1 <= to_integer(unsigned(instruction(25 DOWNTO 21))); REG2 <= to_integer(unsigned(instruction(20 DOWNTO 16))); REG3 <= to_integer(unsigned(W_MUX_5)); --read_data1 <= ; --read_data2 <= ; PROCESS (clock, reset) BEGIN

IF reset = '1' THEN R(0) <= "00000000"; R(1) <= "00000000"; R(2) <= "00000000"; R(3) <= "00000000"; R(4) <= "00000000"; R(5) <= "00000000"; R(6) <= "00000000"; R(7) <= "00000000"; ELSIF clock'EVENT AND clock = '1' then read_data1 <= R(REG1); read_data2 <= R(REG2); IF reg_write = '1' THEN R(REG3) <= W_MUX_8; END IF; END IF; END PROCESS; END structural;

Anda mungkin juga menyukai