Documente Academic
Documente Profesional
Documente Cultură
http://arh.pub.ro/lab/cid1
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.
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
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).
+
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).
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
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
3/12
http://arh.pub.ro/lab/cid1
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).
4/12
http://arh.pub.ro/lab/cid1
Implementare in Verilog:
Circuitul sumator de mai sus este descris de urmatorul modul scris in Verilog :
// 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).
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;
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
sumator suma ( // numele instantei este suma .a (a), .b (b), .carry_in (carry_in), .c (c), .carry_out (carry_out) );
6/12
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
http://arh.pub.ro/lab/cid1
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
http://arh.pub.ro/lab/cid1
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
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
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
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