Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> VHDL

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.

Mendesain Mesin Status Terbatas dalam VHDL: Contoh Praktis Pengatur Lampu Lalu Lintas

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.

Mendesain Mesin Status Terbatas dalam VHDL: Contoh Praktis Pengatur Lampu Lalu Lintas

Analisis

Hal penting dari kode di atas:

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

Lanjutkan ke tutorial berikutnya untuk teknik FSM lanjutan.

VHDL

  1. Finite State Machine: Memanfaatkan Umbal Balik untuk Membangun Pengontrol Urutan Terprogram
  2. Memaksimalkan Performa Mesin Status Qt
  3. Membuat Daftar String dalam VHDL: Praktik Terbaik & Contoh
  4. Membuat Testbench yang Diakibatkan Tcl untuk Modul Kode-Kunci VHDL
  5. Mengakhiri Simulasi Testbench VHDL dengan Elegan
  6. Implementasi Pengontrol PWM dalam VHDL: Desain, Simulasi, dan Demo FPGA
  7. Menghasilkan Angka Acak dalam VHDL: Dari Uniform hingga OSVVM
  8. Cara Membuat Testbench Self-Checking di VHDL – Panduan Praktis
  9. Implementasi Linked List Dinamis di VHDL dengan Tipe Terlindung dan Pointer Akses
  10. Bagaimana Mesin Laser OMNI CNC Membuat Hadiah Natal Personalis