You are on page 1of 8

SINTEZA CIRCUITELOR FOLOSIND

LIMBAJUL VERILOG HDL (I)





1. Scopul lucrrii
Prezentarea structurii unui program realizat n Verilog HDL i prezentarea unor
structuri combinaionale simple care s exemplifice utilizarea principalelor elemente de
sintax ale limbajului Verilog HDL. Verificarea funcionrii circuitelor sintetizate se
face cu ajutorul mediului ModelSim.

2. Aparate necesare
- calculator compatibil Pentium, minim 500MHz, minim 128MB RAM
- mediul de programare ISE (Integrated Software Environment)-versiunea
8.1i, furnizat de firma Xilinx, instalat pe o platform Windows 2000 (SP2
sau SP3) sau XP. Programul poate fi instalat i pe sistemele de operare
Linux sau Solaris. Se poate folosi i versiunea free ISE WebPack, care poate
fi descarcat de pe site-ul firmei Xilinx.
- mediul ModelSim de la Mentor Graphics, care poate fi descarcat de pe site-
ul firmei Xilinx.

3. Consideraii teoretice
n anul 1991, se nfiineaz organizaia OVI (Open Verilog International) cu
scopul de a promova i standardiza limbajul Verilog. Standardul IEEE-1364 descrie
limbajul Verilog HDL mpreun cu o colecie de rutine ce permit interfaarea cu alte
programe. Dei la nceput a dominat limbajul VHDL, la ora actual fiecare limbaj ocup
cam jumtate din piaa de aplicaii comerciale HDL.
Prin comparaie cu limbajul VHDL, principalul concurent de pia, limbajul
Verilog are cteva avantaje: tipurile de date sunt simple i eficiente, principalele pori
logice sunt definite n limbaj, codul scris este mai concentrat i este relativ uor de
nvat, avnd o sintax apropiat de cea a limbajului C.
Verilog HDL descrie un proiect hardware sau o parte de proiect. Descrierile
proiectelor sunt modele Verilog, modele care pot descrie att funcia unui proiect, ct i
componentele i conexiunile dintre componente. Aceste modele pot fi dezvoltate pe
diferite niveluri de abstractizare:
- algoritmic (un model care implementeaz un algoritm prin construcii de nivel nalt
ale limbajului);
- RTL (un model care descrie transferul datelor ntre registre i modul de procesare a
acestora);
- nivel de poart logic (un model care descrie porile logice i conexiunile dintre ele);
- nivel de comutare (un model care descrie tranzistoarele i conexiunile dintre ele).
Blocul elementar n Verilog este modulul, care conine un proiect sau numai o
parte din proiect. Modulele pot ncorpora alte module pentru a forma un model ierarhic
care descrie cum se includ componentele unui proiect n ansamblul proiectului.
Limbajul Verilog comportamental este structurat i procedural, la fel ca limbajul C.
1
A
B
S1
p1
C
p2
p3
S2
F


Fig. 3.1 Schema logic a unei funcii binare

Definirea unui modul este cuprins ntre cuvintele cheie module i endmodule.
Identificatorul care urmeaz cuvntului cheie module reprezint numele modulului.
Opional, modulul poate conine o list de porturi de intrare/ieire. Aceste semnale sunt
declarate n partea de definiii a modulului, ca intrri, ieiri sau semnale bidirecionale.
Schema din figura 3.1 reprezint o soluie de implementare cu pori logice a
funciei C B A f + = . Ca i limbajul VHDL, limbajul Verilog permite fie o descriere
structural a circuitului, fie o descriere comportamental. Un exemplu de descriere
structural ar putea fi urmtorul:

module clc_porti(A,B,C,f);

input A,B,C;
output f;

wire f,S1,S2;

nor p3(f,S1,S2);
and p1(S1,A,B);
not p2(S2,C);

endmodule

Observm c dup cuvntul cheie endmodule nu se mai pune ;. Porile
logice din schem nor, and, not sunt predefinite n limbajul Verilog. Alte pori logice
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_porti. 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.
Pentru o descriere comportamental a circuitului, n interiorul modulului
clc_porti se pstreaz numai declaraiile semnalelor de intrare i de ieire, input
i output. Restul liniilor din interiorul modulului se nlocuiesc prin instruciunea
assign f = ~((A&B)|~C). Programul este scris mai uor i mai compact, pentru
c acum ne intereseaz funcia i nu conexiunile interne ale circuitului.
Mai observm c spre deosebire de VHDL, aici cuvintele cheie rezervate, cum
ar fi module i endmodule, se scriu ntotdeauna numai cu litere mici. Bineneles c
ele nu pot fi folosite pentru a desemna identificatori.
2
MUX
sel
in1 (7:0)
in2 (7:0)
out1 (7:0)


Fig. 3.2 Multiplexor cu 2 ci de date pentru vectori de 8 bii

Un alt exemplu este circuitul schiat n figura 3.2. Dac semnalul sel este pe 0
logic, atunci cele 8 linii de ieire out1 sunt identice cu cele 8 linii de intrare in1. Dac
sel este pe 1 logic, atunci la ieire vom obine informaia de pe cealalt intrare, notat
cu in2. Codul Verilog HDL care descrie acest circuit folosind instruciunea IF ar putea
fi urmtorul:

module mux(out1, in1, in2, sel);

input[7:0] in1, in2;
input sel;
output[7:0] out1;

reg[7:0] out1;

always @(sel, in1, in2)

if (sel == 0)
out1 = in1;
else
out1 = in2;

endmodule

Specificaia always este o specificaie concurent, ca i assign. Ea indic c
la orice modificare a unui semnal din list se execut instruciunile secveniale care
urmeaz, n cazul nostru instruciunea IF. Vedem n acest exemplu cum se reprezint
vectorii de intrare i de ieire pe 8 bii i remarcm necesitatea instruciunii reg, pentru
c urmeaz atribuirea unor valori lui out1.
Exist i varianta modelrii circuitului folosind specificaia assign, aa cum se
poate observa i din urmtoarea secven de instruciuni:

module mux(out1, in1, in2, sel);

input[7:0] in1, in2;
input sel;
output[7:0] out1;

wire[7:0] out1;

assign out1 = sel ? in2 : in1;

endmodule


3
MUX Y (7:0)
Unitate
Unitate
logica
A (7:0)
B (7:0)
aritmetica
Cin
sel (2:0)
sel (3)
arith
logic


Fig. 3.3 Structur ALU pe 8 bii care implementeaz 16 operaii

Unitatea aritmetic i logic (ALU - Arithmetic Logic Unit) pentru operanzi
de 8 bii reprezentat n figura 3.3 are doi operanzi, notai cu A i B, care sunt vectori
de 8 bii, iar semnalul sel permite selecia celor 16 operaii posibile: 8 aritmetice i 8
logice, conform tabelului 3.1. Pentru claritate, s-au evideniat separat dou blocuri
logice, unul aritmetic i unul logic, iar rezultatul corespunztor este livrat la ieire prin
intermediul multiplexorului de ieire, cu ajutorul bitului cel mai semnificativ (sel(3))
din semnalul sel.
Tabel 4.1
sel Operaia Funcia Tipul operaiei
0000 Y <= A Transferul operandului A
0001 Y <= A + 1 Incrementarea lui A
0010 Y <= A 1 Decrementarea lui A
0011 Y <= B Transferul operandului B aritmetic
0100 Y <= B + 1 Incrementarea lui B
0101 Y <= B 1 Decrementarea lui B
0110 Y <= A + B Adunarea lui A cu B
0111 Y <= A + B + Cin Adunarea cu transport (carry)
1000 Y <= NOT A Complementarea lui A
1001 Y <= NOT B Complementarea lui B
1010 Y <= A AND B Operaia I
1011 Y <= A OR B Operaia SAU logic
1100 Y <= A NAND B Operaia I-NU
1101 Y <= A NOR B Operaia SAU-NU
1110 Y <= A XOR B Operaia SAU-EXCLUSIV
1111 Y <= A XNOR B SAU-EXCLUSIV negat

Un cod Verilog care implementeaz circuitului poate fi urmtorul:

module alu(Y, A, B, sel, Cin);

input[7:0] A, B;
input[3:0] sel;
input Cin;
output[7:0] Y;

reg[7:0] arith, logic, Y;
4

always @(A, B, sel, Cin)

begin
case (sel[2:0])
3'b000 : arith = A;
3'b001 : arith = A + 1;
3'b010 : arith = A - 1;
3'b011 : arith = B;
3'b100 : arith = B + 1;
3'b101 : arith = B - 1;
3'b110 : arith = A + B;
3'b111 : arith = A + B + Cin;
endcase

case (sel[2:0])
3'b000 : logic = ~A;
3'b001 : logic = ~B;
3'b010 : logic = A & B;
3'b011 : logic = A | B;
3'b100 : logic = ~(A & B);
3'b101 : logic = ~(A | B);
3'b110 : logic = (~A & B) | (A & ~B);
3'b111 : logic = ~((~A & B)|(A & ~B));
endcase

if (sel[3] == 0)
Y = arith;
else
Y = logic;
end

endmodule

Putem genera i un cod ceva mai simplu, fr s mai inem seam de structura
circuitului reprezentat n figur (adic fr s mai mprim circuitul n dou blocuri
funcionale distincte, blocul aritmetic i blocul logic, i apoi s selectm unul din cele
dou semnale pe care s-l trimitem la ieire). De aceast dat, instruciunea case va
opera pentru toi cei 4 bii ai semnalului sel (4'b0000 este o valoare posibil a
semnalului sel o reprezentare binar pe 4 bii, acetia fiind 0000):

module alu(Y, A, B, sel, Cin);

input[7:0] A, B;
input[3:0] sel;
input Cin;
output[7:0] Y;

reg[7:0] arith, logic, Y;

always @(A, B, sel, Cin)

begin
case (sel[3:0])
4'b0000 : Y = A;
4'b0001 : Y = A + 1;
4'b0010 : Y = A - 1;
5
4'b0011 : Y = B;
4'b0100 : Y = B + 1;
4'b0101 : Y = B - 1;
4'b0110 : Y = A + B;
4'b0111 : Y = A + B + Cin;
4'b1000 : Y = ~A;
4'b1001 : Y = ~B;
4'b1010 : Y = A & B;
4'b1011 : Y = A | B;
4'b1100 : Y = ~(A & B);
4'b1101 : Y = ~(A | B);
4'b1110 : Y = (~A & B) | (A & ~B);
4'b1111 : Y = ~((~A & B) | (A & ~B));
endcase
end

endmodule

4. Modul de lucru
4.1. Se implementeaz circuitul din figura 3.1 folosind mediul ISE i limbajul
Verilog HDL. Se face un proiect care conine un fiier .v ce descrie structural circuitul
i se simuleaz funcionarea circuitului n ModelSim. Se repet sinteza i simularea
pentru un nou proiect, al crui cod surs descrie comportamental circuitul.

4.2. Se face sinteza Verilog HDL a multiplexorului prezentat n figura 3.2 i se
verific funcionarea circuitului folosind cele dou simulatoare: cel existent n mediul
ISE i simulatorul ModelSim.

4.3. S se implementeze n Verilog HDL un multiplexor cu 16 intrri de date, 4
intrri de selecie i o singur ieire.

Secvena de instruciuni care descrie circuitul ar putea fi urmtoarea:

module mux16_1(out, in, sel);

input[3:0] sel;
input[15:0] in;
output out;

assign out = in[sel];

endmodule

Observm c avem aici o descriere comportamental a circuitului, n care
selecia se face prin atribuire. Se pot face i alte descrieri comportamentale folosind
instruciunile if sau case. Un exemplu de folosire a instruciunii case este dat n
continuare, dar observm c modelul rezultat este mai complicat:

module mux16_1(out, in, sel);

input[3:0] sel;
input[15:0] in;
output out;

reg out; // se fac atribuiri iesirii out
6
always @(sel) case (sel)
4b0000: out = in[0];
4b0001: out = in[1];
4b0010: out = in[2];
4b0011: out = in[3];
4b0100: out = in[4];
4b0101: out = in[5];
4b0110: out = in[6];
4b0111: out = in[7];
4b1000: out = in[8];
4b1001: out = in[9];
4b1010: out = in[10];
4b1011: out = in[11];
4b1100: out = in[12];
4b1101: out = in[13];
4b1110: out = in[14];
4b1111: out = in[15];
endcase
endmodule

4.4. S se implementeze n Verilog HDL un decodificator BCD - 7 segmente,
care transform codurile binare ale celor 10 cifre zecimale de la 0 la 9 ntr-un cod
pe 7 bii. Aceste 7 ieiri pot comanda segmentele unui element de afiare care ne
permite s vizualizm comod cifra afiat (vezi figura 4.1). Tabelul de adevr al
circuitului este prezentat n figura 4.2. Informaia trimis la segmentele afiajului
permite aprinderea segmentului respectiv pe 1 logic i stingerea lui pe 0 logic.
Ordinea biilor transmii este: abcdefg.

Descrierea circuitului se poate face cu ajutorul instruciunii case, iar
modulul pentru testarea circuitului poate fi urmtorul:

a
b
c
d
e
f
g

Fig. 4.1 Afiajul cu 7 segmente i notaiile folosite

2
1
2
0
2
3
2
2
BCD - 7 segmente
counter[3]
counter[2]
counter[1]
counter[0]
segments[6] a
b
c
d
e
f
g
segments[5]
segments[4]
segments[3]
segments[2]
segments[1]
segments[0]
0000
counter segments
0001
0010
0011
0100
0101
0110
0111
1000
1001
1111110
0110000
1101101
1111001
0110011
1011011
1011111
1110000
1111111
1111011

Fig. 4.2 Decodificatorul BCD-7segmente i tabelul lui de adevr
7
module seven_seg(segments, number);

input[3:0] number;
output[6:0] segments;

reg[6:0] segments;

always @(number) case (number)
4'b0000: segments = 7'b1111110;
4'b0001: segments = 7'b0110000;
4'b0010: segments = 7'b1101101;
4'b0011: segments = 7'b1111001;
4'b0100: segments = 7'b0110011;
4'b0101: segments = 7'b1011011;
4'b0110: segments = 7'b1011111;
4'b0111: segments = 7'b1110000;
4'b1000: segments = 7'b1111111;
4'b1001: segments = 7'b1111011;
endcase

endmodule



8

You might also like