Sunteți pe pagina 1din 6

Circuite Integrate Digitale

http://arh.pub.ro/lab/cid1

FPGA. Transcodorul binar-zecimal. Circuite secventiale. Numaratorul


Circuitul FPGA (Field Programmable Gate Array) este un circuit generic ce poate fi
programat pentru a implementa orice functie definita de utilizator. Un FPGA este constituit
dintr-o matrice de blocuri programabile, o retea de interconectare care leaga aceste blocuri
intre ele, circuite de I/O si o memorie SRAM care configureaza aceste structuri. Figura 1
prezinta o schema simplificata de FPGA.

Figura 1. Schema simplificata de FPGA

Blocurile programabile pot fi generatoare de functii logice, memorii RAM sau circuite
de inmultire. In Figura 2 este prezentata structura unui bloc generator de functii logice. Acesta
este format dintr-un LUT (Look-Up Table) si un registru pentru a sincroniza iesirea acestuia,
daca se doreste acest lucru. Un LUT poate implementa orice functie logica de 4 variabile cu
ajutorul unui selector. Fiecare combinatie de valori ale variabilelor de intrare selecteaza
rezultatul corespunzator, calculat in prealabil de programul de sinteza si stocat in memoria de
configuratie la programarea FPGA-ului. Iesirea generatorului de functii logice poate fi legata
fie la registru fie direct la iesirea LUT-ului.

Figura 2. Structura unui bloc generator

1/6

Circuite Integrate Digitale

http://arh.pub.ro/lab/cid1

Fiecare bloc programabil este legat la reteaua de interconectare. Aceasta este formata
din segmente de fire si comutatoare programabile. Fiecare comutator poate lega doua sau mai
multe segmente intre ele, asa cum se poate observa in Figura 3. Starea comutatoarelor
(on/off) este de asemenea determinata in prealabil in etapa de Place and Route, si stocata in
memoria de configuratie.

Figura 3. Structura unui computator

Notiuni de Verilog necesare in acest laborator:

Pentru gruparea mai multor instructiuni ce trebuie executate impreuna nu se folosesc acoladele ci
cuvintele cheie begin si end. Dupa end nu se pune punct si virgula.
Se foloseste cuvantul cheie always pentru crearea unor liste de senzitivitati astfel incat variabilele de la
iesire sa se modifice doar atunci cand una din variabilele de la intrare prezente pe lista de senzitivitati
isi schimba starea. Exemple: always @(x) begin end (cand se modifica x, se executa instructiunile
dintre begin si end). Variabilele carora le sunt atribuite valorile in cadrul unui always trebuie declarate
de tip reg.
In cazul circuitelor secventiale modificarile variabilelor de la iesire se vor face in mod sincron cu
semnalele interne ale sistemului (clock si/sau reset), astfel incat lista de senzitivitati va include
fronturile pozitive sau negative ale semnalelor. Exemplu: always @(posedge clock) begin end
(instructiunile dintre begin si end se vor executa la fiecare front crescator al ceasului).
Pe langa operatorul ? prezentat in laboratorul 1 in verilog se mai pot folosi doua intructiuni
conditionate if si case care au aceeasi sintaxa ca in C/C++:
if (cond) begin
case (in)
instructiuni;
expr;
end else begin
endcase
instructiuni;
end
Instructiunile if si case se folosesc tot timpul in interiorul unui always (spre deosebire de operatorul
? care se foloseste cu assign), variabilele care se modifica in interiorul lor fiind de tip reg.

2/6

Circuite Integrate Digitale

http://arh.pub.ro/lab/cid1

1. Transcodorul binar-zecimal
Analiza problemei:
In aplicatiile anterioare afisarea unui numar se facea in binar folosind led-urile LD0-LD7. Afisarea
aceluiasi numar se poate face si pe unul din cele 4 afisoare cu 7 segmente prezente pe placa de dezvoltare:
Punctul prezent pe cele 4 afisoare este notat, prin conventie, cu litera h. Este folosit rareori in aplicatii.

Pentru a face afisare pe un astfel de afisor avem nevoie de un circuit care in functie de numarul de
intrare aprinde o combinatie de segmente corespunzatoare cifrei la iesire. Acest tip de circuit logic
combinational activeaza simultan mai multe iesiri si se numeste transcodor (vezi fig.).

Pentru comanda segmentelor se folosesc 8 semnale (7 semnale (a...g) pentru segmentele ce


formeaza cifra si unul (h) pentru punctul zecimal. Pentru selectia cifrei se folosesc 4 semnale AN3...AN0.
In acest laborator ne alegem urmatoarea ordine pentru cele 7 segmente, reprezentate ca o variabila pe 8 biti:
abcdefgh. Deci, prin LSB controlam punctul zecimal iar prin MSB segmentul superior.
Avantajul unui astfel de mod de lucru este ca folosim doar 12 semnale de comanda in loc de 32, cate ar
fi fost daca fiecare cifra era comandata independent.
Afisajele sunt conectate astfel incat pentru selectia unei anumite cifre trebuie sa aplicam '0' logic pe
pinul respectiv(AN3..AN0), iar pe celelalte '1' logic. Pentru aprinderea unui segment se aplica '0' logic pe
segmentul respectiv. Cu alte cuvinte, selectia cifrei si comanda segmentelor se face in logica negativa (activa
pe 0).

Implementare in Verilog.
In continuare se pune problema descrierii in Verilog a transcodorului.
Circuitul nostru are o intrare in, pe care se aplica numarul binar care urmeaza sa fie convertit.
Intrarea in se leaga la switch-urile SW3-SW0.
Avem doua iesiri: o iesire pe 8 biti (out_seg), care comanda propriu zis aprinderea segmentelor
a...h, si a doua iesire (out_sel), care selecteaza cifra {AN3, AN2, AN1, AN0}. Deoarece folosim
doar o cifra a afisajului (de ex. AN0), circuitul furnizeaza in permanenta {AN3, AN2, AN1, AN0}
= 4'b1110.
out_sel = {AN3, AN2, AN1, AN0} // asignati la pinii: P75, P71, P69, P60.
out_seg = {a,b,c,d,e,f,g,h}; // asignati (in ordine) la pinii: P74, P70, P67, P62,
P61, P73, P68, P63.

3/6

Circuite Integrate Digitale

http://arh.pub.ro/lab/cid1

Maniera de definire a unui modul in limbajul Verilog este urmatoarea:

module <nume_modul> <lista de porturi>;


<definire modul>;
endmodule

Codul nostru:
module transcodor (

// numele modulului

input[3:0] in ,
output reg [7:0] out_seg, // 8 biti pentru selectia segmentelor
output[3:0] out_sel);
// 4 biti pentru selectia
// cifrei

always @ (in)
case (in)

// orice schimbare la intrare produce schimbarea la iesire


// fiecarei combinatii la intrare ii corespunde o combinatie la
// iesire
4'd0 : out_seg = 8'b00000011;
4'd1 : out_seg = 8'b10011111;
4'd2 : out_seg = 8'b00100101;
4'd3 : out_seg = 8'b00001101;
4'd4 : out_seg = 8'b10011001;
4'd5 : out_seg = 8'b01001001;
4'd6 : out_seg = 8'b01000001;
4'd7 : out_seg = 8'b00011111;
4'd8 : out_seg = 8'b00000001;
4'd9 : out_seg = 8'b00001001;
default: out_seg = 8'b00000000;

endcase
assign out_sel = 4'b1110;
endmodule

2. Numaratorul
Analiza problemei:
Pina acum, s-a discutat de circuite care realizeaza functii simple (sumator, transcodor, etc).
Circuitele digitale se impart in doua categorii:


circuite combinationale: circuite care au o anumite functie de implementat si la care rezultatul


calculului apare dupa un anumit timp pe iesirea circuitului. In aceasta categorie intra circuitele studiate
pana acum la laborator: sumator, transcodor, etc.
circuite secventiale: sunt circuitele care au in componenta un registru peste care se inchide o bucla
combinationala; registrele sunt cele care au conexiune directa cu semnalul de clock;

4/6

Circuite Integrate Digitale

http://arh.pub.ro/lab/cid1

Un circuit secvential are de obicei doua semnale mai importante:


 Reset : acest semnal face resetarea circuitului, adica aducerea lui intr-o stare initiala(cum este
cazul unui microprocesor la resetare anumite registre se incarca automat cu valoarea 0); resetarea
unui circuit se face de oricate ori pinul de reset are 0 logic;
 Clock: este un semnal periodic si dreptunghiular care sincronizeaza circuitul cu lumea exterioara.
Frecventa acestui semnal da viteza de lucru a circuitului. O exemplificare a semnalelor reset si
clock este aratata in figura urmatoare.Semnalul de clock are o variatie periodica cu o anumita
frecventa intre 1 si 0. Tranzitia semnalului intre 0 si 1 se numeste front pozitiv (sau posedge
clock) iar tranzitia semnalului intre 1 si 0 se numesc front negativ (sau negedge clock).

Figura 4: Diagramele semnalelor de clock si de reset


Pentru exemplificare vom considera cazul, unui numarator pe 32 biti. Acesta are un semnal de clock,
unul de reset si o iesire (aceasta este conectata direct la registrul de 32 biti).
Schematic numaratorul arata dupa cum urmeaza:

5/6

Circuite Integrate Digitale

http://arh.pub.ro/lab/cid1

Implementare in Verilog.

In continuare se pune problema descrierii in Verilog a numaratorului:


Circuitul nostru are doua intrari: clock (semanlul de ceas) si reset.
Circuitul are o singura iesire, un registru de 32 de biti, out care se incrementeaza cu o unitate la fiecare
front pozitiv al ceasului sau a semnalului de reset. Atunci cand reset este activ valoarea registrului va fi
0.
Codul Verilog ce descrie acest circuit este descris in cele ce urmeaza:

module numarator (
input reset,
input clock,
output reg [31:0] out
);
always @ (posedge clock or posedge reset)
begin
if (reset)
begin
out <= 0;
end else
begin
out <= out +1;
end
end
endmodule
Se observa ca in lista de senzitivitati (ce apare intre paranteze la always) a circuitului de numarare
apare si resetul care va fi activ pe 1 (HIGH).
Se va face sinteza circuitului dupa cum urmeaza:.




intrarea reset trebuie asignata la BTN0;


intrarea clock se leaga la generatorul ceas extern (P77)
iesirea out trebuie asignata la LD7 LD0 (se asigneaza doar out[31:24] pentru a avea o frecventa de
aprindere a ledurilor perceptibila de ochiul uman).

3. Exercitii pentru laborator:


1.

Sa se modifice modulul Numarator astfel incat numararea sa se faca invers.

2.

Sa se afiseze cu ajutorul transcodorului valoarea numaratorului (cei mai semnificativi 4 biti).

3.

Modificati modulul transcodorului astfel incat sa realizati pe un digit o rama ,formata dintr-un singur
segment, care se misca in sensul acelor de ceasornic, in patratul format din segmetele c,d,e si g. De
exemplu daca rama initial era formata din segmentul g la iteratia urmatoare segmentul afisat va fi c.
Hint: Vor fi 4 pozitii posibile care vor alterna cu ajutorul unui numarator.

6/6

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