Perancangan Sirkuit Sekuensial
Dr. Trio Adiono
Date:Wednesday, December 07, 2005
Pendahuluan
Rangkaian sekuensial adalah rangkaian yang outputnya tidak hanya tergantung kepada
keaddan saat ini, tetapi juga pada keaddaan input sebelumnya. Pada bab ini kita belajar
metoda perancangan sirkuit memory, statement yang digunakan membuat rangakain
sekuensial, contoh sirkuit beserta implementasi dan simulasinya dengan menggunakan
VHDL simulator.
Statement VHDL untuk rangakian sekuensial
Statement Process
Untuk membuat sebuah rangkaian sekuensial, kita memerlukan eksekusi statement secara
sekuensial seperti pada bahasa pemrograman umumnya (C, C++, paskal, dll). Dalam sebuah
architecture dari VHDL, semua statement di eksekusi secara bersamaan (concurrent). Tetapi
ada statement khusus, yaitu PROCESS, dimana semua statement VHDL di dalam statement
ini akan dieksekusi secara sekuensial.
Strukutur
Struktur statement process tersebut dapat dilihat pada Gambar II.1:
label : PROCESS(sensitivity_list)
BEGIN
Statement..1
Statement..2
Statement..3
END
Gambar II.1 Struktur Statement Process.
Seperti terlihat pada Gambar II.1 statement_1, statement_2, statement_3 akan di proses
secara berurutan. Setelah statement_3 di eksekusi, maka prosess akan kembali meng
ekseskusi statement_1.
Sensitifity List
Sensitifity List adalah list dari satu atau lebih signal, yang apabila nilai salah satunya berubah,
maka statement di dalam process akan di eksekusi. Contoh yang mudah dalam penggunaan
sensivity list adalah penggunakan clock dalam sebuah rangkaian kombinasional. Sebuah
rangkaian sekuensial, selalu di eksekusi berdasarkan berubahanya nilai signal clock. Dengan
demikian penggunaan sensivifity list dapat dibeuat sebagai berikut:
PROCESS(clock)
BEGIN
Statement..1
Statement..2
Statement..3
END
Gambar II.2 Signal clock sebagai sensivity list dari rangkaian sekuensial.
Dari contoh di atas, statement akan di eksekusi apabila nilai clock berubah dari 1 ke 0 atau
dari 0 ke 1.
Statement Sekuensial
Pada bagian ini akan dibahas beberapa statement VHDL yang dipakai secara sekuensial di
dalam statement PROCESS.
IF Statement
Struktur statement IF tersebut dapat dilihat pada Gambar II.2:
IF condition THEN
Statement_1…
[ELSIF condition THEN
statement_1…]
[ELSE
statement_1…]
END IF;
Gambar II.3 Struktur Statement Process. Catatan: statement di dalam tanda “[ ]” berupa
optional.
Sama seperti bahasa pemrograman umumnya, statement di dalam IF hanya akan dieksekusi
apabila kondisi dari IF atau ELSIF tersebut terpenuhi. Kondisi tersebut harus dibuat dalam
bentuk ekspressi yang BOOLEAN yaitu yang menghasilkan kondisi TRUE atau FALSE.
Apabila tidak terpenuhi, maka kondisi pada ELSE yang akan di eksekusi.
Beberapa contoh kondisi untuk statement IF adalah sebagai berikut:
Contoh 1:
IF reset =’1’ THEN
data <= “00000000”; ELSIF increment=’1’ THEN data <= data + “00000001”; ELSE data <= data; END IF; Contoh 2: IF en =’1’ AND counter<”1111” THEN data <= data + “00000001”; ELSE data <= “00000000”; END IF; Gambar II.4 Contoh pembuatan condition statement dari IF. Pada contoh 1 terlihat bahwa jika signal reset bernilai ‘1’, maka signal data akan di beri nilai “00000000”. Dalam kondisi lainnya, yaitu bila reset=’0’ dan signal increment=’1’, maka nilai dari signal data akan di tambah sebesar satu. Dan apabila kedua kondisi tersebut tidak terpenuhi, yaitu reset=’0’ dan increment=’0’, maka niali dari signal data akan tetap “00000000”. Contoh 2 menunjukan kondisi yang hamper sama, hanya diperlihatkan penggunaan tanda <>
statement_1…;
WHEN pilihan(|pilihan) =>
statement_1…;
…
WHEN OTHERS =>
statement_1…;
END CASE;
Gambar II.5 Struktur Statement CASE. Catatan: statement di dalam tanda “[ ]” berupa
optional.
Statement CASE dipakai untuk meng-assign suatu signal yang memiliki beberapa alternative
kondisi. Signal yang menjadi kondisi ditempatkan sebagai expresi dari CASE statement.
Masing-masing kondisi di wakili oleh WHEN statement. Jika expresi memenuhi salah satu
pilihan, maka statement yang mengikuti WHEN pilihan=> tersebut akan di eksekusi secara
sekuensial.
Contoh penggunaannya sebagai berikut :
CASE mode IS
WHEN add =>
acc <= a+b; WHEN sub =>
acc <= a-b; WHEN OTHERS acc <= a; END CASE; Pada contoh di atas, mode sebagai ekspresi di cek nilainya, sehingga menentukan operasi apa yang dilakukan sehingga menghasilkan nilai untuk acc. Perancangan Rangakain Sekuensial Sederhana Pada bagian ini akan dijelaskan cara membuat deskripsi VHDL untuk rangkaian-rangakain yang banyak dipakai dalam rangkaian sekuensial. Perancangan D Flip-Flop D Flip-flop merupakan elemen memory yang dapat menyimpan data input sebelumnya. D Flip akan menyampling data input apabila nilai clock berubah dari 0 ke 1 (rising edge). Dengan demikian, clock digunakan sebagai sensivity list dari rangkaian seperti yang terlihat pada gambar II.5. Untuk membedakan kapan flip-flop menyampling input data, maka, maka kita perlu menggunakan IF statement seperti pada contoh. D Flip-flop data_in data reset dff: PROCESS(clk) BEGIN IF reset =’1’ THEN data <= ‘0’; ELSIF (en=’1’) THEN IF clk=’1’ AND clk’EVENT THEN data <= data_in; END IF; ELSE data <= data; END IF; Gambar II.5 Deskripsi rangkaian DFF. Signal en adalah signal enable yang berfungsi untuk mengaktifkan flip-flop tersebut. Semua transisi hanya boleh terjadi apabila en=’1’. Statement clk’EVENT adalah untuk membatasi eksekusi process terjadi pada saat transisi nilai dari clock. Apabila statement ini di gabungkan dengan statement clk=’1’, maka eksekusi akan terjadi pada saat rising edge. Sebaliknya, apabila clk=’0’, maka process akan di eksekusi pada falling edge. Rangakain diatas dapat disimulasikan dengan menggunakan rangkaian dff.vhd dan dff_tb.vhd. Hasil simulasi dapat ditunjukan dengan timing diagram pada Gambar II.6. Pada gambar tersebut terlihat data tersample pada saat rising edge dari clock. Gambar II.6 Timing diagram hasil simulasi DFF. D Flip-flop diatas adalah synchronous D flip-flop, dimana kondisi reset hanya bisa tercapai apabila ada clock (rising edge). Untuk memperoleh D flip-flop dengan reset asynchronous (dapat terjadi tanpa perubahan pada clock), maka kita harus memasukan signal reset dalam sensitivity list, sehingga code VHDL menjadi: dff: PROCESS(reset, clk) BEGIN IF reset =’1’ THEN data <= ‘0’; ELSIF (en=’1’) THEN … Gambar II.7 Deskripsi rangkaian DFF dengan asynchronous reset. Perancangan Counter 4Bits Rangkaian counter merupakan rangkaian yang banyak digunakan dalam sirkuit combinasional. 8 bits counter dapat di implementasikan seperti pada Gambar II.8. library ieee ; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; ----------------------------------------------------- entity counter4 is port( en : in std_logic; clock: in std_logic; reset: in std_logic; sc_in: in std_logic; sc_en: in std_logic; sc_out: out std_logic; cout : out std_logic_vector(3 downto 0) ); end counter4; ----------------------------------------------------- architecture behave of counter4 is signal counter : std_logic_vector(3 downto 0); begin process(clock) begin if clock'event and clock = '1' then if en = '0' then if (reset = '1' or counter = "1111") then counter <= (others => '0');
else
counter <= counter + "0001"; end if; end if; end if; end process; cout <= counter; end behave; Gambar II.8 Deskripsi VHDL counter 8 bits. Seperti terlihat diatas, nilai register count dapat dinaikan dengan memberi harga ‘1’ pada signal inc. Nilai register count menjadi “00000000” apabila di reset atau counter mencapai nilai maksimum “11111111”. Rangakain diatas dapat disimulasikan dengan menggunakan rangkaian count8.vhd dan count8_tb.vhd. Hasil simulasi dapat ditunjukan dengan timing diagram pada Gambar II.6. Pada gambar tersebut terlihat data tersample pada saat rising edge dari clock. Perancangan State Machine Sebagai contoh state machine sederhana adalah state machine lampu merah seperti terlihat pada Gambar II. green "01" yellow "10" red "11" idle "00" en='1' yelow_out='1' en='1' en='1' en='1' en='0' en='0' en='0' green_out='1' red_out='1' Traf ic Ligh Controller en reset red_out yellow_out green_out Gambar II.9 State dan blok Diagram dari Trafic light Controller. Seperti terlihat pada state diagram, pada kondisi awal system di riset dan berada di state idle. Apabila en=’1’, maka state akan berubah idleMgreen, greenMyellow, yellowMred, redMgreen. Kecuali apabila en=’0’ pada setiap kondisi maka state akan pindah ke idle. Dari state machine tersebut kita dapat mendesign descripsi VHDL sebagai berikut: • Menentukan jumlah state. Dari diagram kita dapat melihat bahwa system teridir dari 4 state. Dengan demikian kita dapat merepresentasikan state tersebut dengan register 2 bit, dalam hal ini ctrl_state. Dalam code VHDL : signal ctrl_state: std_logic_vector(1 downto 0); • Menentukan Sensivity list. Dalam hal ini, perubahan state adalah terjadi pada saat rising edge daripada clock, sehingga sensivity list dapat ditentukan adalah clock. • Syarat perubahan state. Dari state diagram dapat dilihat bahwa state berubah atas fungsi signal en. Dari tahapan tersebut kita dapat membuat deskripsi VHDL state machine tersebut sebagai berikut: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity trafic is port( clk : in std_logic; rst : in std_logic; en : in std_logic; state : out std_logic_vector (1 downto 0) ); end trafic; architecture trafic_bhv of trafic is signal ctrl_state : std_logic_vector(1 downto 0); begin process(clk) begin if (clk = '1' and clk'event) then if (rst = '1') then ctrl_state <= "00"; elsif (en = '1') then case ctrl_state is when "00" =>
ctrl_state <= "01"; when "01" =>
ctrl_state <= "10"; when "10" =>
ctrl_state <= "11"; when "11" =>
ctrl_state <= "00"; when others =>
ctrl_state <= "00"; end case; else ctrl_state <= "00"; end if; end if; end process; state <= ctrl_state; end trafic_bhv; Cara lain untuk mendeskripsikan traffic controller tersebut adalah dengan menggunakan statement IF THEN. Hasil simulasi design tsb adalah sbb: Perancangan 8Bits Parallel to Serial Converter Pada bagian ini akan dijelaskan tahapan perancangan 8 bits parallel to serial converter. System ini berfungsi untuk mengubah data 8 bits yang datang setiap 8 clock. Data serial akan di keluarkan melalaui port serial setiap clock. Block diagram dari system ini dapat dilihat pada gambar berikut: 8 Bits Registers 8 bits Paralel Data (prl) 1 bit Serial Data (serial) Controller Serial/Parallel (ctrl_state) en clk System ini dapat dibagi atas registers dan controller. Registers berfungsi menerima parallel 8 bits data pada saat mode registers parallel, danmelakukan shift secara serial ketika register pada mode serial. Selain register system memiliki controller, yang berfungsi menentukan kapan register menerima data parallel dan kapan menshift data secara serial. State machine dari block controller dapat dilihat pada gambar berikut: para "0" Serial "1" en='1'&cnt_state=7 | en='0' en='0' en='1' cnt_state<8 clk =" '1'" rst =" '1')" en =" '1')">
ctrl_state <= '1'; when '1' =>
if (srl_cnt = "111") then
ctrl_state <= '0'; else ctrl_state <= ctrl_state; end if; when others =>
ctrl_state <= ctrl_state;
end case;
else
ctrl_state <= '0';
end if;
end if;
end process;
cnt : process(clk)
begin
if (clk = '1' and clk'event) then
if (rst = '1' or ctrl_state = '0') then
srl_cnt <= "000";
else
srl_cnt <= srl_cnt+"001";
end if;
end if;
end process;
Pbuff : process(clk)
begin
if (clk = '1' and clk'event) then
if (rst = '1') then
buff <= "00000000";
elsif (ctrl_state = '0') then
buff <= prl;
elsif (ctrl_state = '1') then
buff <= buff(6 downto 0) & '0';
end if;
end if;
end process;
srl <= buff(7);
end prl2srl_bhv;
Hasil simulasi dari system ini dapat dilihat pada gambar berikut:
0 comments:
Post a Comment