This is an old revision of the document!
Acest laborator va fi disponibil incepand cu 11/10/2021
Spre deosebire de primitive, ordinea porturilor unui modul nu este restricționată. Intrările și ieșirile pot fi declarate în orice ordine, însă, pentru consistență, se preferă folosirea convenției de la primitive: prima dată se declară ieșirile, apoi intrările.
Implicit, toate porturile sunt de tip wire, însă acest lucru poate fi modificat pentru porturile de ieșire (porturile de intrare nu pot fi modificate). Vom discuta acest aspect în laboratoarele următoare.
Descrierea funcționalității unui modul poate folosi, pe lângă primitive, și instanțe ale altor module. Acest lucru se face asemănător cu instanțierea unei primitive, cu diferența că, în acest caz, numele instanței nu este opțional.
module mux4_1(output out, input[3:0] in, input[1:0] sel); // implementare multiplexor 4:1 endmodule module mux8_1(output out, input[7:0] in, input[2:0] sel); mux4_1 m1(out30, in[3:0], sel[1:0]); // instantiere mux4_1 mux4_1 m2(out47, in[7:4], sel[1:0]); // alta instantiere mux4_1 // logica aditionala not(n_sel2, sel[2]); and(y1, out30, n_sel2); and(y2, out47, sel[2]); or(out, y1, y2); endmodule
În exemplul anterior definiția modulului mux8_1 folosește instanțe ale modulului mux4_1, denumite m1 și m2. Semnalele out30, in[3:0] și sel[1:0] sunt legate la porturile out, in și, respectiv, sel ale instanței m1, asemănător cu apelul unei funcții în C.
<imgcaption mux81 center |Multiplexorul 8:1></imgcaption>
<hidden Click pentru un mod alternativ de instanțiere a unui modul>
În Verilog, legătura dintre porturile unei instanțe și semnalele legate la aceste porturi poate fi făcută și pe baza numelor, nu doar a poziției. Această metodă de instanțiere a unui modul poate fi observată în exemplul următor.
module mux4_1(output out, input[3:0] in, input[1:0] sel); // implementare multiplexor 4:1 endmodule module mux8_1(output out, input[7:0] in, input[2:0] sel); mux4_1 m1(.out(out30), .in(in[3:0]), .sel(sel[1:0])); // instantiere mux4_1 mux4_1 m2(.sel(sel[1:0]), .in(in[7:4]), .out(out74)); // alta instantiere mux4_1 // logica aditionala not(n_sel2, sel[2]); and(y1, out30, n_sel2); and(y2, out74, sel[2]); or(out, y1, y2); endmodule
Această metodă de instanțiere nu este suportată pentru primitive, porturile acestora neavând asociate nume. </hidden>
Proiectarea Top-Down
Proiectarea top-down se referă la partiționarea sistematică și repetată a unui sistem complex în unități funcționale mai simple, a căror proiectare poate fi făcută mai facil. O partiționare și organizare la nivel înalt a unui sistem reprezintă arhitectura acestuia. Unitățile funcționale individuale ce rezultă în urma partiționării sunt mai ușor de proiectat și de testat decât întregul sistem. Strategia divide-et-impera a proiectării top-down ne permite proiectarea de circuite care conțin milioane de porți.
Instanțierea unui modul în definiția unui alt modul este numită imbricare (eng. nested module). Modulele imbricate reprezintă mecanismul oferit de Verilog pentru proiectarea top-down, deoarece imbricarea creează automat o partiționare a sistemului.
* Verilog este un limbaj case-sensitive; x_in
și x_In
sunt tratate ca două semnale diferite.
* Numele identificatorilor (ex. nume de module, semnale și porturi) pot conține doar litere, cifre, _ și $; ele trebuie să înceapă cu _ sau cu o literă.
* Comentariile se marchează cu //
sau se încadrează între /
.
În cadrul laboratorului vom folosi mediul de dezvoltare Xilinx ISE, varianta WebPACK, pentru simularea codului Verilog și programarea plăcilor cu FPGA. WebPACK este versiunea gratuită a Xilinx ISE disponibilă pentru download pe site-ul Xilinx. Un tutorial pentru instalarea versiunii 14.6 (folosite în laborator) găsiți în secțiunea tutoriale. Sistemul de operare Windows 8 nu este suportat în mod oficial.
Pentru crearea proiectelor și modulelor folosind Xilinx ISE urmăriți tutorialul de pe wiki.
full_adder.v
.</hidden>