Descărcați ca PDF, TXT sau citiți online pe Scribd
Descărcați ca pdf sau txt
Sunteți pe pagina 1din 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
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);