Un automat finit (Finite State Automaton, sau FSM) este, un model de calculabilitate, folosit pentru proiectarea diverselor programe sau circuite secvenţiale. Altfel spus, automatele cu stari finite ne ajuta sa modelam execution flow-uri, lucru necesar in diverse domenii cum ar fi matematica, inteligenta artificiala, jocuri sau analiza lingvistica (*cough* *cough* A-ul din “LFA” in anul 3).
Un FSM modeleaza o masina ipotetica avand un numar finit de stari. Trasatura fundamentala a acestei masini este ca numai una din aceste stari poate fi activa in oricare moment de timp. Asta inseamna ca pentru a putea executa toate actiunile pentru care a fost proiectata, aceasta trebuie sa isi schimbe starea activa (sau curenta) in functie de niste conditii 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ă mari categorii generale.
La automatele Mealy, ieşirea depinde de starea curentă şi de input-ul curent. O diagramă simplă pentru un automat Mealy este prezentată mai jos. Observaţi pe fiecare arc (= tranziţie) input-urile şi output-urile pe care automatul le dă după tranziţie. 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, pe de altă parte, output-ul este determinat exclusiv de starea în care se află. Mai jos găsiţi o diagramă pentru un automat Moore simplu. Observaţi input-urile care determină tranziţiile şi output-urile corespunzătoare fiecărei stări, care sunt independente de valorile de intrare.
Automatele pot fi construite atât în forma Mealy, cât şi Moore. Î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:
In cadrul acestui laborator vom recomanda folosirea codificarii prin numarare efectiva a starilor, deoarece aceasta este cea mai usor accesibila alternativa.
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 Output1 , output wire Output2 , output reg [2:0] Status // ieșiri pe 1 bit assign Output1 = ( CurrentState == STATE_1 ) | ( CurrentState == STATE_2 ); assign Output2 = ( CurrentState == STATE_2 ); // ieșiri pe mai multi biți always@ ( * ) begin Status = 3’b000 ; case ( CurrentState ) STATE_2 : begin Status = 3’b010 ; end STATE_3 : begin Status = 3’b011 ; end endcase end
always@ ( posedge Clock ) begin if ( Reset ) CurrentState <= STATE_Initial ; else CurrentState <= NextState ; end
always@ ( * ) begin NextState = CurrentState ; case ( CurrentState ) STATE_Initial : begin NextState = STATE_1 ; end STATE_1 : begin if (A & B) NextState = STATE_2 ; end STATE_2 : begin if (A) NextState = STATE_3 ; end STATE_3 : begin if (!A & B) NextState = STATE_Initial ; else if (A & !B) NextState = STATE_4 ; end STATE_4 : begin 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.