Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> VHDL

Een eindige-toestandsmachine in VHDL ontwerpen: een praktisch verkeerslichtvoorbeeld

Een eindige-toestandsmachine (FSM) is een deterministisch logica-model waarvan de output niet alleen afhangt van de huidige invoer, maar ook van de reeks eerdere in- en outputs. In FPGA-ontwerp en tijdsafhankelijke VHDL-algoritmen is een FSM de standaardabstractie om stateful gedrag vast te leggen.

FSM's in VHDL worden typisch geïmplementeerd als geclockte processen die een state-signaal gebruiken om de laatste configuratie te onthouden. Het state-signaal fungeert als een intern register, waardoor het ontwerp kan reageren op gebeurtenissen die zich over meerdere klokcycli uitstrekken.

Basic VHDL Tutorials – Deel 3

Verkeerslichten als FSM

Overweeg een vierkruispunt dat bestuurd wordt door verkeerslichten. De lichten cyclen door een eindige set zichtbare toestanden – bijvoorbeeld Noord/Zuid rood, Noord/Zuid groen, West/Oost rood, etc. De timing van elke toestand (5 s voor rood of geel, 60 s voor groen) wordt gedreven door verstreken klokcycli.

Een eindige-toestandsmachine in VHDL ontwerpen: een praktisch verkeerslichtvoorbeeld

We modelleren deze gedragingen door een enumerated type te definiëren dat alle mogelijke toestanden opsomt:

type t_State is (NorthNext, StartNorth, North, StopNorth, WestNext, StartWest, West, StopWest);

Daarna declareren we een signaal van dat type om de huidige toestand vast te houden:

signal State : t_State;

Met het state-signaal op zijn plaats, leeft de FSM-logica binnen een enkel geclockt proces dat een case-statement gebruikt. Elke when-tak correspondeert met een afzonderlijke toestand en bevat de outputtoewijzingen voor die toestand. Een teller houdt de verstreken tijd bij en drijft de overgang naar de volgende toestand wanneer de waarde een vooraf gedefinieerde drempel bereikt.

One-Process FSM-sjabloon

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;

Let op: Je kunt FSM's implementeren met one-, two-, of three-process stijlen. Zie FSM Styles Explained.

Praktische oefening

Hieronder staat een compleet, synthetiseerbaar voorbeeld dat een verkeerslichtcontroller implementeert. Het ontwerp gebruikt een 100 Hz klok om de simulatie te vereenvoudigen terwijl realistische timing wordt gedemonstreerd.

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;

State-Machine Module

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; -- Active low reset 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 -- Default outputs 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;

Het draaien van de simulatie voor vijf minuten produceert een golfform die toont dat de FSM door zijn acht toestanden cycleert, met groene fasen van één minuut elk.

Een eindige-toestandsmachine in VHDL ontwerpen: een praktisch verkeerslichtvoorbeeld

Analyse

Belangrijkste lessen uit de code:

  • Enumerated types beperken het State-signaal tot een bekende set geldige waarden, wat veiligheid en leesbaarheid verbetert.
  • Alle outputs worden gedreven met een standaardwaarde aan het begin van het proces; daaropvolgende state-takken overschrijven alleen de signalen die veranderen.
  • De Counter-variabele is de timing-motor, en zijn drempelwaarden (5 s, 60 s) worden afgeleid van de klokfrequentie.

De resulterende golfform bevestigt dat de FSM correct voorschrijdt: het State-signaal toggelt door de acht gedefinieerde toestanden, en elke groene fase duurt één minuut.

Kernpunten

  • Eindige-toestandsmachines zijn de standaardmanier om sequentiële logica in VHDL te implementeren.
  • Een case-statement binnen een geclockt proces koppelt netjes elke toestand aan zijn gedrag.
  • Enumerated types bieden compile-time veiligheid door de set toegestane state-waarden te beperken.

Ga door naar de volgende tutorial voor geavanceerde FSM-technieken.

VHDL

  1. Eindige-toestandsmachine: feedback benutten om programmeerbare sequentiecontrollers te bouwen
  2. Hoe de OMNI CNC-lasermachine gepersonaliseerde kerstcadeaus maakt
  3. Prestaties van Qt State Machines maximaliseren
  4. Dynamische string-lijsten in VHDL: Best Practices & Voorbeeld
  5. Een Tcl-gedreven testbench maken voor een VHDL code-lock module
  6. Een VHDL-testbench netjes beëindigen: methoden en best practices
  7. Een PWM-controller implementeren in VHDL: Ontwerp, Simulatie en FPGA-demo
  8. Willekeurige getallen genereren in VHDL: Van Uniform naar OSVVM
  9. Ontwerpen van een robuuste VHDL-ringbuffer FIFO in blok-RAM
  10. Een self-checking testbench in VHDL bouwen – Een praktische gids
  11. Een dynamische gelinkte lijst in VHDL implementeren met protected types en access pointers