Documente Academic
Documente Profesional
Documente Cultură
http://arh.pub.ro/lab/cid1
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.
1/6
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.
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
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.).
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
http://arh.pub.ro/lab/cid1
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)
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:
4/6
http://arh.pub.ro/lab/cid1
5/6
http://arh.pub.ro/lab/cid1
Implementare in Verilog.
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:.
2.
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