Sunteți pe pagina 1din 10

MinisterulEducatiei al RepubliciiMoldova

UniversitateaTehnica a Moldovei
FacultateaMicroelectronicasiIngineriaBiomedicala

Raport
Lucrare de laborator Nr.3

Disciplina :Prelucrareasemnalelordigitale
Tema: Proiectareaautomatelor finite

A efectuat : st.gr.MN-111, DiaconuSandu

A verificat : lect.sup., Bragarenco Andrei

Chisinau 2014
 Scopullucrarii:
1.Definirea unui automat.
2.Proiectarea deagramelor de stari.
3.Codificarea starilor.
4.Implimentarea automatelor in Verilog.

 Sarcinalucrarii:
Sa se proiecteze un automat care varealizafunctionareaunuisemafor care
vaopritraficulautomobilelor in cazul in care un pietonvalansa o cerereprinapasareaunuibuton.
Dupa o perioadaprestabilitavatrece in stareaintermediaraverdepentru automobile.

 Date teoretice:
Un automat finit (AF) sau o "mașină cu un numărfinit de stări" este un model de
comportamentcompus din stări, tranzițiișiacțiuni. O stare stocheazăinformațiidespretrecut,
adicăreflectăschimbărileintrării de la inițializareasistemuluipânăînmomentul de față. O
tranzițieindică o schimbare de stare șiestedescrisă de o condiție care estenevoiesă fie
îndeplinităpentru a declanșatranziția. O acțiuneeste o descriere a uneiactivitățiceurmează a fi
executată la un anumit moment. Existăcâtevatipuri de acțiuni:
Acțiune de intrare - executată la intrareaîntr-o stare
Acțiune de ieșire - executată la ieșireadintr-o stare
Acțiune de intrare de date - acțiuneexecutatăînfuncție de stareaprezentăși de datele de intrare
Acțiune de tranziție - acțiuneexecutatăînmomentuluneitranziții
AF poate fi reprezentatprintr-o diagramă de stări (saudiagramă de stărișitranziții) ca înfigura 1. În
plus, se folosescșitabele de tranziție. Ceamaicomunăreprezentareestedatămaijos:
combinațiastăriicurente (B) șicondiției (Y) dăstareaurmătoare (C). Informații complete
privindacțiunile pot fi adăugatedoar ca note de subsol.

 Deagrama de stari : RST

yellow
red-yellow
green

Butonsi
red
green-
yellow
yellow

Stare R Y G RpGp
000 Y1 0 1 0 1 0
001 G 0 0 1 1 0
011 GY 0 1 1 1 0
010 Y2 0 1 0 1 0
110 R 1 0 0 0 1
100 RY 1 1 0 1 0

 Modul de lucru:

1.Proiectarea dispozitivuluipropus
2.Rezolvare problemei cu referinta la notiuniteoretic

 CodulSursa:

module Semafor_St(ck,rst,button,Red,Gr,Y,Rp,Gp);
input ck,rst; // semnalul de clock si de resetare
input button; // Butonul pentru schimbarea culorii
output Red,Gr,Y,Rp,Gp; // Variabile de iesire pentru diferite stari
reg Red,Gr,Y,Rp,Gp; // Initializarea registrului pentru culori
wire T_Out;

parameter Y1_STATE=3'b000; //Atribuim parametrului culoarea galbena intermediara 1


parameter G_STATE =3'b001; //Atribuim parametrului combinatia pentru culoarea verde
parameter GY_STATE=3'b011; //Atribuim parametrului combinatia de trecere verde-galben
parameter Y2_STATE=3'b010; //Atribuim parametrului culoarea galbena intermediara 2
parameter R_STATE =3'b110; //Atribuim parametrului culoarea rosie
parameter RY_STATE=3'b100; //Atribuim parametrului culoarea de trecere rosu galben

parameter F =1000; //frecventa


parameter T_G =3*F; //timpul de retinere pentru culoarea Verde
parameter T_Y1=3*F; //timpul de retinere pentru culoarea intermediara Galbena
parameter T_GY=3*F; //timpul de retinere pentru terecerea Verde - Galben
parameter T_Y2=3*F; //timpul de retinere pentru galben intermediar 2
parameter T_R =3*F; //timpul de retinere pentru culoarea Rosie
parameter T_RY=3*F; //timpul de retinere pentru trecerea Rosu - Galben

reg [2:0] STATE; //Registru de memorare a starii curent


reg [15:0] TIMER; // Registru pentru Timer.

assign T_Out=(TIMER==0)?1:0; //Atribuire implicita sau assign T_Out=(TIMER==0)

always@(negedge ck or posedge rst) //De fiecare data cind front negativ “ ck “ si pozitiv “ rst”
if (rst) //Daca este reset punem in starea intermediara Galben
begin
STATE<=Y1_STATE; //Atribuim registrului starea galbena intermediara
TIMER<=T_Y1; //Atribuim registrului timer timpul de retinere pentru galben
end
else if (T_Out) //Asteptam timpul T_Out si se seteaza a doua stare
case (STATE) //Daca starea este Y1 se face tot ce este dupa begin
Y1_STATE :
begin
STATE<=G_STATE; // Atribuim registrului stare galben intermediar
TIMER<=T_G; //Atribuim registrului timer timpul de retinere pentru galben
end
G_STATE : //Daca este stare Green se executa comenzile de mai jos
if(button) begin
STATE<=GY_STATE; //Atribuim registrului stare valoarea de trecere galben -verde
TIMER<=T_GY; //Atribuim registrului timer timpul de retinere pentru galben-verd
end
GY_STATE : //Daca este stare Geen Yellow se executa comenzile de mai jos
begin
STATE<=Y2_STATE; // Atribuim registrului stare valoarea culorii galben intermediar
TIMER<=T_Y2; // Atribuim registrului timer timpul de retinere Galben2
end
Y2_STATE : // Daca este stare Yellow2 se vor executa comenzile de mai jos
begin
STATE<=R_STATE; // Atribuim registrului stare valoarea culorii Rosu
TIMER<=T_R; // Atribuim registrului timer timpul de retinere Rosu
end
R_STATE : //Daca este stare Rosu se vor executa comenzile de mai jos
begin
STATE<=RY_STATE; //Atribuim registrului stare de trecere Rosu- Galben
TIMER<=T_RY; // Atribuim registrului time timpul de retinere ROsu Galben
end
default : // Daca nu este nici un caz se executa comenzile de mai jos
begin
STATE<=Y1_STATE; //Atribuim registrului de stare valoare culorii galben
TIMER<=T_Y1; //Atribuim registrului timer timpul de retinere Galben
end
endcase
else
TIMER<=TIMER-1; // Decrementarea Timerului

always@(STATE) //ciclul continue


case (STATE)
Y1_STATE : // Conditia de aprindere culorii galbene
begin //daca starea este aleasa executa functia din ghilimele
{Red, Y, Gr} = 3'b010; // Atribuim lui Red Yellow si Gren 0 1 si 0
{Rp, Gp} = 2'b10; // Atribuim lui Rp si Gp valoarea 1 si 0
end
G_STATE : // Conditia de aprindere culorii Verde
begin
{Red, Y, Gr} = 3'b010;
{Rp, Gp} = 2'b10;
Red=0; //Stingem rosu
Y=0; //Stingem culoarea galbena
Gr=1; //Aprindem culoarea verde
Rp=1; // Aprindem culoarea rosie
Gp=0; // Stingem culoarea verde
end
GY_STATE : // Conditia de trecere a culorii Verde - Galben
begin
{Red, Y, Gr} = 3'b010; //Setam pentru culorile rosu galben verde bitii 0 1 si 0
{Rp, Gp} = 2'b10; // Setam pentru culorile rosu si verde bitii 1 si 0
Red=0; // Stingem culoarea rosie
Y=1; //Aprindem culoarea galbena
Gr=1; //Aprindem culoarea verde
Rp= 1; // Aprindem culoarea rosie
Gp=0; //Stingem culoarea verde
end
Y2_STATE : // Conditia de aprindere culorii galbene
{Red, Y, Gr} = 3'b010; // Setam pentru culorile rosu galben si verde bitii 0 1 si 0
{Rp, Gp} = 2'b10; // Setam pentru culorile rosu si verde bitii 1 si 0
begin
Red=0; // Atribui culorii rosu valoarea “ 0 “ pt a fi stins
Y=1; // Atribui culorii galben valoarea “1” pt a fi arpins
Gr=0; // Atribui culorii verde valoarea “0” pt a fi stins
Rp=1; //Atribui culorii rosu valoarea “1” pt a fi aprins
Gp=0; // Atribui culorii rosu valoarea “ 0” pt a fi stins
end
R_STATE : // Conditia de aprindere culorii Rosu
Begin
{Red, Y, Gr} = 3'b010; // Setam pentru culorile rosu galben si verde bitii 0 1 si 0
{Rp, Gp} = 2'b10; // Setam pentru culorile rosu si verde bitii 1 si 0
Red=1; // Atribui Culorii rosu valoarea “ 1”
Y=0; // Stingem culoarea galbena
Gr=0; // Aprinderm culoarea verde
Rp=0; //Stingem culoarea rosie
Gp=1; // Aprindem culoarea verde
end
RY_STATE : // Conditia de trecere Rosu - Galben
begin
{Red, Y, Gr} = 3'b010; // Setam pentru culorile rosu galben si verde bitii 0 1 si 0
{Rp, Gp} = 2'b10; //Setam pentru culorile rosu si verde bitii 1 si 0
Red=1; // Atribui culorii rosu valoarea “ 1”
Y=1; // Aprindem culoarea galbena
Gr=0; // Stingem culoarea verde
Rp=1; // Aprindem culoarea rosie
Gp=0; // Stingem culoarea verde
end
default :
begin
{Red, Y, Gr} = 3'b010; // Setam pentru bitii rosu galben si verde bitii 0 1 si 0
{Rp, Gp} = 2'b10; // Setam pentru culorile rosu si verde bitii 1 si 0
Red=0; // Atribui culorii rosu valoarea “ 0 “
Y=1; // Aprindem culoarea galbena
Gr=0; // Stingem culoarea verde
Rp=0; // Stingem culoarea rosie
Gp=0; // Stingem culoarea verde
end
endcase

endmodule
 Test Bench:

module Test_Semafor;

reg ck,rst,button; // Registrul de clock resetare si buton


wire Red, Gr, Y, Rp, Gp;
reg [2:0] STATE; // Registrul de stare

initial
ck=0; // Setez clock in “0”
always#5 ck=~ck; //Fac o asteptare de 5 tacte dupa schimb starea clock

initial begin
rst=1; //Atribui variabilei reset valoarea “1 “
#10 rst=0; // Fac o asteptare de 10 unitat de timp dupa atribui variabilei rst 0
#20 rst=1; //Fac o asteptare de 20 unitati de timp dupa atribuim variabliei rst 1
end
initial begin
button=0; //Atribuim butonului valoarea “ 0 “
#500 button=1; //Fac o asteptare de 500 unitati de timp dupa atribuim butonului “ 1”
#100 button=0; // Fac o asteptare de 100 unitati de timp dupa atribuim butonului “ 0”
end

Semafor_St S(ck,rst,button,Red,Gr,Y,Rp,Gp);

always
begin
#10 $monitor("Red=%b,Gr=%b,Y=%b,Rp=%b,Gp=%b",Red,Gr,Y,Rp,Gp); // Afisez rezultatul
// programului pe monitor
end
endmodule
 Rezultatulsintetizarii in Leonardo Spectrum:
Concluzie:
In urmaefectuariiacesteilucrari de laborator am avutdreptscop de a construi un automat
finit, drept un automat finitnoi am luat un semafor. Pentru a proiectaacest automat noi am
fostnevoitisafacemdeagrama de stariapoi un tabel de stari in care in dependenta de stare
saaprindemculoareanecesara.
Am avutnevoiesi de un program de simulare cum este Leonardo pentru a
simulaprogramulpropriuzissi a vedeamarimeacircuitelor. In acest program am gasitnisteeroripe
care nu le-a gasitcalculatorul de asemenea am obtinutsicircuitul electric principial al
schemeinoastre.In final avind un rezultatpe care lam asteptat.

S-ar putea să vă placă și