You are on page 1of 11

TUGAS TAKE HOME PERANCANGAN SISTEM ELEKTRONIS

8 BIT BARREL SHIFTER (ARITHMETIC)

DISUSUN OLEH :

BEST LEADER NABABAN ( H1C010051)

KEMENTRIAN PENDIDIKAN DAN KEBUDAYAAN UNIVERSITAS JENDERAL SOEDIRMAN FAKULTAS SAINS DAN TEKNIK JURUSAN TEKNIK TEKNIK ELEKTRO PURBALINGGA 2012 1. DESKRIPSI 8-BIT BARREL SHIFTER (ARITHMETIC)

Sebuah Barrel Shifter adalah sebuah sirkuit yang dapat menggeser data masukan dengan sejumlah posisi. Paket IEEE std_logic.1164 akan mendefinisikan sejumlah pergeseran maupun rotasi. Karena kesulitan dalam shifting circuit beberapa perangkat software tidak dapat mensintesis operator ini secara otomatis. Operasi pergeseran dapat dilakukan baik dalam arah kiri (left) atau kanan(right),yang dibagi jenisnya menjadi rotate (memutar) , logic shift (geser logika) dan arithmetic shift (geser aritmatika). Dan dalam tugas saya ini yang akan dibahas adalah mengenai arithmetic shift. Dalam pemrograman komputer, pergeseran aritmatika adalah sebuah Operator Geser,yang dikenal yang dikenal juga sebagai signed shift (geser bertanda). Pada Barrel Shifter (Arithmetic) dikenal memiliki dua jenis pergeseran yaitu : 1. Shift Left Arithmetic (sla)

Ketika dilakukan pergeseran ke kiri sebanyak n,maka nilai bit paling kanan akan diisi dengan nilai 0. 2. Shift Right Arithmetic (sra)

Ketika dilakukan pergeseran ke kanan sebanyak n, maka nilai bit paling kiri akan sama

dengan nilai bit paling kiri sebelumnya.

3. SOURCE CODE shifter.vhdl library IEEE ; --Membaca Paket Standart Dari Library IEEE

use IEEE.STD_LOGIC_1164.all; --Memasukan Semua Bagian Dari IEEE STD_LOGIC Variable entity arithmetic is --deklarasi entity, port input dan output port ( EN : in std_logic; --mendeklarasikan port EN sebagai input dalam tipe std_logic CLK : in std_logic; --mendeklarasikan port CLK sebagai input dalam tipe std_logic a : in std_logic_vector (7 downto 0); --mendeklarasikan port a sebagai input dalam tipe std_logic_vector sebanyak 8 bit amt : in std_logic_vector (2 downto 0); --mendeklarasikan port amt sebagai input dalam tipe std_logic_vector sebanyak 3 bit y : out std_logic_vector (7 downto 0) ); --mendeklarasikan port y sebagai output dalam tipe std_logic_vector sebanyak 8 bit end arithmetic ; --akhir dari deklarasi entity architecture direct_arch of arithmetic is --definisi architecture yang diberi nama direct_arch begin memulai defenisi architecture arithmetic : process (EN, CLK,a,amt) --deklarasi sensitivity list berisi EN, CLK, a, dan amt variable arith_result: std_logic_vector (7 downto 0) ; --mendeklarasikan variabel arith_result dalam tipe std_logic_vector sebanyak 8 bit sebagai variable begin --memulai proses if (EN='1') then --kondisi perulangan jika nilai EN = 1 if(clk='1' and clk'event) then --kondisi perulangan jika nilai clock mencapai 1 case (amt) is --perulangan untuk input amt when "000" => arith_result := a ; --keluaran menjadi a ketika amt 000 when "001" => arith_result := a(7) & a(7 downto 1); --keluaran menjadi a(7) digabung beruntun dengan a(7 downto 1) ketika amt 001 when "010" => arith_result := a(7) & a(7) & a(7 downto 2); --keluaran menjadi a(7) digabung beruntun dengan a(7) , a(7 downto 2) ketika amt 010 when "011" => arith_result := a(7) & a(7) & a(7) & a(7 downto 3); --keluaran menjadi a(7) digabung beruntun dengan a(7) , a(7), a(7 downto 3) ketika amt 011 when "100" => arith_result := a(7) & a(7) & a(7) & a(7) & a(7 downto 4); --keluaran menjadi a(7) digabung beruntun dengan a(7), a(7), a(7), a(7 downto 4) ketika amt 100 when "101" => arith_result := a(7) & a(7) & a(7) & a(7) & a(7) & a(7 downto 5); --keluaran menjadi a(7) digabung beruntun dengan a(7), a(7), a(7), a(7), a(7 downto 5) ketika amt 101

when "110" => arith_result := a(7) & a(7) & a(7) & a(7) & a(7) & a(7) & a(7 downto 6); --keluaran menjadi a(7) digabung beruntun dengan a(7), a(7), a(7), a(7), a(7), a(7 downto 6) ketika amt 111 when others => arith_result := a(7) & a(7) & a(7) & a(7) & a(7) & a(7) & a(7) & a(7); --keluaran menjadi a(7) digabung beruntun dengan a(7), a(7), a(7), a(7), a(7), a(7), a(7) ketika amt berkondisi lain diluar kondisi-kondisi sebelumnya end case; --akhir dari perulangan case y <= arith_result; --inisialisasi signal arith_result ke output y end if; --akhir perulangan if untuk nilai CLK end if; --akhir perulangan if untuk nilai EN end process; --akhir process end direct_arch; --akhir dari architecture

------------------------------------------------------------ Penjelasan shifter.vhdl Pada dasarnya source code shifter.vhdl ini dibuat untuk menggeser bit dengan tipe aritmatika, apabila digeser ke kanan maka bit paling kiri aka diisi sama dengan nilai bit paling kiri sebelumnya. Pada program ini ada dua variabel yang sangat mempengaruhi yaitu EN dan CLK dimana sebagai input dan bertipe std_logic dimana kedua variabel ini masuk ke dalam sensitivity list. Dengan adanya kedua variabel ini, maka inputan a dan amt akan bergantung kepada inputan EN dan CLK sehingga mempengaruhi juga output y yang akan ditampilkan nantinya. Program akan berjalan hanya jika EN = 1 dan CLK juga mencapai nilai 1 (ketika perpindahan dari 0 ke 1). Jika EN = 1 dan juga CLK = 1 and CLK'event, maka variabel amt akan bekerja. Untuk ketika amt bernilai 0 maka inputan akan digeser ke kanan menjadi a dan disimpan sementara di dalam arith_result. Ketika amt bernilai 1 maka inputan akan digeser menjadi a(7) & a(7) & a(7 downto 2) dimana fungsi & ini adalah untuk menggabungkan secara beruntun antara a(7) dengan a(7 downto 1). Ketika amt bernilai 2 maka inputan akan digeser menjadi a(7) & a(7) & a(7 downto 2) dimana a(7) digabung beruntun dengan a(7) , a(7 downto 2). Ketika amt bernilai 3 maka inputan akan digeser menjadi a(7) & a(7) & a(7) & a(7 downto 3) dimana digabungkan secara beruntun antara a(7) dengan a(7) , a(7), a(7 downto 3). Ketika amt bernilai 4 maka inputan akan digeser menjadi a(7) & a(7) & a(7) & a(7) & a(7 downto 4) dimana a(7) digabung beruntun dengan a(7), a(7), a(7), a(7 downto 4). Ketika amt bernilai 5 maka inputan akan digeser menjadi a(7) & a(7) & a(7) & a(7) & a(7) & a(7 downto 5) dimana a(7)

digabung beruntun dengan a(7), a(7), a(7), a(7), a(7 downto 5).Ketika amt bernilai 6 maka inputan akan digeser menjadi a(7) & a(7) & a(7) & a(7) & a(7) & a(7) & a(7 downto 6) dimana a(7) digabung beruntun dengan a(7), a(7), a(7), a(7), a(7), a(7 downto 6). Ketika amt bernilai others maka inputan akan digeser menjadi a(7) & a(7) & a(7) & a(7) & a(7) & a(7) & a(7) & a(7) dimana a(7) digabung beruntun dengan a(7), a(7), a(7), a(7), a(7), a(7), a(7) ketika amt berkondisi lain diluar kondisi-kondisi sebelumnya. Semua inputan tersebut disimpan sementara di dalam arith_result sebelum dikirimkan ke variabel y sebagai output yang akan ditampilkan nantinya. Kemudian terakhir setelah diinisialisaikan y <= arith_result maka keluaran akan ditampilkan oleh variabel y.

4. SOURCE CODE Shifter_tb.vhdl LIBRARY ieee; --Membaca Paket Standart Dari Library IEEE use IEEE.STD_LOGIC_1164.ALL; --Memasukan Semua Bagian Dari IEEE STD_LOGIC Variable

use IEEE.STD_LOGIC_ARITH.ALL; --Memasukan Semua Bagian Dari IEEE STD_LOGIC operasi aritmatika use IEEE.STD_LOGIC_SIGNED.ALL; --Memasukan Semua Bagian Dari IEEE STD_LOGIC Variable bertanda entity arithmetic_tb is --deklarasi entity ttpi kosong end entity arithmetic_tb; --akhir dari entity architecture bench of arithmetic_tb is --definisi architecture yang diberi nama direct_arch signal EN : std_logic; --deklarasi variabel EN bertipe std_logic sebagai signal signal CLK : std_logic; --deklarasi variabel CLK bertipe std_logic sebagai signal constant clk_period : time := 200 ns; --deklarasi variabel clk_period bertipe constant dengan inisialisasi nilai 200 ns signal a : std_logic_vector (7 downto 0); --deklarasi variabel a bertipe std_logic_vector sebanyak 8 bit sebagai signal signal amt : std_logic_vector (2 downto 0); --deklarasi variabel amt bertipe std_logic_vector sebanyak 3 bit sebagai signal signal y : std_logic_vector (7 downto 0); --deklarasi variabel y bertipe std_logic_vector sebagai signal begin --memulai definisi architecture block1 : entity work.arithmetic port map (EN => EN, --port mapping EN CLK => CLK, --port mapping CLK a => a, --port mapping a amt => amt, --port mapping amt y => y); --port mapping y clk_process :process --proses dari clk_process begin --memulai proses dari definisi architecture CLK <= '0'; --inisialisasi port CLK bernilai 0 wait for clk_period/2; --inisialisai waktu tunggu selama nilai konstanta clk_period/2 untuk ke proses

berikutnya CLK <= '1'; --inisialisasi port CLK bernilai 1 wait for clk_period/2; --inisialisai waktu tunggu selama nilai konstanta clk_period/2 untuk ke proses berikutnya end process; --akhir proses arithmetic: process is proses sari arithmetic begin --memulai proses EN <= '1', --inisialisai variabel EN bernilai 1 '0' after 500 ns, --inisialisasi bernilai 0 setelah 500 ns '1' after 1000 ns; --inisialisasi bernilai 1 setelah 1000 ns a <= "00000001", --inisialisasi variabel a bernilai 00000001 "00000011" after 600 ns, --inisialisasi bernilai 00000011 setelah 600 ns "00000100" after 1200 ns; --inisialisasi bernilai 00000100 setelah 1200 ns amt <= "000", --inisialisai variabel amt bernilai 000 "001" after 100 ns, --inisialisasi bernilai 001 setelah 100 ns "010" after 200 ns, --inisialisasi bernilai 010 setelah 200 ns "011" after 300 ns, --inisialisasi bernilai 011 setelah 300 ns "100" after 400 ns, --inisialisasi bernilai 100 setelah 400 ns "101" after 500 ns, --inisialisasi bernilai 101 setelah 500 ns "110" after 600 ns, --inisialisasi bernilai 110 setelah 600 ns "001" after 700 ns, --inisialisasi bernilai 001 setelah 700 ns "010" after 800 ns, --inisialisasi bernilai 010 setelah 800 ns "011" after 900 ns, --inisialisasi bernilai 011 setelah 900 ns "100" after 1000 ns, --inisialisasi bernilai 100 setelah 1000 ns "101" after 1100 ns, --inisialisasi bernilai 101 setelah 1100 ns "110" after 1200 ns; --inisialisasi bernilai 110 setelah 1200 ns wait; --proses tunggu kompilasi end process; --akhir proses end architecture bench; --akhir dari architecture

--------------------------------------------------------

Penjelasan shifter_tb.vhdl

Pada dasarnya setelah kita berhasil membuat sebuat code vhdl , untuk mengetes code vhdl yang telah kita buat benar adanya kita perlu membuat suatu TEST BENCH . Seperti yang dijelaskan pada shifter.vhdl bahwa program ini sangat dipengaruhi oleh adanya variabel EN dan CLK. Penggeseran aritmatika ke kanan yang akan terjadi sesuai dengan kondisi amt yang diberikan adalah: 1. a = 00000001 dengan amt 000 maka y = 00000001 2. a = 00000001 dengan amt 001 maka y = 00000000 3. dan seterusnya Ketika keadaan EN = 0 maka program seakan-akan tidak dijalankan (keadaan off) sehingga outputan sama seperti keadaan sebelumnya. Sedangkan ketika EN = 1 maka program dalam keadaan on dalam arti outputan akan sesuai dengan inputan CLK, a, dan amt-nya. Sama halnya dengan EN, variabel CLK juga demikian hanya melakukan proses pada saat keadaan 1, jika pada saat keadaan CLK = 0 maka keadaan output akan sesuai dengan keadaan sebelumnya.

5. SCREENSHOOT

6. KESIMPULAN Program Barrel Shifter Arithmetic adalah sebuah sirkuit yang dapat menggeser data masukan dengan sejumlah posisi. Ketika dilakukan pergeseran ke kanan sebanyak n, maka nilai bit paling kiri akan sama dengan nilai bit paling kiri sebelumnya. Pada Program ini terdapat sensitivity list dimana sensitivity list ini sangat berpengaruh dan menentukan dalam berjalannya program. Dua variabel yang dianggap paling berpengaruh yaitu EN dan CLK. Variabel EN berada pada posisi pertama dalam

penentuan jalannya program. Jika EN = 0 berarti dalam keadaan off dimana program tidak dijalankan atau dalam arti outputnya sesuai dengan keadaan sebelumnya. Tetapi jika EN = 1 berarti dalam keadaan on dimana program akan dijalankan dan akan melakukan penyesuaian lagi kepada variabel CLK dalam penentuan outputnya. Sama halnya dengan variabel EN, jika CLK = 0 maka program tidak jalankan dalam arti output sesuai denga keadaan sebelumnya tetapi jika CLK = 1 maka program dalam keadaan on dan output akan sesuai dengan sifat-sifat pergeserannya yang sudah diinisialisasi sebelumnya.

You might also like