Sunteți pe pagina 1din 6

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 gratuit din Internet. Singura
limitare a acestei versiuni gratuite este limitatea surselor la circa 1000 linii de cod.
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 reprezentat n figura
3.3. Cele dou fiiere sunt incluse ntr-un proiect nou, numit clc1.prj.

A
B
C

p1
p2

S1
p3

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
comanda 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 cuvintele 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

test_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

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 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] b[3]

b[3:0]
4

a[3:0]
4

xor_3

comp_4

a[2] b[2]

xor_2
w3

a[1] b[1]

xor_1
w2 w1

a[0] b[0]

xor_0
w0

nor_1

out

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 ;
wire w0, w1, w2, w3 ;
xor

nor

// cele dou intrri sunt vectori pe 4 bii


// se declar conexiunile interne

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

end

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

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
nand_2

xor_2
carry_out

carry_in

adder

w1
w2
nand_3

xor_1

w3

sum

nand_1
sum

carry_out

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

end

// in ordine, cei trei biti sunt (carry_in, a, b)


// conexiunile la monitor

signals = 3b000;
#10 signals = 3b001;
#10 signals = 3b010;
#10 signals = 3b011;
#10 signals = 3b100;
#10 signals = 3b101;
#10 signals = 3b110;
#10 signals = 3b111;

// se genereaza toate combinatiile posibile


// pentru cei trei biti de intrare

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 sursele 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%?
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], carry_out, a[3], b[3], carry_3),
add_2(sum[2], carry_3, a[2], b[2], carry_2),
add_1(sum[1], carry_2, a[1], b[1], carry_1),
add_0(sum[0], carry_1, a[0], b[0], carry_in);
endmodule

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