Circuite secvențiale

De la WikiLabs
Salt la: navigare, căutare

Circuitele secvențiale sunt circuitele care sunt sincronizate de un semnal de ceas, adică ale căror ieșiri nu se modifică decât pe frontul pozitiv (sau negativ, în funcție de descriere) de ceas.

Semnalul de ceas

Semnal de ceas în Modelsim

Semnalul de ceas este un semnal periodic, care oscilează cu o anumită frecvență, numită frecvența de ceas.

Observație: Vezi sintaxa Verilog pentru a afla cum se generează un semnal de ceas în simulare.

Elementele semnalului de ceas

Circuite de memorare. Registrul

Registrul este celula elementară de memorare și baza circuitelor secvențiale. Odată o valoare încarcată într-un registru, aceasta se păstrează până la suprascrierea ei cu o altă valoare.

Regulă: Încărcarea unei valori într-un registru se face doar pe frontul de ceas.
Regulă: În Verilog, încărcarea cu o valoare a unui registru se face exclusiv în blocuri always.
Regulă: Dacă un modul este secvențial atunci obligatoriu el va avea un port de intrare pentru semnalul de ceas.

Reprezentarea grafică a unui registru pe n biți

Simulare a unui registru pe 4 biți

Aceasta este implementarea în Verilog a unui registru pe 4 biți care nu face decât să încarce registrul cu valoarea de intrare, iar în imagine puteți vedea o simulare Modelsim care arată că ieșirea nu se schimbă decât pe frontul pozitiv de ceas care urmează schimbării intrării:

module Register(
    output reg [3:0] out,
    input [3:0] in,
    input clock
);
 
always@(posedge clock) begin
    out <= in;  
end
 
endmodule

Reset pentru circuitele secvențiale

Există situații în care registrele trebuie resetate, adică încărcate cu o valoare implicită. Acest proces de reset este de obicei utilizat când circuitul de blochează, dintr-un motiv sau altul, sau când se dorește repornirea acestuia dint-o stare inițială. Circuitelor pentru care este necesar să fie posibilă resetarea, li se adaugă un semnal de reset. Descrierea în Verilog a unui registru pe 4 biți cu semnal de reset, care doar se încară cu o valoarea de pe intrare, este următoarea:

module Register(
    output reg [3:0] out,
    input [3:0] in,
    input clock,
    input reset
);
 
always@(posedge clock) begin
    if(reset) begin
        out <= 4'b0;
    end else begin
        out <= in;  
    end
end
 
endmodule

Acest tip de reset se numește reset sincron, pentru ca el este evaluat doar pe frontul de ceas (sincron cu ceasul). Există și cazuri în care resetul este asincron, iar atunci frontul activ al semnalului de reset trebuie să apară în lista de sensitivități a blocului always.