Blocurile initial și always marchează secțiunile de cod procedural ale modulului, iar în interiorul lor se pot folosi construcții de control similare celor din limbajele procedurale.

Spre deosebire de descrierea circuitului la nivel structural sau flux de date, la nivel procedural contează ordinea instrucțiunilor.

Un bloc initial este un bloc ce va fi executat o singură dată și se folosește frecvent pentru inițializări sau resetarea circuitului.

initial begin
    A = 8'b01010101;        // Atribuim registrului A o valoare binara ('b) pe 8 biti.
    B = {A[0:3], 4’b0000};  // Atribuim registrului B concatenarea intre primii 4 biti
                            // ai registrului A si 4 biti de 0.
    C = 8'h4D;              // Registrul C primeste o valoare in hexazecimal ('h) pe 8 biti.
end

Blocul initial poate să nu fie sintetizabil. Pentru a inițializa registrele cu anumite valori este recomandat să folosiți o linie explicită de reset.

Un bloc always este un bloc ce va fi executat continuu, ca o buclă infinită. El poate fi executat încontinuu sau la apariția unui eveniment.

input clk;
 
reg a;
reg b;
 
 
always @(posedge clk)
begin
   a <= b;
end

Construcția @(…) definiște lista de senzitivitate (sensitivity list) a blocului always respectiv. Dacă ea lipsește, atunci blocul se va rula încontinuu. Dacă ea conține vreun semnal, atunci blocul va rula doar la apariția unei schimbări a acelui semnal. Fiecare semnal poate fi prefixat cu posedge sau negedge, pentru a specifica execuția doar la fronturile pozitive sau negative ale semnalului.

always begin ... end                // Se va executa incontinuu.
always @(a) begin ... end           // Se va executa la orice tranzitie a semnalului a.
always @(posedge a) begin ... end   // Se va executa la orice tranzitie pozitiva a semnalului a.
always @(negedge a) begin ... end   // Se va executa la orice tranzitie negativa a semnalului a.
always @(a or b) begin ... end      // Se va executa la orice tranzitie a semnalului a sau b.
 
always @(*)
begin
    b = a;
end                                 // Se va executa la orice tranzitie a oricarui semnal care poate 
                                    // influenta rezultatul blocului (orice semnal citit in interiorul
                                    // blocului). In acest caz, cum o schimbare a semnalului a ar duce la
                                    // schimbarea valorii lui b, blocul se va executa pentru orice 
                                    // tranzitie a semnalului a.                                    
soc/laboratoare/02/blocuri.txt · Last modified: 2026/03/03 10:39 by alexandru.ionita04
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0