Un automat finit (FSA - Finite State Automaton sau FSM - Finite State Machine) este un model de calculabilitate folosit pentru proiectarea diverselor programe sau circuite secvențiale. Altfel spus, automatele cu stări finite ne ajută să modelăm fluxuri de execuție. Acestea au aplicații în diverse domenii cum ar fi matematica, inteligența artificială, jocuri sau analiza lingvistică (*cough* *cough* A-ul din “LFA” in anul 3).
Un FSM modelează o mașină având un număr finit de stări. Trăsătura fundamentală a acestei mașini este că numai una din aceste stări poate fi activă în oricare moment de timp. Așadar, pentru a putea executa toate acțiunile pentru care a fost proiectată, aceasta trebuie sa își schimbe starea activă (sau curentă) în funcție de niște condiții prestabilite.
Vom parcurge în acest laborator o modalitate de reprezentare a stărilor şi tranziţiilor automatelor.
Automatele finite, pe lângă faptul că au stări şi tranziţii, pot primi intrări şi pot da la ieșire diverse informaţii, ceea ce le dă şi utilitatea. Din punctul de vedere al condiţiilor în care automatele dau informaţii la output, ele sunt împărţite în două categorii: Mealy și Moore.
Automatele pot fi construite atât în forma Mealy, cât şi Moore. În diagramele de mai jos, este reprezentat același automat în cele două forme precizate.
La automatele Mealy, ieşirea depinde de starea curentă şi de input-ul curent.
Observați input-urile şi output-urile corespunzătoare fiecărei tranziţii (fiecărui arc). De exemplu, tranziţia A -> B se poate citi astfel: "Din A, cu input-ul 0, trec în B şi scot la ieşire 0".
La automatele Moore output-ul este determinat exclusiv de starea în care se află.
Observaţi input-urile care determină tranzițiile și output-urile corespunzătoare fiecărei stări, care sunt independente de valorile de intrare.
În laborator vom lucra cu varianta Moore, pentru că este mai uşor de reprezentat.
Pentru a implementa şi programa un automat finit, avem nevoie de o metodă de memorare a stării automatului într-un moment de timp oarecare, deci de o metodă de codificare.
Cele mai folosite metode de codificare a stărilor unui automat sunt:
În cadrul acestui laborator vom folosi codificarea prin numărarea efectivă pentru a reprezenta stările.
Automatul din figură primește un șir binar și scoate la ieșire 1 când recunoaște secvența 011:
Observăm că:
localparam STATE_Initial = 3’d0 , STATE_1 = 3’d1 , STATE_2 = 3’d2 , STATE_3 = 3’d3 , STATE_4 = 3’d4 , STATE_5_PlaceHolder = 3’d5 , STATE_6_PlaceHolder = 3’d6 , STATE_7_PlaceHolder = 3’d7;
output wire o_w_out , // ieșire pe 1 bit assign o_w_out = ( l_r_currentState == STATE_4 );
always@ ( posedge i_w_clk ) begin if ( Reset ) l_r_currentState <= STATE_Initial ; else l_r_currentState <= l_r_nextState ; end
always@ ( * ) begin l_r_nextState = l_r_currentState ; case ( l_r_currentState ) STATE_Initial : begin l_r_nextState = STATE_1 ; end STATE_1 : begin if (!i_w_in) l_r_nextState = STATE_2 ; end STATE_2 : begin if (i_w_in) l_r_nextState = STATE_3 ; end STATE_3 : begin if (i_w_in) l_r_nextState = STATE_4 ; else l_r_nextState = STATE_2 ; end STATE_4 : begin if (i_w_in) l_r_nextState = STATE_1 ; else l_r_nextState = STATE_2 ; end //Stări pentru tratarea erorilor //Dacă automatul ajunge în aceste stări se va reseta. STATE_5_PlaceHolder : begin NextState = STATE_Initial ; end STATE_6_PlaceHolder : begin NextState = STATE_Initial ; end STATE_7_PlaceHolder : begin NextState = STATE_Initial ; end endcase end
Task 1 (2p + 0.25p + 0.25p) Implementați un modul care să aprindă și se stingă un LED la un anumit interval de timp. Astfel, vom folosi un FSM simplu, cu doar două stări. După simularea cu succes a circuitului, completați fișierul xdc
și încărcați soluția pe FPGA.
Urmăriți TODO-urile din schelet!
Task 2 (2.5p + 0.25p + 0.75p) Chiar dacă a trecut Craciunul, acum știm destul de multe pentru a realiza o simplă instalație de pom. Implementați un FSM care să producă următoarea secvență folosind LED-urile. După simularea cu succes a circuitului, completați fișierul xdc
și încărcați soluția pe FPGA.
t00 *-*-*-*- t01 -*-*-*-* t02 *-*-*-*- t03 -*-*-*-* t04 *------* t05 -*----*- t06 --*--*-- t07 ---**--- t08 --*--*-- t09 -*----*- t10 *------* t11 -**-*--* t12 *---**-* t13 *---*-** t14 -**-*--* mergi la t00
Task 3 (2.5p + 0.5p + 1p) Implementați un modul care să simuleze comportamentul unui semafor pentru pietoni controlat prin apăsarea unui buton. După simularea cu succes a circuitului, completați fișierul xdc
și încărcați soluția pe FPGA.
Bonus (3p) Considerăm ADN-ul unei specii ca fiind o succesiune de nucleotide: adenină(A), guanină(G), citozină(C) şi timină(T). Implementați un modul care să identifice exemplarele mutante, care au în succesiunea de nucleotide secvenţa GGTC. Trebuie să creaţi un automat Moore care:
Porturi modul:
Completați fișierul xdc
pentru modulul de detecție al mutanților (Task 4) și încărcați soluția pe FPGA.