Sunteți pe pagina 1din 7

STRUCTURI COMBINAIONALE SSI IMPLEMENTATE N VERILOG

1. Scopul lucrrii
Introducere n limbajul de descriere hardware Verilog HDL i folosirea simulatorului Veriwell pentru sinteza structurilor combinaionale implementate cu pori logice.

2. Aparate necesare
- calculator compatibil Pentium - sistem de operare Windows 95 sau superior - programul VeriWell 2.0, produs de Wellspring Solutions, versiunea freeware, disponibil pe Internet

3. Consideraii teoretice
Metodele manuale de sintez a sistemelor numerice, care presupun tehnici de minimizare a funciilor binare, utilizarea tabelelor de tranziii etc., nu permit proiectantului conceperea unor sisteme de mare complexitate. Pentru automatizarea proiectrii au fost concepute instrumente sub forma unor limbaje de descriere a hardware-ului, numite limbaje HDL (Hardware Description Languages). Aceste limbaje permit specificarea riguroas a funcionalitii sistemelor numerice, permit simularea acestor circuite (prin vizualizarea formelor de und n timp se verific dac funcionarea circuitului corespunde ateptrilor noastre), precum i sinteza circuitelor, genernd conexiunile necesare pentru o structur programabil, sau mtile necesare pentru construcia unui circuit integrat ASIC. Rezultatul compilrii programului nu este un cod main, ci schema de conexiuni a unui circuit numeric. Sursele HDL-urilor nu sunt reprezentri grafice de scheme logice, ci fiiere text, care respect sintaxa limbajului respectiv, i care ofer, asemenea unui limbaj de nivel nalt, o descriere comportamental a circuitelor. Este posibil i o descriere structural , legat mai mult de schema circuitului, preferat de unii proiectani, mcar pentru unele poriuni ale sistemului numeric. La ora actual sunt standardizate dou limbaje HDL: Verilog HDL, uor de nvat, cu o sintax asemntoare limbajului C (chiar dac mai exist i unele instruciuni care mai amintesc de Pascal), care ocup circa jumtate din aplicaiile comerciale HDL din Statele Unite, i limbajul VHDL (Very High Speed Integrated Circuit Hardware Description Language), ceva mai dificil, cu o sintax bazat pe limbajul Ada, care ocup cealalt jumtate din pia. Simulatorul de Verilog pe care l vom folosi se numete Veriwell i poate fi descrcat grat uit din Internet. Singura limitare a acestei versiuni gratuite este limitatea surselor la circa 1000 linii de cod.
1

S considerm circuitul combinaional simplu cu 3 intrri i o ieire din figura 3.1. Pentru sinteza i analiza acestui circuit trebuie s generm dou fiiere surs, pe care le-am numit clc1.v i test_clc1.v, iar coninutul lor este repreze ntat n figura 3.3. Cele dou fiiere sunt incluse ntr-un proiect nou, numit clc1.prj. A S1 p1 F p3 B
C p2 S2

Fig. 3.1 Schema logic a unei structuri combinaionale Interfaa grafic a mediului VeriWell 2.0 este prezentat n figura 3.2. Primul pas const n crearea unui proiect nou, alegnd opiunea Project i apoi New Project. Am numit proiectul clc1.prj, iar fiierele componente sunt listate n fereastra din dreapta-sus: clc1.v i test_clc1.v. Orice fiier Verilog nou, adic orice fiier *.v, poate fi creat cu opiunea File i apoi New, i poate fi adugat la proiectul curent prin opiunea Project i apoi Add file. Comanda Run din meniul Project determin compilarea fiierelor surs, iar rezultatul apare n ferestra de consol VeriWell Console din partea stng-jos a ecranului. Se observ lipsa erorilor din procesul de compilare a proiectului, se raporteaz modulul ierarhic superior, n cazul nostru test_clc_1 i se listeaz nivelurile logice ale semnalelor de intrare A, B, C i de ieire F pentru 80 uniti de timp, aa cum s-a cerut n fiierul surs test_clc1.v. Aceste semnale pot fi vizualizate n fereastra wavefile.wmf, reprezentat n partea dreapt-jos, obinut prin comand a Open Wave File din meniul File. Fereastra Signal Browser din stnga-sus permite alegerea semnalelor pe care vrem s le vizualizm. Putem observa c fiierul clc1.v realizeaz o descriere structural a circuitului, iar fiierul test_clc1.v realizeaz testarea circuitului, prin aplicarea la anumite intervale de timp a unor stimuli pe intrri. Observm c orice circuit sau sistem se definete ca un modul, care ncepe i se termin cu cuvin tele cheie module i respectiv endmodule (dup endmodule nu se mai pune ;). Porile logice din schem nor, and, not sunt predefinite n limbajul Verilog. Alte pori logice
.

Fig. 3.2 Cteva ferestre din mediul VeriWell 2.0


clc1.v module CLC_1(inA,inB,inC,outF); input inA,inB,inC; output outF; wire outF,S1,S2; nor p3(outF,S1,S2); and p1(S1,inA,inB); not p2(S2,inC); endmodule test_clc1.v module test_CLC_1; reg A,B,C; wire F; initial begin $vw_dumpvars; $monitor ($time, "A = %b B = %b C = %b F = %b", A, B, C, F); #10 A = 0; B = 0; C = 0; #10 C = 1; #10 A = 1; #10 B = 1; #10 A = 0; #10 B = 0; #10 C = 0; #10 $finish; end CLC_1 testat(A,B,C,F); endmodule

Fig. 3.3 Fiierele surs ale proiectului clc1.prj predefinite sunt : nand, or, xor, xnor i buf. Observm c fiecare poart are un nume i o list de intrri/ieiri. Ieirea este pus prima n list. Cu excepia bufferelor, toate porile au o singur ieire. Bufferele repet semnalul de intrare pe mai multe ieiri, de exemplu: buf BUF1 (out1, out2, out3, in); Prin input i output se declar intrrile i ieirile din blocul combinaional CLC_1. Variabilele care reprezint semnale numerice sunt de dou tipuri: wire (fir) sau reg (registru). O variabil de tip wire modeleaz un semnal combinaional , iar
3

atribuirea ei se face cu instruciunea assign, care nseamn c la fiecare modificare de variabil se reevalueaz valoarea atribuirii i se modific dac este cazul. O variabil de tip reg modeleaz o celul de memorie , iar atribuirea se face procedural, ca n limbajele de programare uzuale. Dac vrem s inem seama i de ntrzierile datorate timpilor de propagare prin pori, este suficient s introducem la definirea porii o ntrziere egal cu acest timp de propagare. De exemplu, instruciunea nor #2 p3(outF,S1,S2) introduce un timp de propagare de 2 uniti pentru poarta p3. Dac o intrare se modific la t = 6, atunci ieirea porii se modific la t = 8. Pentru o descriere comportamental a circuitului, n interiorul modulului CLC_1 se pstreaz numai declaraiile semnalelor de intrare i de ieire input i output. Restul liniilor din interiorul modulului se nlocuiesc prin instruciunea assign outF = ~((inA&inB)|~inC). Programul este scris mai uor i mai compact, pentru c acum ne intereseaz funcia i nu conexiunile interne ale circuitului. Al doilea fiier al proiectului , test_clc1.v, genereaz semnalele de testare a circuitului. Sistemul de testare este tot un modul. Instruciunile care genereaz semnalele de test sunt cuprinse ntre begin i end. Cuvntul cheie initial determin execuia instruciunilor de la t = 0. Funcia de sistem $monitor permite monitorizarea variabilelor. Simbolurile specifice %... ne trimit la lista de variabile unde se caut o valoare zecimal (d) sau binar (b). Monitorizarea urmrete n permanen valoarea
.

a[3:0] 4

b[3:0] 4

a[3]b[3] a[2] b[2] a[1]b[1] a[0] b[0]

comp_4

xor_3

xor_2 w3

xor_1 w2 w1

xor_0 w0

out

nor_1 out

Fig. 3.4 Schema logic a unui comparator de 4 bii variabilelor, repetnd instruciunea la fiecare modificare a variabilelor. Numele modulului testat, CLC_1, apare nainte de ultima comand endmodule din fiierul test_clc1.v. Un alt exemplu de circuit combinaional este comparatorul a dou numere binare de cte 4 bii, reprezentat n figura 3.4, att sub form de bloc logic cu funcie de comparator, ct i sub form de schem logic cu pori. Dac cele dou numere de la intrare sunt egale, atunci ieirea are valoarea logic 1, iar n caz contrar este 0. Codul surs care descrie structural acest circuit este urmtorul:
module comp_4(out, a, b); input[3:0] a, b; output out ; // cele dou intrri sunt vectori pe 4 bii

wire w0, w1, w2, w3 ; xor

// se declar conexiunile interne

nor

xor_3(w3, a[3], b[3]), xor_2(w2, a[2], b[2]), xor_1(w1, a[1], b[1]), xor_0(w0, a[0], b[0]), nor_1(out, w0, w1, w2, w3);

endmodule

Un modul de testare pentru acest circuit este propus mai jos. El poate fi introdus n acelai fiier, sau ntr-un fiier separat, aa cum am procedat la exemplul anterior.
module test_comp; reg[3:0] number_1, number_2; // cele doua numere de intrare wire out_; // firul de conectare la monitor initial begin number_1 = 4d5; number_2 = 4d7; #1 number_1 = 4d7; #2 number_2 = 4d12; #3 number_1 = 4d12; #4 number_1 = 4d1; // numarul zecimal 5 scris in binar pe 4 biti // numarul zecimal 7 scris in binar pe 4 biti // deci a = b la t = 1 // din nou a = b, la t = 6

end

comp_4 COMP(out_, number_1, number_2);

//COMP este un circuit de tipul comp_4

initial $monitor(Time=%0d number_1=%b number_2=%d out_, $time, number_1, number_2, COMP.out_); endmodule

a b carry_in xor_2 nand_2 w2 xor_1 nand_3 w3 nand_1 sum carry_out

carry_out

adder

carry_in

w1

sum

Fig. 3.5 Sumator complet pe un bit i schema intern Sumatorul complet pe 1 bit adun biii de intrare a + b + carry_in i are la ieire un bit de sum sum i transportul ctre rangul superior, carry_out . Funcionarea corect a acestui circuit poate fi testat cu urmtorul modul de test:
module test_adder; reg[2:0] signals; wire sum, carry_out; initial begin // in ordine, cei trei biti sunt (carry_in, a, b) // conexiunile la monitor // se genereaza toate combinatiile posibile // pentru cei trei biti de intrare

signals = 3b000; #10 signals = 3b001; #10 signals = 3b010; #10 signals = 3b011; #10 signals = 3b100;

end

#10 signals = 3b101; #10 signals = 3b110; #10 signals = 3b111;

adder dut(sum, carry_out, signals[1], signals[0], signals[2]); initial $monitor(Time=%0d signals=%b sum=%b carry_out=%b, $time, signals, dut.sum, dut.carry_out); endmodule

Modulul care descrie funcionarea sumatorului complet de un bit poate fi folosit n sinteza altor circuite, cum ar fi sumatorul pentru dou numere binare de cte 4 bii, obinut prin conectarea n cascad a patru sumatoare de un bit.

4. Modul de lucru
4.1. Se lanseaz n execuie VeriWell 2.0, se deschide proiectul clc1.prj i se vizualizeaz fiierele componente clc1.v i test_clc1.v. Studiai meniul principal, consultnd i opiunea Help. Facei simularea circuitului i verificai c nu avei erori. Vizualizai formele de und , folosind fereastra wavefile.vwf, aa cum se vede n figura 3.3. Modificai fiierele proiectului, dar salvai -le cu alte nume ntr-un subdirector nou, creat de dumneavoastr, i reluai simularea pentru diverse tipuri de pori logice i pentru diverse secvene de intrare. Repetai simulrile innd seama i de timpii de propagare nenuli prin porile logice. Verificai i descrierea comportamentala a circuitului. 4.2. Simulai funcionarea unui comparator pe 4 bii. Construii un nou proiect folosind sur sele propuse pentru comparatorul din figura 3.4. ncercai s facei o descriere comportamental a circuitului i verificai prin simulare soluia obinut. Refacei testarea circuitului, introducnd timpii de propagare pentru porile din circuit. 4.3. Descriei structural sumatorul complet de un bit din figura 3.5. Testai funcionarea circuitului, folosind modulul de test recomandat mai sus. Completai modulul sumator realizat anterior prin introducerea timpilor de propagare (considerai un timp de 1 pentru porile NAND i un timp de 2 pentru porile XOR n general, porile inversoare sunt ceva mai rapide). Rulai din nou programul de testare i remarcai ntrzierile semnalelor la ieire, fa de cazul anterior. Observai faptul c, la nceput, pn la propagarea semnalelor de intrare la ieire, ieirile sunt necunoscute (sunt marcate prin valoarea x). 4.4. n programul urmtor este descris un sumator pentru 2 numere binare de cte 4 bii, realizat prin conectarea n cascad a 4 module sumatoare de un bit (este folosit modulul adder, proiectat mai sus). Desenai schema descris n acest modul, preciznd toate semnalele de intrare, ieire i interconectare a celor 4 sumatoare elementare folosite. Apoi, generai o surs pentru testarea sumatorului de 4 bii. Este posibil testarea circuitului n proporie de 100%?
6

module four_bit_adder(sum, carry_out, a, b, carry_in); input carry_in; input[3:0] a, b; output carry_out; output[3:0] sum; wire carry_1, carry_2, carry_3; adder add_3(sum[3], add_2(sum[2], add_1(sum[1], add_0(sum[0], endmodule carry_out, a[3], b[3], carry_3), carry_3, a[2], b[2], carry_2), carry_2, a[1], b[1], carry_1), carry_1, a[0], b[0], carry_in);

Not: Instruciunea $vw_dumpvars; permite vizualizarea semnalelor prin forme de und n fereastra wavefile.wmf. Dac ea lipsete din fiierul de test, atunci rezultatul simulrii se poate vedea numai n fereastra de consol ca un fiier text, fereastra wavefile.wmf coninnd formele de und de la simulri anterioare. Noi am introdus-o numai n primul exemplu.

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