VHDL #12: Finite State Machine (FSM) dalam Pemrograman VHDL

January 1, 2026

 

Sahabat Robonesia, mesin keadaan terbatas atau Finite State Machine (FSM) merupakan teknik pemodelan khusus untuk rangkaian logika sekuensial. Model seperti ini sangat membantu dalam perancangan jenis sistem tertentu, terutama sistem yang tugasnya membentuk urutan yang terdefinisi dengan baik (misalnya, Controller digital).

Artikel ini dimulai dengan meninjau konsep-konsep fundamental yang berkaitan dengan FSM. Kemudian, kita akan memperkenalkan teknik pengkodean VHDL yang sesuai, diikuti dengan contoh-contoh desain lengkap.

 

Gambar 1. Finite State mesin Mealy and Moore
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 160

 

12.1 Mengenal FSM

Gambar 1 menunjukkan diagram blok mesin keadaan satu fasa. Seperti yang ditunjukkan pada gambar 1, bagian bawah berisi logika sekuensial (flip-flop), sedangkan bagian atas berisi logika kombinasi.

Bagian logika kombinasional (atas) memiliki dua input, yaitu pr_state (Present_state/keadaan saat ini) dan input eksternal. Bagian ini memiliki dua output, yaitu nx_state (Next_state/keadaan berikutnya) dan output eksternal.

Bagian logika sekuensial (bawah) memiliki tiga input (clock, reset, dan nx_state), dan satu output (pr_state). Karena semua flip-flop berada di bagian sistem ini, maka clock dan reset harus dihubungkan ke bagian ini.

Ada 2 jenis FSM yaitu mesin Mealy dan mesin Moore. Berikut adalah definisinya:

  1. Mesin Mealy adalah jika data output sebuah mesin keadaan tidak hanya bergantung pada keadaan saat ini (pr_state) tetapi juga pada input saat ini.
  2. Mesin Moore adalah jika data output sebuah mesin keadaan hanya bergantung pada keadaan saat ini (pr_state).

Pemisahan rangkaian menjadi dua bagian (Lihat gambar 1) memungkinkan desain untuk dibagi menjadi dua bagian juga. Dari perspektif VHDL, jelas bahwa bagian bawah, yang bersifat sekuensial, akan membutuhkan PROCESS, sedangkan bagian atas, yang bersifat kombinasional, tidak. Namun, perlu diingat bahwa kode sekuensial dapat mengimplementasikan kedua jenis logika, kombinasional maupun sekuensial. Oleh karena itu, jika diinginkan, bagian atas juga dapat diimplementasikan menggunakan PROCESS.

Sinyal clock dan reset biasanya muncul dalam daftar sensitivitas PROCESS bagian bawah (kecuali jika reset sinkron atau tidak digunakan, atau WAIT digunakan sebagai pengganti IF). Ketika reset diaktifkan, pr_state akan diatur ke keadaan awal sistem. Jika tidak, pada Edge-clock yang tepat, flip-flop akan menyimpan nx_state, sehingga mentransfernya ke output bagian bawah (pr_state).

Satu aspek penting yang terkait dengan pendekatan FSM adalah bahwa meskipun rangkaian sekuensial apa pun pada prinsipnya dapat dimodelkan sebagai mesin keadaan, ini tidak selalu menguntungkan. Alasannya adalah kode tersebut mungkin menjadi lebih panjang, lebih kompleks, dan lebih rentan terhadap kesalahan dibandingkan dengan pendekatan konvensional. Hal ini sering terjadi pada rangkaian register sederhana, seperti Counter. Sebagai aturan praktis sederhana, pendekatan FSM disarankan dalam sistem yang tugasnya membentuk daftar yang terstruktur dengan baik sehingga semua keadaan dapat dengan mudah dihitung. Artinya, dalam implementasi mesin keadaan yang khas, kita akan menemukan, di awal ARSITEKTUR, tipe data terenumerasi yang ditentukan pengguna, yang berisi daftar semua kemungkinan keadaan sistem. Controller digital adalah contoh yang baik dari rangkaian tersebut.

Aspek penting lainnya, bahwa tidak semua rangkaian yang memiliki memori harus berurutan. RAM (Random Access Memory) diberikan sebagai contoh. Di dalamnya, operasi pembacaan memori hanya bergantung pada bit alamat yang saat ini diterapkan ke RAM (input saat ini), dengan nilai yang diambil tidak ada hubungannya dengan akses memori sebelumnya (input sebelumnya). Dalam kasus seperti itu, pendekatan FSM tidak disarankan.

 

12.2 Desain FSM – Style #1

Beberapa pendekatan dapat dirancang untuk mendesain FSM. Kita akan menjelaskan secara detail satu gaya yang terstruktur dengan baik dan mudah diterapkan. Dalam style #1 ini, desain bagian bawah mesin keadaan (gambar 1) sepenuhnya dipisahkan dari bagian atasnya. Semua keadaan mesin selalu dideklarasikan secara eksplisit menggunakan tipe data enumerasi. Setelah memperkenalkan gaya desain tersebut, kita akan memeriksanya dari sudut pandang data.

 

12.2.1 Desain Bagian Bawah (Sequential logic)

Pada gambar 1, flip-flop berada di bagian bawah, sehingga clock dan reset terhubung ke sana. Input bagian bawah lainnya adalah nx_state (keadaan berikutnya), sedangkan pr_state (keadaan saat ini) adalah satu-satunya outputnya. Karena rangkaian bagian bawah bersifat sekuensial, diperlukan sebuah PROCESS, di mana salah satu pernyataan sekuensial (IF, WAIT, CASE, atau LOOP) dapat digunakan.

Template desain untuk bagian bawah adalah sebagai berikut:

 

 

Kode yang ditunjukkan di atas sangat sederhana. Kode tersebut terdiri dari reset asinkron, yang menentukan keadaan awal sistem (state0), diikuti oleh penyimpanan sinkron nx_state (pada transisi clock positive_edge), yang akan menghasilkan pr_state pada output bagian bawah (gambar 1). Salah satu keunggulan pendekatan ini adalah desain bagian bawahnya pada dasarnya standar. Keuntungan lain dari gaya desain ini adalah jumlah register yang dibutuhkan minimal.

Jumlah flip-flop yang dihasilkan dari kode program VHDL di atas sama dengan jumlah bit yang dibutuhkan untuk mengkodekan semua keadaan FSM (karena satu-satunya sinyal yang diberi nilai pada transisi sinyal lain adalah pr_state). Oleh karena itu, jika gaya pengkodean default (biner) (Sub-bab 12.4 artikel ini) digunakan, maka hanya dibutuhkan [log2n] flip-flop, di mana n adalah jumlah keadaan.

 

12.2.2 Desain Bagian Atas (Combinational logic)

Pada gambar 1, bagian atas sepenuhnya kombinasi, sehingga kodenya tidak perlu berurutan. Kode concurrent juga dapat digunakan. Namun, pada template desain yang ditunjukkan di bawah ini, kode berurutan digunakan, dengan pernyataan CASE memainkan peran utama. Dalam hal ini, ingatlah bahwa aturan 1 dan 2 harus dipatuhi, yaitu aturan menggunakan kode sekuensial untuk membuat rangkaian kombinasional yang telah kita bahas pada sub-bab 10.10 artikel berjudul “VHDL #10: Kode Program Sequential dalam Pemrograman VHDL.

 

 

Seperti yang terlihat, kode ini juga sangat sederhana, dan melakukan dua hal: (a) menetapkan nilai keluaran dan (b) menetapkan keadaan selanjutnya. Perhatikan juga bahwa kode ini mematuhi aturan 1 dan 2 yang telah di sebutkan di atas, yang berkaitan dengan desain rangkaian kombinasi menggunakan pernyataan sekuensial, karena semua sinyal masukan ada dalam daftar sensitivitas dan semua kombinasi masukan/keluaran ditentukan. Terakhir, perhatikan bahwa tidak ada penetapan sinyal yang dilakukan pada transisi sinyal lain, sehingga tidak ada flip-flop yang akan disimpulkan.

 

12.2.3 Template Desain FSM – Style #1

Template lengkapnya ditunjukkan di bawah ini. Perhatikan bahwa, selain dua proses yang disajikan di atas, template ini juga berisi tipe data enumerasi yang ditentukan pengguna (di sini disebut dengan state), yang mencantumkan semua kemungkinan status mesin.

 

 

Contoh 12.1: BCD Counter

 

Gambar 2. State diagram contoh 12.1 – BCD counter
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 164

 

Sebuah counter merupakan contoh dari mesin Moore, karena outputnya hanya bergantung pada keadaan yang tersimpan (saat ini). Sebagai rangkaian terdaftar sederhana dan sebagai sequencer, counter dapat dengan mudah diimplementasikan dengan dua pendekatan: konvensional atau tipe FSM. Masalah dengan pendekatan terakhir adalah ketika jumlah keadaan (state) besar, akan menjadi rumit untuk menghitung semuanya, masalah yang mudah dihindari dengan menggunakan pernyataan LOOP dalam pendekatan konvensional.

Diagram keadaan counter melingkar 0-ke-9 ditunjukkan pada gambar 2. Keadaan-keadaan tersebut disebut zero, one, two, three, …, nine. Masing-masing nama sesuai dengan nilai desimal output.

Kode program VHDL, yang secara langsung menyerupai template desain style #1, disajikan pada Program 1. Tipe data yang dihitung (State) muncul pada baris 11–12. Desain bagian bawah (Clock) disajikan pada baris 16–23, dan bagian atas (kombinasi) pada baris 25–59. Dalam contoh ini, jumlah register adalah [log2 10] = 4. Hasil simulasi ditunjukkan pada gambar 3. Seperti yang dapat dilihat, output (Count) bertambah dari 0 menjadi 9, dan kemudian dimulai kembali dari 0.

 

Program 1: Untuk contoh 12.1

 

Hasil simulasi contoh 12.1 tampak pada gambar 3 berikut ini:

Gambar 3. Hasil simulasi contoh 12.1 – BCD counter
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 165

 

Contoh 12.2: FSM sederhana (#1)

 

Gambar 4. State diagram contoh 12.2 – FSM sederhana 1
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 167

 

Gambar 4 menunjukkan diagram keadaan dari FSM yang sangat sederhana. Sistem ini memiliki dua keadaan (keadaan A dan keadaan B), dan harus berubah dari satu ke yang lain setiap kali d = ‘1’ diterima. Keluaran yang diinginkan adalah x = a ketika mesin berada di keadaan A, atau x = b ketika berada di keadaan B. Keadaan awal (reset) adalah keadaan A. Kode VHDL untuk rangkaian ini, menggunakan desain Style #1, ditunjukkan di bawah ini.

 

Program 2: Untuk contoh 12.2

 

Hasil simulasi contoh 12.2 tampak pada gambar 5 berikut ini:

 


Gambar 5. Hasil simulasi contoh 12.2 – FSM sederhana 1
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 168

 

Hasil simulasi yang berkaitan dengan kode di atas ditunjukkan pada gambar 5. Perhatikan bahwa rangkaian bekerja seperti yang diharapkan. Memang, dengan melihat file laporan, kita akan memverifikasi bahwa, seperti yang diharapkan, hanya satu flip-flop yang diperlukan untuk mengimplementasikan rangkaian ini karena hanya ada dua keadaan yang akan dikodekan. Perhatikan juga bahwa bagian atas memang kombinasional, karena output (x), yang dalam hal ini bergantung pada input (a atau b, tergantung pada keadaan mesin), bervariasi ketika a atau b bervariasi, terlepas dari clk. Jika output sinkron diperlukan, maka desain Style #2 harus digunakan.

 

12.3 Desain FSM – Style #2 (Stored Output)

 


Gambar 6. Diagram rangkaian desain Style #1 dan Style #2
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 169

 

Seperti yang telah kita lihat, pada desain Style #1 hanya pr_state yang disimpan. Oleh karena itu, keseluruhan rangkaian dapat diringkas seperti pada gambar 6(a). Perhatikan bahwa dalam kasus ini, jika itu adalah mesin Mealy (mesin yang outputnya bergantung pada input saat ini), output mungkin berubah ketika input berubah (output asinkron).

Dalam banyak aplikasi, sinyal-sinyal tersebut harus sinkron, sehingga output hanya perlu diperbarui ketika tepi clock yang tepat terjadi. Untuk membuat mesin Mealy sinkron, output juga harus disimpan, seperti yang ditunjukkan pada gambar 6(b).

Struktur ini adalah objek dari gaya desain #2. Untuk mengimplementasikan struktur baru ini, hanya sedikit modifikasi yang diperlukan. Misalnya, kita dapat menggunakan sinyal tambahan (misalnya, temp) untuk menghitung nilai output (bagian atas), tetapi hanya meneruskan nilainya ke sinyal output sebenarnya ketika peristiwa clock terjadi (bagian bawah). Modifikasi ini dapat diamati pada template yang ditunjukkan di bawah ini.

 

12.3.1 Template Desain FSM – Style #2

 

Dengan membandingkan template desain style #2 dengan desain style #1, kita dapat memastikan bahwa satu-satunya perbedaan adalah yang terkait dengan pengenalan sinyal internal temp. Sinyal ini akan menyebabkan output dari state machine disimpan, karena nilainya hanya diteruskan ke output ketika clk’EVENT terjadi.

 

Contoh 12.3: FSM sederhana (#2)

Mari kita pertimbangkan kembali desain contoh 12.2 di atas. Namun, anggaplah sekarang kita menginginkan output yang sinkron (berubah hanya ketika sinyal clock naik). Karena ini adalah mesin Mealy, desain Style #2 diperlukan.

 

Program 3: Untuk contoh 12.3

 

Dengan melihat berkas laporan yang dihasilkan oleh kompiler, kita mengamati bahwa dua flip-flop kini dihasilkan, satu untuk mengkodekan keadaan mesin, dan yang lainnya untuk menyimpan output.

 

Gambar 7. Hasil simulasi contoh 12.3 – FSM sederhana 2
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 172

 

Hasil simulasi ditunjukkan pada gambar 7. Ingatlah bahwa ketika sinyal disimpan, nilainya akan tetap statis antara dua Edge-clock yang berurutan. Oleh karena itu, jika input (a atau b dalam contoh di atas) berubah selama interval ini, perubahan tersebut mungkin tidak diamati oleh rangkaian; terlebih lagi, ketika diamati, perubahan tersebut akan tertunda relatif terhadap input (yang merupakan ciri khas rangkaian sinkron).

 

Contoh 12.4: String Detector

 


Gambar 8. State diagram – Contoh 12.4
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 172

 

Kita ingin merancang sebuah rangkaian yang menerima input berupa aliran bit serial dan menghasilkan output ‘1’ setiap kali urutan ‘‘111’’ muncul. Tumpang tindih juga harus dipertimbangkan, yaitu, jika . . . 0111110 . . . terjadi, maka output harus tetap aktif selama tiga siklus clock berturut-turut.

State diagram mesin kita ditunjukkan pada gambar 8. Terdapat empat keadaan, yang kita sebut nol, satu, dua, dan tiga, dengan nama yang sesuai dengan jumlah ‘1’ berturut-turut yang terdeteksi. Solusi yang ditunjukkan di bawah ini menggunakan desain Style #1.

 

Program 4: Untuk contoh 12.4

 

Perhatikan bahwa dalam contoh ini, output tidak bergantung pada input saat ini. Fakta ini dapat diamati pada baris 30, 35, 40, dan 45  dari kode di atas, yang menunjukkan bahwa semua penugasan ke q bersifat tanpa syarat (yaitu, tidak bergantung pada d). Oleh karena itu, output secara otomatis sinkron (mesin Moore), sehingga penggunaan desain Style #2 tidak diperlukan. Rangkaian ini membutuhkan dua flip-flop, yang mengkodekan empat keadaan mesin keadaan, dari mana q dihitung.

 


Gambar 9. Hasil simulasi contoh 12.4 – String detector
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 175

 

Hasil simulasi ditunjukkan pada gambar 9. Seperti yang dapat dilihat, urutan data d = ‘‘011101100’’ diterapkan pada rangkaian, menghasilkan respons q = ‘‘000100000’’ pada output.

 

Contoh 12.5: Traffic Light Controller (TLC)

Seperti yang telah disebutkan sebelumnya, pengontrol digital adalah contoh yang baik dari rangkaian yang dapat diimplementasikan secara efisien ketika dimodelkan sebagai mesin keadaan.

 

Tabel 1. Spesifikasi sistem TLC – Contoh 12.5
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 175

 

Dalam contoh ini, kita ingin merancang TLC dengan karakteristik yang dirangkum dalam tabel 1, yaitu:

  1. Tiga mode operasi: Reguler, Uji, dan Siaga.
  2. Mode Reguler: empat keadaan, masing-masing dengan waktu yang dapat diprogram secara independen, yang diteruskan ke rangkaian melalui sebuah CONSTANT.
  3. Mode Uji: memungkinkan semua waktu yang telah diprogram sebelumnya untuk ditimpa (dengan sakelar manual) dengan nilai kecil, sehingga sistem dapat dengan mudah diuji selama pemeliharaan (1 detik per keadaan). Nilai ini juga harus dapat diprogram dan diteruskan ke rangkaian menggunakan sebuah CONSTANT.
  4. Mode Standby: jika diatur (misalnya, oleh sensor yang mendeteksi kerusakan, atau sakelar manual) sistem harus mengaktifkan lampu kuning di kedua arah dan tetap demikian selama sinyal siaga aktif.
  5. Asumsikan bahwa “clock” 60 Hz tersedia.

 

Gambar 10. State diagram (Regular mode) – Contoh 12.5
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 175

 

 

Di sini, desain Style #1 dapat diterapkan, seperti yang ditunjukkan pada kode di bawah ini.

 

Program 5: Untuk contoh 12.5

 

Jumlah flip-flop yang diharapkan untuk mengimplementasikan rangkaian ini adalah 15. Tiga flip-flop untuk menyimpan pr_state (mesin memiliki lima keadaan, sehingga dibutuhkan tiga bit untuk mengkodekannya), ditambah dua belas flip-flop untuk counter (ini adalah counter 12-bit, karena harus menghitung hingga timeMAX = 2700).

 

Gambar 11. Hasil simulasi contoh 12.5
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 179

 

Hasil simulasi ditunjukkan pada gambar 11. Agar hasilnya sesuai dengan grafik, kita menggunakan nilai waktu yang kecil, dengan semua CONSTANTS sama dengan 3 kecuali timeTEST, yang dibuat sama dengan 1. Oleh karena itu, sistem diharapkan mengubah keadaan setiap tiga siklus clock saat dalam operasi Reguler, atau setiap siklus clock jika dalam mode Uji. Kedua kasus ini dapat diamati pada dua grafik pertama gambar 11, masing-masing. Grafik ketiga menunjukkan mode Standby diaktifkan. Seperti yang diharapkan, stby bersifat asinkron dan memiliki prioritas lebih tinggi daripada test, menyebabkan sistem tetap berada dalam keadaan YY (keadaan 4) saat stby aktif. Sinyal uji, di sisi lain, bersifat sinkron, tetapi tidak perlu menunggu hingga pengaturan waktu status saat ini selesai untuk diaktifkan, seperti yang dapat diamati pada grafik kedua.

 

Contoh 12.6: Signal Generator

Kita ingin merancang sebuah rangkaian yang, dari sinyal clock “clk,” menghasilkan sinyal “outp” yang ditunjukkan pada gambar 12(a). Perhatikan bahwa rangkaian tersebut harus beroperasi pada kedua edge (rising_edge dan falling_edge) dari “clk.”

Gambar 12. Bentuk gelombang contoh 12.6
(a) sinyal outp yang akan dihasilkan dari clk (b) sinyal perantara out1 dan out2 (outp = out1 AND out2).
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 180

 

Untuk mengatasi aspek two-edge, salah satu alternatifnya adalah dengan mengimplementasikan dua state machine, mesin keadaan pertama beroperasi secara eksklusif pada transisi positif clk dan mesin keadaan kedua beroperasi secara eksklusif pada Edge-negatve, sehingga menghasilkan sinyal perantara out1 dan out2 yang ditunjukkan pada gambar 12(b). Sinyal-sinyal ini kemudian dapat di-AND-kan untuk menghasilkan sinyal outp yang diinginkan. Perhatikan bahwa rangkaian ini tidak memiliki input eksternal (kecuali clk, tentu saja), sehingga output hanya dapat berubah ketika clk berubah (output sinkron).

 

Program 6: Untuk contoh 12.6

 

Hasil simulasi dari rangkaian yang disintesis dengan kode di atas (Contoh 12.6) ditunjukkan pada gambar 13.

 

Gambar 13. Hasil simulasi contoh 12.6
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 182

 

12.4 Encode Style: Binnary vs. One-hot

Untuk mengkodekan keadaan mesin keadaan, kita dapat memilih salah satu dari beberapa gaya yang tersedia. Gaya standar adalah biner. Keuntungannya adalah membutuhkan jumlah flip-flop paling sedikit. Dalam hal ini, dengan n flip-flop (n bit), hingga 2n keadaan dapat dikodekan. Kerugian dari skema pengkodean ini adalah membutuhkan lebih banyak logika dan lebih lambat daripada yang lain.

Di sisi lain, terdapat gaya pengkodean one-hot, yang menggunakan satu flip-flop per keadaan. Oleh karena itu, gaya ini membutuhkan jumlah flip-flop terbesar. Dalam hal ini, dengan n flip-flop (n bit), hanya n keadaan yang dapat dikodekan. Di sisi lain, pendekatan ini membutuhkan logika tambahan paling sedikit dan paling cepat.

Gaya yang berada di antara kedua gaya di atas adalah skema pengkodean two-hot, yang menghadirkan dua bit aktif per keadaan. Oleh karena itu, dengan n flip-flop (n bit), hingga n(n-1)/2 keadaan dapat dikodekan.

Gaya one-hot direkomendasikan dalam aplikasi di mana flip-flop banyak digunakan, seperti pada FPGA (Field Programmable Gate Arrays). Di sisi lain, pada ASIC (Application Specific Integrated Circuits) gaya biner umumnya lebih disukai.

 

Tabel 2. State encoding dari sebuah FSM 8-keadaan (8-state)
Sumber: Circuit Design With VHDL- Volnei A. Pedroni – Page 182

 

Sebagai contoh, misalkan mesin keadaan kita memiliki delapan keadaan. Maka pengkodeannya akan seperti yang ditunjukkan pada tabel 2. Jumlah flip-flop yang dibutuhkan dalam setiap kasus adalah tiga (untuk biner), lima (twohot), atau delapan (onehot). Detail lainnya juga disajikan dalam tabel 2.

 

Author

Taufiq Dwi Septian Suyadhi

Degrees from electronics and industrial engineering. Enthusiast on electronics, embedded systems, and robotics. Motivation: “Never ending learning and sharing valuable knowledge to the others”.

Leave a Reply

Post Related

error: Content is protected !!