În acest laborator vom recapitula noțiuni învățate la SOC și ne vom familiariza cu programul Vivado.
Vivado Design Suite e un pachet software dezvoltat de compania Xilinx (achiziționată de AMD) pentru a programa FPGA-uri.
Vivado permite editarea, simularea și sintetizarea codului de descriere hardware (HDL) pe plăcuța Nexys A7 folosită în laborator.
Verilog este un HDL (Hardware Description Language) folosit pentru specificarea formală a circuitelor electronice digitale.
Modulul este unitatea de bază a limbajului Verilog. Definește interfața (intrările și ieșirile) și comportamentul unui circuit electronic. Putem descrie comportamentul unui modul în trei moduri:
module A(input in, output out); not(out, in); endmodule module B(input in, output out); assign out = ~in; endmodule module C(input in, output reg out); always @(*) begin out = ~in; end end
În Verilog putem folosi două tipuri de date:
wire
: reprezintă conexiuni fizice între componente, se folosesc pentru transmisia semnalelor și nu au capacitate de reținere a informațieireg
: folosite pentru a stoca date, care persistă chiar dacă registrul este deconectatwire a; wire [7:0] b; reg c; reg [0:7] d;
Pentru a controla ce date se află pe fire sau în registre, avem la dispoziție mai multe tipuri de atribuiri:
assign
): reprezintă relații directe între semnalele, funcționează doar pe wire
=
): sunt folosite pentru descrierea logicii combinaționale, executându-se secvențial, funcționează doar pe reg
<=
): sunt folosite pentru descrierea logicii secvențiale, executându-se în paralel, funcționează doar pe reg
module A(input in); wire a; reg b; reg c; assign a = in; always @(*) begin b = in; end always @(*) begin c <= in; end endmodule
Dacă alegem descrierea procedurală avem la dispoziție două blocuri speciale:
initial
: va fi executat o singură dată și se folosește în simulări pentru inițializarea circuitului. Acest bloc nu ajunge să fie sintetizat în circuitul propriu-zis.always
: va fi executat de fiecare dată la apariția unui eveniment. Este similar funcției de tratare a unei întreruperi - când întreruperea apare în sistem, funcția se execută. @(*)
este echivalent cu orice eveniment
.
Circuitele logice combinaționale sunt circuitele reprezentate prin porți logice ce aplică o funcție pe intrări. Valorile de ieșire depind doar de valorile de intrare, nu și de stări de reactie (feedback), iar cand starea unei intrări se schimbă, se reflectă imediat la ieșiri.
Spre deosebire de circuitele logice combinaționale, la cele secvențiale valorile de ieșire nu mai depind exclusiv de starea curentă a intrărilor, ci și de stările anterioare ale circuitului.
Un automat finit este, în sensul cel mai abstract, un model de calculabilitate. Trăsătura fundamentală a automatelor finite este faptul că se află, la orice moment de timp, într-una dintr-un număr finit de stări posibile. De asemenea, în anumite condiţii, ele pot executa tranziţii între aceste stări. Astfel, un automat este descris de: intrări, ieșiri, stări și tranziții.
În funcție de relația dintre intrare, ieșire și starea curentă există două tipuri de automate: Mealy și Moore. La automatele Mealy, ieşirea depinde de starea curentă şi de input-ul curent. Astfel, o ieșire corespunde unei tranziții.
La automatele Moore, pe de altă parte, ieșirea este determinată exclusiv de starea în care se află.
initial
always
wire
vs reg
assign
), blocante (=
) și non-blocante (<=
)
Task 01 (5p) Creați un proiect în Vivado care aprinde un led (e.g. H17) de pe plăcuța Nexys A7 la apăsarea unui buton (e.g. N17).
Task 02 (5p) Implementați un modul UAL ``ual.v``.
Modulul va primi la intrare 2 numere (pe 4 biți) (a și b) și indicatorul unei operații ce se va efectua asupra numerelor (sel - pe 2 biti).
Ieșirea modului (result) va fi un număr pe 4 sau 5 biți ce reprezintă rezultatul aplicării operației asupra numerelor a și b. Pentru valorile intrării sel avem urmatoarele operatii:
Exemplu de mapare a porturilor pe plăcuță: (click pe imagine pentru zoom in)
Folosiți acest fișier: Nexys-A7-100T-Master.xdc