Mendesain Mesin Status Terbatas dalam VHDL: Contoh Praktis Pengatur Lampu Lalu Lintas
Mesin status terbatas (FSM) adalah model logika deterministik yang outputnya tidak hanya bergantung pada input saat ini, tetapi juga pada urutan input dan output di masa lalu. Dalam desain FPGA dan algoritma VHDL yang bergantung pada waktu, FSM adalah abstraksi utama untuk menangkap perilaku berbasis status.
FSM dalam VHDL biasanya diimplementasikan sebagai proses terpicu jam yang menggunakan sinyal state untuk mengingat konfigurasi terakhir. Sinyal state bertindak sebagai register internal, sehingga desain dapat merespons peristiwa yang meluas selama beberapa siklus jam.
Tutorial VHDL Dasar – Bagian 3
Lampu Lalu Lintas sebagai FSM
Pertimbangkan persimpangan empat arah yang dikontrol oleh lampu lalu lintas. Lampu menyelidiki serangkaian status terlihat yang terbatas – misalnya, Utara/Selatan merah, Utara/Selatan hijau, Barat/Timur merah, dan seterusnya. Waktu setiap status (5 detik untuk merah atau kuning, 60 detik untuk hijau) didorong oleh siklus jam yang telah berlalu.
Kita memodelkan perilaku ini dengan mendefinisikan tipe enumerasi yang mencantumkan semua status yang mungkin:
type t_State is (NorthNext, StartNorth, North, StopNorth, WestNext, StartWest, West, StopWest);
Kemudian kita mendeklarasikan sinyal dari tipe tersebut untuk menyimpan status saat ini:
signal State : t_State;
Dengan sinyal state yang tersedia, logika FSM berada di dalam satu proses terpicu tunggal yang menggunakan pernyataan case. Setiap cabang when sesuai dengan status yang berbeda dan berisi penetapan output untuk status tersebut. Sebuah penghitung melacak waktu yang telah berlalu dan mendorong transisi ke status berikutnya saat nilainya mencapai ambang batas yang telah ditentukan.
Template FSM Satu-Proses
process(Clk) is begin if rising_edge(Clk) then if nRst = '0' then State <= <reset_state>; Counter <= 0; else case State is when <state_name> => <set_outputs_for_this_state_here> if <state_change_condition_is_true> then State <= <next_state_name>; end if; ... end case; end if; end if; end process;
Catatan: Anda dapat mengimplementasikan FSM dengan gaya satu-, dua-, atau tiga-proses. Lihat FSM Styles Explained.
Latihan Praktis
Di bawah ini adalah contoh lengkap yang dapatdisintesis yang mengimplementasikan pengontrol lampu lalu lintas. Desain ini menggunakan jam 100 Hz untuk menyederhanakan simulasi sambil tetap menunjukkan timing yang realistis.
Testbench
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T20_FiniteStateMachineTb is end entity; architecture sim of T20_FiniteStateMachineTb is constant ClockFrequencyHz : integer := 100; -- 100 Hz constant ClockPeriod : time := 1000 ms / ClockFrequencyHz; signal Clk : std_logic := '1'; signal nRst : std_logic := '0'; signal NorthRed : std_logic; signal NorthYellow : std_logic; signal NorthGreen : std_logic; signal WestRed : std_logic; signal WestYellow : std_logic; signal WestGreen : std_logic; begin i_TrafficLights : entity work.T20_TrafficLights(rtl) generic map(ClockFrequencyHz => ClockFrequencyHz) port map( Clk => Clk, nRst => nRst, NorthRed => NorthRed, NorthYellow => NorthYellow, NorthGreen => NorthGreen, WestRed => WestRed, WestYellow => WestYellow, WestGreen => WestGreen); Clk <= not Clk after ClockPeriod / 2; process is begin wait until rising_edge(Clk); wait until rising_edge(Clk); nRst <= '1'; wait; end process; end architecture;
Modul Mesin Status
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T20_TrafficLights is generic(ClockFrequencyHz : integer); port( Clk : in std_logic; nRst : in std_logic; -- Reset aktif rendah NorthRed : out std_logic; NorthYellow : out std_logic; NorthGreen : out std_logic; WestRed : out std_logic; WestYellow : out std_logic; WestGreen : out std_logic); end entity; architecture rtl of T20_TrafficLights is type t_State is (NorthNext, StartNorth, North, StopNorth, WestNext, StartWest, West, StopWest); signal State : t_State; signal Counter : integer range 0 to ClockFrequencyHz * 60; begin process(Clk) is begin if rising_edge(Clk) then if nRst = '0' then State <= NorthNext; Counter <= 0; NorthRed <= '1'; NorthYellow <= '0'; NorthGreen <= '0'; WestRed <= '1'; WestYellow <= '0'; WestGreen <= '0'; else -- Output default NorthRed <= '0'; NorthYellow <= '0'; NorthGreen <= '0'; WestRed <= '0'; WestYellow <= '0'; WestGreen <= '0'; Counter <= Counter + 1; case State is when NorthNext => NorthRed <= '1'; WestRed <= '1'; if Counter = ClockFrequencyHz * 5 - 1 then Counter <= 0; State <= StartNorth; end if; when StartNorth => NorthRed <= '1'; NorthYellow <= '1'; WestRed <= '1'; if Counter = ClockFrequencyHz * 5 - 1 then Counter <= 0; State <= North; end if; when North => NorthGreen <= '1'; WestRed <= '1'; if Counter = ClockFrequencyHz * 60 - 1 then Counter <= 0; State <= StopNorth; end if; when StopNorth => NorthYellow <= '1'; WestRed <= '1'; if Counter = ClockFrequencyHz * 5 - 1 then Counter <= 0; State <= WestNext; end if; when WestNext => NorthRed <= '1'; WestRed <= '1'; if Counter = ClockFrequencyHz * 5 - 1 then Counter <= 0; State <= StartWest; end if; when StartWest => NorthRed <= '1'; WestRed <= '1'; WestYellow <= '1'; if Counter = ClockFrequencyHz * 5 - 1 then Counter <= 0; State <= West; end if; when West => NorthRed <= '1'; WestGreen <= '1'; if Counter = ClockFrequencyHz * 60 - 1 then Counter <= 0; State <= StopWest; end if; when StopWest => NorthRed <= '1'; WestYellow <= '1'; if Counter = ClockFrequencyHz * 5 - 1 then Counter <= 0; State <= NorthNext; end if; end case; end if; end if; end process; end architecture;
Menjalankan simulasi selama lima menit menghasilkan gelombang yang menunjukkan FSM menyelidiki delapan statusnya, dengan fase hijau berlangsung satu menit masing-masing.
Analisis
Hal penting dari kode di atas:
Tipe enumerasi membatasi sinyal State pada himpunan nilai yang diketahui dan valid, meningkatkan keamanan dan keterbacaan.
Semua output diberikan nilai default di awal proses; cabang status selanjutnya hanya menimpa sinyal yang berubah.
Variabel Counter adalah mesin timing, dan nilai ambang batasnya (5 detik, 60 detik) berasal dari frekuensi jam.
Gelombang yang dihasilkan memastikan FSM maju dengan benar: sinyal State bergantian melalui delapan status yang telah didefinisikan, dan setiap fase hijau bertahan selama satu menit.
Kesimpulan
Mesin status terbatas adalah cara standar untuk mengimplementasikan logika sekuensial dalam VHDL.
Pernyataan case di dalam proses terpicu jam memetakan setiap status ke perilakunya dengan rapi.
Tipe enumerasi memberikan keamanan waktu kompilasi dengan membatasi himpunan nilai status yang diizinkan.
Lanjutkan ke tutorial berikutnya untuk teknik FSM lanjutan.