Sunteți pe pagina 1din 12

Circuite Integrate Digitale

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

Implementarea circuitelor digitale folosind 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 [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. In acest laborator se va sari peste etapa de simulare, aceasta fiind prezentata in laboratorul 1.

1/12

Circuite Integrate Digitale

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

Exemplu:
Ne propunem sa proiectam un circuit care sa faca adunarea a doua numere. Pentru a introduce in acest circuit cele doua numere si pentru afisarea rezultatului adunarii vom folosi placa de dezvoltare cu FPGA prezenta pe mesele de laborator. Ne alegem urmatoarele detalii de proiectare (alese intr-un mod conventabil din punct de vedere fizic, cu toate ca nu exista o regula generala): Cele doua numere care reprezinta intrarile circuitului, sunt doua varibile de tip intrare, pe cate 4 biti, atribuite celor 8 switch-uri de pe placa, SW7-SW4 pentru variabila a, respectiv SW3-SW0 pentru varibila b. Iesirea dorim s-o afisam pe 5 din cele 8 leduri disponibile pe placa (doua numele reprezentate pe cate 4 biti fiecare, insumate pot fi reprezentate pe 5 biti). Alegem ledurile LD4-LD0. La finalul exercitiului, ar trebui sa putem observa pe leduri suma celor doua numere introduse prin intermediul celor doua grupuri de cate 4 switch-uri. Mai departe vom arata drumul care trebuie parcurs de la descrierea unei probleme pana la implementarea sa fizica fara a tine cont de fazele de codare in Verilog si simulare cu Modelsim. Aceste faze au fost facute in laboratorul 1, unde a fost facuta si o mica introducere in limbajul Verilog. In continuare o sa trecem direct la faza de sintaza a circuitului. Pentru sinteza se va folosi un program numit Xilinx ISE. Pentru sinteza si implementarea fizica a circuitului se urmeaza urmatorii pasi: 1. Se creeaza un nou proiect: Primul pas este deschiderea programului Xilinx ISE care se gaseste pe desktop-ul fiecarei statii. Dupa aceasta se face click pe New->Project dand un nume proiectului ca in figura urmatoare. Dupa ce sa completat numele proiectului se da click pe Next.

2. Se seteaza parametrii FPGA-ului: In aceasta fereastra, se seteaza tipul de FPGA folosit. Se selecteaza familia: Spartan2 tipul: XC2S200, tipul capsulei este PQ208. (se va seta fiecare camp conform figurii de mai jos):

2/12

Circuite Integrate Digitale

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

Se selecteaza Next si se trece la faza urmatoare. 3. Adaugarea unui fisier Verilog:

La aparitia ferestrei de mai jos se selecteaza butonul Next.

La aparitia ferestrei de mai jos se selecteaza butonul Finish.

3/12

Circuite Integrate Digitale

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

In acest moment ar trebui sa aveti deshisa o fereastra ca cea din figura de mai jos:

Se face click pe Project->New Source ca in figura de mai jos:

4/12

Circuite Integrate Digitale

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

Trebuie sa apara o fereastra ca cea de mai jos. Aici se selecteaza tipul modului: Verilog Module, Se da un nume fisierului pe care intentionam sa il cream, dupa care se da click pe Next

Va aparea ferestra de mai jos in care nu se completeaza nimic. Se da click pe Next

5/12

Circuite Integrate Digitale

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

Dupa aceasta va aparea o fereastra la care se da Finish apoi se va deschide o fereastra ca cea de mai jos. Acum se va trece la urmatoarea etapa: editarea codului.

6/12

Circuite Integrate Digitale


4. jos: Editarea fisierului Verilog:

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

Dupa ce s-a trecut prin toate etapele de mai sus trebuie editat codul sumatorului conform figurii de mai

Codul nostru:

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


Dupa editare se salveaza (Ctrl + S). Dupa aceasta se va putea observa fisierul sumator.v atasat la proiect.Astfel se ajunge la o fereastra ca cea de mai jos.

7/12

Circuite Integrate Digitale

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

5. Asignarea pinilor: Pentru asignarea pinilor se va face click pe Project->New Source si se va selecta Implementation Constraints File. In casuta File name se scrie numele fisierului de constrangeri. In exemplul curent acesta este sumator. Apoi in fereastra care va aparea se da Finish. Astfel vom crea fisierul de constrangeri sumator.ucf. In el vom putea scrie corespondentele pin-semnal.

8/12

Circuite Integrate Digitale

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

Pentru a edita fisierul de constrangeri se da click pe +-ul din dreptul modulului sumator. Vom vedea apoi fisierul tocmai creat sumator.ucf. Cand se da click pe fisierul sumator.ucf in meniul de Processes va aparea un nou proces User Constraints -> Edit Constraints (Text) ca in figura de mai jos.

Se da dublu-click pe Edit Constraints(Text) si se va deschide fisierul sumator.ucf intr-o fereastra de editare de text. In acest moment fisierul este gol. In el trebuie sa facem asignarea propriu-zisa a pinilor. In fisierul de constrangeri pot fi date atat constrangeri legate de timing cat si constrangeri legate de asignarea pinilor. Constrangerile legate de timing sunt puse pentru a da o informatie tool-ului de sinteza legata de cat dorim noi sa fie de optimizat design-ul din punct de vedere a frecventei de lucru. Constrangerile legate de asignarea pinilor fac posibila legatura dintre lumea reala si cip-ul FPGA. Cipul FPGA este legat de periferice prin niste conexiuni fixe. De exemplu: cipul FPGA este legat la switch-ul 7 de pe placa de dezvoltare prin conexiunea fixa P81. Daca vrem sa avem o legatura cu acest SW7 trebuie doar sa asignam P81 unui semnal declarat de in modulul Verilog. In exemplul curent il asignam lui a[3]. In aceasta faza se face o asociere intre firele de care am vorbit mai sus (la faza de editare a codului Verilog) si pinii FPGA-ului. Se vor face urmatoarele asocieri: intrarii a i se vor asocia switch-urile SW7- SW4 (pinii FPGA-ului: P81 P82, P83, P84) intrarii b i se vor asocia switch-urile SW3-SW0 (pinii FPGA-ului: P86, P87, P88, P89) iesirii c i se vor asocia ledurile-urile LD4-LD0 ( pinii FPGA-ului: P42, P43, P44, P45, P46) Pentru a vedea toti pinii fpga-ului disponibili se poate consulta acest link

9/12

Circuite Integrate Digitale

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

Asocierea pinilor se va fara completand fisierul de constrangeri folosind sintaxa urmatoare:

NET "signal_name<bit_number>" LOC=Pxx;


Astfel, concret, daca vrem sa asignam bitul cel mai semnificativ al numarului a(a[3]) la switch-ul SW7 de pe placa de dezvoltare, vom scrie in fisierul de constrangeri linia: NET "a<3>" LOC=P81; Continuam cu asignarea tuturor pinilor necesari. In final fereastra noastra de editare va arata in felul urmator:

6. Sinteza propriu-zisa: Se da din nou click pe modulul sumator din meniul Sources. Din meniul Processes se va da dublu-click pe Configure Target Device dupa care se va astepta pana cand sinteza e gata. Sinteza va genera un fisier sumator.bit care reprezinta configuratia portilor logice ce va fi programata in FPGA in faza urmatoare.

10/12

Circuite Integrate Digitale

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

7. Implementarea fizica:
Cand se va termina sinteza se va deschide automat o fereastra asemanatoare cu cea de mai jos:

ATENTIE: In acest moment asigurati-va ca placa este alimentata si cablul paralel este conectat.
In aceasta fereastra se selecteaza Finish, dupa care va aparea o fereastra ca cea de mai jos:

Aici se face click pe sumator.bit se se da apoi Open. Dupa care se va deschide .in mod automat o fereastra ca cea de mai jos:

11/12

Circuite Integrate Digitale

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

In acesta fereastra se va selecta Bypass. Dupa aceasta faza va aparea urmatoarea figura:

Aici facem click-dreapta pe chipul din partea stinga si selectam Program si apoi in fereatra care apare selectam OK. Acum este momentul in care se face programarea fisierului sumator.bit pe placa de FPGA. Dupa ce programarea s-a terminat cu succes puteti modifica pozitiile switch-urilor si puteti obseva cum se aprind ledurile pe placa(rezultatul c de pe LD4 LD0). Numerele a, b si c vor fi reprezentare in binar pe 4 biti. Pentru cei care nu stapanesc conversia binar-zecimal pot consulta urmatorul tabel.

Exercitii pentru laborator:


1. Sa se modifice codul verilog de mai sus si sa se faca sinteza pentru circuitul de scadere. 2. Sa se modifice codul verilog si sa se faca sinteza pentru circuitul de inmultire. Hint: Ganditi-va ce dimensiune are produsul a doua numere pe 4 biti. 3. Sa se realizeze un circuit care afiseaza rezultatul adunarii a doua numere daca butonul BTN0 este apasat, respectiv rezultatul diferentei lor daca butonul BTN0 nu este apasat. Pentru aceasta se vor folosii operatorii assign si ? (instructiunea conditinala din C++). Hint: assign x = cond ? b1 : b2; va genera un circuit in care daca bitul cond este 1 atunci x va lua valoarea lui b1, altfel x va lua valoarea lui b2.

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

12/12

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