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.
1. 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 di bawah ini.
label : PROCESS(sensitivity_list)
BEGIN
Statement..1
Statement..2
Statement..3 END
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 dibuat sebagai berikut:
Signal clock sebagai sensivity list dari rangkaian sekuensial
PROCESS(clock)
BEGIN
Statement..1
Statement..2
Statement..3 END
Dari contoh di atas, statement akan di eksekusi apabila nilai clock berubah dari 1 ke 0 atau dari 0 ke 1.
2. 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 di bawah ini.
Struktur Statement Process. Catatan: statement di dalam tanda "[ ]" berupa optional.
IF condition THEN
Statement_1... [ELSIF condition THEN statement_1...]
[ELSE statement_1...]
END IF;
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:
Pembuatan condition statement dari IF
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;
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 < dan statement "AND". Berbagai operasi aritmatik dapat kita tempatkan di dalam condition tersebut, selama hasil yang diperoleh bernilai TRUE/'1' atau FASLE/'0'.
Meskipun kondisi ELSE merupakan suatu optional, untuk menjamin rangkaian yang disintesis dari deskripsi VHDL tersebut mengahsilkan rangkaian sesuai dengan yang diharapkan, maka usahakan untuk selalu membuat statement dalam kondisi ELSE.
CASE Statement
Struktur statement CASE tersebut dapat dilihat di bawah ini.
Struktur Statement CASE. Catatan: statement di dalam tanda "[ ]" berupa optional
CASE expression IS
Statement_1...
WHEN pilihan(|pilihan) => statement_1...; WHEN pilihan(|pilihan) => statement_1...;
...
WHEN OTHERS => statement_1...;
END CASE;
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.
3. 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.
Deskripsi rangkaian DFF

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;
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.
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:
Deskripsi rangkaian DFF dengan asynchronous reset
dff: PROCESS(reset, clk)
BEGIN
IF reset =’1’ THEN data <= ‘0’;
ELSIF (en=’1’) THEN
Perancangan Counter 4Bits
Rangkaian counter merupakan rangkaian yang banyak digunakan dalam sirkuit combinasional. 8 bits counter dapat di implementasikan seperti di bawah ini.
Deskripsi VHDL counter 8 bits
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;
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 di bawah ini.

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 idle?green, green?yellow, yellow?red, red?green. 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:

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:

VHDL code dari system ini adalah sebagai berikut:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity prl2srl is
port(
clk : in std_logic;
rst : in std_logic;
en : in std_logic;
prl : in std_logic_vector (7 downto 0);
srl : out std_logic
);
end prl2srl;
architecture prl2srl_bhv of prl2srl is
signal ctrl_state : std_logic;
signal srl_cnt : std_logic_vector(2 downto 0);
signal buff : std_logic_vector(7 downto 0);
begin
ctrl : process(clk)
begin
if (clk = '1' and clk'event) then
if (rst = '1') then
ctrl_state <= '0';
elsif (en = '1') then
case ctrl_state is
when '0' =>
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:

Author: Dr. Trio Adiono Date:Wednesday, December 07, 2005