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

Butonsi

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 "main cu un numrfinit de stri" este un model de
comportamentcompus din stri, tranziiiiaciuni. O stare stocheazinformaiidespretrecut,
adicreflectschimbrileintrrii de la iniializareasistemuluipnnmomentul de fa. O
tranziieindic o schimbare de stare iestedescris de o condiie care estenevoies fie
ndeplinitpentru a declanatranziia. O aciuneeste o descriere a uneiactiviticeurmeaz a fi
executat la un anumit moment. Existctevatipuri de aciuni:
Aciune de intrare - executat la intrareantr-o stare
Aciune de ieire - executat la ieireadintr-o stare
Aciune de intrare de date - aciuneexecutatnfuncie de stareaprezenti de datele de intrare
Aciune de tranziie - aciuneexecutatnmomentuluneitranziii
AF poate fi reprezentatprintr-o diagram de stri (saudiagram de striitranziii) ca nfigura 1.
n plus, se folosescitabele de tranziie. Ceamaicomunreprezentareestedatmaijos:
combinaiastriicurente (B) icondiiei (Y) dstareaurmtoare (C). Informaii complete
privindaciunile pot fi adugatedoar ca note de subsol.

Deagrama de stari :










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
yellow
green
green-
yellow
yellow
red
red-
yellow
RST



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