Sunteți pe pagina 1din 12

Circuite Integrate Digitale

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

Introducere in circuitele digitale.


Implementarea circuitelor digitale folosind FPGA.
In lumea inconjuratoare omul se confrunta cu o mare diversitate de probleme. Aceste probleme au diverse moduri de rezolvare: Hardware Software mixte: Hardware-Software (specific pentru majoritatea sistemelor complexe) (vezi fig.1)

Fig 1: Diferitele implementari ale unei probleme


In acest laborator o sa invatam cum pot fi rezolvate problemele limitandu-ne doar la solutii hardware, implementate intr-un FPGA. In lucrarea de fata se urmareste descrierea procesului prin care se poate ajunge de la codul Verilog al unui anumit circuit la implementarea lui fizica pe un chip programabil Spartan-2 produs de Xilinx. Pentru demonstratie se foloseste o placa de dezvoltare Pegasus prevazuta cu un FPGA Xilinx Spartan-2 cu 200.000 de porti, oscilator de 50 MHz, 8 LED-uri, 4 cifre cu 7-segmente, 4 butoane, 8 comutatoare, un port PS2 (la care poate fi conectata o tastatura sau un mouse) si o iesire VGA. Specificatia detaliata pentru aceasta placa o gasiti la: http://arh.pub.ro/lab/digilent-docs/PEGASUS-rm.pdf. Un FPGA (Field Programmable Gate Array), adic o reea de pori logice reconfigurabile, este un dispozitiv electronic pe baz de semiconductori (disponibil sub form de circuit integrat VLSI), care conine module elementare (numite adeseori "celule") de funciuni logice de baz (AND, OR, XOR etc..) precum i celule elementare de memorie. Dup cum o indic numele su, ceea ce difereniaz un FPGA de un circuit integrat "normal" este faptul c poate fi configurat de ctre utilizator, acesta putnd modifica de exemplu "cablajul logic" intern al circuitului su FPGA n mod dinamic, pentru a-l adapta necesitilor sale de moment, sau chiar pentru a corecta anumite erori de programare. Pentru a configura FPGA-ul se foloseste un limbaj HDL. Verilog-ul este un limbaj de descriere a hardware-lui (Hardware Description Language - HDL), destinat descrierii comportamentului i/sau arhitecturii unui sistem numeric, cu alte cuvinte al unei funcii logice combinatorii sau secveniale. Limbajul HD poate descrie sistemul numeric avand in vedere portile logice si bistabilele componente, adica la nivel de porti. Acest limbaj are o structura foarte asemanatoare cu cea a foarte cunoscutului C / C++, cu unele modificari esentiale pentru un limbaj hardware.

Notiuni de Verilog necesare in acest laborator:


Orice circuit sau subcircuit descris reprezinta un modul si trebuie delimitat clar. Aceasta se face folosind cuvintele cheie module si endmodule. Circuitul va fi definit de catre marimile de intrare si cele de iesire folosind cuvintele cheie input sau output, urmate de numele variabilei, eventual si dimensiunea acesteia in biti. Exemplu: input a; input 1/12

Circuite Integrate Digitale

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

[3:0] b; Dimensiunile unei variabile se definesc astfel: variabilele pe un singur bit se declara scriind doar numele, iar cele pe mai multi biti au inainte de nume, intre paranteze drepte, ultimul si primul bit separate intre ele de :. Exemplu: output [7:0] s; (variabila s are 8 biti). Se pot defini si variabile de tip wire, care sunt doar niste conexiuni intre doua puncte, dar pot fi si iesirile unor circuite combinationale simple. Pentru realizarea unui circuit combinational simplu, se foloseste assign. Exemplu: assign x = a + b; Definirea constantelor numerice in Verilog se poate face folosind baza zecimala, binara, octala sau hexazecimala astfel: un numar in binar pe 8 biti: 8'b10011001; un numar in hexazecimal pe 16 biti: 16'hA2FF; numere in zecimal se scriu direct. Peste tot se foloseste conventia little endian, bitul 0 reprezinta intotdeauna LSB-ul. Tipurile de variabilele cele mai folosite in Verilog sunt varibilele de tip wire si cele de tip reg. Cand se doreste asignarea continua(la fiecare moment de timp), prin cuvantul cheie assign, a unei variabile atunci se foloseste tipul wire. Cand se doreste un alt tip de asignare(in cazul blocurilor de tip initial sau always) variabilele se declara de tip reg.

Pentru a rezolva orice problema (harware) va trebui sa parcurgem etapele descrise in fig 2.

Fig 2: Etapele de proiectare a unui circuit digital

In acest laborator se va parcurge etapa de simulare a circuitului, iar in laboratorul urmator se va face si implementarea pe FPGA a acestui circuit.

Etapele proiectarii si sintezei unui circuit digital: La proiectarea oricarui fel de circuit digital orice inginer parcurge etapele din figura 2. Haideti sa parcurgem impreuna aceste etape pentru circuitul nostru (circuitul de adunare a doua numere):

2/12

Circuite Integrate Digitale

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

Analiza problemei: Un modul care face adunarea cu carry are: trei intrari, 2 iesiri si o functie (adunare in cazul nostru).

schema bloc: a b c_in

+
c c_out

Implelmentare in Verilog:
Se stablilesc cei doi operanzi a si b pe cite 4 biti si semnalul carry_in pe 1 bit. Se stabileste si iesirea c pe 4 biti alaturi de carry_out pe 1 bit .In interiorul modulului se stabileste operatia facuta cu ajutorul directivei assign ( ea face atribuirea).

modul scris in Verilog:


module sumator ( input [3:0] a, input [3:0] b, input carry_in, output[3:0] c, output carry_out); assign {carry_out,c} = a + b+ carry_in; endmodule

Simularea in Modelsim:
Aceasta etapa presupune folosirea programului Modelsim pentru a simula functionarea circuitului. Aceasta faza va fi explicata mai pe larg in paragrafele urmatoare

Sinteza cu programul Xilinx ISE:


In aceasta etapa folsim programul Xilinx ISE pentru a realiza sinteza circuitului de adunare. Acest program foloseste codul Verilog al modulului de adunareentru a obtine un fisier (sumator.bit) necesar pentru a programa placa de FPGA.

Xilinx ISE

sumator.bit

Implementarea fizica:
Fisierul obtinut se va scrie pe placa de FPGA folosind programul IMPACT.Dupa programarea FPGA-ului functionarea circuitului se poate verifica (direct) prin modificarea pozitiei switch-urilor si observarea ledurilor care se aprind. Fisierul sumator.bit se va scrie pe FPGA putindu-se observa direct rezultatul

Fig 3: Etapele care trebuie parcurse pentru proiectarea unui sumator


Mai departe vom arata drumul care trebuie parcurs de la descrierea unei probleme pana la implementarea sa fizica. Vom pune accentul in acest laborator pe partea de simulare a circuitelor folosind ModelSim.

3/12

Circuite Integrate Digitale

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

Introducere in simularea circuitelor digitale


Simularea folosind ModelSim.
In mod normal pentru orice circuit care se proiecteaza se face si o simulare inainte de a sintetiza circuitul pentru a ne asigura ca circuitul functioneaza asa cum ne dorim. Pentru a indeplini acest pas in Laboratorul de CID vom face simulari cu ajutorul programului ModelSim. Modelsim este un program care ne permite sa testam comportamentul unui circuit digital, prin simularea semnalelor ce se vor aplica la intrarile lui, si observarea semnalelor de la iesire. In acest laborator vom simula un sumator cu carry, un circuit digital elementar.

1. Sumatorul cu carry.
Sumatorul cu carry este un sumator extensibil deoarece este conceput astfel incat sa fie usor extins pentru a aduna numere de mai mult de 4 biti (vezi fig. 4).

Fig 4: Sumator pe 4 biti cu carry


Un sumator cu carry pe 4 biti are urmatoarele conexiuni : intrarile a si b, sunt numere pe 4 biti, adica numerele pe care le vom aduna in cazul in care am vrea sa construim un sumator pe 8 biti folosind doua sumatoare de 4 biti (fig. 2) ar trebui sa legam un fir de la primul sumator catre al doilea sumator care sa indice faptul ca avem transport in primul sumator. intrarea in sumator care indica faptul ca sumatorul anterior are transport se numeste carry_in . iesirea din sumator care indica faptul ca sumatorul curent are transport se numeste carry_out . iesirea c, este un numar pe 4 biti, care reprezinta rezultatul adunarii.

Fig 5: Sumator de 8 biti construit cu doua sumatoare de 4 biti

4/12

Circuite Integrate Digitale

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

Implementare in Verilog:
Circuitul sumator de mai sus este descris de urmatorul modul scris in Verilog :

module sumator ( sumator

// se incepe definirea modulului input[3:0] a , // definirea porturilor de intrare input[3:0] b , input carry_in , output[3:0] c , // definirea porturilor de iesire output carry_out );

assign {carry_out, c} = a + b + carry_in; /*parantezele {} concateneaza sirurile binare. In acest caz, {carry_out,c } reprezinta rezultatul pe 5 biti, carry fiind bitul cel mai semnificativ. "assign" este un cuvant cheie al limbajului, folosit pentru atribuirea combinationala: de cate ori se modifica valorile lui a ,b sau carry_in, se reevalueaza rezultatul*/ endmodule // sfarsit de modul; nu este urmat de ;

Fiecare circuit digital descris in Verilog este simulat cu ajutorul unui modul de test. Prin modulul de test se verifica iesirile pentru anumite combinatii ale valorilor de intrare. In figura de mai jos este reprezentata schematic modul in care un modul de test genereaza anumite secvente de intrare care sunt introduse in sumatorul pe 4 biti. Toate semnalele (si intrarile si iesirile) sunt vizualizate cu ajutorul Wave Viewer (este integrat in ModelSim).

Crearea unui fisier (modul) de test (testbench).


Aceasta etapa presupune crearea unui fisier Verilog separat de cel in care avem modulul pe care vrem sa-l testam, fisier din care Modelsim-ul isi va lua toate datele de care are nevoie (porturile de intrare si de iesire, precum si forma semnalelor de la intrare). Astfel, pastrand regulile de sintaxa ale codului Verilog, fisierul de test va cuprinde un modul in care se definesc toate porturile de iesire, generarea semnalelor de intrare si instantierea modulumlui pe care vrem sal testam. 5/12

Circuite Integrate Digitale

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

Sa realizam fisierul de test pentru modulul sumator: In fisierul de test declaram modulul de test astfel:

module test_sumator;

Toate iesirile devin fire:

wire[3:0] c; wire carry_out;

Toate intrarile sunt definite ca registre, pentru a putea sa le modelam in continuare:

reg[3:0] a; reg[3:0] b; reg carry_in;

Pentru generarea semnalelor se folosesc urmatoarele cuvinte cheie: initial, begin si end. Cuvantul cheie initial seteaza timpul la 0s, iar apoi in interiorul constructiei begin end se vor modifica semnalele de intrare folosind operatorul de intarziere in timp, #. Exemplu:

initial begin

a = 0; b = 0; carry_in = 0; #1 a = 4'b0100; // #1 dupa o unitate de timp, t=1 #1 b = 4'b0111; // t=2 #1 carry_in = 1'b1; // t=3 #1 a = 4'b1001; // t=4 #1 carry_in = 1'b0; // t=5 #1 b = 4'b0001; // t=6 end

// suntem la momentul t=0 // inceputul unui bloc de instructiuni // valorile initiale ale intrarilor sunt 0

Ultimul pas este instantierea modulului pe care il testam, astfel:

sumator suma ( // numele instantei este suma .a (a), .b (b), .carry_in (carry_in), .c (c), .carry_out (carry_out) );

Simularea folosind ModelSim


Porniti programul ModelSim, executand dublu-click pe simbolul programului (il gasiti pe desktop). O sa apara o fereastra ca cea din figura de mai jos:

6/12

Circuite Integrate Digitale

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

Selectati din meniul File optiunea New->Project. Se va deschide fereastra din figura de mai jos. Se completeaza campurile: numele proiectului si locatia lui. Folositi doar directorul /home/student<index_statie>. De exemplu daca numele statiei este st66.arh.pub.ro (numele fiecarei statii este inscris pe carcasa) atunci directorul in care veti avea access este /home/student66.

Se va deschide fereastra din figura de mai jos. In aceasta fereastra selectati Create New File .

Se va deschide o fereastra noua ca cea de mai jos in care introduceti numele fisierului pe care vreti sa-l creati. In campul Add file as type selectati Verilog apoi apasati OK. Se va deschide o fereastra in care veti putea edita modulul test. 7/12

Circuite Integrate Digitale

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

In fisierul sumator.v scrieti modulul sumator pe care dorim sa il testam :

Codul Verilog este:

module sumator ( input[3:0] a, input[3:0] b, input carry_in, output[3:0] c, output carry_out ); assign {carry_out, c} = a + b + carry_in; endmodule

Pe langa editarea modului sumator trebuie sa editam si modulul de test. Pentru editarea modulului de test se deschide o noua fereastra apasand click dreapta in fereastra Workspace si alegand Add to Project>NewFile. 8/12

Circuite Integrate Digitale

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

Introduceti numele modulului de test, si apasati OK, ca in figura de mai jos:

In fereastra obtinuta se editeaza modulul de test: Codul Verilog este:

module test_sumator; reg[3:0] in1; reg[3:0] in2; reg c_in; wire[3:0] out; wire c_out; initial begin in1 = 0; in2 = 0; c_in = 0; #1 in1 = 4'b0100; #1 in2 = 4'b0111; #1 c_in = 1'b1; #1 in1 = 4'b1001; #1 c_in = 1'b0; #1 in2 = 4'b0001; end

9/12

Circuite Integrate Digitale

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

sumator suma ( .a (in1), .b (in2), .carry_in (c_in), .c (out), .carry_out (c_out) ); endmodule

Dupa editare se salveaza fisierele selectand din meniul File optiunea Save. ModelSim are un bug,pe care-l puteti sa ocoliti executand urmatoarele operatii:dati click dreapta pe modulele create si selectati Remove, dupa ce dati Add To Project -> Existing File. Pasul urmator e sa compilam codul scris. Compilarea este faza in care se verifica codul verilog pe care l-am scris din punct de vedere sintactic. Pentru aceasta se da click dreapta pe fisierul sumator.v in fereastra WorkSpace , selectand optinea Compile->Compile All ca in figura de mai jos. Acum ModelSim va compila programul, si daca l-ati scris corect nu va aparea nici un mesaj de eroare. In cazul in care sunt erori apasati dublu click pe mesajul de eroare pentru a vedea mai multe detalii despre eroare.

Dupa compilare trebuie sa trecem la faza de simulare a circuitului. Simularea este faza in care se verifica codul din punctul de vedere functional. Pentru a face simularea selectati din meniul Simulate optiunea Start Simulation.

In fereastra care apare se debifeza Enable Optimization, se da click pe + din dreptul lui work si se selecteaza numele modulului de test ca in figura de mai jos:

10/12

Circuite Integrate Digitale

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

Pentru a vizualiza formele de unda se da click dreapta pe instantierea suma in fereastra WorkSpace , selectand optinea Add->Add to Wave , ca in figura de mai jos:

Ca sa rulam simularea timp de 100ns se selecteaza din meniul Simulate optiunea Run->Run 100 ns ca in figura de mai jos:

11/12

Circuite Integrate Digitale

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

Acum se pot vizualiza formele de unda. Cu ajutorul lor putem verifica functionarea circuitului. Trebuie sa verificati faptul ca carry_in si c reprezinta suma dintre a, b si carry_in.

Ne intereseaza butoanele de tip Zoom care ne permit sa modificam imaginea formelor de unda, realizand o scalare pe axa timp (orizontala). Butonul Zoom+ va provoca o dilatare a semnalelor, permitandu-ne sa vedem mai multe detalii. Butonul marcat cu Zoom are exact efectul contrar, de comprimare. Avem la dispozitie si doua butoane pentru insertia unui nou cursor ( Insert Cursor) si stergerea unui cursor (Remove Cursor). Inserati un al doilea cursor in fereastra de wave. Modificati pozitiile lor. Observati aceste axe verticale si modificarea valorilor Cursorl si Cursor2, in functie de noile pozitii.

Atentie:
1. Un scurt indrumar de verilog il gasiti aici.

12/12

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