Diferență între revizuiri ale paginii „Circuite secvențiale”

De la WikiLabs
Jump to navigationJump to search
 
(Nu s-au afișat 9 versiuni intermediare efectuate de același utilizator)
Linia 23: Linia 23:
 
[[Fișier:seq3.png|thumb|Simulare a unui registru pe 4 biți]]
 
[[Fișier:seq3.png|thumb|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ă propage intrarea la ieșire și nimic mai mult 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:
+
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:
  
 
<syntaxhighlight lang="verilog">
 
<syntaxhighlight lang="verilog">
 
module Register(
 
module Register(
  input clock,
+
    output reg [3:0] out,
  input [3:0] in,
+
    input [3:0] in,
  output reg [3:0] out
+
    input clock
  );
+
);
  
 
always@(posedge clock) begin
 
always@(posedge clock) begin
  out <= in;   
+
    out <= in;   
 
end
 
end
  
 
endmodule
 
endmodule
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
== 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:
 +
 +
<syntaxhighlight lang="verilog">
 +
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
 +
</syntaxhighlight>
 +
 +
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'''.

Versiunea curentă din 1 aprilie 2014 05:59

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.